Условия:
1) До записи нового документа счет-фактура выданный аванс показать его заполненную, по основанию, форму и предложить пользователю интерактивно его записать;
2) Обработку создания документа сделать внешней и подключаемой к форме документа основания.
Нюанс: У документа счет-фактура выданный аванс в конфигурации оснований не задано.
Решение:
Шаг 1.
Понятно, что от нас требуется создать внешнюю обработку вида "СозданиеСвязанныхОбъектов" и подключить её в информационную базу.
Приведу код в модуле обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ПоступлениеБезналичныхДенежныхСредств");
ПараметрыРегистрации.Вставить("Вид", "СозданиеСвязанныхОбъектов");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Создать документ счет-фактура на аванс на основании документа поступление безналичных денежных средств");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части к документу счет-фактура выданный аванс");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Счет-фактура на аванс",
"Счет-фактура на аванс",
"ВызовКлиентскогоМетода",
Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Истина, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Так как нам придется работать с формами объектов, мы просто вынуждены использовать метод ВызовКлиентскогоМетода для вызова команды внешней обработки.
Напомню, при использовании ВызовСерверногоМетода с формами объектов работать не получится.
Подробнее о типовых принципах создания внешних подключаемых обработок и печатных форм вы можете почитать здесь.
Шаг 2.
Так как мы использовали ВызовКлиентскогоМетода, то обязательную процедуру, для внешней подключаемой обработки создания связанных объектов, ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт, необходимо выполнять &НаКлиенте в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит, и поместим внутрь модуля формы следующий код:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
//Переберем все выбранные документы на основании, которых будет созданы другие новые документы
//В нашем случае это всего один документ "Поступление безналичных денежных средств"
Для каждого Элемент из ОбъектыНазначенияМассив Цикл
//Получая форму объекта создаваемого документа, мы уже создаем этот объект
ФормаДок = ПолучитьФорму("Документ.СчетФактураВыданныйАванс.ФормаОбъекта");
//Далее мы получаем объект только, что созданной формы и помещаем её в переменную
//В объекте содержатся все реквизиты (элементы) формы
ДанныеФормы = ФормаДок.Объект;
//Мы помещаем объект формы в переменную,
//так как должны передать её в процедуру на сервере,
//где нельзя изменять объект формы, зато можно править переменную содержащую его
СоздатьНовыйДокумент(Элемент, ДанныеФормы);
//После выполнения процедуры на сервере мы получаем изменную переменную ДанныеФормы,
//которую необходимо передать в уже созданную нами форму
КопироватьДанныеФормы(ДанныеФормы, ФормаДок.Объект);
//Открываем результат выполнения обработки
ФормаДок.Открыть();
КонецЦикла;
КонецПроцедуры
Ниже приведу код, который у вас может быть совершенно другим, и делать какие-либо другие манипуляции с объектом формы:
&НаСервере
Процедура СоздатьНовыйДокумент(Элемент, НовыйОбъект)
Основание = Элемент.Ссылка;
НовыйОбъект.Дата = ТекущаяДата();
НовыйОбъект.Организация = Основание.Организация;
НовыйОбъект.ДокументОснование = Основание;
НовыйОбъект.Контрагент = Основание.Контрагент;
ДанныеОснования = ПолучитьДанныеОснованияНаСервере(НовыйОбъект.ДокументОснование);
ЗаполнитьЗначенияСвойств(НовыйОбъект, ДанныеОснования);
Для каждого СтрокаТЧ из Основание.РасшифровкаПлатежа Цикл
НоваяСтрока = НовыйОбъект.Авансы.Добавить();
Если ЗначениеЗаполнено(СтрокаТЧ.СчетНаОплату) Тогда
НоваяСтрока.Содержание = "Предварительная оплата" + ФормированиеПечатныхФорм.СформироватьЗаголовокДокумента(СтрокаТЧ.СчетНаОплату, НСтр("ru=' по счету на оплату'"));
КонецЕсли;
НоваяСтрока.Сумма = СтрокаТЧ.Сумма;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118;
ТекПроцентНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(НоваяСтрока.СтавкаНДС);
НоваяСтрока.СуммаНДС = ЦенообразованиеКлиентСервер.РассчитатьСуммуНДС(НоваяСтрока.Сумма, ТекПроцентНДС);
КонецЦикла;
НовыйОбъект.Сумма = НовыйОбъект.Авансы.Итог("Сумма");
НовыйОбъект.СуммаНДС = НовыйОбъект.Авансы.Итог("СуммаНДС");
КонецПроцедуры
&НаСервере
Функция ПолучитьДанныеОснованияНаСервере(ДокументОснование)
ДанныеОснования = Документы.СчетФактураВыданныйАванс.ПолучитьВходящиеНомерДатуДокумента(ДокументОснование);
Возврат ДанныеОснования;
КонецФункции
В результате наша задача будет выполнена, документ счет-фактура выданный аванс будет создан на основании документа поступление безналичных денежных средств из его же формы. Но при этом созданный документ не будет записан в информационную базу, а будет открыта только его заполненная форма с возможностью интерактивной записи, проведением и возможностью редактирования.
Если есть более оптимальные, более правильные решения поставленной задачи, сообщайте об этом мне или публикуйтесь самостоятельно, не молчите. На данный момент информации о внешних подключаемых обработках на управляемом приложении почти нет, даже книги Радченко М.Г. дают её в ограниченном объеме.
P.S. Следующая задача, которую я пытаюсь решить: внешняя подключаемая обработка заполнения объекта без его записи в информационную базу.
Релиз платформы: 8.2.13.219 Файл-сервер