Универсальный обмен между идентичными конфигурациями через REST интерфейс OData. Часть І: Справочники

19.05.18

Интеграция - Обмен между базами 1C

Сейчас все чаще интеграции различных конфигураций проектируются через HTTP-сервисы - они и работают быстрее, и "войти" в режим отладки гораздо проще, тем самым обойдя "черный ящик" универсального обмена через xml, например. Более года назад я начал работать в компании, в которой разработчики работали с конфигурациями 1С в режиме совместимости еще 8.2.16 (менять режим совместимости в типичных базах мы не хотели) - а как Вы наверное знаете, если интересовались HTTP-сервисами в 1С, их использование в режиме совместимости 8.3.4 и ниже недопустимо - и здесь я уже не надеялся на разработку и использование HTTP-сервисов. Но позже меня заинтересовал такой "сервис" как REST интерфейс OData, так как его можно использовать не меняя режим совместимости конфигурации - именно он и стал для меня идеальным вариантом решения "нетривиальных" задач.

 

Итак, начиная с версии платформы 8.3.5 в 1С появился REST интерфейс OData. Подробнее о его реализацию можно почитать на Зазеркалье 1С  и закрытом разделе ИТС.
В двух словах, REST это способ взаимодействия с помощью HTTP запросов. OData это стандарт описывающих формат ЭТИХ запросов и ответов на них.
Для работы с ним достаточно установить флажок "публиковать стандартный интерфейс OData" при публикации конфигурации на web-сервер (смотрите ниже).

Если в конфигурации установлен режим совместимости 8.3.4 или ниже, то возможна публикация только всех метаданных сразу.
Если же у Вас в конфигурации отключен режим совместимости, то вы можете воспользоваться методом УстановитьСоставСтандартногоИнтерфейсаOData () який позволяет установить список публикуемых объектов. Пример:
&НаСервере
Процедура УстановитьODataНаСервере()
   
   тМассив = Новый Массив;
   тМассив.Добавить(Метаданные.Справочники.ФизическиеЛица);

   УстановитьСоставСтандартногоИнтерфейсаOData(тМассив);

КонецПроцедуры
После ознакомления с данным сервисом (подробнее не буду рассказывать - в интернете уже есть достаточное количество материала для ознакомления), так как в нашей компании более сотни фронт-офисных узлов, было принято решение собирать данные с узлов используя интерфейс OData - сначала данные тех объектов "публичность" которых мы установили выше используя УстановитьСоставСтандартногоИнтерфейсаOData(тМассив).
В результате получился общий модуль - для передачи (создания / обновления) данных на сервере сбора данных из узла.
 
Для начала мы добавили константу СерверСбораДанныхДляЗарплатнойСистемы (Строка, 30), в которой указывали адрес публикации сервера сбора данных (например, zbor_centr).
Далее добавили код "отправки" данных на сервер в процедуры "ПриЗаписи" Справочника и "ОбработкаПроведения" документа.
В модуле объекта справочника в процедуре "ПриЗаписи" он выглядит так:
Если ОбменССерверомСбораДанных.СоединенияССерверомСбораДанныхУстановлено() Тогда

   ОбменССерверомСбораДанных.ОтправитьНаСерверСбораДанных(ЭтотОбъект.Ссылка, , 1);

КонецЕсли;	
Что это такое?:) Сначала о простом - функция общего модуля ОбменССерверомСбораДанных - СоединенияССерверомСбораДанныхУстановлено ():
Функция СоединенияССерверомСбораДанныхУстановлено() Экспорт
	
   Возврат (НЕ Константы.СерверСбораДанныхДляЗарплатнойСистемы.Получить() = "");
	
КонецФункции

Далее опишу метод отправки пока только справочника, если будет спрос - будет и продолжения статьи (по обмену документов и регистров).

Вот общая процедура отправки данных на сервер - ОтправитьНаСерверСбораДанных ():

 
 Процедура ОтправитьНаСерверСбораДанных(СсылкаИсточник, DELETE = Ложь, ТипОбъекта = 0) Экспорт
Комментарий к ОтправитьНаСерверСбораДанных () - первым параметром передаем ссылку (документа, справочника), второй параметр - пока не используеться (заготовка на будущее - для отправки команд на удаление), и ТипОбъекта - если отправляем справочник - передаем числом 1, документ - 2.
Процедуры создания теневой копий - это функционал, в случае которого, если не удалось доставить данные на сервер - сделать это позже регламентным заданием (здесь вы как разработчик по-своему можете придумать "офлайн" режим)
 
