Часто перед разработчиками и опытными пользователями 1С возникает задача: найти в списке все элементы справочника, у которых конкретная табличная часть является пустой. Прямая попытка установить отбор по условию НомерСтроки равно «Не заполнено» (или 0) в стандартном динамическом списке обычно не дает результатов. Давайте разберемся, почему так происходит и как правильно настроить отбор без изменения конфигурации и написания программного кода.
Чтобы понять причину, нужно вспомнить, как платформа 1С:Предприятие транслирует настройки отбора в SQL-запросы. Когда мы настраиваем отбор по ТабличнаяЧасть.НомерСтроки, платформа выполняет LEFT JOIN (левое соединение) с таблицей табличной части. Попытка задать условие, что номер строки «не заполнен», интерпретируется системой как поиск записей, где номер строки равен 0. Однако физически в базе данных 1С нумерация строк начинается с 1. Записей с НомерСтроки = 0 просто не существует, поэтому условие никогда не выполняется, и список остается пустым.
Чтобы получить нужный результат, нам необходимо изменить логику запроса с «найти строки, где номер равен нулю» на «найти элементы, у которых НЕ СУЩЕСТВУЕТ ни одной записи в табличной части». Для этого в настройках отбора динамического списка мы воспользуемся возможностью группировки условий с отрицанием.
ИмяТабличнойЧасти.Ссылка (или НомерСтроки).НомерСтроки «Заполнено».Таким образом, мы даем платформе инструкцию: «Отбери все элементы справочника, для которых НЕ выполняется условие наличия хотя бы одной заполненной строки в табличной части». При такой настройке 1С транслирует запрос с использованием NOT EXISTS, что корректно выводит именно те элементы, табличная часть которых пуста.
Хотя предложенный выше метод является штатным и удобным, при работе с большими объемами данных следует учитывать некоторые нюансы:
NOT EXISTS в динамических списках может приводить к замедлению открытия формы, так как для каждого элемента справочника сервер баз данных будет выполнять проверку наличия связанных записей. Если в справочнике сотни тысяч элементов, а табличная часть очень объемная, это может быть заметно.ЕстьДанныеВТЧ.Рассмотрим пример того, как можно поддерживать такой реквизит в актуальном состоянии через модуль объекта:
Процедура ПередЗаписью(Отказ)
// Устанавливаем признак наличия данных в ТЧ
ЕстьДанныеВТЧ = (ТабличнаяЧасть.Количество() > 0);
КонецПроцедуры
Используя этот реквизит, вы сможете настроить отбор в списке очень быстро, так как поиск будет выполняться по обычному индексированному полю самого справочника, без выполнения сложных соединений с дочерними таблицами. Однако этот метод требует внесения изменений в конфигурацию.
Итак, мы проанализировали ситуацию и выяснили, что для отбора элементов с пустой табличной частью в стандартном интерфейсе 1С необходимо использовать группу условий с логическим «НЕ». Этот метод позволяет решать задачу «на лету» без привлечения программиста. В случае же высокой нагрузки на систему всегда можно рассмотреть вариант с хранением признака наличия строк непосредственно в объекте.