Как вывести остатки товаров из регистра в список справочника Номенклатура?

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

В процессе разработки в системе 1С часто возникает необходимость отображать актуальные данные об остатках товаров непосредственно в форме списка справочника Номенклатура. Это позволяет пользователям (менеджерам по продажам или кладовщикам) видеть наличие товара без необходимости открывать дополнительные отчеты или карточки каждой позиции. Рассмотрим подробно, как реализовать эту задачу наиболее оптимальным способом, используя механизмы управляемых форм платформы 1С 8.3.

Разберем архитектурные основы: Выбор правильного регистра

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

Настройка динамического списка в форме справочника

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

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

Проектирование запроса к базе данных

Теперь проанализируем сам запрос. Нам необходимо соединить таблицу справочника с виртуальной таблицей остатков регистра. Очень важно использовать именно ЛЕВОЕ СОЕДИНЕНИЕ. Если применить "Внутреннее соединение", то из списка исчезнут все товары, по которым в данный момент нет остатков на складе. Мы же хотим видеть всю номенклатуру, просто с нулевыми значениями там, где товара нет.

Рассмотрим пример запроса:


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

Разберем важные детали этого запроса:

Программная установка параметров периода

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


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

Использование ТекущаяДатаСеанса() предпочтительнее обычной ТекущаяДата(), так как она учитывает часовой пояс пользователя в распределенных системах.

Оптимизация производительности

Выясним причину, по которой иногда списки с остатками могут "подтормаживать". Соединение с виртуальными таблицами в реальном времени — ресурсоемкая операция. Если в базе сотни тысяч записей номенклатуры и активные движения по складам, прокрутка может стать медленной. Для оптимизации рекомендуем:

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

Добавление поля на форму

После того как запрос написан и параметры установлены, нам нужно вывести новое поле в пользовательский интерфейс. В окне "Элементы" формы найдем таблицу Список. Развернем в дереве реквизитов наш Список, найдем там поле ОстатокНаСкладе и просто перетащим его в элементы формы. Для этого поля рекомендуется установить свойство Только просмотр, так как это расчетный показатель, который нельзя редактировать вручную.

Таким образом, мы создали интерактивный и информативный инструмент, который позволяет в реальном времени отслеживать складские запасы прямо в основном рабочем окне справочника номенклатуры.

← На главную