Как настроить отбор по МОЛ в форме подбора номенклатуры для документа «Требование-накладная»

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

При разработке и адаптации типовых решений в 1С:Бухгалтерия предприятия 3.0 часто возникает необходимость кастомизации стандартных механизмов подбора товаров. Одной из популярных задач является реализация фильтрации остатков не только по складу, но и по материально ответственному лицу (МОЛ). Рассмотрим ситуацию, когда при вызове формы подбора из документа Требование-накладная все параметры передаются корректно, однако форма открывается со списком всех товаров, игнорируя фильтр по конкретному сотруднику. Разберем по шагам, как правильно передать параметры и почему фильтрация может «слетать» после обновления конфигурации.

Анализ механизма программного вызова подбора

Для начала проанализируем, как инициируется процесс подбора в управляемом приложении. Обычно в модуле формы документа существует процедура-обработчик команды, которая подготавливает структуру параметров и вызывает форму обработки ПодборНоменклатуры. Посмотрим на типовой пример реализации такой процедуры:


&НаКлиенте
Процедура ОбработкаПодбораМатериалы(Команда)
    ПараметрыПодбора = ПолучитьПараметрыПодбора("Материалы");
    Если ПараметрыПодбора <> Неопределено Тогда
        ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора,
            ЭтаФорма, УникальныйИдентификатор);
    КонецЕсли;
КонецПроцедуры

В данном коде ключевую роль играет функция ПолучитьПараметрыПодбора. Именно в ней формируется «инструкция» для открываемой формы: какие остатки показывать, по какой организации, складу и, в нашем случае, по какому МОЛ. Рассмотрим подробнее формирование этой структуры:


&НаКлиенте
Функция ПолучитьПараметрыПодбора(ИмяТаблицы)
    
    ПараметрыФормы = Новый Структура;
    ДатаРасчетов = ?(НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДата()), Неопределено, Объект.Дата);
    
    ПараметрыФормы.Вставить("ВидПодбора", "");
    
    // Определяем специфику для разных табличных частей
    Если ИмяТаблицы = "Материалы" Тогда
        ПредставлениеТаблицы = НСтр("ru = 'Материалы'");
        ПараметрыФормы.Вставить("ПоказыватьЗабалансовыеОстатки", Ложь);
    КонецЕсли;
    
    // Наполняем структуру данными из документа
    ПараметрыФормы.Вставить("ЕстьКоличество",      Истина);
    ПараметрыФормы.Вставить("ДатаРасчетов",        ДатаРасчетов);
    ПараметрыФормы.Вставить("Организация",         Объект.Организация);
    ПараметрыФормы.Вставить("Склад",               Объект.Склад);
    ПараметрыФормы.Вставить("МОЛ",                 Объект.МОЛ); // Передача нашего фильтра
    ПараметрыФормы.Вставить("ПоказыватьОстатки",   Истина);
    
    Возврат ПараметрыФормы;
КонецФункции

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

Почему отбор может не работать даже при правильной передаче параметров

Если мы убедились, что в момент выхода из функции ПолучитьПараметрыПодбора значение Объект.МОЛ заполнено и успешно помещено в структуру, но форма подбора всё равно игнорирует его, причину следует искать «на той стороне» — в самой обработке ПодборНоменклатуры. Выясним, как форма подбора обрабатывает входящие данные.

Проанализируем ситуацию: в типовой конфигурации 1С:Бухгалтерия учет на складах часто не предусматривает разделения остатков по МОЛ на уровне регистров бухгалтерии (субконто). Если поле МОЛ было добавлено в документ как доработка, то и в обработку подбора должны быть внесены соответствующие изменения. Рассмотрим типичные причины сбоя:

  1. Отсутствие реквизита в форме подбора: Если после обновления конфигурации объект Обработка.ПодборНоменклатуры был замещен типовым, в нем может отсутствовать реквизит формы, в который записывается переданное значение МОЛ.
  2. Отсутствие кода в ПриСозданииНаСервере: В модуле формы подбора должна быть логика, которая считывает Параметры.МОЛ и применяет этот фильтр к динамическому списку остатков.
  3. Потеря программного фильтра в запросе: Динамический список подбора формируется на основе сложного запроса. Чтобы фильтр по МОЛ заработал, этот параметр должен быть задействован в секции ГДЕ или установлен как параметр компоновки данных.

Восстановление логики фильтрации после обновления

Как показывает практика, чаще всего проблема кроется в том, что при обновлении (особенно если оно проводилось в автоматическом режиме) изменения в обработке подбора были затерты. Выясним, как восстановить работоспособность. Разберем шаги по проверке кода внутри обработки ПодборНоменклатуры:

Во-первых, проверим процедуру ПриСозданииНаСервере в модуле формы подбора. В ней должен присутствовать блок кода, принимающий наш параметр. Примерно такой:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // ... стандартный код ...
    Если Параметры.Свойство("МОЛ") Тогда
        МОЛ_ДляФильтра = Параметры.МОЛ;
        // Здесь должна быть логика установки параметра в динамический список
    КонецЕсли;
КонецПроцедуры

Во-вторых, проанализируем, как формируется текст запроса для списка номенклатуры. Если учет по МОЛ ведется через дополнительные разрезы (например, через субконто «Работники организаций» на забалансовых счетах или в расширенном регистре остатков), запрос должен содержать соединение с этими данными. Если же МОЛ — это просто реквизит склада, убедимся, что система правильно связывает выбранный склад и ответственное лицо.

Рекомендации по реализации стабильного отбора

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

Посмотрим на пример того, как можно добавить установку отбора через расширение:


&После("ПриСозданииНаСервере")
Процедура ИмяПрефикс_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("МОЛ") И ЗначениеЗаполнено(Параметры.МОЛ) Тогда
        // Устанавливаем отбор в динамический список "СписокНоменклатура"
        ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МОЛ");
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = Параметры.МОЛ;
        ЭлементОтбора.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

Резюмируем: Если отбор в Требовании-накладной перестал работать, сначала проверьте точку останова в функции ПолучитьПараметрыПодбора, чтобы убедиться в передаче данных. Если данные уходят верно, переходите к анализу модуля формы Обработка.ПодборНоменклатуры. Помните, что при обновлении типовых конфигураций (особенно БП 3.0) механизмы подбора часто претерпевают изменения, и ваши кастомные реквизиты могут просто «исчезнуть» из структуры обработки, что и приводит к потере фильтрации.

← На главную