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