В конфигурациях 1С часто возникает необходимость определить, содержит ли документ (или справочник) строки в табличной части. Это может понадобиться для:
- формирования условий отбора в отчётах;
- блокировки проведения документа при пустой табличной части;
- вывода сообщения пользователю о незаполненных данных;
- оптимизации запросов, исключая обработку пустых строк.
Ниже рассмотрены наиболее распространённые способы проверки заполнения табличной части непосредственно в тексте запроса.
Подсчёт количества строк через КОЛИЧЕСТВО
Самый прямой способ – посчитать количество строк в табличной части и сравнить результат с нулём.
Пример: проверка документа РеализацияТоваровУслуг.
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Документ,
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары) КАК КолвоСтрок
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары) > 0
Если нужно вернуть только флаг «заполнена/не заполнена», можно воспользоваться функцией ЕСТЬNULL (или ЕСТЬ) вместе с подзапросом:
ВЫБРАТЬ
Документ.Ссылка КАК Документ,
ЕСТЬNULL(ВложенныйЗапрос.Колво, 0) КАК ЕстьСтроки
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(1) КАК Колво
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка
) КАК ВложенныйЗапрос
ПО Документ.Ссылка = ВложенныйЗапрос.Ссылка
Поле ЕстьСтроки будет содержать количество строк табличной части; если оно равно 0 – часть пуста.
Проверка через ЕСТЬNULL и левое соединение
Если нужно просто узнать, есть ли хотя бы одна строка, достаточно выполнить левое соединение табличной части и проверить, не равно ли связанное поле NULL.
Пример:
ВЫБРАТЬ
Документ.Ссылка КАК Документ,
ВЫБОР
КОГДА ВложенныйЗапрос.Ссылка ЕСТЬ NULL ТОгда 0
ИНАЧЕ 1
КОНЕЦ КАК ЕстьЗаполнение
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
) КАК ВложенныйЗапрос
ПО Документ.Ссылка = ВложенныйЗапрос.Ссылка
Здесь поле ЕстьЗаполнение принимает значение 1, если в табличной части есть хотя бы одна строка, и 0 – иначе.
Использование агрегатной функции СУММА с условием
Иногда удобно посчитать не просто количество строк, а, например, сумму некоторого количества (кол-во, сумма) и проверить, больше ли оно нуля.
Пример: проверка, что сумма количества товаров в реализации больше нуля.
ВЫБРАТЬ
Документ.Ссылка КАК Документ,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК СуммаКолво
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ПО Документ.Ссылка = РеализацияТоваровУслугТовары.Ссылка
СГРУППИРОВАТЬ ПО Документ.Ссылка
ИМЕЮЩИЕ СУММА(РеализацияТоваровУслугТовары.Количество) > 0
Если после ГРУППИРОВКА нет строк, значит табличная часть пуста (или все количества равны нулю).
Проверка через ВЫБОР КОГДА … THEN … END в составе подзапроса
Можно построить подзапрос, который возвращает 1 для документов с заполненной табличной частью и 0 – для пустых, а затем использовать его в основном запросе.
ВЫБРАТЬ
Документ.Ссылка КАК Документ,
ВЫБОР
КОГДА ЕСТЬNULL(ТабЧасть.Колво, 0) > 0 ТОгда 1
ИНАЧЕ 0
КОНЕЦ КАК ФлагЗаполнения
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(1) КАК Колво
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Ссылка
) КАК ТабЧасть
ПО Документ.Ссылка = ТабЧасть.Ссылка
Рекомендации по производительности
- Избегайте повторного вычисления одного и того же подзапроса несколько раз в одном запросе – лучше вынести его в ВЫБРАТЬ … ЛЕВОЕ СОЕДИНЕНИЕ ( … ).
- Если проверка нужна только для фильтрации документов, помещайте условие в ГДЕ или ИМЕЮЩИЕ, а не в список выбираемых полей – так движок сможет применить индексы раньше.
- Для больших объёмов данных предпочтительно использовать КОЛИЧЕСТВО или СУММА с условием > 0, чем проверять каждое поле на NULL через ЕСТЬNULL.
- При необходимости проверить несколько табличных частей одновременно можно построить несколько левых соединений и объединить результаты через ВЫБОР.
Проверка заполнения табличной части в запросе 1С реализуется несколькими простыми приёмами:
- Подсчёт строк через функцию КОЛИЧЕСТВО.
- Левое соединение с последующей проверкой на NULL (или использование ЕСТЬNULL).
- Агрегатные функции (СУММА, СРЕДНЕЕ) с условием > 0.
- Условные выражения ВЫБОР … КОГДА … ТОгда … ИНАЧЕ … КОНЕЦ для формирования флага.
Выбор конкретного способа зависит от задачи: нужна ли просто факт наличия строк, требуется ли знать их количество или суммировать какое‑то поле, а также от требований к производительности запроса. При правильном использовании этих техник вы сможете гибко управлять логикой отборов и обработки данных в своих конфигурациях 1С.