Как перехватить создание документа установки цен из поступления в 1С:Розница?

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

При работе с конфигурацией 1С:Розница 2 (а также другими решениями на базе БСП, такими как УТ 11, КА 2 или ERP) часто возникает задача изменить стандартную логику создания документов на основании. Рассмотрим ситуацию: нам необходимо при создании документа УстановкаЦенНоменклатуры из документа ПоступлениеТоваровУслуг автоматически добавлять в табличную часть все характеристики поступившей номенклатуры, а не только те, что указаны в накладной. Это критически важно для обеспечения актуальности прайс-листа по всей линейке характеристик одного товара.

Многие разработчики сталкиваются с тем, что в модуле формы документа-источника отсутствуют явные команды вызова. Это связано с тем, что механизмы формирования меню «Создать на основании» в современных конфигурациях автоматизированы. Давайте подробно разберем, где именно нужно «ловить» создание документа и как правильно реализовать дозаполнение данными.

Анализ механизмов создания документов на основании

Для начала проанализируем, как платформа и конфигурация взаимодействуют при нажатии кнопки «Создать на основании». В старых конфигурациях на обычных формах мы могли найти конкретную кнопку и ее обработчик. В Рознице 2 используется механизм подключаемых команд (подсистема БСП). Это означает, что список команд формируется динамически при открытии формы.

Однако, вне зависимости от того, как была вызвана команда — интерактивно пользователем или программно из другого объекта — основным «входом» для инициализации нового документа является обработчик ОбработкаЗаполнения в модуле объекта документа-приемника (в нашем случае — УстановкаЦенНоменклатуры).

Использование обработчика ОбработкаЗаполнения

Рассмотрим по шагам, как работает этот механизм. Когда система инициирует создание нового документа на основании другого объекта, управление передается в процедуру ОбработкаЗаполнения. В параметр ДанныеЗаполнения передается ссылка на документ-источник.

Выясним, как нам правильно вклиниться в этот процесс. Нам необходимо выполнить следующие действия:

  1. Проверить, что заполнение происходит именно на основании документа ПоступлениеТоваровУслуг.
  2. Позволить системе выполнить стандартное заполнение (чтобы подтянулись основные товары, цены и настройки).
  3. Дополнить документ недостающими характеристиками по каждой номенклатурной позиции.

Посмотрим на пример кода, который можно разместить в модуле объекта УстановкаЦенНоменклатуры:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Проверяем, что в качестве данных заполнения передана ссылка на поступление
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
        
        // Здесь можно либо оставить СтандартнаяОбработка = Истина, 
        // чтобы БСП отработала свой код, либо полностью перехватить управление.
        // В Рознице часто вызывается общий модуль:
        // УстановкаЦенНоменклатурыСервер.ЗаполнитьПоПоступлению(ЭтотОбъект, ДанныеЗаполнения);
        
        // После стандартного заполнения реализуем свою логику
        ДозаполнитьВсемиХарактеристиками(ДанныеЗаполнения);
        
    КонецЕсли;

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

Алгоритм получения всех характеристик номенклатуры

Проанализируем ситуацию: в документе поступления может быть 5 позиций «Товар А» с разными характеристиками. Наша задача — найти в справочнике ХарактеристикиНоменклатуры вообще все записи, владельцем которых является этот «Товар А», и добавить их в установку цен, если их там еще нет.

Разберем пример реализации вспомогательной процедуры. Обратите внимание, что мы используем временные таблицы для эффективной работы с запросом:


Процедура ДозаполнитьВсемиХарактеристиками(ИсточникСсылка)
    
    // Создаем запрос для получения всех характеристик по товарам из поступления
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ПоступлениеТовары.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ВТ_ТоварыПоступления
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТовары
    |ГДЕ
    |	ПоступлениеТовары.Ссылка = &ИсточникСсылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ХарактеристикиНоменклатуры.Владелец КАК Номенклатура,
    |	ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
    |ИЗ
    |	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |ГДЕ
    |	ХарактеристикиНоменклатуры.Владелец В
    |			(ВЫБРАТЬ
    |				ВТ_ТоварыПоступления.Номенклатура
    |			ИЗ
    |				ВТ_ТоварыПоступления КАК ВТ_ТоварыПоступления)";
    
    Запрос.УстановитьПараметр("ИсточникСсылка", ИсточникСсылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Логика проверки: если такой пары Номенклатура + Характеристика еще нет в ТЧ Товары
        ПараметрыПоиска = Новый Структура("Номенклатура, Характеристика", Выборка.Номенклатура, Выборка.Характеристика);
        НайденныеСтроки = ЭтотОбъект.Товары.НайтиСтроки(ПараметрыПоиска);
        
        Если НайденныеСтроки.Количество() = 0 Тогда
            НоваяСтрока = ЭтотОбъект.Товары.Добавить();
            НоваяСтрока.Номенклатура = Выборка.Номенклатура;
            НоваяСтрока.Характеристика = Выборка.Характеристика;
            // Здесь также необходимо заполнить цены, ед. изм. и прочие реквизиты
            // согласно логике вашей конфигурации
        КонецЕсли;
        
    КонецЦикла;

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

Местонахождение команд в интерфейсе (БСП)

Вернемся к вопросу о том, почему команд нет на форме. В Рознице 2 используется подсистема «Подключаемые команды». Проанализируем механизм их регистрации. Обычно в модуле менеджера документа (например, ПоступлениеТоваровУслуг) существует процедура:

Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, КнопкиКоманд, Параметры) Экспорт

Именно здесь описывается, какие документы могут создаваться на основании текущего. Если вам нужно полностью изменить поведение самой кнопки (например, открывать вместо документа специальную обработку), то искать точку входа нужно именно здесь. Но для изменения логики заполнения документа ОбработкаЗаполнения остается самым правильным и надежным методом.

Реализация через расширение конфигурации

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

  1. Создадим новое расширение или откроем существующее.
  2. Добавим в расширение документ УстановкаЦенНоменклатуры.
  3. В модуле объекта документа в расширении добавим обработчик &После("ОбработкаЗаполнения").

Рассмотрим пример кода в расширении:


&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
        // Вызываем нашу процедуру дозаполнения. 
        // Важно: на этот момент стандартное заполнение уже отработало.
        ДозаполнитьВсемиХарактеристиками(ДанныеЗаполнения);
    КонецЕсли;
    
КонецПроцедуры

Этот метод хорош тем, что он не мешает работе типового кода. Сначала 1С выполнит все стандартные действия по заполнению цен из поступления, а затем ваш код «докинет» в таблицу остальные характеристики, которые не попали в приходную накладную.

Важные нюансы при работе с ценами в Рознице 2

Проанализируем еще один важный момент: в Рознице 2 документ УстановкаЦенНоменклатуры может работать в разных режимах. Иногда создание документа инициируется не напрямую через «Создать на основании», а через обработку «Цены номенклатуры».

Если вы обнаружите, что при использовании определенных кнопок в интерфейсе ОбработкаЗаполнения не вызывается, проверьте общий модуль УстановкаЦенНоменклатурыСервер или ЦенообразованиеВызовСервера. В современных версиях логика может быть вынесена в функции вида ЗаполнитьПараметрыУстановкиЦен. Однако в 90% случаев для задачи создания на основании стандартного документа «Поступление товаров» метода с ОбработкаЗаполнения будет более чем достаточно.

Резюмируем: для перехвата создания документа используйте модуль объекта приемника. Для чистоты кода и простоты обновлений используйте расширение с аннотацией &После. Это обеспечит стабильную работу системы и позволит реализовать любую сложную логику переоценки характеристик.

← На главную