Табличные части в запросах 1С: Предприятие

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

+7 (800) 301-07-30

Реклама jurik.ru

Табличные части (ТЧ) – один из самых мощных механизмов платформы 1С:Предприятие. Они позволяют хранить произвольные наборы строк, связанных с объектом (документом, справочником, регистром). Часто возникает необходимость получать данные из ТЧ непосредственно в запросах (конструкторе запросов, в коде запросов, в СКД). В этой статье мы разберём, как правильно обращаться к табличной части документа, какие приёмы существуют, какие подводные камни могут встретиться и как оптимизировать запросы.


Что такое табличная часть документа?

Табличная часть – это отдельный объект метаданных, который хранится в отдельной таблице СУБД, но логически привязан к основной таблице документа. В метаданных ТЧ имеет собственный набор реквизитов (поля) и может иметь ссылки на другие справочники, регистры и т.п.

Пример: документ ПоступлениеТоваров имеет табличную часть Товары с полями Номенклатура, Количество, Цена, Сумма.

Как ТЧ выглядит в базе данных?

  • Основная таблица: Document_Purchase (содержит реквизиты документа, номер, дату, ссылку и т.д.).
  • Таблица ТЧ: Document_Purchase_Tovary (каждая строка – отдельный товар).

Это разделение позволяет обращаться к ТЧ как к самостоятельной таблице в запросах.


Обращение к табличной части в конструкторе запросов

Перетаскивание ТЧ в поле «Таблицы»

В конструкторе запросов (встроенный редактор запросов) достаточно выполнить следующие шаги:

  1. Открыть Конструктор запросов (в режиме разработки).
  2. В списке «Таблицы» найти объект Документ.ПоступлениеТоваров.Товары и перетащить его в рабочую область.
  3. Установить нужные поля, например Товары.Номенклатура, Товары.Количество, Товары.Сумма.
  4. При необходимости добавить связь с основной таблицей через поле Ссылка (это ссылка на документ).

После этого в тексте запроса появится запись:

ВЫБРАТЬ
 Товары.Ссылка КАК Документ,
 Товары.Номенклатура,
 Товары.Количество,
 Товары.Сумма
ИЗ
 Документ.ПоступлениеТоваров.Товары КАК Товары

Фильтрация по полям ТЧ

Для отбора строк, удовлетворяющих условию, используем оператор ГДЕ:

ГДЕ
 Товары.ДатаПоступления > &ДатаНачала
 И Товары.Количество > 0

Обратите внимание, что ДатаПоступления – это реквизит документа, а не ТЧ. Чтобы отфильтровать по полям документа, нужно добавить связь с основной таблицей:

ВЫБРАТЬ
 Товары.Ссылка КАК Документ,
 Документ.Дата КАК ДатаДокумента,
 Товары.Номенклатура,
 Товары.Количество
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
 Документ.Дата > &ДатаНачала
 И Товары.Количество > 0

Язык запросов 1С: Предприятие – синтаксис обращения к ТЧ

Прямой запрос к ТЧ

Если требуется работать только с данными ТЧ, можно указать её как отдельный источник:

ВЫБРАТЬ
 Товары.Номенклатура,
 Товары.Количество,
 Товары.Сумма
ИЗ
 Документ.ПоступлениеТоваров.Товары КАК Товары
ГДЕ
 Товары.Количество > 10

Объединение (JOIN) с основной таблицей

Для получения полей документа (например, Дата, Номер) используем ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ:

ВЫБРАТЬ
 Документ.Номер,
 Документ.Дата,
 Товары.Номенклатура,
 Товары.Количество,
 Товары.Сумма
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
 Товары.Количество > 5

Подзапросы и агрегаты

Часто требуется посчитать суммарные показатели по документу. Делается это через агрегатные функции и ГРУППИРОВАТЬ ПО:

ВЫБРАТЬ
 Товары.Ссылка КАК Документ,
ИЗ
 Документ.ПоступлениеТоваров.Товары КАК Товары
ГДЕ
 Товары.ДатаПоступления > &ДатаНачала
СГРУППИРОВАТЬ ПО
 Товары.Ссылка

Если нужны поля из основной таблицы, их можно добавить в ГРУППИРОВАТЬ ПО:

ВЫБРАТЬ
 Документ;Номер,
 Документ.Дата,
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
 Документ.Дата > &ДатаНачала
СГРУППИРОВАТЬ ПО
 Документ.Номер,
 Документ.Дата

Использование ТаблицаЗначений (ТЗ) в запросе

Иногда нужно сравнить ТЧ с набором значений, полученных из внешних источников. Для этого создаём ТаблицаЗначений в коде и передаём её в запрос через параметр:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КодНоменклатуры", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("МинКол", Новый ОписаниеТипов("Число"));
ТЗ.ДобавитьСтроку(Новый Структура("КодНоменклатуры, МинКол", "ABC123", 10));
ТЗ.ДобавитьСтроку(Новый Структура("КодНоменклатуры, МинКол", "XYZ789", 5));

Запрос = Новый Запрос;
Запрос.Текст = 
 "ВЫБРАТЬ
 Товары.Ссылка КАК Документ,
 Товары.Номенклатура,
 Товары.Количество
 ИЗ
 Документ.ПоступлениеТоваров.Товары КАК Товары
 ЛЕВОЕ СОЕДИНЕНИЕ &ТаблицаЗначений КАК Параметры
 ПО Товары.Номенклатура.Код = Параметры.КодНоменклатуры
 ГДЕ
 Товары.Количество >= Параметры.МинКол";

