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