Цель статьи: подробно рассмотреть, как формировать запросы к табличным частям документов в 1С, какие возможности предоставляет язык запросов, какие нюансы следует учитывать и как использовать результаты запроса в бизнес‑логике.
Содержание - Синтаксис запросов к табличным частям
- Работа в конструкторе запросов
- Примеры запросов
- Параметры и динамические условия
- Группировки и агрегаты
- Экспорт результата в табличную часть документа
- Типичные ошибки и способы их устранения
- Часто задаваемые вопросы
- Контакты для обращений
В 1С:Предприятие табличная часть – это вложенная таблица, которая хранит набор строк, связанных с конкретным объектом (документом, справочником, регистром). Табличные части позволяют хранить детализированные данные, например, перечень товаров в документе Отчет о производстве за смену или список детей сотрудника.
При работе с запросами у вас есть два способа обращения к табличной части:
- Как к полю основной таблицы – используется синтаксис
Документ.ТабличнаяЧасть. При этом каждая строка табличной части «разворачивается» в отдельную запись результата. - Как к самостоятельной таблице – в конструкторе запросов табличную часть можно добавить в раздел Таблицы; Это удобно, когда требуется выполнить сложные соединения или агрегировать данные непосредственно в табличной части.
Синтаксис запросов к табличным частям
Базовый шаблон запроса выглядит так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
ТЧ.Поле1,
ТЧ.Поле2,
ТЧ.Поле3
ИЗ
Документ.ИмяДокумента.ИмяТабличнойЧасти КАК ТЧ
ГДЕ
ТЧ.Поле1 = &Значение"; Где:
Документ.ИмяДокумента.ИмяТабличнойЧасти– полное имя таблицы‑источника.КАК ТЧ– псевдоним, под которым будет доступно поле в SELECT‑части.- Условие
ГДЕможет использовать параметры, которые задаются черезЗапрос.УстановитьПараметр.
Обращение к вложенной таблице через точку и скобки
В некоторых версиях 1С возможно использовать запись вида:
Сотрудники.Дети.(Пол, ГодРождения) КАК Дети Это позволяет сразу выбрать несколько полей из табличной части Дети справочника Сотрудники.
Работа в конструкторе запросов
Конструктор запросов (СКД) упрощает построение запросов без написания кода:
- Откройте Конструктор запросов (Меню → Конструктор запросов).
- В левом окне «Таблицы» найдите нужный объект и перетащите его в рабочую область.
- Если требуется работать именно с табличной частью, перетащите её в раздел Таблицы. В появившемся окне укажите псевдоним.
- Выберите необходимые поля, задайте условия в разделе Условия и нажмите Сформировать запрос.
После генерации текста запроса вы можете скопировать его в код модуля и добавить параметры.
Примеры запросов Выборка продукции из табличной части документа «ОтчетПроизводстваЗаСмену» Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Продукция.Количество,
Продукция;Номенклатура
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Продукция
ГДЕ
Продукция.Ссылка = &Документ";
Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
Результат = Запрос.Выполнить;
Выборка сотрудников, у которых хотя бы один ребёнок родился после 2000 года Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Наименование КАК ФИО,
Дети.Пол,
Дети.ГодРождения
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Сотрудники.Дети КАК Дети
ПО Сотрудники.Ссылка = Дети.Ссылка
ГДЕ
Дети.ГодРождения > 2000";
Результат = Запрос.Выполнить;
Агрегирование: суммировать количество продукции по номенклатуре Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Продукция.Номенклатура КАК Номенклатура,
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Продукция
СГРУППИРОВАТЬ ПО
Продукция.Номенклатура";
Результат = Запрос.Выполнить;
Параметры и динамические условия
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Продукция.Количество,
Продукция;Номенклатура
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Продукция
ГДЕ
Продукция.Ссылка = &Документ";
Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
Результат = Запрос.Выполнить; Выборка сотрудников, у которых хотя бы один ребёнок родился после 2000 года Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Наименование КАК ФИО,
Дети.Пол,
Дети.ГодРождения
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Сотрудники.Дети КАК Дети
ПО Сотрудники.Ссылка = Дети.Ссылка
ГДЕ
Дети.ГодРождения > 2000";
Результат = Запрос.Выполнить;
Агрегирование: суммировать количество продукции по номенклатуре Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Продукция.Номенклатура КАК Номенклатура,
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Продукция
СГРУППИРОВАТЬ ПО
Продукция.Номенклатура";
Результат = Запрос.Выполнить;
Параметры и динамические условия
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Наименование КАК ФИО,
Дети.Пол,
Дети.ГодРождения
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Сотрудники.Дети КАК Дети
ПО Сотрудники.Ссылка = Дети.Ссылка
ГДЕ
Дети.ГодРождения > 2000";
Результат = Запрос.Выполнить;Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Продукция.Номенклатура КАК Номенклатура,
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Продукция
СГРУППИРОВАТЬ ПО
Продукция.Номенклатура";
Результат = Запрос.Выполнить; Параметры и динамические условия
Для того чтобы запрос был переиспользуемым, в тексте запроса используются параметры, начинающиеся с символа &. Параметры задаются методом УстановитьПараметр:
Запрос.УстановитьПараметр("ДатаНач", НачальнаяДата);
Запрос.УстановитьПараметр("ДатаКон", КонечнаяДата); Пример запроса с датами:
Запрос.Текст =
"ВЫБРАТЬ
ТЧ.Дата,
ТЧ.Сумма
ИЗ
Документ.РасходныйКассовыйОрдер.ТабличнаяЧасть КАК ТЧ
ГДЕ
ТЧ.Дата МЕЖДУ &ДатаНач И &ДатаКон"; Группировки и агрегаты
Язык запросов поддерживает стандартные агрегатные функции: СУММА, СРЗНАЧ, МИН, МАКС, КОЛИЧЕСТВО. Группировка задаётся ключевым словом СГРУППИРОВАТЬ ПО.
Пример: подсчитать количество изделий, произведённых каждым сотрудником за выбранный период.
Запрос.Текст =
"ВЫБРАТЬ
ТЧ.Сотрудник КАК Сотрудник,
СУММА(ТЧ.Количество) КАК Всего
ИЗ
Документ.ПроизводственнаяОперация.ТабличнаяЧасть КАК ТЧ
ГДЕ
ТЧ.Дата МЕЖДУ &ДатаНач И &ДатаКон
СГРУППИРОВАТЬ ПО
ТЧ.Сотрудник"; Экспорт результата в табличную часть документа
Часто требуется заполнить табличную часть нового документа данными, полученными запросом. Делается это в обработчике НаСервере:
Процедура ЗаполнитьДокумент
{
// 1. Создаём запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Сотрудники.Наименование КАК Наименование,
Сотрудники.Оклад КАК Оклад,
Сотрудники.Должность КАК Должность,
Сотрудники.Подразделение КАК Подразделение
ИЗ
Справочник.Сотрудники КАК Сотрудники";
// 2. Выполняем запрос
Результат = Запрос.Выполнить;
Выборка = Результат.Выбрать;
// 3. Создаём новый документ
Док = Документы.ОтчетОСотрудниках.СоздатьДокумент;
// 4. Заполняем табличную часть
Пока Выборка.Следующий Цикл
Строка = Док.ТабличнаяЧасть.Добавить;
Строка.Наименование = Выборка.Наименование;
Строка.Оклад = Выборка.Оклад;
Строка.Должность = Выборка.Должность;
Строка.Подразделение = Выборка.Подразделение;
КонецЦикла;
// 5. Пишем документ
Док.Записать;
}
Важно помнить, что запись в табличную часть происходит в клиентском режиме, а запрос – в серверном (НаСервере), чтобы избежать передачи больших объёмов данных.
Типичные ошибки и способы их устранения - Ошибка «Поле не найдено» – проверьте правильность указания имени табличной части и её полей. В 1С имена чувствительны к регистру.
- Ошибка «Не удалось выполнить запрос» – часто связана с неверным синтаксисом условия
ГДЕ. Убедитесь, что все параметры объявлены и типы совпадают. - Пустой результат при условии на табличную часть – если в условии используется поле, которое может быть
NULL, добавьте проверку И НЕ (ТЧ.Поле ПУСТО) или используйте ЛЕВОЕ СОЕДИНЕНИЕ. - Дублирование строк – происходит, когда запрос соединяет несколько табличных частей без группировки. Добавьте
СГРУППИРОВАТЬ ПО или используйте УНИКАЛЬНЫЕ в SELECT.
Часто задаваемые вопросы Как получить только те документы, у которых в табличной части есть строка, удовлетворяющая условию?
ГДЕ. Убедитесь, что все параметры объявлены и типы совпадают.NULL, добавьте проверку И НЕ (ТЧ.Поле ПУСТО) или используйте ЛЕВОЕ СОЕДИНЕНИЕ.СГРУППИРОВАТЬ ПО или используйте УНИКАЛЬНЫЕ в SELECT.Как получить только те документы, у которых в табличной части есть строка, удовлетворяющая условию?
Используйте оператор СУЩЕСТВУЕТ или EXISTS в подзапросе:
ВЫБРАТЬ
Док.Ссылка,
Док.Номер
ИЗ
Документ.ОтчетПроизводстваЗаСмену КАК Док
ГДЕ
СУЩЕСТВУЕТ(
ВЫБРАТЬ
*
ИЗ
Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Пр
ГДЕ
Пр.Ссылка = Док.Ссылка
И Пр.Дата > &Дата); Можно ли использовать подзапросы внутри SELECT‑части?
Да, но только в виде скалярных подзапросов, возвращающих одно значение. Для получения наборов строк используйте отдельный запрос и соединения.
Как вывести табличную часть как вложенную таблицу (таблицу‑значений) в результате запроса?
В 1С 8.3+ можно использовать синтаксис ТЧ.(Поле1, Поле2) КАК ВложеннаяТаблица. Результат будет представлен как ТаблицаЗначений в колонке.
Контакты для обращений
Если у вас возникли вопросы по работе с запросами к табличным частям, вы можете воспользоваться следующими каналами связи.
| Официальный сайт | https://support.1c.ru |
| Горячая линия | +7 (495) -23‑45‑67 (круглосуточно) |
| Номера телефонов |
|
| Электронный адрес | support@1c.ru |
| Личный кабинет | https://lk.1c.ru – вход по логину и паролю, возможность отслеживать статус заявок. |
| Личный прием | Приёмные часы в офисе: Пн‑Пт, 10:00‑12:00 (по предварительной записи). |
| График приёма |
|
| Отделы |
|
| Руководство |
|
| Отзывы | Мы ценим ваше мнение! Оставьте отзыв на официальном портале или отправьте письмо на feedback@1c.ru. |
Если после прочтения статьи остались вопросы, не стесняйтесь обращаться по указанным контактам – наша команда всегда готова помочь.