Запрос.УстановитьПараметр("ТаблицаЗначений", ТЗ);
Результат = Запрос.Выполнить;

Такой приём позволяет гибко фильтровать строки ТЧ без необходимости писать длинные Или‑условия.


Частые ошибки и способы их устранения

  • Отсутствие связи через поле Ссылка – запрос возвращает «дублированные» строки или пустой результат. Всегда проверяйте, что в JOIN указано условие ТЧ.Ссылка = Документ.Ссылка.
  • Неправильный оператор НЕ в условии – в 1С НЕ (ТЧ.Поле = ...) работает, но если в скобках пустой набор, результат может быть неожиданным. Лучше использовать ТЧ.Поле IS NULL или ТЧ.Поле <> ....
  • Проблемы с производительностью – при работе с большими ТЧ (десятки тысяч строк) используйте индексы в метаданных (поле Ссылка и часто фильтруемые реквизиты). Также ограничьте диапазон дат;
  • Запрос к ТЧ без сохранения документа – если документ находится в режиме Запись (не записан), его ТЧ недоступна в запросах к базе. Нужно сначала Записать документ или использовать Объект.Записать в коде.

Лучшие практики

  1. Всегда указывайте алиас (КАК) для ТЧ и основной таблицы – это повышает читаемость.
  2. Для агрегаций используйте СУММА, МИН, МАКС и т.п. в сочетании с СГРУППИРОВАТЬ ПО.
  3. Если требуется получить только документы, у которых хотя бы одна строка ТЧ удовлетворяет условию, используйте СУЩЕСТВУЕТ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ с условием в ГДЕ.
  4. Для сложных фильтров (много условий) лучше вынести их в отдельный ПОДЗАПРОС и соединить с основной таблицей.
  5. При работе с большими объёмами данных используйте ОБРЕЗАТЬ (LIMIT) и ПАРАМЕТРЫ вместо конкатенации строк.

Пример полного запроса: «Документы, у которых в ТЧ «Товары» есть строка с ценой выше 100 000 и датой поставки позже »

ВЫБРАТЬ
 Документ.Ссылка КАК Документ,
 Документ.Номер,
 Документ.Дата,
 Товары.Номенклатура,
 Товары.Количество,
 Товары.Цена,
 Товары.ДатаПоставки
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
 Товары.Цена > 100000
 И Товары.ДатаПоставки > ДАТА('2024-01-01')
УПОРЯДОЧИТЬ ПО
 Документ.Дата УБЫВ

Запрос вернёт все строки ТЧ, удовлетворяющие условиям, вместе с реквизитами документа.


Часто задаваемые вопросы (FAQ)

Можно ли в запросе обратиться к ТЧ без указания её имени в метаданных?

Да, если в запросе уже есть ссылка на объект, содержащий ТЧ, можно использовать путь через точку: Документ.ТЧ.Поле. Но в конструкторе запросов лучше явно добавить ТЧ в список «Таблицы», чтобы увидеть доступные поля.

Как получить количество строк ТЧ для каждого документа?

Используем агрегат КОЛИЧЕСТВО(ТЧ.) и группировку по Документ.Ссылка:

ВЫБРАТЬ
 Документ.Ссылка КАК Документ,
 КОЛИЧЕСТВО(Товары.) КАК КолСтрок
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
СГРУППИРОВАТЬ ПО
 Документ.Ссылка

Как отфильтровать документы, у которых ТЧ пуста?

Можно использовать НЕ СУЩЕСТВУЕТ или левое соединение с условием Товары.Ссылка IS NULL:

ВЫБРАТЬ
 Документ.Ссылка,
 Документ.Номер
ИЗ
 Документ.ПоступлениеТоваров КАК Документ
 ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
 ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
 Товары.Ссылка IS NULL

Контакты для обращений

Официальный сайт: 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://login.1c.ru

Личный приём (для корпоративных клиентов): записаться можно через форму записи на приём

График приёма:

  • Понедельник‑Пятница: 09:00 – 18:00
  • Суббота: 10:00 – 15:00 (по предварительной записи)
  • Воскресенье: выходной

Отделы:

  1. Техническая поддержка
  2. Консультации по внедрению
  3. Обучение и сертификация
  4. Продажи и лицензирование

Руководство:

  • Генеральный директор – Иванов И.И.
  • Директор по развитию – Петров П.П.
  • Директор по поддержке – Сидорова А.А.

Отзывы клиентов:

  • «Отличная поддержка, быстро решают любые вопросы» – ООО «ТехноСервис»
  • «Инструменты работы с табличными частями позволяют экономить часы разработки» – АО «СтройИнвест»
  • «Удобный личный кабинет и понятные инструкции» – ИП «Смирнов В.В.»

Обращение к табличной части документа в запросах 1С – это мощный способ получать детализированные данные без необходимости писать дополнительный код обхода. Правильное использование JOIN, агрегатных функций, подзапросов и ТаблицаЗначений позволяет решать самые разнообразные задачи: от простых отчётов до сложных аналитических выборок.

Помните о необходимости связывать ТЧ с основной таблицей через поле Ссылка, следите за индексами и всегда проверяйте результат на небольшом наборе данных перед запуском в продакшн.

Если после прочтения статьи у вас остались вопросы, используйте указанные выше контакты – команда поддержки 1С готова помочь.