Итак, самое интересное:
1) Функция СправочникДоставленоУспешно (СсылкаСправочник, DELETE, Метод = "POST", Тень = Ложь)
Параметры:
СсылкаСправочник - ссылка справочника
DELETE - булево - удаление на сервере сбора данных по GUID
Метод - строка - по умолчанию - "POST" (о других методах тоже достаточно материалов в свободном доступе)
Тень - булево - если функцию использует регламентное задание, этот параметр будет истина.
Тело функции:
 
 Функция СправочникДоставленоУспешно(СсылкаСправочник, DELETE, Метод = "POST", Тень = Ложь) 
Функция СправочникДоставленоУспешно(СсылкаСправочник, DELETE, Метод = "POST", Тень = Ложь) 
	
	Если Константы.СерверСбораДанныхОфлайн.Получить() И (НЕ Тень) Тогда // если связи нету можна просто перейти в офлайн используя  Константы.СерверСбораДанныхОфлайн.Установить(Истина)
		Возврат Ложь;
	КонецЕсли;	
	
	Связь = ПолучитьКаналСвязиССерверомСбораДаних(); // служебное - смотри далее
	
	ИмяСправочника = СсылкаСправочник.Метаданные().Имя;

	Если Тень Тогда
           // теневые копию я создавал в идентичном обьъкте как оригинальний справочник, только с префиксом «_с_». Зачем? Запрос по теневым копиям работают быстрее, и в случае успешной доставки теневой копию — копия удалялась
           ИмяСправочника = СтрЗаменить(ИмяСправочника,"_с_",""); 
	КонецЕсли;
	
	guid =  Строка(СсылкаСправочник.УникальныйИдентификатор());
	
	Если DELETE Тогда // если удалить объект
		
		АдресРесурса =  "/" + Связь.Порт + "/odata/standard.odata/Catalog_" + ИмяСправочника + "(guid'"+ guid + "')";
		
		Соединение = Новый HTTPСоединение(Связь.Сервер);		
		
		ЗаголовокHTTP = Новый Соответствие(); 
		ЗаголовокHTTP.Вставить("Accept", "application/atom+xml,application/xml");
		ЗаголовокHTTP.Вставить("Accept-Charset", "UTF-8");
		ЗаголовокHTTP.Вставить("DELETE" + " /" + Связь.Порт + "/odata/standard.odata/Catalog_" + ИмяСправочника + "(guid'"+ guid + "')");
		ЗаголовокHTTP.Вставить("Content-Type", "application/atom+xml");	
		ЗаголовокHTTP.Вставить("DataServiceVersion", "3.0;NetFx");	
		ЗаголовокHTTP.Вставить("MaxDataServiceVersion", "3.0;NetFx");	
		ЗаголовокHTTP.Вставить("User-Agent", "1C-Enterprise");	
		ЗаголовокHTTP.Вставить("Host", Связь.Сервер);
		Запрос = Новый HTTPЗапрос(АдресРесурса, ЗаголовокHTTP); 
		Ответ = Соединение.ВызватьHTTPМетод("DELETE", Запрос);
		
		Возврат Ответ.КодСостояния = 204 // случае успешного удаления сервер вернет код состояния  =204
	Иначе // если создать/обновить объект
		
		АдресРесурса = "/" + Связь.Порт + "/odata/standard.odata/Catalog_" + ИмяСправочника + ?(Метод = "PUT", "(guid'" + guid + "')","");	
		
		ТекстЗапроса = ОпределитьШапкуЗапроса(guid); // служебное - смотри далее
		
		// соответствие стандартных реквизитов
		CписокCтандартныхРеквизитов = СоздатьОписанияОбязательнихРеквизитовСправочника(СсылкаСправочник); // служебное - смотри далее
		Для Каждого ОписаниеРеквизита ИЗ CписокCтандартныхРеквизитов Цикл
			ТекстЗапроса = ТекстЗапроса + "
			|         <d:" + ОписаниеРеквизита.Ключ + ">" + СокрЛП(ОписаниеРеквизита.Значение) + "</d:" + ОписаниеРеквизита.Ключ + ">";	
		КонецЦикла;	
		
		// соответствие дополнительных реквизитов
		СписокДопРеквизитов = СоздатьОписанияДополнительнихРеквизитов(СсылкаСправочник); // служебное - смотри далее
		Для Каждого ОписаниеДопРеквизита ИЗ СписокДопРеквізитів Цикл
			ТекстЗапроса = ТекстЗапроса + "
			|         <d:" + ОписаниеДопРеквизита.Ключ + ">" + СокрЛП(ОписаниеДопРеквизита.Значение) + "</d:" + ОписаниеДопРеквизита.Ключ + ">";	
		КонецЦикла;	
		
		// соответствие табличных частей
		ОписаниеТабличныхЧастей = СоздатьОписанияТабличныхЧастей(СсылкаСправочник, "Catalog", Тень); // служебное - смотри далее
		Если НЕ ОписаниеТабличныхЧастей = "" Тогда
			ТекстЗапроса = ТекстЗапроса + ОписаниеТабличныхЧастей;
		КонецЕсли;	
		
		ТекстЗапроса = ТекстЗапроса + "	
		|      </m:properties>	
		|   </content>	
		|</entry>";
		
		Соединение = Новый HTTPСоединение(Связь.Сервер);	
		Заголовки = Новый Соответствие;
		Заголовки.Вставить("Accept", "application/atom+xml,application/xml");
		Заголовки.Вставить("Accept-Charset", "UTF-8");
		Заголовки.Вставить(Метод + "  /" + Связь.Порт + "/odata/standard.odata/Catalog_" + ИмяСправочника + ?(Метод = "PUT", "(guid'" + guid + "')","") + " HTTP/1.1");	
		Заголовки.Вставить("Content-Type", "application/atom+xml");	
		Заголовки.Вставить("DataServiceVersion", "3.0;NetFx");	
		Заголовки.Вставить("MaxDataServiceVersion", "3.0;NetFx");	
		Заголовки.Вставить("User-Agent", "1C-Enterprise");	
		Заголовки.Вставить("Host", Связь.Сервер);
		
		Попытка
			Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);	
			Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);	
			Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос);
			
			Если (Ответ.КодСостояния <> 201) И (Метод = "POST") Тогда // успешным для POST считается код 201					
				Возврат СправочникДоставленоУспешно(СсылкаСправочник, DELETE,"PUT", Тень);
			ИначеЕсли (Ответ.КодСостояния <> 200) И (Метод = "PUT") Тогда // успешным для PUT считается код 200					
				Возврат Ложь
			Иначе	
				Возврат Истина
			КонецЕсли;
				
		Исключение
			Возврат Ложь;
		КонецПопытки;	
		
	КонецЕсли;
		
