Как настроить динамический список номенклатуры для отображения только товаров в наличии?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

Часто в процессе разработки конфигураций на базе 1С, особенно в 1С:Управление нашей фирмой, возникает задача реализации удобного фильтра. Например, пользователь хочет видеть в справочнике Номенклатура только те позиции, по которым на текущий момент есть остатки на складах. Казалось бы, задача проста — нужно лишь изменить запрос Динамического списка. Однако на практике программисты часто сталкиваются с пустым результатом или ошибками отображения. Давайте разберем, как сделать это правильно, избегая частых «подводных камней».

Анализ типичных ошибок при настройке запроса

Первая трудность, с которой мы сталкиваемся при попытке отфильтровать список — это нарушение логики связей в запросе. При использовании ЛЕВОГО СОЕДИНЕНИЯ важно соблюдать последовательность таблиц:

  1. Если мы ставим Справочник.Номенклатура как левую таблицу, а регистр остатков — как присоединяемую, мы получаем все элементы справочника, а данные по остаткам станут NULL там, где товара нет.
  2. Если мы меняем их местами, делая регистр остатков основной таблицей, то при наличии условия ГДЕ ЗапасыНаСкладахОстатки.КоличествоОстаток > 0, система отсечет все товары, у которых нет записей в регистре. Это и приводит к «пустому» списку, так как связь может быть установлена некорректно.

Метод первый: Использование параметров динамического списка

Самый профессиональный и эффективный способ реализации такого функционала — это использование параметров запроса. Вместо того чтобы переписывать весь запрос целиком при каждом нажатии галочки, мы можем оставить запрос стабильным, а фильтрацию возложить на параметр.

Рассмотрим, как это выглядит в коде:


// В запросе динамического списка добавляем условие в секцию ГДЕ:
ГДЕ (&ПоказыватьТолькоОстатки = ЛОЖЬ 
    ИЛИ СправочникНоменклатура.Ссылка В 
        (ВЫБРАТЬ Остатки.Номенклатура 
         ИЗ РегистрНакопления.ЗапасыНаСкладах.Остатки КАК Остатки 
         ГДЕ Остатки.КоличествоОстаток > 0))

Теперь при изменении состояния переключателя или галки в форме справочника нам достаточно просто обновить значение параметра:


// В обработчике события изменения элемента формы
Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьТолькоОстатки", Истина);

Этот метод хорош тем, что он не сбрасывает настройки пользователя, такие как установленные фильтры, сортировки или группировки, которые были сохранены в Настройках пользователя.

Метод второй: Использование логического выражения в условиях

Если вы не хотите использовать вложенные запросы, можно применить логическое условие непосредственно в секции ГДЕ, используя оператор ВЫБОР. Это позволяет динамически менять поведение списка в зависимости от установленного параметра:


ГДЕ ВЫБОР 
        КОГДА &ВыводитьТолькоОстатки ТОГДА ЗапасыНаСкладахОстатки.КоличествоОстаток > 0 
        ИНАЧЕ ИСТИНА 
    КОНЕЦ

При таком подходе обязательно следите за тем, чтобы в Динамическом списке связь между Справочник.Номенклатура и РегистрНакопления.ЗапасыНаСкладах.Остатки была настроена корректно (обычно это ЛЕВОЕ СОЕДИНЕНИЕ по полю Номенклатура). Именно ошибки в порядке связей (как было отмечено в обсуждении) часто приводят к тому, что данные не выводятся вовсе.

Важные рекомендации по производительности

Помните, что Динамический список работает по принципу попорционного вывода данных. Включение виртуальных таблиц остатков в основной запрос списка может значительно замедлить работу всей формы, особенно если база данных большая. Вот несколько советов для оптимизации:

Подводя итог, можно сказать, что решение задачи по фильтрации Номенклатуры сводится к правильной настройке связей в Конструкторе запроса и умелому использованию параметров Динамического списка. Не торопитесь пересоздавать запрос при каждом действии пользователя — используйте параметры, и ваша конфигурация будет работать быстрее и стабильнее!

← На главную