Как изменить цены в подборе номенклатуры для конкретного документа в 1С?

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

При доработке типовых и отраслевых конфигураций (например, на базе ДАЛИОН или типовых решений 1С) часто возникает задача изменить логику расчета или подстановки цен в подборе номенклатуры. Однако подбор — это универсальный механизм, используемый десятками разных документов. Если напрямую изменить общий модуль или обработку подбора, новые цены начнут подставляться во все документы системы.

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

Причина сложности и основные подходы к решению

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

Для решения задачи мы можем пойти несколькими путями:

  1. Определить документ-владелец через контекст формы (ВладелецФормы).
  2. Добавить необязательный параметр в процедуры общих модулей.
  3. Выполнить пересчет цен на стороне документа при переносе товаров.
  4. Использовать внешнюю обработку заполнения табличной части или механизмы расширений.

Способ 1. Определение контекста через ВладелецФормы

Проанализируем ситуацию: подбор номенклатуры всегда открывается из какой-либо формы документа. Это означает, что у формы обработки подбора есть свойство ВладелецФормы, через которое можно обратиться к контексту вызывающего документа.

Разберем, как получить тип документа непосредственно в обработке подбора или вызываемом модуле без передачи дополнительных параметров по цепочке:


// Получаем форму-владельца подбора
ФормаВладелец = ЭтаФорма.ВладелецФормы;

Если ФормаВладелец <> Неопределено Тогда
    // Проверяем тип документа или имя метаданных
    Попытка
        ДокументСсылка = ФормаВладелец.ДокументОбъект.Ссылка;
        ИмяДокумента = ДокументСсылка.Метаданные().Имя;
    Исключение
        ИмяДокумента = "";
    КонецПопытки;
    
    Если ИмяДокумента = "ВозвратПоставщику" Тогда
        // Применяем свой алгоритм запроса и подстановки цен
    КонецЕсли;
КонецЕсли;

Этот подход позволяет сохранить сигнатуру общих процедур неизменной и не менять цепочки вызовов во всей конфигурации.

Способ 2. Использование необязательных параметров с значениями по умолчанию

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

Рассмотрим пример модификации процедуры ЗаполнитьЦену:


Процедура ЗаполнитьЦену(ОформленияСтрок, СписокНоменклатуры, ИмяКолонкиЦена, КатегорияЦен, ТипЦен = Неопределено) Экспорт

    Если ТипЦен = Неопределено Тогда
        // Выполняется штатный запрос и заполнение цен для всех документов
    Иначе
        // Выполняется ваш специальный запрос цен для документа "Возврат поставщику"
    КонецЕсли;

КонецПроцедуры

Благодаря значению ТипЦен = Неопределено все существующие вызовы процедуры из других документов продолжат работать в штатном режиме без ошибок.

Способ 3. Пересчет цен на стороне документа после переноса из подбора

Выясним, обязательно ли менять сам подбор. В некоторых случаях проще оставить подбор абсолютно типовым, а логику пересчета цен вынести в форму документа «Возврат поставщику».

Посмотрим на алгоритм работы данного подхода:

  1. Пользователь открывает стандартный подбор и выбирает нужные товары.
  2. При закрытии подбора товары попадают в обработчик события ОбработкаВыбора формы документа.
  3. В форме документа вызвается процедура пересчета, которая выполняет запрос к нужным ценам (например, по последним ценам поступления или специальному типу цен) и перезаполняет колонку Цена и сумму в табличной части.

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

Способ 4. Внешняя обработка или механизмы расширений

Если система работает на платформе 8.3, наиболее технологичным решением является использование расширений конфигурации. В расширении можно перехватить процедуру ЗаполнитьЦену с помощью аннотации &Вместо или &Перед:

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

← На главную