fbpx

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

Решение 1 я подробно описал в прошлой записи. Однако, мне не давали покоя некоторые проблемы данного решения.
В частности, способ обновления данных формы объекта после выполнения обработки данных был не универсален или не элегантный. Поэтому штудирование интернета, ИТС документации БСП, в купе с отладчиком — принесло данное решение — делюсь с интернетом!

Решение. Способ 2

Собственно разбираемый далее вариант является более правильным, с точки зрения разработчиков БСП.

1. Начинаем, как положено, с модуля обработки — добавляем экспортную процедуру СведенияОВнешнейОбработке

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

Тут 2 ключевых момента:

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

Также как и Варианте 1 — появится кнопка

2. Далее, в соответствии с моделью реализации БСП при данном варианте регистрации обработки, будет реализован вызов клиентской процедуры (т.е. процедуры модуля формы &НаКлиенте) «ВыполнитьКоманду«, которая передаст нужный нам контекст (ИдентификаторКоманды, ОбъектыНазначения).

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

Но по условиям нашей задачи — этого не достаточно?! Мы планировали поработать с формой, после чего пользователь нажмет кнопку «Обработать».

— Что нам нужно с этим сделать?
— Открыть нашу обработку второй раз, принудительно, уже из процедуры «ВыполнитьКоманду» и передать в нее нужный нам контекст!
Мало того — и это самый главный бонус данного способа решения задачи — после закрытия мы можем отработать событие закрытия и обновить данные самого объекта(!). В нашем примере — это документ «Поступление безналичных денежных средств».

Подводя итог написанному выше:

  • При выполнении клиентской процедуры «ВыполнитьКоманду» сохраняем ссылку на открытый ранее объект, которая приходит в виде первого элемента массива: ОбъектыНазначения[0]
  • Открываем повторно нашу форму ОткрытьФорму(«ВнешняяОбработка.ЗагрузкаПлатежей2.Форма.пп_ФормаЗагрузки», ….
  • ПриСозданииНаСервере — отрабатываем переданный нами контекст. Главное не забыть записать где-то ссылку на обрабатываемый объект
  • Для отработки события закрытия нашей формы — добавляем процедуру «ВыполнитьПослеЗакрытия», которая обновит данные формы объекта («Поступление безналичных денежных средств») командой ВладелецФормы.Прочитать()
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	ЗапросПараметров = ОткрытьФорму("ВнешняяОбработка.ЗагрузкаПлатежей2.Форма.пп_ФормаЗагрузки",
		Новый Структура("ОбъектыНазначения", ОбъектыНазначения), ОбъектыНазначения[0],,,,Новый ОписаниеОповещения("ВыполнитьПослеЗакрытия", ЭтаФорма));
КонецПроцедуры 

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

	Шаг = 0;
	УправлениеВидимостьюЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеЗакрытия(Результат, Параметры) Экспорт
    Если НЕ ВладелецФормы = Неопределено Тогда
        ВладелецФормы.Прочитать();
    КонецЕсли;
КонецПроцедуры 

Команда ВладелецФормы.Прочитать() — которую мы можем выполнить с клиента — самый главный бонус данного способа регистрации.

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

После нажатия кнопки выполнить, добавляем команду

    Закрыть();

После чего форма будет закрыта, а данные документа — обновлены. Все готово!

Вот собственно и все Решение 2.

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


Решение 1 можно посмотреть здесь.

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

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