Табличные части (ТЧ) – один из самых мощных механизмов платформы 1С:Предприятие. Они позволяют хранить произвольные наборы строк, связанных с объектом (документом, справочником, регистром). Часто возникает необходимость получать данные из ТЧ непосредственно в запросах (конструкторе запросов, в коде запросов, в СКД). В этой статье мы разберём, как правильно обращаться к табличной части документа, какие приёмы существуют, какие подводные камни могут встретиться и как оптимизировать запросы.
Что такое табличная часть документа?
Табличная часть – это отдельный объект метаданных, который хранится в отдельной таблице СУБД, но логически привязан к основной таблице документа. В метаданных ТЧ имеет собственный набор реквизитов (поля) и может иметь ссылки на другие справочники, регистры и т.п.
Пример: документ ПоступлениеТоваров имеет табличную часть Товары с полями Номенклатура, Количество, Цена, Сумма.
Как ТЧ выглядит в базе данных?
- Основная таблица:
Document_Purchase(содержит реквизиты документа, номер, дату, ссылку и т.д.). - Таблица ТЧ:
Document_Purchase_Tovary(каждая строка – отдельный товар).
Это разделение позволяет обращаться к ТЧ как к самостоятельной таблице в запросах.
Обращение к табличной части в конструкторе запросов
Перетаскивание ТЧ в поле «Таблицы»
В конструкторе запросов (встроенный редактор запросов) достаточно выполнить следующие шаги:
- Открыть Конструктор запросов (в режиме разработки).
- В списке «Таблицы» найти объект
Документ.ПоступлениеТоваров.Товарыи перетащить его в рабочую область. - Установить нужные поля, например
Товары.Номенклатура,Товары.Количество,Товары.Сумма. - При необходимости добавить связь с основной таблицей через поле
Ссылка(это ссылка на документ).
После этого в тексте запроса появится запись:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары Фильтрация по полям ТЧ
Для отбора строк, удовлетворяющих условию, используем оператор ГДЕ:
ГДЕ
Товары.ДатаПоступления > &ДатаНачала
И Товары.Количество > 0 Обратите внимание, что ДатаПоступления – это реквизит документа, а не ТЧ. Чтобы отфильтровать по полям документа, нужно добавить связь с основной таблицей:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Документ.Дата КАК ДатаДокумента,
Товары.Номенклатура,
Товары.Количество
ИЗ
Документ.ПоступлениеТоваров КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
Документ.Дата > &ДатаНачала
И Товары.Количество > 0 Язык запросов 1С: Предприятие – синтаксис обращения к ТЧ
Прямой запрос к ТЧ
Если требуется работать только с данными ТЧ, можно указать её как отдельный источник:
ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары
ГДЕ
Товары.Количество > 10 Объединение (JOIN) с основной таблицей
Для получения полей документа (например, Дата, Номер) используем ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ:
ВЫБРАТЬ
Документ.Номер,
Документ.Дата,
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.ПоступлениеТоваров КАК Документ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
Товары.Количество > 5 Подзапросы и агрегаты
Часто требуется посчитать суммарные показатели по документу. Делается это через агрегатные функции и ГРУППИРОВАТЬ ПО:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары
ГДЕ
Товары.ДатаПоступления > &ДатаНачала
СГРУППИРОВАТЬ ПО
Товары.Ссылка Если нужны поля из основной таблицы, их можно добавить в ГРУППИРОВАТЬ ПО:
ВЫБРАТЬ
Документ;Номер,
Документ.Дата,
ИЗ
Документ.ПоступлениеТоваров КАК Документ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Товары
ПО Товары.Ссылка = Документ.Ссылка
ГДЕ
Документ.Дата > &ДатаНачала
СГРУППИРОВАТЬ ПО
Документ.Номер,
Документ.Дата Использование ТаблицаЗначений (ТЗ) в запросе
Иногда нужно сравнить ТЧ с набором значений, полученных из внешних источников. Для этого создаём ТаблицаЗначений в коде и передаём её в запрос через параметр:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КодНоменклатуры", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("МинКол", Новый ОписаниеТипов("Число"));
ТЗ.ДобавитьСтроку(Новый Структура("КодНоменклатуры, МинКол", "ABC123", 10));
ТЗ.ДобавитьСтроку(Новый Структура("КодНоменклатуры, МинКол", "XYZ789", 5));
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
Товары.Количество
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ &ТаблицаЗначений КАК Параметры
ПО Товары.Номенклатура.Код = Параметры.КодНоменклатуры
ГДЕ
Товары.Количество >= Параметры.МинКол";
Запрос.УстановитьПараметр("ТаблицаЗначений", ТЗ);
Результат = Запрос.Выполнить; Такой приём позволяет гибко фильтровать строки ТЧ без необходимости писать длинные Или‑условия.
Частые ошибки и способы их устранения
- Отсутствие связи через поле
Ссылка– запрос возвращает «дублированные» строки или пустой результат. Всегда проверяйте, что вJOINуказано условиеТЧ.Ссылка = Документ.Ссылка. - Неправильный оператор
НЕв условии – в 1СНЕ (ТЧ.Поле = ...)работает, но если в скобках пустой набор, результат может быть неожиданным. Лучше использоватьТЧ.Поле IS NULLилиТЧ.Поле <> .... - Проблемы с производительностью – при работе с большими ТЧ (десятки тысяч строк) используйте индексы в метаданных (поле
Ссылкаи часто фильтруемые реквизиты). Также ограничьте диапазон дат; - Запрос к ТЧ без сохранения документа – если документ находится в режиме
Запись(не записан), его ТЧ недоступна в запросах к базе. Нужно сначалаЗаписатьдокумент или использоватьОбъект.Записатьв коде.
Лучшие практики
- Всегда указывайте алиас (КАК) для ТЧ и основной таблицы – это повышает читаемость.
- Для агрегаций используйте
СУММА,МИН,МАКСи т.п. в сочетании сСГРУППИРОВАТЬ ПО. - Если требуется получить только документы, у которых хотя бы одна строка ТЧ удовлетворяет условию, используйте
СУЩЕСТВУЕТилиВНУТРЕННЕЕ СОЕДИНЕНИЕс условием вГДЕ. - Для сложных фильтров (много условий) лучше вынести их в отдельный
ПОДЗАПРОСи соединить с основной таблицей. - При работе с большими объёмами данных используйте
ОБРЕЗАТЬ(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С – это мощный способ получать детализированные данные без необходимости писать дополнительный код обхода. Правильное использование JOIN, агрегатных функций, подзапросов и ТаблицаЗначений позволяет решать самые разнообразные задачи: от простых отчётов до сложных аналитических выборок.
Помните о необходимости связывать ТЧ с основной таблицей через поле Ссылка, следите за индексами и всегда проверяйте результат на небольшом наборе данных перед запуском в продакшн.
Если после прочтения статьи у вас остались вопросы, используйте указанные выше контакты – команда поддержки 1С готова помочь.