
Задача. К примеру, нам необходимо сделать загрузчик данных в табличную часть «Расшифровка платежа» документа «Поступление безналичных денежных средств», а данные для загрузки находятся в файле Excel, который интерактивно выбирает пользователь. Конечно, менять конфигурацию нельзя, расширения добавлять нельзя. В конфигурации используется БСП версии (2++). Такая вот задача.
Среди видов внешних обработок есть такой вид — «Заполнение объекта». С помощью данной обработки можно заполнить справочник или документ исходя из собственных требований. Хорошим примером может являться разноска выписки по договорам или счетам.
В «интернетах» довольно тяжело найти примеры реализации внешних обработок вида «Заполнение объекта» , тем более с описанием. С другой стороны, задачу вполне можно решить без использования этого вида обработок, и с меньшими проблемами. С третьей стороны, отладка таких обработок — задача непростая, невозможная без специального инструментария. Немного помучившись, и решив предложенную задачку, я решил поделиться с коллегами знанием и написать данную статейку.
Итак, что можно сделать с помощью дополнительной внешней обработки вида » Заполнение объекта»?
Можно, например, из формы документа (или справочника) открыть форму обработки, передав в нее контекст вызвавшей ее формы документа, провести некие манипуляции с данными. Звучит непонятно? — Давайте разберем пример.

Решение данной задачи с помощью внешней обработки вида «Заполнение объекта» следующее:
- Создаем внешнюю обработку, в модуле добавляем экспортную процедуру СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.2.45");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.БезопасныйРежим = Истина;
ПараметрыРегистрации.Наименование = Метаданные().Синоним;
ПараметрыРегистрации.Версия = Метаданные().Комментарий;
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеБезналичныхДенежныхСредств");
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, "Чтение и запись файла Excel во временном каталоге");
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = Метаданные().Синоним;
НоваяКоманда.Идентификатор = Метаданные().Имя;
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Тут ключевой параметр: ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()
В этом случае, после регистрации внешней обработки, в форме назначенного документа появится кнопка с вашей командой

Далее, при открытии основной формы обработки, при создании на сервере, получаем входящий контекст:
Тут важно сохранить ссылку на открытый ранее документ, которая придет в виде первого элемента массива: Параметры.ОбъектыНазначения[0]
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") и
Параметры.ОбъектыНазначения <> Неопределено Тогда
ПоступлениеБезналичныхДенежныхСредств =
Параметры.ОбъектыНазначения[0];
ИмяФормыВладельца = Параметры.ИмяФормы;
КонецЕсли;
...
КонецПроцедуры
Далее, в форме разрабатываем интерфейс работы с файлом и обработчик загрузки. Например, вот такой интерфейс: выбираем файл Excel, читаем его файл в Табличный документ (с COM-объектом при этом не работаем!), далее обрабатываем открытое содержимое и подготавливаем данные для переноса в соответствии с бизнес-требованиями.


Но далее, есть небольшой нюанс. Мы открыли нашу форму «обработку загрузки» из формы исходного документа с передачей лишь ссылки на него, соответственно, нам нужно:
- обработать (заполнить табличную часть) и сохранить объект
- обновить форму открытого документа с уже новыми данными
- закрыть форму нашей обработки
Если в форме нашего «обрабатываемого» объекта есть обработчик оповещения (процедура формы документа «ОбработкаОповещения»), дело упрощается — мы подключаемся к нему и этот обработчик и обновит данные формы в соответствии с данными объекта (выполнит команду Прочитать() с формы документа). Для этого используем команду Оповестить(«ОбновитьДокументИБПослеЗаполнения», Массив, ЭтаФорма)
&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
Результат = ЗагрузитьРасшифровкуПлатежа();
Если Результат Тогда
Массив = Новый Массив();
Массив.Добавить(ПоступлениеБезналичныхДенежныхСредств);
Оповестить("ОбновитьДокументИБПослеЗаполнения", Массив, ЭтаФорма);
КонецЕсли;
//ПарамЗакрытия = Новый Структура("Результат, СтрокиРасшифровкаПлатежаВДокумент", "ПеренестиВДокумент", СтрокиРасшифровкаПлатежаВДокумент());
Если Открыта() Тогда
Закрыть();
КонецЕсли;
КонецПроцедуры
Если же обработчика нет — тогда хоть и кривенько, но вполне подойдет закрытие исходной формы документа и открытие уже новой формы документа.
Вот собственно и все решение. В принципе, несложное, но пару нюансов содержит
Скачать разбираемую обработку можно здесьСкачать
Позднее появилось и другое решение данной задачи. РЕШЕНИЕ №2