Как добавить колонку с количеством в динамический список справочника «Партии»

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

В типовых конфигурациях, таких как 1С:Управление нашей фирмой (УНФ), пользователи часто сталкиваются с необходимостью видеть не только наименование партии или ее серийный номер, но и актуальный остаток в форме выбора или списка. По умолчанию справочник Партии не хранит сведения о количестве, так как эти данные являются расчетными и находятся в регистрах накопления. В этой статье мы подробно разберем, как расширить возможности динамического списка и вывести оперативную информацию о количестве товара прямо в таблицу.

Постановка задачи и анализ структуры данных

Прежде чем приступать к доработке, проанализируем, где физически хранятся данные. Справочник Партии — это объект метаданных, описывающий характеристики конкретной партии товара (дата поступления, производитель и т.д.). Количество же фиксируется в регистре накопления (например, Запасы или ПартииТоваров) в виде приходов и расходов. Следовательно, просто «включить» отображение поля в настройках формы не получится — этого поля нет в самом справочнике. Нам потребуется изменить текст запроса, который питает динамический список данными.

Шаг 1. Включение произвольного запроса

Рассмотрим процесс изменения динамического списка. Для этого нам нужно открыть конфигуратор, найти требуемую форму (обычно это ФормаВыбора или ФормаСписка справочника Партии) и выполнить следующие действия:

  1. Перейдем на закладку Данные в редакторе формы.
  2. Найдем основной реквизит формы с типом ДинамическийСписок (чаще всего он называется Список).
  3. В окне свойств этого реквизита найдем флаг Произвольный запрос и установим его.
  4. После этого станет доступной гиперссылка Настройка списка, при нажатии на которую откроется конструктор запроса.

Шаг 2. Написание запроса для получения остатков

Теперь разберем, как правильно составить текст запроса. Нам необходимо выполнить левое соединение основной таблицы справочника с виртуальной таблицей остатков регистра. Это гарантирует, что мы увидим все партии, даже если по ним в данный момент нет остатка (в этом случае будет выведен 0).

Проанализируем пример запроса:


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

Важный нюанс: при использовании виртуальной таблицы Остатки крайне желательно передавать параметры в саму таблицу (в скобках после имени таблицы), а не в секцию ГДЕ. Это значительно повышает производительность системы, так как фильтрация происходит на уровне сервера СУБД еще до формирования итоговой выборки.

Шаг 3. Установка основной таблицы

Выясним причину, почему после включения произвольного запроса могут перестать работать стандартные функции списка (поиск, сортировка, отборы). Это происходит, если в свойствах динамического списка не указана Основная таблица. Выясним, как это исправить:

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

Шаг 4. Обработка пустых значений и параметров

Посмотрим на ситуацию с выводом данных. Если мы просто выберем поле КоличествоОстаток, то для партий без остатков в колонке будет пустота (значение NULL). Для пользователя это выглядит неаккуратно. Поэтому мы используем функцию ЕСТЬNULL(КоличествоОстаток, 0), которая превращает пустоту в числовой ноль. Это также позволит пользователю корректно сортировать колонку по возрастанию или убыванию.

Теперь разберем работу с параметром &Период. Чтобы список всегда показывал актуальные остатки, этот параметр нужно установить программно. Перейдем в модуль формы и найдем (или создадим) процедуру ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Устанавливаем текущую дату как период для получения остатков
    Список.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата());
    
    // Если форма открывается для выбора конкретной номенклатуры,
    // можно передать и этот параметр
    Если Параметры.Свойство("Владелец") Тогда
        Список.Параметры.УстановитьЗначениеПараметра("Номенклатура", Параметры.Владелец);
    КонецЕсли;
    
КонецПроцедуры

Шаг 5. Добавление колонки в пользовательский интерфейс

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

  1. В окне элементов формы (левая верхняя часть редактора) разверните дерево реквизита Список.
  2. Найдите созданное поле КоличествоОстаток.
  3. Перетащите его мышкой в таблицу Список на форме.
  4. В свойствах нового элемента (колонки) установите понятный заголовок, например, «Остаток на складе».

Шаг 6. Оптимизация и визуальное оформление

Проанализируем вопросы производительности. Динамический список с левым соединением может работать медленно, если количество записей в справочнике исчисляется десятками тысяч. Чтобы избежать «тормозов», убедитесь, что:

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

Резюме

Мы рассмотрели комплексный подход к модификации формы. Использование Произвольного запроса в сочетании с Виртуальными таблицами и механизмом Параметров — это стандарт индустрии для разработки на платформе 1С:Предприятие 8.3. Такой подход сохраняет гибкость настроек и обеспечивает высокую информативность интерфейса для конечного пользователя.

← На главную