Пример разработки внешней обработки 1С вида «Заполнение объекта»

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

Среди видов внешних обработок есть такой вид — «Заполнение объекта». С помощью данной обработки можно заполнить справочник или документ исходя из собственных требований. Хорошим примером может являться разноска выписки по договорам или счетам.

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

Итак, что можно сделать с помощью дополнительной внешней обработки вида » Заполнение объекта»?
Можно, например, из формы документа (или справочника) открыть форму обработки, передав в нее контекст вызвавшей ее формы документа, провести некие манипуляции с данными. Звучит непонятно? — Давайте разберем пример.

Решение данной задачи с помощью внешней обработки вида «Заполнение объекта» следующее:

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

Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, "Чтение и запись файла Excel во временном каталоге");
ПараметрыРегистрации.Разрешения.Добавить(Разрешение); 

НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление              = Метаданные().Синоним;
НоваяКоманда.Идентификатор              = Метаданные().Имя;  
НоваяКоманда.Использование              = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение       = Ложь;

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

Тут ключевой параметр: ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()

В этом случае, после регистрации внешней обработки, в форме назначенного документа появится кнопка с вашей командой

Далее, при открытии основной формы обработки, при создании на сервере, получаем входящий контекст:

Тут важно сохранить ссылку на открытый ранее документ, которая придет в виде первого элемента массива: Параметры.ОбъектыНазначения[0]

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

Далее, в форме разрабатываем интерфейс работы с файлом и обработчик загрузки. Например, вот такой интерфейс: выбираем файл Excel, читаем его файл в Табличный документ (с COM-объектом при этом не работаем!), далее обрабатываем открытое содержимое и подготавливаем данные для переноса в соответствии с бизнес-требованиями.

Но далее, есть небольшой нюанс. Мы открыли нашу форму «обработку загрузки» из формы исходного документа с передачей лишь ссылки на него, соответственно, нам нужно:

  • обработать (заполнить табличную часть) и сохранить объект
  • обновить форму открытого документа с уже новыми данными
  • закрыть форму нашей обработки

Если в форме нашего «обрабатываемого» объекта есть обработчик оповещения (процедура формы документа «ОбработкаОповещения»), дело упрощается — мы подключаемся к нему и этот обработчик и обновит данные формы в соответствии с данными объекта (выполнит команду Прочитать() с формы документа). Для этого используем команду Оповестить(«ОбновитьДокументИБПослеЗаполнения», Массив, ЭтаФорма)

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

Если же обработчика нет — тогда хоть и кривенько, но вполне подойдет закрытие исходной формы документа и открытие уже новой формы документа.

Вот собственно и все решение. В принципе, несложное, но пару нюансов содержит

Скачать разбираемую обработку можно здесьСкачать

Позднее появилось и другое решение данной задачи. РЕШЕНИЕ №2

Вам также может понравиться

About the Author: Павел Пчелинцев