КонецФункции

 

 

И, конечно, список функций обозначенных комментарием "служебное":

 
 Функция ПолучитьКаналСвязиССерверомСбораДаних()
 
 Функция СоздатьОписанияДополнительнихРеквизитов(СсылкаОбъекта, СписокСсылочных = 0)
 
 Функция СоздатьОписанияТабличныхЧастей(СсылкаОбъекта, ПрефиксОбъекта, Тень = Ложь)
 
 Функция НормализироватьКОбмену(ЭтотРеквизит)
 
 Функция ОпределитьШапкуЗапроса(GUID = "00000000-0000-0000-0000-000000000000")
 
 Функция СоздатьОписанияОбязательнихРеквизитовСправочника(СсылкаСправочник)

 

В результате мы получили универсальный модуль создания / обновления / удаления справочников.
 
 
 
 
Спасибо, что дочитали до конца! :)

 

 

обмен OData универсальные процедуры

См. также

SALE! 10%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием Россия Платные (руб)

Продано более 270 раз! Обработка позволяет перенести из УПП в ERP / 1С:УТ 11 / КА 2 всю возможную информацию. Переносятся документы, а также начальные остатки и справочная информация. Типовая обработка от фирмы 1С не позволяет сохранить документы за период работы. Кроме того, наши алгоритмы выгрузки начальных остатков тоже имеют больше функционала и тщательно проверялись на реальных проектах перехода с УПП на ERP. Наша разработка будет полезна как фирмам-франчайзи, которые периодически выполняют перенос данных для заказчиков, так и организациям, самостоятельно выполняющим проект по переходу. При приобретении обработки вы будете четыре месяца получать ее обновления, далее можно приобрести подписку на обновления. Конфигурации 1С постоянно меняются, выходят новые релизы. Имея подписку на обновления, вы всегда можете быть уверены, что правила конвертации данных будут работать на ваших базах 1С.

50722 45650 руб.

04.08.2015    155946    289    263    

331

SALE! 10%

Перенос данных из УПП 1.3 / КА 1.1 в БП 3.0

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Россия Бухгалтерский учет Платные (руб)

Предлагаем перенос данных из УПП 1.3 в БП 3.0 (или из КА 1.1 в БП 3.0). Переносятся документы, начальные остатки и вся справочная информация. Есть фильтр по организации и множество других параметров выгрузки. Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов. Перенос данных возможен в 1С: Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую. Переход с "1С: Управление производственным предприятием 1.3" / "1С:Комплексная автоматизация 1.1" на "1С:Бухгалтерия предприятия 3.0" с помощью наших правил конвертации будет максимально комфортным! Обработка входит в ТОП продаж Инфостарта!

43889 39500 руб.

25.02.2015    166996    284    236    

367

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    131782    687    290    

