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