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

19.05.18

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

Продолжение статьи об универсальном обмене между идентичными конфигурации через REST интерфейс OData (https://infostart.ru/public/829356/). В части второй разберем особенности обмена документами.

 

ПРЕДЫДУЩАЯ ЧАСТЬ. ЧАСТЬ І. СПРАВОЧНИКИ

 

В части первой мы уже коротко выяснили что такое OData и описали некоторые общие процедуры и функции (в первой части я называл их служебными), мы используем (или даже расширим) для разработки модуля обмена документами следующие из них:

Функция ПолучитьКаналСвязиССерверомСбораДаних() // не изменится в этой статье
Функция ОпределитьШапкуЗапроса(GUID = "00000000-0000-0000-0000-000000000000") // не изменится в этой статье
Функция НормализироватьКОбмену(ЭтотРеквизит) // не изменится в этой статье

Функция СоздатьОписанияДополнительнихРеквизитов(СсылкаОбъекта, СписокСсылочных = 0) // расширится
Функция СоздатьОписанияТабличныхЧастей(СсылкаОбъекта, ПрефиксОбъекта, Тень = Ложь) // расширится

 

Вот так расширится и "главная" экспортная процедура отправки данных на сервер:

 
 Процедура ОтправитьНаСерверСбораДанных(СсылкаИсточник, DELETE = Ложь, ТипОбъекта = 0, БезКопии = Ложь, ОписаниеРеквизитовОтправки = Неопределено) Экспорт

Как видите добавились два новых параметры процедуры:
1) БезКопии - булево - по умолчанию - Ложь - мы начали передавать "ссылочные" реквизиты некоторых документов, но не хотели наполнять базу теневыми копиями, поэтому некоторые объекты НЕ копируются в тень для отложенной отправки;
2) ОписаниеРеквизитовОтправки - список значений - по умолчанию - Неопределено - не все реквизиты справочника для нас критически необходимо видеть на сервере, например, у нас на узле в справочнике ФизическиеЛица есть реквизиты ДатаРождения и ИНН, но на сервере нам необходимо видеть только реквизит ИНН - тогда в параметр ОписаниеРеквизитовОтправки мы передадим это:

Список = Новый СписокЗначений; 
Список.Добавить("ИНН"); // имя реквизита как в конфигураторе
 

Тело функции для обмена документом:

 
 Функция ДокументДоставленоУспешно(СсылкаДокумент, DELETE, Метод = "POST", Тень = Ложь, ФормироватьКлюч = Ложь, СписокРеквизитов = Неопределено)
