Обращение к табличным частям документов в запросах 1С

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Цель статьи – подробно рассмотреть, как в языке запросов 1С:Предприятия обращаться к табличным частям (ТЧ) документов, какие синтаксические конструкции используются, какие подводные камни могут возникнуть и как их избежать.

Содержание

  1. Синтаксис обращения к табличной части
  2. Простейший запрос к ТЧ
  3. Соединение ТЧ с основной таблицей документа
  4. Агрегатные функции и группировка
  5. Параметризованные запросы
  6. Подзапросы и вложенные выборки
  7. Оптимизация и типичные ошибки
  8. FAQ
  9. Контактные данные

В 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С. Если возникнут дополнительные вопросы – обращайтесь по указанным контактам.