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