Функция ДокументДоставленоУспешно(СсылкаДокумент, DELETE, Метод = "POST", Тень = Ложь, ФормироватьКлюч = Ложь, СписокРеквизитов = Неопределено)
	
	Если СсылкаДокумент.Пустая() Тогда
		Возврат Истина;
	КонецЕсли;
	
	Если Константы.СерверСбораДанныхОфлайн.Получить() И (НЕ Тень) Тогда // если связи нету можна просто перейти в офлайн используя  Константы.СерверСбораДанныхОфлайн.Установить(Истина)
		Возврат Ложь;
	КонецЕсли;	
	
	Связь = ПолучитьКаналСвязиССерверомСбораДаних(); // служебное - см. часть І
	
	ИмяДокумента = СсылкаДокумент.Метаданные().Имя;
	Если Тень Тогда
        // теневые копию я создавал в идентичном обьъкте как оригинальний док, 
        // только с префиксом «_с_». Зачем? Запрос по теневым копиям работают быстрее, 
        // и в случае успешной доставки теневой копию — копия удалялась
		ИмяДокумента = СтрЗаменить(ИмяДокумента,"_с_","");
	КонецЕсли;
	
	guid =  Строка(СсылкаДокумент.УникальныйИдентификатор());
	
    Заголовки = Новый Соответствие;
	Заголовки.Вставить("Accept", "application/atom+xml,application/xml");
	Заголовки.Вставить("Accept-Charset", "UTF-8");
	Заголовки.Вставить("Content-Type", "application/atom+xml");	
	Заголовки.Вставить("DataServiceVersion", "3.0;NetFx");	
	Заголовки.Вставить("MaxDataServiceVersion", "3.0;NetFx");	
	Заголовки.Вставить("User-Agent", "1C-Enterprise");	
	Заголовки.Вставить("Host", Связь.Сервер);

	Если DELETE Тогда // если удалить объект
        
        хАдресРесурса =  "/" + Связь.Порт + "/odata/standard.odata/Document_" + ИмяДокумента + "(guid'"+ guid + "')";
        Соединение = Новый HTTPСоединение(Связь.Сервер);		
    	Заголовки.Вставить("DELETE" + " /" + Связь.Порт + "/odata/standard.odata/Catalog_" + ИмяДокумента + "(guid'"+ guid + "')");

	    Попытка
		   хЗапрос = Новый HTTPЗапрос(хАдресРесурса, Заголовки); 
		   Ответ = Соединение.ВызватьHTTPМетод("DELETE", хЗапрос);
           Возврат Ответ.КодСостояния = 204 // случае успешного удаления сервер вернет код состояния  =204 
	    Исключение
           Возврат Ложь; 
		КонецПопытки;	

   Иначе // если создать/обновить объект	

		АдресРесурса = "/" + Связь.Порт + "/odata/standard.odata/Document_" + 
        ИмяДокумента + ?(Метод = "PUT", "(guid'" + guid + "')","");	
		
		ТекстЗапроса = ОпределитьШапкуЗапроса(guid); // служебное - см. часть І
		
        // соответствие стандартных реквизитов
		CписокCтандартныхРеквизитов  = СоздатьОписанияОбязательнихРеквизитовДокумента(СсылкаДокумент); // новое служебное - смотри далее
		Для Каждого ОписаниеРеквизита ИЗ CписокCтандартныхРеквизитов Цикл
			ТекстЗапроса = ТекстЗапроса + "
			|         <d:" + ОписаниеРеквизита.Ключ + ">" + СокрЛП(ОписаниеРеквизита.Значение) + "</d:" + ОписаниеРеквизита.Ключ + ">";	
		КонецЦикла;	
		
		// ссылочные реквизиты шапки(суфикс _Key)
		СписокКейс = Новый СписокЗначений();
		Если ИмяДокумента = "ЧекККМ" Тогда
			СписокКейс.Добавить("Магазин");
			СписокКейс.Добавить("Ответственный");
			СписокКейс.Добавить("Пользователь");
			СписокКейс.Добавить("Место");
		КонецЕсли;	
		
		// соответствие дополнительных реквизитов
		СписокДопРеквизитов  = СоздатьОписанияДополнительнихРеквизитов(СсылкаДокумент, СписокКейс); // служебное РАСШИРЕННОЕ - см. часть І
		Для Каждого ОписаниеДопРеквизита ИЗ СписокДопРеквизитов  Цикл
			ТекстЗапроса = ТекстЗапроса + "
			|         <d:" + ОписаниеДопРеквизита.Ключ + ">" + СокрЛП(ОписаниеДопРеквизита.Значение) + "</d:" + ОписаниеДопРеквизита.Ключ + ">";	
		КонецЦикла;		
		
        // ссылочные реквизиты табличных частей(суфикс _Key)
		СписокКейсТЧ = Новый СписокЗначений();
		Если ИмяДокумента = "ЧекККМ" Тогда
			СписокКейсТЧ.Добавить("Номенклатура");
		КонецЕсли;	
        
    	// соответствие табличных частей 
		ОписаниеТабличныхЧастей = СоздатьОписанияТабличныхЧастей(СсылкаДокумент, "Document", Тень, СписокКейсТЧ); // служебное РАСШИРЕННОЕ - см. часть І
		Если НЕ ОписаниеТабличныхЧастей = "" Тогда
			ТекстЗапроса = ТекстЗапроса + ОписаниеТабличныхЧастей;
		КонецЕсли;	
		
		// ключ
		Если ФормироватьКлюч Тогда // все объекты которые не копируются в тень передаються с ключем - у нас это GUID Основного магазина
			ТекстЗапроса = ТекстЗапроса + "
			|         <d:Магазин_Key>" + СокрЛП(Строка(Константы.ОсновнойМагазин.Получить().УникальныйИдентификатор())) + "</d:Магазин_Key>";	
		КонецЕсли;	
		
		ТекстЗапроса = ТекстЗапроса + "	
		|      </m:properties>	
		|   </content>	
		|</entry>";
		
		Соединение = Новый HTTPСоединение(Связь.Сервер);	
		
		Заголовки.Вставить("1C_OData_DataLoadMode", Истина); // ВАЖНО! Документы по старинке в режиме "ОбменДанными.Загрузка = Истина"
		Заголовки.Вставить(Метод + "  /" + Связь.Порт + "/odata/standard.odata/Document_" + ИмяДокумента + ?(Метод = "PUT", "(guid'" + guid + "')","") + " HTTP/1.1");	
		
		Попытка
			Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);	
			Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);	
			Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос);
			
			Если (Ответ.КодСостояния <> 201) И (Метод = "POST") Тогда // успешный POST когда КодСостояния = 201
				Возврат ДокументДоставленоУспешно(СсылкаДокумент, DELETE,"PUT", Тень, ФормироватьКлюч, СписокРеквизитов);
			ИначеЕсли (Ответ.КодСостояния <> 200) И (Метод = "PUT") Тогда // успешный PUT когда КодСостояния = 200
				Возврат Ложь
			Иначе	
				Возврат Истина
			КонецЕсли;
			
		Исключение
			Возврат Ложь;
		КонецПопытки;	
    КонецЕсли;

