Универсальный обмен между идентичными конфигурациями через 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! 10%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    143320    821    297    

428

SALE! 10%

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

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

55778 50200 руб.

04.08.2015    168352    344    279    

380

SALE! 10%

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

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

35000 31500 руб.

23.07.2020    53408    236    73    

192

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24820    174    51    

132

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    37239    99    66    

95

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    81564    324    253    

276

SALE! 10%

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

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

48278 43450 руб.

25.02.2015    172010    307    258    

384

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

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

120000 руб.

19.08.2020    25689    25    1    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 21.05.18 00:28
Сообщение было скрыто модератором.
...
2. logarifm 1123 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 267 29.04.21 11:02 Сейчас в теме
(2) Воспринимается как юмор, норм. Наоборот разнообразие.
7. logarifm 1123 22.05.18 18:06 Сейчас в теме
А еще самое интересное то другое. Но мы уйдем щас в политику. При запрете 1С до этого практически во всех известных гос.структурах используется продукт именно этой фирмы. Типовые решения. Пенсионный фонд использует. А интересно то другое, кто выигрывает тендеры на написания софта гос.уччреждениям украинским. Отнють не САП и не оракл...
8. logarifm 1123 22.05.18 18:14 Сейчас в теме
Кстати в первой статье я тоже смотрю вы получили замечания относительно переменных. (и статья не исправлена)
V.Stavinsky; +1 Ответить
9. пользователь 22.05.18 18:59
Сообщение было скрыто модератором.
...
10. V.Stavinsky 273 22.05.18 19:00 Сейчас в теме
хотел бы поднять тему конвертации через odata - у кого какие идеи как можно это реализовать?
Оставьте свое сообщение