Как подключить новые типы объектов в интегрируемых системах

Интегрируемые системы объединяют данные из разных источников. Для работы с новыми типами объектов разработчикам нужно выполнить определённые действия. Мы рассмотрим основные шаги подключения новых типов объектов, которые надо сделать на примере МЕДЕРП и Дополнения КБФИТ для БГУ.

В этой статье мы поговорим о том, как можно подключить новые типы объектов в интегрируемых системах. На примере добавления нового типа объекта — подразделения — при интеграции МЕДЕРП с 1С: БГУ мы покажем наше закулисье.

1. Подготовительные работы

Любой новый механизм или функциональность обязательно регистрируются на информационном портале КБФИТ:

  • Присваивается тег — механизму присваивается свой персональный тег, который в дальнейшем обрастет информацией, включая:
    • Имя - в нашем случае это «nsi-bgu-pdrz».
    • Группа — фиксируется принадлежность механизма к подсистеме, в нашем случае это — «Механизмы "Централизованное управление нормативно-справочной информацией"».
    • Название — в нашем случае это «МП. НСИ. Формирование подразделения на стороне 1С: БГУ».
    • Ответственный — фиксируется аналитик, который в дальнейшем будет описывать работу механизма.
  • Фиксируются связанные теги — так как механизм является составляющей функциональности, то фиксируем к чему относится:
    • Ф. НСИ. Учет подразделений.
    • Ф. УРУ. Интеграция с 1С: БГУ.
  • Создается статья — для аналитика формируется статья, с описанием общего скелета и демонстрации работы.

Мы создаём тег для заполнения реестра ошибок. Каждая запись реестра будет связана с этим тегом, что позволит легко находить статьи, где описан данный механизм.

2. Внесение изменений на стороне МЕДЕРП

Рассмотрим какие изменения необходимо сделать на стороне основной программы (МЕДЕРП, СИСРП и так далее), на примере МЕДЕРП, а именно — включаем интеграцию справочником «Подразделения».

Расширить перечисления

/content/pmedia/articles/article1p1.png

Необходимо добавить новое значение в перечисление «Типы интегрируемых объектов» (МЕДЕРП_ТипыИнтегрируемыхОбъектов).

В нашем случае добавляется новое значение:

  • Подразделения

Расширить состав определяемых типов

/content/pmedia/articles/article1p1.png

Необходимо внести изменения в состав определяемого типа  «Справочники интегрируемых систем» (МЕДЕРП_СправочникиИнтегрируемыхСистем).

В нашем случае добавляется новое значение:

  • СправочникСсылка.МЕДЕРП_ПодразделенияОрганизаций

Внести изменения в форму элемента справочника

/content/pmedia/articles/article1p1.png

Необходимо внести изменения на форму элемента интегрируемого объекта, в нашем случае это основная форма элемента справочника Подразделения. При этом необходимо:

  • Добавить реквизиты на форме.
  • Добавить команды на форме.
  • Добавить обработчики формы и внести изменения в код.
  • Добавить новый раздел и разместить там реквизиты и команды.

 Для начала необходимо добавить реквизиты:

  • Идентификатор_1С_БГУ — Идентификатор (1С: БГУ), строка 36 символов.
  • ПредставлениеОбъекта_1С_БГУ — Представление объекта (1С: БГУ), строка 150 символов.

Далее необходимо добавить команды:

  • Выгрузить_1С_БГУ — если предполагается что из МЕДЕРП данные будут выгружаться и создаваться на стороне БГУ
    • Заголовок: Выгрузить.
    • Картинка: ВнешнийИсточникДанных.
    • Подсказка: Выгрузить в 1С: БГУ.
    • Действие: Выгрузить_1С_БГУ.
  • Отвязать_1С_БГУ — для обеспечения возможности разорвать связь с объектом БГУ
    • Заголовок: Отвязать.
    • Картинка: Удалить.
    • Подсказка: Разрывает связь с объектом 1С: БГУ.
    • Действие: Отвязать_1С_БГУ.
  • Привязать_1С_БГУ — для обеспечения возможности связать с объектом БГУ
    • Заголовок: Привязать.
    • Картинка: ПолучитьНавигационнуюСсылку.
    • Подсказка: Привязать к объекту 1С: БГУ.
    • Действие: Привязать_1С_БГУ.
  • Актуализировать_1С_БГУ — для обеспечения возможности актуализировать объект БГУ
    • Заголовок: Актуализировать.
    • Картинка: Изменить.
    • Подсказка: Актуализировать в 1С: БГУ.
    • Действие: Актуализировать_1С_БГУ.

