Понятно, что многие гуру знают об этой возможности, но статья все же не для них. Предупреждаю сразу. :)
Есть разные виды внешних отчетов и обработок:
// Вид - строка - возможные значения: "ДополнительнаяОбработка"
// "ДополнительныйОтчет"
// "ЗаполнениеОбъекта"
// "Отчет"
// "ПечатнаяФорма"
// "СозданиеСвязанныхОбъектов"
Поговорим о последнем виде... Как оказалось - это достаточно мощная возможность добавить новый функционал без необходимости непосредственного изменения конфигурации. Лучше всего рассмотрим на примере:
Мне была поставлена следующая задача.
Задача: Есть УТ 11, с одним складом и несколькими складскими помещениями и ордерной схемой работы. При закупке имеем следующее:
Заказ поставщику → Поступление товаров → Приходный ордер (центральное помещение) → [?] Перемещение (в другие помещения)
И все бы хорошо, но на последнем шаге, после того, как товар будет оприходован в центральное помещение, его начинают перемещать в другие помещения в рамках одного склада. Т.е. документ "Перемещение товаров" не сделать, все необходимо делать с помощью "Ордера на перемещение товаров", который выпадает из схемы закупки. И так получается, что этот документ нельзя создать на основании "Приходного ордера", или документа "Поступление товаров". Подходим к вопросу о том, как это сделать.
Необходимо: Добавить возможность создания документа "Ордер на перемещение товаров" на основании "Приходного ордера".
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
// Добавим куда нужно вставить возможность создания на основании
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ПриходныйОрдерНаТовары");
ПараметрыРегистрации.Вставить("Вид" , "СозданиеСвязанныхОбъектов");
ПараметрыРегистрации.Вставить("Назначение" , МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование" , "Создать ордер на перемещение товаров на основании приходного ордера");
ПараметрыРегистрации.Вставить("Версия" , "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим" , Истина);
ПараметрыРегистрации.Вставить("Информация" , "Дополнительная обработка");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавим команду
ДобавитьКоманду(
ТаблицаКоманд,
"Ордер на перемещение товаров",
"Ордер на перемещение товаров",
"ВызовКлиентскогоМетода",
Истина
);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление" , Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор" , Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование" , Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение" , Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор" , Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Истина, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Добавляем форму, в которой описываем перезаполнение:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
//Переберем все выбранные документы на основании, которых будет созданы другие новые документы
Для каждого Элемент из ОбъектыНазначенияМассив Цикл
//Получая форму объекта создаваемого документа
ФормаДок = ПолучитьФорму("Документ.ОрдерНаПеремещениеТоваров.ФормаОбъекта");
//Далее мы получаем объект только, что созданной формы и помещаем её в переменную
//В объекте содержатся все реквизиты (элементы) формы
ДанныеФормы = ФормаДок.Объект;
//Мы помещаем объект формы в переменную,
//так как должны передать её в процедуру на сервере,
//где нельзя изменять объект формы, зато можно править переменную содержащую его
СоздатьНовыйДокумент(Элемент, ДанныеФормы);
//После выполнения процедуры на сервере мы получаем изменную переменную ДанныеФормы,
//которую необходимо передать в уже созданную нами форму
КопироватьДанныеФормы(ДанныеФормы, ФормаДок.Объект);
//Открываем результат выполнения обработки
ФормаДок.Открыть();
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СоздатьНовыйДокумент(Элемент, НовыйОбъект)
// Заполняем
Основание = Элемент.Ссылка;
НовыйОбъект.Дата = ТекущаяДата();
НовыйОбъект.Склад = Основание.Склад;
НовыйОбъект.ПомещениеОтправитель= Основание.Помещение;
// Переносим строки
Для каждого СтрокаТЧ из Основание.Товары Цикл
ЗаполнитьЗначенияСвойств(НовыйОбъект.Товары.Добавить(), СтрокаТЧ);
КонецЦикла;
КонецПроцедуры
Все.
Добавляем в дополнительные отчеты и обработки и можем работать! Все получилось достаточно просто и быстро.
Всем удачи.