Управляемое приложение. Внешняя обработка. Создание связанных объектов


Задача: В "1С:Управление торговлей 11" (релиз 11.06.7). Создать документ Счет-фактура выданный аванс на основании документа Поступление безналичных денежных средств из формы документа или из формы списка документов.

Условия:

1) До записи нового документа счет-фактура выданный аванс показать его заполненную, по основанию, форму и предложить пользователю интерактивно его записать;

2) Обработку создания документа сделать внешней и подключаемой к форме документа основания.

Нюанс: У документа счет-фактура выданный аванс в конфигурации оснований не задано.

Решение:

Шаг 1.

Понятно, что от нас требуется создать внешнюю обработку вида "СозданиеСвязанныхОбъектов" и подключить её в информационную базу.

Приведу код в модуле обработки:

 

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ПоступлениеБезналичныхДенежныхСредств");

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

ТаблицаКоманд = ПолучитьТаблицуКоманд();

ДобавитьКоманду(ТаблицаКоманд,
"Счет-фактура на аванс",
"Счет-фактура на аванс",
"ВызовКлиентскогоМетода",
Истина);

ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

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

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

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


Так как нам придется работать с формами объектов, мы просто вынуждены использовать метод ВызовКлиентскогоМетода для вызова команды внешней обработки.

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

Подробнее о типовых принципах создания внешних подключаемых обработок и печатных форм вы можете почитать здесь.

Шаг 2.

Так как мы использовали ВызовКлиентскогоМетода, то обязательную процедуру, для внешней подключаемой обработки создания связанных объектов, ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт, необходимо выполнять &НаКлиенте в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит, и поместим внутрь модуля формы следующий код:

 

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт

//Переберем все выбранные документы на основании, которых будет созданы другие новые документы
//В нашем случае это всего один документ "Поступление безналичных денежных средств"
Для каждого Элемент из ОбъектыНазначенияМассив Цикл

//Получая форму объекта создаваемого документа, мы уже создаем этот объект
ФормаДок = ПолучитьФорму("Документ.СчетФактураВыданныйАванс.ФормаОбъекта");

//Далее мы получаем объект только, что созданной формы и помещаем её в переменную
//В объекте содержатся все реквизиты (элементы) формы
ДанныеФормы = ФормаДок.Объект;

//Мы помещаем объект формы в переменную,
//так как должны передать её в процедуру на сервере,
//где нельзя изменять объект формы, зато можно править переменную содержащую его
СоздатьНовыйДокумент(Элемент, ДанныеФормы);

//После выполнения процедуры на сервере мы получаем изменную переменную ДанныеФормы,
//которую необходимо передать в уже созданную нами форму
КопироватьДанныеФормы(ДанныеФормы, ФормаДок.Объект);

//Открываем результат выполнения обработки
ФормаДок.Открыть();
КонецЦикла;

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


Ниже приведу код, который у вас может быть совершенно другим, и делать какие-либо другие манипуляции с объектом формы:

 

&НаСервере
Процедура СоздатьНовыйДокумент(Элемент, НовыйОбъект)

Основание = Элемент.Ссылка;

НовыйОбъект.Дата = ТекущаяДата();
НовыйОбъект.Организация = Основание.Организация;
НовыйОбъект.ДокументОснование = Основание;
НовыйОбъект.Контрагент = Основание.Контрагент;
ДанныеОснования = ПолучитьДанныеОснованияНаСервере(НовыйОбъект.ДокументОснование);
ЗаполнитьЗначенияСвойств(НовыйОбъект, ДанныеОснования);

Для каждого СтрокаТЧ из Основание.РасшифровкаПлатежа Цикл
НоваяСтрока = НовыйОбъект.Авансы.Добавить();
Если ЗначениеЗаполнено(СтрокаТЧ.СчетНаОплату) Тогда
НоваяСтрока.Содержание = "Предварительная оплата" + ФормированиеПечатныхФорм.СформироватьЗаголовокДокумента(СтрокаТЧ.СчетНаОплату, НСтр("ru=' по счету на оплату'"));
КонецЕсли;
НоваяСтрока.Сумма = СтрокаТЧ.Сумма;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118;
ТекПроцентНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(НоваяСтрока.СтавкаНДС);
НоваяСтрока.СуммаНДС = ЦенообразованиеКлиентСервер.РассчитатьСуммуНДС(НоваяСтрока.Сумма, ТекПроцентНДС);
КонецЦикла;

НовыйОбъект.Сумма = НовыйОбъект.Авансы.Итог("Сумма");
НовыйОбъект.СуммаНДС = НовыйОбъект.Авансы.Итог("СуммаНДС");

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

&НаСервере
Функция ПолучитьДанныеОснованияНаСервере(ДокументОснование)

ДанныеОснования = Документы.СчетФактураВыданныйАванс.ПолучитьВходящиеНомерДатуДокумента(ДокументОснование);

Возврат ДанныеОснования;

КонецФункции


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

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

P.S. Следующая задача, которую я пытаюсь решить: внешняя подключаемая обработка заполнения объекта без его записи в информационную базу.

Релиз платформы: 8.2.13.219 Файл-сервер

UPD: Хорошие примеры от Поручик: первый и второй

Файлы обработки:

-