Команду «Актуализировать» нужно добавлять, если после создания нового объекта предполагается однократная выгрузка. После этого объект на стороне БГУ живёт своей жизнью и может отличаться от МЕДЕРП. Если в этом нет нужды, достаточно команды «Выгрузить». Для подразделения это избыточно, поэтому ее не будем добавлять. Для анализа работы подобной команды можно обратиться к справочнику «МЕДЕРП_Договора».

Следующим шагом является добавление обработчиков на форме, а именно:

  • РазделыПриСменеСтраницы — для вывода справочной информации обработчик заполняется у элемента «Разделы» вида «страницы».
  • ОбработкаОповещения — при получении оповещений обработчик заполняется у самой формы для обновления информации.

Если на форме нет элемента «Разделы», то его необходимо добавить

Далее необходимо внести изменения в код модуля формы.

  1. Отредактировать обработчик ОбработкаОповещения

    Внести изменения в код обработчика, начало и конец кода отмечены словами "ИнтегрируемыеСистемы".

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

    Внести изменения в код обработчика, начало и конец кода отмечены словами "ИнтегрируемыеСистемы".

     
    ////////////////////////////////////////////////////////////////////////////////
    // ОБРАБОТЧИКИ КОМАНД ФОРМЫ
    #Область ОбработчикиКомандФормы
    
    // ИнтегрируемыеСистемы
    
    ////////////////////////////////////////////////////////////////////////////////
    // ОБРАБОТЧИКИ КОМАНД ИНТЕГРИРУЕМЫЕ СИСТЕМЫ
    #Область Обработчики_ИнтегрируемыхСистем
    
    // Производит привязку к 1С:БГУ.
    //
    &НаКлиенте
    Процедура Привязать_1С_БГУ						(Команда)
    
    	МЕДЕРП_ИнтегрируемыеСистемыКлиент.ПривязатьКСправочнику(ЭтаФорма
    															,ПредопределенноеЗначение("Перечисление.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С")
    															,ПредопределенноеЗначение("Перечисление.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения")
    															,Объект.Ссылка);
    
    КонецПроцедуры
    
    // Производит очистку привязки к 1С: БГУ.
    //
    &НаКлиенте
    Процедура Отвязать_1С_БГУ						(Команда)
    
        // 1. Инициализация параметров
    	КодОшибки = "";
    	ОписаниеОшибки = "";
    
    	// 2. Очищение связи
    	МЕДЕРП_ИнтегрируемыеСистемыВызовСервера.ОтвязатьОтСправочника(ПредопределенноеЗначение("Перечисление.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С")
    																 ,ПредопределенноеЗначение("Перечисление.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения")
    																 ,Объект.Ссылка
    																 ,КодОшибки
    																 ,ОписаниеОшибки);
    	// 3. Оповещение о наличии ошибки
    	Если Не КодОшибки = "" Тогда
    		МЕДЕРП_ПоказатьПредупрежденияОбОшибке(КодОшибки, ОписаниеОшибки);
    
    	// 4. Оповешение о том, что связь очищена
    	Иначе
    		МЕДЕРП_ПроинформироватьПользователя(НСтр("ru = 'Связь с объектом 1С: БГУ очищена'"));
    		УстановитьВидимостьИДоступность();
    	КонецЕсли;
    
    КонецПроцедуры
    
    // Производит выгрузку в 1С: БГУ.
    //
    &НаКлиенте
    Процедура Выгрузить_1С_БГУ						(Команда)
    
    	// 1. Инициализация параметров
    	КодОшибки = "";
    	ОписаниеОшибки = "";
    
    	// 2. Выгрузка данных
    	МЕДЕРП_ИнтегрируемыеСистемыВызовСервера.БГУ_ВыгрузитьПодразделение(Объект.Ссылка, КодОшибки, ОписаниеОшибки);
    
    	// 3. Информирование о том, что данные выгружены
    	Если КодОшибки = "" Тогда
    		МЕДЕРП_ПроинформироватьПользователя(НСтр("ru = 'Подразделение выгружено'"));
    		УстановитьВидимостьИДоступность();
    
    	// 4. Информирование о наличии ошибки
    	Иначе
    		МЕДЕРП_ПоказатьПредупрежденияОбОшибке(КодОшибки, ОписаниеОшибки)
    	КонецЕсли;
    
    КонецПроцедуры
    
    #КонецОбласти
    
    // ИнтегрируемыеСистемы Конец
    
    #КонецОбласти
    
  3. Отредактировать обработчик УстановитьВидимостьИДоступность

    Внести изменения в код обработчика, начало и конец кода отмечены словами "ИнтегрируемыеСистемы".

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

