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