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