Как правило, код стандартен и достаточно заменить "Подразделения" на нужный справочник.

Процедура УстановитьВидимостьИДоступность применяется во всех справочниках и документах, она, как правило, есть.

/content/pmedia/articles/article1p1.png

В завершении необходимо добавить раздел "Раздел_Интеграция" и разместить на нем созданные реквизиты и команды.

  • Добавить группу Интеграция (1С:БГУ) (1), разместить:
    • Идентификатор_1С_БГУ.
    • Команды.
  • Добавить группу Интеграция (1С:БГУ) (2), разместить:
    • ПредставлениеОбъекта_1С_БГУ.

Проще всего делать данные процедуры копированием на основе существующих объектов.

Внести изменения в общий модуль «Интегрируемые системы (вызов сервера)»

Необходимо отредактировать общий модуль — «Интегрируемые системы (вызов сервера)» (МЕДЕРП_ИнтегрируемыеСистемыВызовСервера), и внести изменения в тело области — «Экспортные_процедуры_и_функции_1С_БГУ».

Создать процедуру «БГУ_ВыгрузитьПодразделение».

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ИНТЕГРАЦИИ С 1С:БГУ
#Область Экспортные_процедуры_и_функции_1С_БГУ

// Производит выгрузку подразделения в 1С:БГУ.
// 	
// Параметры:
//	Подразделение - СправочникСсылка.МЕДЕРП_ПодразделенияОрганизаций - Содержит ссылку на подразделение
//	КодОшибки - Строка - Содержит код ошибки
//	ОписаниеОшибки - Строка - Содержит код ошибки
//
Процедура 	БГУ_ВыгрузитьПодразделение						(Подразделение, КодОшибки, ОписаниеОшибки) Экспорт

	// 1. Проверка использования интеграции с 1С: БГУ
	Если Константы.МЕДЕРП_ИспользуетсяИнтеграция_1С_БГУ.Получить() = Ложь Тогда
		Возврат
	КонецЕсли;
	
	// 2. Инициализация параметров
	// 2.1. Получение данных из подразделения
	ЗапрашиваемыеДанные = Новый Структура();
	ЗапрашиваемыеДанные.Вставить("Наименование", "Наименование");
	ЗапрашиваемыеДанные = МЕДЕРП_ОбщегоНазначенияВызовСервера.ЗначенияРеквизитовОбъекта(Подразделение,ЗапрашиваемыеДанные);
	// 2.3. Получение данных по идентификатору
	ЗапрашиваемыеДанные.Вставить("Идентификатор", Строка(Подразделение.УникальныйИдентификатор()));
	// 2.4. Получение данных по связанному идентификатору
	Запрос = Новый Запрос();

// Инициализация текста запроса
//
#Область Инициализация_текса_запроса
	Запрос.Текст = "ВЫБРАТЬ
	               |	МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем.Идентификатор КАК Идентификатор
	               |ИЗ
	               |	РегистрСведений.МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем КАК МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем
	               |ГДЕ
	               |	МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем.ОбъектМЕДЕРП = &Подразделение
	               |	И МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем.ИнтегрируемаяСистема = &ИнтегрируемаяСистема
	               |	И МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем.ТипСправочника = &ТипСправочника";
