Внешняя обработка заполнения объекта

 

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

Рассмотрим на примере. Заполним элемент ДеревоЦен (реквизит формы, не реквизит Объекта!) формы документа Установка цен номенклатуры конфигурации УТ 11.0.7.21:

Элемент ДеревоЦен

В элемент ДеревоЦен записываются данные по номенклатуре, а в подчиненные номенклатуре строки – данные по характеристикам номенклатуры. В результате в табличной части Товары документа Установка цен номенклатуры находятся строки по Номенклатуре (без характеристики) и строки по Характеристикам номенклатуры (т.е. получается как развернутый вид дерева значений ДеревоЦен).

Элемент ДеревоЦен будем заполнять товарами из ассортимента выбранного партнера, для этого в конфигурацию добавлен регистр сведений пр_АссортиментТоваров с измерениями Партнер и Характеристика; в документ Установка цен номенклатуры добавлен реквизит пр_Партнер.

Т.к. рассматриваем пример внешней обработки по заполнению объекта, то в модуле внешней обработки прописываем соответствующие процедуры:

Функция СведенияОВнешнейОбработке() Экспорт
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.УстановкаЦенНоменклатуры");
 
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заполнение Установки цен номенклатуры");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка Заполнение Установки цен номенклатуры по Ассортименту товаров");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Заполнить по Ассортименту товаров", "_ЗаполнениеУстановкиЦенНоменклатуры", "ВызовКлиентскогоМетода", Истина);
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

Функция ПолучитьТаблицуКоманд()
  Команды = Новый ТаблицаЗначений;
  Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
  Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
  Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
  Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Далее, т.к. используем ВызовКлиентскогоМетода, добавляем форму обработки. В модуле формы обработки прописываем процедуру ВыполнитьКоманду():

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
                Документ = ОбъектыНазначенияМассив[0];
               
                Парам = Новый Структура("Ключ", Документ);
                Форма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента", Парам);
               
                ДеревоЦенДанныеФормы = Форма.ДеревоЦен;
                Заполнить(ДеревоЦенДанныеФормы, Документ);    
                КопироватьДанныеФормы(ДеревоЦенДанныеФормы, Форма.ДеревоЦен);
КонецПроцедуры        

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

После подключения внешней обработки в пользовательском режиме (после добавления в справочник Дополнительные отчеты и обработки), в документе Установка цен номенклатуры появится кнопка Заполнение…, после нажатия на которую появится окно Команды заполнения объектов с названием команды, которую мы прописали в модуле объекта внешней обработки в процедуре СведенияОВнешнейОбработке() в строке «ДобавитьКоманду(ТаблицаКоманд, “Заполнить по Ассортименту товаров”»:

Заполнение документа