При работе с запросами в 1С разработчики часто сталкиваются с необходимостью обработать данные табличных частей документов. Зачастую возникает вопрос: как правильно отфильтровать документы, чтобы в выборку попадали только те, у которых есть заполненная табличная часть, или как корректно вывести все товары из документов? Давайте разберем эти задачи по шагам.
В исходном примере вы использовали синтаксис ПоступлениеТоваров.Товары.(...). Хотя 1С позволяет так делать, этот метод создает иерархическую структуру данных, которую крайне неудобно обрабатывать в коде. В профессиональной разработке принято работать с «плоскими» таблицами. Это упрощает отладку, ускоряет выполнение запроса и делает код более читаемым.
Если ваша задача — просто отобрать документы, у которых табличная часть Товары не пуста, мы можем использовать метод коррелирующего подзапроса. Это позволит исключить документы без товаров еще на этапе выполнения запроса.
Рассмотрим пример кода, который проверяет наличие хотя бы одной записи:
ГДЕ
1 В (
ВЫБРАТЬ ПЕРВЫЕ 1 1
ИЗ Документ.ПоступлениеТоваровУслуг.Товары КАК ТоварыТЧ
ГДЕ ТоварыТЧ.Ссылка = ПоступлениеТоваров.Ссылка
)
Разберем, как это работает:
ВЫБРАТЬ ПЕРВЫЕ 1 1 сообщает системе, что нам не нужны сами данные товаров — достаточно найти факт наличия хотя бы одной записи. Это существенно оптимизирует скорость работы.1 В (...) является условием: если подзапрос нашел запись, он возвращает единицу, и документ проходит проверку.ГДЕ ТоварыТЧ.Ссылка = ПоступлениеТоваров.Ссылка связывает конкретную шапку документа с его табличной частью.Если вам нужно не просто отфильтровать документы, а вывести сами товары (наименование, количество, цену), используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Это стандартный подход при работе с базами данных.
Давайте посмотрим, как это выглядит на практике:
ВЫБРАТЬ
ТоварыТЧ.Ссылка КАК Документ,
ТоварыТЧ.Номенклатура,
ТоварыТЧ.Количество
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ТоварыТЧ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК Поступление
ПО ТоварыТЧ.Ссылка = Поступление.Ссылка
ГДЕ
Поступление.Проведен = ИСТИНА
И Поступление.Дата МЕЖДУ &НачДата И &КонДата
Почему этот способ лучше:
ВНУТРЕННЕГО СОЕДИНЕНИЯ автоматически отсеивает все документы, в которых табличная часть Товары пуста, так как для них не будет найдено совпадений по полю Ссылка.Если вам нужно получить количество строк товаров для каждого документа, воспользуйтесь группировкой СГРУППИРОВАТЬ ПО и агрегатной функцией КОЛИЧЕСТВО.
ВЫБРАТЬ
ТоварыТЧ.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(ТоварыТЧ.НомерСтроки) КАК КоличествоСтрок
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ТоварыТЧ
СГРУППИРОВАТЬ ПО
ТоварыТЧ.Ссылка
Этот запрос выдаст вам список всех документов и количество товарных позиций в каждом из них. Если документ не попал в выборку, значит, его табличная часть была пустой.
Итоговые советы:
ЛЕВОЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ.ПЕРВЫЕ 1.ВНУТРЕННЕГО СОЕДИНЕНИЯ — это самый мощный и универсальный инструмент для анализа данных табличных частей.