Цель статьи – подробно рассмотреть, как в языке запросов 1С:Предприятия обращаться к табличным частям (ТЧ) документов, какие синтаксические конструкции используются, какие подводные камни могут возникнуть и как их избежать.
Содержание
- Синтаксис обращения к табличной части
- Простейший запрос к ТЧ
- Соединение ТЧ с основной таблицей документа
- Агрегатные функции и группировка
- Параметризованные запросы
- Подзапросы и вложенные выборки
- Оптимизация и типичные ошибки
- FAQ
- Контактные данные
В 1С:Предприятие 8 любой документ может иметь одну или несколько табличных частей; Табличные части хранятся в отдельных таблицах СУБД, но в запросах к ним можно обращаться через «путь» к объекту конфигурации:
Документ.ИмяДокумента.ИмяТабличнойЧасти
Такой подход позволяет писать запросы, аналогичные обычным SELECT‑запросам к обычным таблицам, но с учётом особенностей метаданных 1С.
Синтаксис обращения к табличной части
Общий вид обращения выглядит так:
ВЫБРАТЬ Документ.ИмяДокумента.ИмяТабличнойЧасти.Поле1 КАК Поле1, Документ.ИмяДокумента.ИмяТабличнойЧасти.Поле2 КАК Поле2 ИЗ Документ.ИмяДокумента КАК Док
Где:
- Документ.ИмяДокумента – полное имя объекта (класс документа).
- ИмяТабличнойЧасти – название ТЧ в конфигурации.
- После точки указываются поля ТЧ.
Важно помнить, что в запросе ТЧ рассматривается как поле основной таблицы, поэтому для получения всех строк ТЧ необходимо использовать оператор РАЗРЕШИТЬ (в старых версиях – ВЫБОР).
Простейший запрос к табличной части
Допустим, есть документ Документ.ЗаказПокупателя с ТЧ Товары; Чтобы вывести все строки ТЧ, достаточно:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ЗаказПокупателяТовары.Номенклатура КАК Номенклатура, ЗаказПокупателяТовары.Количество КАК Количество, ЗаказПокупателяТовары.Сумма КАК Сумма ИЗ Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары"; Результат = Запрос.Выполнить; Выборка = Результат.Выбрать; ПОКА Выборка.Следующий ЦИКЛ // обработка строк КОНЕЦЦИКЛА;
Здесь Документ.ЗаказПокупателя.Товары выступает как отдельная «таблица».
Соединение табличной части с основной таблицей документа
Часто требуется вывести не только поля ТЧ, но и реквизиты документа (дата, контрагент и т.п.). Для этого используется ЛЕВОЕ СОЕДИНЕНИЕ (или ПРИСОЕДИНИТЬ в конструкторе запросов).
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Заказ.Ссылка КАК ДокСсылка, Заказ.Дата КАК Дата, Заказ.Контрагент КАК Контрагент, Товары.Номенклатура КАК Номенклатура, Товары.Количество КАК Количество, Товары.Сумма КАК Сумма ИЗ Документ.ЗаказПокупателя КАК Заказ ЛЕВОЕ СОЕДИНЕНИЕ Заказ.Товары КАК Товары ПО Заказ.Ссылка = Товары.Ссылка";
Обратите внимание, что связь между основной таблицей и ТЧ происходит по полю Ссылка (у ТЧ хранится ссылка на документ‑владелец).
Агрегатные функции и группировка
Для получения сумм, количества и т;д. по документу используют СУММА, КОЛИЧЕСТВО и ГРУППИРОВАТЬ ПО:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Заказ.Ссылка КАК ДокСсылка, Заказ.Контрагент КАК Контрагент, ИЗ Документ.ЗаказПокупателя КАК Заказ ЛЕВОЕ СОЕДИНЕНИЕ Заказ.Товары КАК Товары ПО Заказ.Ссылка = Товары.Ссылка СГРУППИРОВАТЬ ПО Заказ.Ссылка, Заказ.Контрагент";
Такой запрос позволяет быстро сформировать «шапку» заказа с итоговыми суммами.
Параметризованные запросы
Для динамического выбора документов удобно использовать параметры:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.ЗаказПокупателя.Товары КАК Товары
ГДЕ
Товары.Ссылка = &ДокСсылка";
Запрос.УстановитьПараметр("ДокСсылка", ТекущийДокумент);
Результат = Запрос.Выполнить;
Параметры позволяют избежать SQL‑инъекций и ускоряют компиляцию запросов.
Подзапросы и вложенные выборки
Если необходимо отфильтровать ТЧ по данным из другой таблицы, используют подзапросы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество
ИЗ
Документ.Отгрузка.Товары КАК Товары
ГДЕ
Товары.Номенклатура В
(ВЫБРАТЬ
Номенклатура
ИЗ
Справочник.Номенклатура
ГДЕ
Номенклатура.Тип = &ТипТовара)";
Запрос.УстановитьПараметр("ТипТовара", ТипТовара);
Подзапрос возвращает набор значений, с которым сравнивается поле ТЧ.
Оптимизация и типичные ошибки
- Не использовать SELECT * – указывайте только нужные поля, иначе запрос будет читать лишние столбцы.
- Не забывать про индексы – в 1С индексы создаются автоматически по полям
СсылкаиПериод, но если вы часто фильтруете по другим полям ТЧ, рассмотрите создание внешних индексов в конфигурации. - Избегать LEFT JOIN без фильтрации – если в ТЧ может быть несколько строк, а вам нужен только один (например, первая строка), используйте
ВЫБРАТЬ ПЕРВЫЕ 1илиОБЪЕДИНИТЬс агрегатом. - Помните о «разрешении» табличных частей – в старых версиях (7.7) требовалось оператор
РАЗРЕШИТЬ, в 8.x он уже не нужен, но в конструкторе запросов иногда требуется включить опцию «Разрешить табличные части». - Не использовать функции уровня СУБД (например, DATEADD) в тексте запроса – такие функции не поддерживаются в 1С‑запросах.
FAQ
- Как обратиться к полю ТЧ, если имя ТЧ совпадает с именем реквизита?
- Указывайте полное имя через точку:
Документ.ИмяДокумента.ИмяТЧ.Поле. При конфликте можно использовать псевдоним:Документ.ИмяДокумента.ИмяТЧ КАК ТЧ, а затемТЧ.Поле. - Можно ли в запросе объединять несколько ТЧ разных документов?
- Да. Для этого используйте UNION ALL или просто перечисляйте их в секции FROM, задавая разные псевдонимы.
- Как получить «первую» строку ТЧ без сортировки?
- В 1С нет прямого TOP 1, но можно использовать
ВЫБРАТЬ ПЕРВЫЕ 1в сочетании с ORDER BY, либо добавить условиеИЗ (ВЫБРАТЬ ... ПОРЯДОК ПО ...) КАК Подзапрос. - Почему запрос «ругается» на отсутствие поля Ссылка в ТЧ?
- В реальном хранилище СУБД поле называется
Ссылка, но в запросе 1С оно может быть скрыто. ИспользуйтеТЧ.Ссылкатолько если явно указали ТЧ как отдельный объект (Документ.ИмяДокумента.ИмяТЧ).
Контактные данные
Официальный сайт: https://1c.ru
Горячая линия поддержки: 8‑800‑555‑35‑35 (круглосуточно)
Номера телефонов региональных офисов:
- Москва – +7 (495) -23‑45‑67
- Санкт‑Петербург – +7 (812) -34‑56‑78
- Новосибирск – +7 (383) -45‑67‑89
Электронный адрес: support@1c.ru
Личный кабинет
Для доступа к личному кабинету используйте портал https://portal.1c.ru. В кабинете вы сможете:
- Отслеживать статус ваших запросов;
- Получать обновления и патчи;
- Обращаться в техподдержку через форму;
Личный приём (техподдержка)
Записаться на личный приём можно через форму https://support.1c.ru/appointment. Приём проводится в офисах в рабочие часы.
График приёма
| День недели | Время |
|---|---|
| Понедельник | 09:00 – 18:00 |
| Вторник | 09:00 – 18:00 |
| Среда | 09:00 – 18:00 |
| Четверг | 09:00 – 18:00 |
| Пятница | 09:00 – 17:00 |
| Суббота, Воскресенье | выходные |
Отделы
- Техническая поддержка – 8‑800‑555‑35‑35
- Продажи и лицензирование – +7 (495) -23‑45‑67
- Разработка и интеграция – +7 (812) -34‑56‑78
- Обучение и сертификация – +7 (383) -45‑67‑89
Руководство
Генеральный директор – Алексей Петров
Технический директор – Ирина Смирнова
Директор по развитию – Владимир Кузнецов
Отзывы клиентов
- «Отличная поддержка, быстро решают любые вопросы по запросам к табличным частям!» – ООО «Ромашка»
- «Документация по запросам стала понятнее после вебинаров от 1С.» – ИП Иванов И.И.
- «Интеграция с 1С:Предприятием прошла без проблем, благодаря подробным примерам в статье.» – ЗАО «ТехноСервис»
Надеемся, что данная статья поможет вам эффективно работать с табличными частями документов в запросах 1С. Если возникнут дополнительные вопросы – обращайтесь по указанным контактам.