#КонецОбласти	
	Запрос.УстановитьПараметр("Подразделение", 			Подразделение);
	Запрос.УстановитьПараметр("ТипСправочника", 		ПредопределенноеЗначение("Перечисление.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения"));
	Запрос.УстановитьПараметр("ИнтегрируемаяСистема", 	ПредопределенноеЗначение("Перечисление.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С"));
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() И Не Выборка.Идентификатор = "" Тогда
		ЗапрашиваемыеДанные.Вставить("Идентификатор", Выборка.Идентификатор);
	КонецЕсли;

	// 3. Подключение к 1С: БГУ
	Прокси		= Инициализация_Прокси(Перечисления.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С, КодОшибки, ОписаниеОшибки);
	Если Не КодОшибки = "" Тогда
		Возврат
	КонецЕсли;
			
	// 4. Выгрузка данных в 1С: БГУ
	Попытка
		Результат 	= Прокси.ЗагрузитьПодразделение(ЗапрашиваемыеДанные.Идентификатор
													, ЗапрашиваемыеДанные.Наименование);
		Результат	= ЗначениеИзСтрокиВнутр(Результат).Получить();
		Если Не Результат.КодОшибки = "" Тогда
			КодОшибки = Результат.КодОшибки;
			ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Возникла ошибка при выгрузке подразделения: %1'"), Результат.ОписаниеОшибки);
			Возврат
		КонецЕсли;		
	Исключение
		КодОшибки = "МРП_н0448";
		ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Возникла ошибка при выгрузке подразделения: %1'"), ОписаниеОшибки());
		Возврат
	КонецПопытки;
	
	// 5. Фиксация связки в регистре "МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем"
	МенеджерЗаписи = РегистрыСведений.МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.ОбъектМЕДЕРП 		= Подразделение;
	МенеджерЗаписи.ИнтегрируемаяСистема = Перечисления.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С;
	МенеджерЗаписи.ТипСправочника 		= Перечисления.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения;
	МенеджерЗаписи.Идентификатор 		= Результат.Результат.Идентификатор;
	МенеджерЗаписи.Записать();
	
	// 6. Получение изменений из 1С: БГУ
	ПолучитьЭлементыСправочника(Перечисления.МЕДЕРП_ИнтегрируемыеСистемы.БГУ_1С, Перечисления.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения, КодОшибки, ОписаниеОшибки, Ложь); 
	
КонецПроцедуры// ()

#КонецОбласти

Также следует отметить, что в реестре ошибок необходимо добавить новую запись, для идентификации проблем с интеграцией. В нашем случае это — МРП_н0448.

Внести изменения в процедуру «ПолучитьЭлементыСправочника» — отредактировать пункт «3.1. Интеграция с 1С: БГУ».

ИначеЕсли ТипСправочника = Перечисления.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения Тогда
	ТипСправочника_Стр = "Подразделения";

Внести изменения в регистр сведений

Для возможности связывания с объектами 1С:БГУ необходимо внести правки в код модуля формы «Форма связи со справочником интегрируемой системы» (ФормаСвязиСоСправочникомИнтегрируемойСистемы) регистра сведений «МЕДЕРП_СвязанныеЭлементыСправочниковИнтегрируемыхСистем».

Необходимо поправить код процедуры ПриСозданииНаСервере, в пункте «5. Инициализация дополнительных колонок» добавить обработчик:

	// 5.4. Обработка подразделений
	ИначеЕсли ТипСправочника = ПредопределенноеЗначение("Перечисление.МЕДЕРП_ТипыИнтегрируемыхОбъектов.Подразделения") Тогда
		Элементы.Реквизит_1.Заголовок = НСтр("ru = 'Наименование (полное)'");		Элементы.Реквизит_1.Видимость = Истина;
		Элементы.Реквизит_2.Видимость = Ложь;
		Элементы.Реквизит_3.Видимость = Ложь;
	КонецЕсли;

3. Внесение изменений на стороне Дополнение КБФИТ для БГУ

Дальнейшие действия осуществляются на стороне 1С:БГУ, при этом все правки делаются в расширении «Дополнение КБФИТ для БГУ» (в нашем случае — «редакция 1»).

