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