Как в заказе выбрать только ту номенклатуру, которая есть в наличии на складе?

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

При оформлении документов продажи, таких как Заказ клиента или Реализация товаров и услуг в «1С:Управление торговлей», менеджеры часто сталкиваются с задачей быстрого выбора только тех позиций, которые реально присутствуют на складе. При стандартном открытии формы выбора из поля табличной части отображается весь справочник номенклатуры, включая товары с нулевыми остатками. Разберем, почему так происходит и как правильно организовать работу с доступным остатком.

Почему стандартная форма выбора не фильтрует товары по остаткам

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

  1. Производительность динамических списков: список справочника Номенклатура отображает данные напрямую из таблицы справочника. Если бы система при каждом открытии связывала весь каталог с виртуальными таблицами остатков по конкретному складу, это приводило бы к зависаниям и медленной работе при большом ассортименте.
  2. Разделение физических и доступных остатков: в конфигурации реальный физический остаток хранится в регистре накопления ТоварыНаСкладах, а остаток с учетом резервов под другие заказы — в регистре СвободныеОстатки. Выбор товара без учета доступности привел бы к ошибкам проведения из-за нехватки свободного количества.
  3. Контекст склада: в зависимости от настроек программы склад может определяться как в шапке документа, так и отдельно в каждой строке табличной части. Стандартная форма выбора справочника не предназначена для автоматического считывания этих условий из контекста строки.

Типовое решение: использование формы подбора товаров

Для подбора позиций с контролем остатков разработчиками предусмотрен специализированный инструмент — обработка подбора товаров. В отличие от стандартной формы списка, механизм подбора специально оптимизирован для работы со свободными остатками и ценами.

Рассмотрим по шагам, как настроить отображение только товаров в наличии:

  1. Открываем документ Заказ клиента и переходим на вкладку Товары.
  2. Нажимаем кнопку Подбор товаров над табличной частью.
  3. В открывшемся окне подбора в командной панели или в блоке фильтров находим переключатель или флаг Только в наличии на складе (наименование склада автоматически подтягивается из документа).
  4. После установки этого флага список доступных позиций мгновенно фильтруется: система скроет все товары, у которых свободный остаток равен нулю.
  5. Выбираем необходимые позиции двойным кликом, указываем количество и нажимаем кнопку Перенести в документ.

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

Варианты программной доработки (для разработчиков)

Если для пользователей критически важно производить выбор с фильтрацией именно через стандартное поле ввода в строке табличной части, рассмотрим способы реализации этой задачи с помощью расширения конфигурации.

Способ 1: Перенаправление события НачалоВыбора на форму подбора

Наиболее надежный вариант без дублирования логики расчета остатков — перехват события начала выбора в поле номенклатуры и открытие типовой формы подбора.

Посмотрим на пример обработчика в модуле формы документа:


&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("Склад", Объект.Склад);
    ПараметрыПодбора.Вставить("ТолькоВНаличии", Истина);
    
    ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма", ПараметрыПодбора, ЭтотОбъект);
КонецПроцедуры

Способ 2: Использование кастомной формы выбора с параметризованным динамическим списком

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

Разберем по шагам создание такой формы:

  1. В динамическом списке формы настраивается запрос с соединением с регистром остатков:
    
    ВЫБРАТЬ
        СпрНоменклатура.Ссылка КАК Ссылка,
        СпрНоменклатура.Наименование КАК Наименование,
        ЕСТЬNULL(Остатки.ВНаличииОстаток, 0) КАК Остаток
    ИЗ
        Справочник.Номенклатура КАК СпрНоменклатура
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(
                &Период,
                Склад = &Склад) КАК Остатки
            ПО СпрНоменклатура.Ссылка = Остатки.Номенклатура
    ГДЕ
        НЕ СпрНоменклатура.ЭтоГруппа
    
  2. В событии формы ПриСозданииНаСервере склад передается в параметры запроса динамического списка:
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Параметры.Свойство("Склад") Тогда
            Список.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад);
        КонецЕсли;
    КонецПроцедуры
    
  3. В форме заказа в процедуре ТоварыНоменклатураНачалоВыбора отключаем стандартную обработку и открываем созданную форму выбора, передавая в структуре параметров склад из документа.

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

← На главную