КонецФункции

 

 

Вот список необходимых функций обозначенных комментарием "новое служебное" или "служебное РАСШИРЕННОЕ" (не ругайте - знаю местам их можно и даже нужно оптимизировать):

 
 Функция СоздатьОписанияОбязательнихРеквизитовДокумента(СсылкаДокумент)
 
 Функция СоздатьОписанияДополнительнихРеквизитов(СсылкаОбъекта, СписокСсылочных = 0)
 
 Функция СоздатьОписанияТабличныхЧастей(СсылкаОбъекта, ПрефиксОбъекта, Тень = Ложь, СписокСсылочных = 0)

 

Ну, вроде по документу все. Ах да - а что делать если пользователь выполнит отмену проведения или вообще удалит документ? Ну, тогда нужно прописать в соответствующих местах модуля объекта документа следующее (документ исчезнет на сервере):

Процедура ОбработкаУдаленияПроведения(Отказ)
	
   ОбменССерверомСбораДанных.ОтправитьНаСерверСбораДанных(ЭтотОбъект.Ссылка,Истина,2);
	
КонецПроцедуры

 

СЛЕДУЮЩАЯ ЧАСТЬ. ЧАСТЬ ІІІ: РЕГИСТРЫ СВЕДЕНИЙ

 

Спасибо, что дочитали до конца! :)

обмен OData документ Open Data Protocol универсальный обмен

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

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

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159670    363    267    

345

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 22572 руб.

12.06.2017    134927    722    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68414    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34168    80    58    

78

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.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46287    196    64    

158

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

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

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231390    124    327    

295

Перенос данных из Парус 10 в ЗГУ ред.3

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9207    9    8    

10

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.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    20235    132    38    

90
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 21.05.18 00:28
Сообщение было скрыто модератором.
...
2. logarifm 1117 22.05.18 17:34 Сейчас в теме
Я все понимаю.... Я с Украины причем западной. И ежедневно общаюсь на родном языке. Но так писать это перебор

ОписаниеСтандарнихРеквізивтів


Это не только не уважение к самому процессу стандарту именования переменных но и к другим участникам программирования. Исправьте пожалуйста это неподобство иначе реально влиплю минус.

Да еще и выкладываете на ресурс как учебный материал. Не портите и так тяжелые взаимоотношения таким написанием. Либо если так писать то пишите полностью на украинском но уже с английским диалектом. Как же так вообще реквизыты можно называть они и не русские и не украинские. Что это ?
V.Stavinsky; +1 Ответить
3. пользователь 22.05.18 17:42
Сообщение было скрыто модератором.
...
4. пользователь 22.05.18 17:48
Сообщение было скрыто модератором.
...
5. пользователь 22.05.18 17:52
Сообщение было скрыто модератором.
...
6. пользователь 22.05.18 17:56
Сообщение было скрыто модератором.
...
11. uno-c 234 29.04.21 11:02 Сейчас в теме
(2) Воспринимается как юмор, норм. Наоборот разнообразие.
7. logarifm 1117 22.05.18 18:06 Сейчас в теме
А еще самое интересное то другое. Но мы уйдем щас в политику. При запрете 1С до этого практически во всех известных гос.структурах используется продукт именно этой фирмы. Типовые решения. Пенсионный фонд использует. А интересно то другое, кто выигрывает тендеры на написания софта гос.уччреждениям украинским. Отнють не САП и не оракл...
8. logarifm 1117 22.05.18 18:14 Сейчас в теме
Кстати в первой статье я тоже смотрю вы получили замечания относительно переменных. (и статья не исправлена)
V.Stavinsky; +1 Ответить
9. пользователь 22.05.18 18:59
Сообщение было скрыто модератором.
...
10. V.Stavinsky 271 22.05.18 19:00 Сейчас в теме
хотел бы поднять тему конвертации через odata - у кого какие идеи как можно это реализовать?
Оставьте свое сообщение