Добавить подразделение в расширение

/content/pmedia/articles/article1p1.png

Для начала необходимо добавить интегрируемый справочник — Подразделение в расширение.

Расширить состав определяемых типов

/content/pmedia/articles/article1p1.png

Необходимо дополнить состав определяемых типов в расширении:

  • КБФИТ. Интегрируемые справочники (ссылка):
    • СправочникСсылка.Подразделения
  • КБФИТ. Интегрируемые справочники (объект):
    • СправочникОбъект.Подразделения

Расширить состав источников подписок

/content/pmedia/articles/article1p1.png

Необходимо внести изменение в состав источников подписок расширения:

  • «КБФИТ. Зафиксировать идентификатор справочника:
    • СправочникОбъект.Подразделения

 

Добавить константу и разместить ее в панели администрирования

/content/pmedia/articles/article1p1.png

Необходимо создать новую константу «КБФИТ. Формировать подразделения».

  • Тип — булево.
  • Имя — «КБФИТ_ФормироватьПодразделения».
/content/pmedia/articles/article1p1.png

Необходимо внести изменения в основную форму обработки «КБФИТ. Панель администрирования», разместить в соответствующем разделе константу «КБФИТ_ФормироватьПодразделения».

  • Имя — «НаборКонстант_КБФИТ_ФормироватьПодразделения».
  • Заголовок — «Формировать подразделения».
  • Путь к данным  — «НаборКонстант.КБФИТ_ФормироватьПодразделения».
  • Действие — «НаборКонстант_Константа_ПриИзменении».

Размещать в основном разделе — «Учет НСИ». При выборе подраздела ориентироваться на подраздел подсистемы НСИ МЕДЕРП-а, в которой размещен справочник. В нашем случае это — «Организация». Если подраздела на форме — нет, то ее надо создать.

Имя элемента заполняется по особому шаблону, где префикс «НаборКонстант_», а потом название константы. В заголовке убрать лишнюю служебную префиксацию константы «КБФИТ. ».

Далее необходимо внести изменения в процедуру «ПриСозданииНаСервере», добавить обработчик заполнения константы:

	// Учет НСИ
	// Учет НСИ: Организация
	МассивИменКонстант.Добавить("КБФИТ_ФормироватьПодразделения");

Расширить операции web-сервиса 

/content/pmedia/articles/article1p1.png

Необходимо добавить новую операцию в web-сервис «KBFIT - exchange (1.0)». Операция должна соответствовать в части названия и параметров, указанных коде общего модуля.

  • Название операции — ЗагрузитьПодразделение. Параметры:
    • Идентификатор — строка, идентификатор подразделения.
    • Наименование — строка, название подразделение.

В общем модуле web-сервиса необходимо добавить обработчик операции:

Функция ЗагрузитьПодразделение					(Идентификатор, Наименование)
	
	Попытка
		КодОшибки = "";
		ОписаниеОшибки 	= "";
		Данные 			= Новый Структура("Результат",КБФИТ_ОбщегоНазначенияВызовСервера.ЗагрузитьПодразделение(Идентификатор, Наименование, КодОшибки, ОписаниеОшибки));
		Данные.Вставить("КодОшибки",КодОшибки);
		Данные.Вставить("ОписаниеОшибки",ОписаниеОшибки);
											
		Возврат ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(Данные,Новый СжатиеДанных(6)));
	Исключение
		Данные = Новый Структура("Результат", "");
		Данные.Вставить("КодОшибки", "МРП_н0447");
		Данные.Вставить("ОписаниеОшибки",СтрШаблон(НСтр("ru = 'Возникла критическая ошибка: %1'"),ОписаниеОшибки()));
		
		Возврат ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(Данные,Новый СжатиеДанных(6)));
	КонецПопытки; 
	
КонецФункции

Также следует отметить, что в реестре ошибок необходимо добавить новую запись, для идентификации проблем с интеграцией. В нашем случае это — МРП_н0447.

Расширить права роли «КБФИТ. Обмен»

