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