379

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С: Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила тестировались на конфигурациях УПП 1.3 (1.3.215.x) и БП 3.0 (3.0.144.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    18266    114    36    

69

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Наша обработка позволяет не только перенести все документы, справочную информацию и начальные остатки из ERP 2 или КА 2 в ЗУП 3, но и организовать регулярный перенос данных между программами 1С:ERP 2 / КА 2 и 1С:ЗУП 3. Вы можете выбрать период отбора данных и установить фильтр по организациям, чтобы выгружать только необходимую информацию. Более того, перенос оперативно обновляется при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

48278 43450 руб.

03.12.2020    32725    69    56    

71

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11 / КА 2 / ERP 2 (ЕРП 2)

Обмен между базами 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Предлагаем вам качественное и проверенное временем решение для перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2. Перенос данных находится в продаже с 2015 года, постоянно развивается, им воспользовались уже более 240 компаний. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

50722 45650 руб.

24.04.2015    188274    264    235    

267

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Перенос данных осуществляется из 1С:ERP 2 / 1С:КА 2 / 1С:УТ 11 в 1С:БП 3.0. Правила обмена оперативно обновляются при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

38500 34650 руб.

15.04.2019    66174    164    131    

97

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. За основу были взяты стандартные правила переноса остатков и справочной информации. Правила тестировались на конфигурациях УТ 10.3 (10.3.85.x) и УТ 11.5 (11.5.15.x).

28000 25200 руб.

23.07.2020    43363    185    63    

138
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VasilVtoroy 11.05.18 23:11 Сейчас в теме
Во вступлении к статье ошибка - использовать HTTP-сервисы можно в любом режиме совместимости.

Ограничение на использование в режиме совместимости было только в версии 8.3.7. Смотрите V8Update для версии 8.3.8

https://its.1c.ru/db/v838doc#content:121:1:issogl1_5a3feda0-6292-11e5-a3f7-0050569f678a
V.Stavinsky; +1 Ответить
2. V.Stavinsky 271 13.05.18 18:50 Сейчас в теме
(1) "Для конфигураций, в которых используются HTTP-сервисы, разрешена установка режима совместимости Версия 8.3.4 и ниже.
При необходимости работать с конфигурацией, которая содержит HTTP-сервисы, на системе «1С:Предприятие» версии 8.3.8 и выше, но которая открывалась конфигуратором системы «1С:Предприятие» версии 8.3.4, необходимо выполнить следующие действия:

Создать любой объект конфигурации;
Выполнить сохранение конфигурации информационной базы;
Удалить созданный объект конфигурации;
Выполнить сохранение конфигурации информационной базы."

понял) попробуем сделать действия которые там описанные. но главный акцент статьи все таки это Rest OData
3. пользователь 15.05.18 05:48
Сообщение было скрыто модератором.
...
4. VarLone 16.05.18 10:10 Сейчас в теме
После выхода продолжения, не забудь те в этой статье вставить ссылку на продолжение
vbuots; V.Stavinsky; +2 Ответить
5. V.Stavinsky 271 19.05.18 23:03 Сейчас в теме
6. dmarenin 341 22.05.18 17:25 Сейчас в теме
(0) код не читаем(не глагол)
V.Stavinsky; +1 Ответить
7. V.Stavinsky 271 22.05.18 18:58 Сейчас в теме
(8) спасибо, будет исправлено!
8. Dorosh 176 17.07.18 15:39 Сейчас в теме
Синхронный обмен через сервисы выглядит плохой идеей. Возможны большие задержки, юзеры будут смотреть на "зависший" 1с и нервничать. Переделайте отправку на асинхронный режим через фоновые задания.
9. V.Stavinsky 271 17.07.18 19:15 Сейчас в теме
(8) если менять пакеты данных - то да; но у нас один элемент справочника - одна "отправка" в другую базу; ответ приходит моментально; и уже в зависимости от ответа - если он отрицательный, то оставляем на "переотправку" фоновому заданию
10. Dorosh 176 19.07.18 09:06 Сейчас в теме
(9) Помимо размера отправляемых данных надо учитывать кол-во юзверей. Помимо задержек при транспорте есть ожидания на блокировках. Сейчас их у вас нет, завтра система вырастет вширь и они появятся.
12. V.Stavinsky 271 19.07.18 10:07 Сейчас в теме
(10) да, согласен, пока проблем нет; тогда в базе приемнике будем дописывать "очередь", чтобы избежать блокировок (и тут уже неважно как "направляются" данные туда - или онлайн, или фоново)
11. V.Stavinsky 271 19.07.18 10:07 Сейчас в теме
да, согласен, пока проблем нет; тогда в базе приемнике будем дописывать "очередь", чтобы избежать блокировок (и тут уже неважно как "направляются" данные туда - или онлайн, или фоново)
Оставьте свое сообщение