/content/pmedia/articles/article1p1.png

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

  • Открыть роль «КБФИТ_Обмен»;
  • Выбрать операцию «ЗагрузитьПодразделение»;
  • Установить галочку «Использование» в разделе Права.

Внести изменения в общий модуль «КБФИТ. Общего назначения вызов сервера»

Необходимо изменить тело процедуры ПолучитьЭлементыСправочника в области Экспортные_процедуры_и_функции_Интеграция. Расширить обработку типа справочника в пункте «2.3. Изменение текста запроса в зависимости от типа документ».

	// 2.3. Изменение текста запроса в зависимости от типа документа
	Если 		ТипСправочника = "ИсточникиФинансированияДетализированные" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "КБФИТ_ИсточникиФинансированияДетализированные", "КБФИТ_ИсточникиФинансированияДетализированные");
	ИначеЕсли	ТипСправочника = "Контрагенты" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "КБФИТ_ИсточникиФинансированияДетализированные", "Контрагенты");
	ИначеЕсли	ТипСправочника = "Подразделения" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "КБФИТ_ИсточникиФинансированияДетализированные", "Подразделения");
	ИначеЕсли	ТипСправочника = "Договора" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "КБФИТ_ИсточникиФинансированияДетализированные", "Договоры");
	Иначе
		КодОшибки = "МРП_н0413";
		ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Не определен обработчик. Справочник: %1'"), ТипСправочника);
		Возврат Неопределено;
	КонецЕсли;

Необходимо добавить процедуру ПолучитьЭлементыСправочника в области Экспортные_процедуры_и_функции_Интеграция. Расширить обработку типа справочника в пункте «2.3. Изменение текста запроса в зависимости от типа документ».


// Возвращает идентификатор, на сформированное подразделение, либо существующее.
// 	
// Параметры:
//  Идентификатор - Строка - идентификатор
//  Наименование - Строка - наименование
//  КодОшибки - Строка - код ошибки
//  ОписаниеОшибки - Строка - описание ошибки
//
// Возвращаемое значение:
//	Структура - содержит идентификатор	
// 
Функция 	ЗагрузитьПодразделение						(Идентификатор, Наименование, КодОшибки, ОписаниеОшибки) Экспорт
	
	// 1. Инициализация параметров
	УстановитьПривилегированныйРежим(Истина);
    Запрос = Новый Запрос();
	Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
	Подразделение = Неопределено;
	
	// 2. Инициализация по существующим идентификаторам

// Инициализация текста запроса
//
#Область Инициализация_текста_запроса
	Запрос.Текст = "ВЫБРАТЬ
	               |	Подразделения.Ссылка КАК Ссылка
	               |ИЗ
	               |	Справочник.Подразделения КАК Подразделения
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КБФИТ_ИдентификаторыСправочников КАК КБФИТ_ИдентификаторыСправочников
	               |		ПО Подразделения.Ссылка = КБФИТ_ИдентификаторыСправочников.ОбъектСистемы
	               |ГДЕ
	               |	КБФИТ_ИдентификаторыСправочников.Идентификатор = &Идентификатор";
#КонецОбласти

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Подразделение = Выборка.Ссылка;
	КонецЕсли;
	
	// 3. Инициализация по существующему идентификатору
	Если Подразделение = Неопределено Тогда
		мПодразделение = Справочники.Подразделения.ПолучитьСсылку(Новый УникальныйИдентификатор(Идентификатор));
		Если Не мПодразделение.ПолучитьОбъект() = Неопределено Тогда
			Подразделение = мПодразделение;
		КонецЕсли;
	КонецЕсли;

	// 4. Инициализация подразделения по наименованию
	Если Подразделение = Неопределено Тогда
		Запрос = Новый Запрос();
		Запрос.УстановитьПараметр("Наименование", Наименование);
		
// Инициализация текста запроса
//
#Область Инициализация_текста_запроса
		Запрос.Текст = "ВЫБРАТЬ
		               |	Подразделения.Ссылка КАК Ссылка
		               |ИЗ
		               |	Справочник.Подразделения КАК Подразделения
		               |ГДЕ
		               |	Подразделения.Наименование = &Наименование";
#КонецОбласти		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			Подразделение = Выборка.Ссылка
		КонецЕсли;		
	КонецЕсли;
	
	// 5. Формирование подразделения
	Если Подразделение = Неопределено И Константы.КБФИТ_ФормироватьПодразделения.Получить() = Истина Тогда

// Обработчики формирования подразделения
//
#Область Формирование_подразделения

		// 1. Начало транзакции
		НачатьТранзакцию();
		
		Попытка

			// 2. Заполнение подразделения
			Подразделение = Справочники.Подразделения.СоздатьЭлемент();
			Подразделение.УстановитьСсылкуНового(Справочники.Подразделения.ПолучитьСсылку(Новый УникальныйИдентификатор(Идентификатор)));
			Подразделение.Владелец 		= Справочники.Организации.ОрганизацияПоУмолчанию();
			Подразделение.Наименование 	= Наименование;

			// 3. Фиксация транзакции
			Если КодОшибки = "" Тогда 
				Подразделение.Записать();
				ЗафиксироватьТранзакцию();
				Возврат Новый Структура("Идентификатор",Строка(Подразделение.Ссылка.УникальныйИдентификатор()))
				
			// 4. Обработка ошибки
			Иначе
				ОтменитьТранзакцию();
				Возврат Новый Структура("Идентификатор","");
			КонецЕсли;		
			
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ОтменитьТранзакцию();
			КодОшибки = "МРП_н0449";
			ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Возникла критическая ошибка. Ошибка: %1'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
			Возврат Новый Структура("Идентификатор","");
		КонецПопытки;
		
#КонецОбласти		
		
	КонецЕсли;
	
	// 6. Контроли
	
	// 6.1. Подразделение не идентифицировано
	Если Подразделение = Неопределено Тогда
		КодОшибки = "МРП_н0450";
		ОписаниеОшибки = НСтр("ru = 'Не идентифицировано подразделение'");
		Возврат Новый Структура("Идентификатор","");
	КонецЕсли;
		
	// 7. Возврат идендификатора подразделения
	Возврат Новый Структура("Идентификатор",Строка(Подразделение.Ссылка.УникальныйИдентификатор()));
			
КонецФункции

Необходимо зафиксировать записи в реестре ошибок. В нашем случае это МРП_н0449 «Обработка технической ошибки при записи подразделения» и МРП_н0450 «Обработка ситуации, когда подразделение не идентифицировано».

Необходимо изменить тело процедуры ЗафиксироватьИдентификаторСправочника в области СлужебныеПроцедурыИФункции. Расширить обработку типа справочника в пункте «// 1. Инициализация данных — переопределеяемый».

	// 4. Инициализация представления объекта системы - Подразделения
	ИначеЕсли ТипЗнч(ОбъектСистемы) = Тип("СправочникСсылка.Подразделения") Тогда
		ЗапрашиваемыеДанные.Вставить("Код");
		ЗапрашиваемыеДанные.Вставить("ПометкаУдаления");
		ЗапрашиваемыеДанные.Вставить("ПредставлениеОбъектаСистемы", "Наименование");
		ЗапрашиваемыеДанные.Вставить("Реквизит_1", "НаименованиеПолное");

4. Тестирование обмена

Мы проведём тестирование перед передачей данных аналитику:

  • Привяжем подразделение к объекту 1С: БГУ вручную.
  • Разорвём связь подразделения с объектом 1С: БГУ.
  • Отработаем автоматический поиск подразделения по наименованию.
  • Отработаем процесс с взведенной галочкой «Формировать подразделения».
  • Отработаем процесс со снятой галочкой «Формировать подразделения».

Заключение

После тестирования мы передадим механизм аналитикам. Работа над ним продолжится, и впереди нас ждёт несколько этапов:

  • Описание механизма:
    • Cоздание статьи или цикла статей.
    • Запись видеороликов.
    • Подготовка тестов;
    • Написание справки.
  • Оформление механизма:
    • Включение в курсы.
    • Включение в руководства.
    • Включение в очередной релиз программы.
  • Формализация интеллектуальной собственности:
    • Регистрация релиза в Федеральной службе по интеллектуальной собственности.
  • Выпуск релиза в продуктивную среду.

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