Интеграция УАТ с топливными сервисами

21.04.20

Интеграция - WEB-интеграция

Интеграция конфигурации Управление автотранспортом с топливными веб-сервисами.

Всем привет! В прошлой статье я описывал основные возможности топливного веб-сервиса Лукойл ЛИКАРД. В этой, на примере конфигурации Управление автотранспортом Проф, редакция 2.2 (2.2.2.1), покажу, как можно использовать полученные данные, для автоматического создания документов заправок и сливок, автоматического сопоставления путевым листам, созданных документов, исходя из информации топливной системы, тем самым обеспечив саму простую синхронизацию с топливным веб-сервисом, исключив ручную работу и человеческий фактор при создании документов, обеспечив 100% актуальную информацию в отчетах по расходу топлива.

Будем рассматривать пример интеграции с сервисом Лукойл ЛИКАРД, но статья универсальна и подойдет для любого другого сервиса, отличаться будет только часть с получением массива данных с сервиса, далее обработку данных можно без проблем подогнать под любой сервис.

Начнем.

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

  • ИдентификаторДоговораЛукойл – Тип Строка
  • ПутьКФайлуSSLСертификата – Тип Строка
  • ПарольSSLСертификата – Тип Строка
  • ГлубинаПоискаПЛДоВыездаЛукойл – Тип число
  • ГлубинаПоискаПЛПослеВозвращения – тип число
  • ПроводитьСозданныеЗаправкиГСМЛукойл – тип булево
  • ПересчитатьПутевыеЛистыЛукойл – Булево
  • АЗС – тип СправочникСсылка.уатАЗС

Добавляем все реквизиты на формы, и добавляем команду “Синхронизировать” к которой привязываем процедуру Синхронизировать()

Привожу код модуля формы:


&НаСервере
Процедура СинхронизироватьНаСервере()
	
	УстановитьПривилегированныйРежим(Истина);
	
	Попытка
		// получаем массив с данными веб-сервиса, эта процедура будет немного отличаться для каждого веб-сервсиса, далее все универсально	
		МассивРезультатЗапроса = ПолучитьМассивСРезультатомЗапросаНаСайт();
		Если ЗначениеЗаполнено(МассивРезультатЗапроса) Тогда
			// обрабатываем полученные даные, здесь будем создавать документы заправок и сливов
			ОбработатьРезультатЗапросаНаСайт(МассивРезультатЗапроса);
			// здесь будем сопоставлять созданные заправки и сливы с имеющимися путевыми листами
			ПересопоставитьГСМ();
		КонецЕсли;
		
	Исключение;
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура Синхронизировать(Команда)
	СинхронизироватьНаСервере();
КонецПроцедуры

&НаСервере
Функция ПолучитьМассивСРезультатомЗапросаНаСайт()
// подробнее о том, откуда получаются данные в этой функции, можно почитать в прошлой моей статье	
	ЗаписьJSON = Новый ЗаписьJSON;
	ДатаНачала = НачалоДня(Объект.НачалоПериода);
	ДатаКонец = КонецДня(Объект.КонецПериода);
	ИдентификаторДоговора = Объект.ИдентификаторДоговораЛукойл;
	ПутьКФайлуSSLСертификата = Объект.ПутьКФайлуSSLСертификата; 
	ПарольSSLСертификата = Объект.ПарольSSLСертификата;
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("contractId", ИдентификаторДоговора);
	СтруктураПараметров.Вставить("dateFrom", ДатаНачала);
	СтруктураПараметров.Вставить("dateTo", ДатаКонец);
	СтруктураПараметров.Вставить("reportMode", "");
	СтруктураПараметров.Вставить("cardNumberIn", "");
	СтруктураПараметров.Вставить("vehicleNumberIn", "");
	СтруктураПараметров.Вставить("cityIn", "");
	СтруктураПараметров.Вставить("transMatterIn", "");
	СтруктураПараметров.Вставить("countryCodeIn", "");
	СтруктураПараметров.Вставить("regionIdIn", "");
	СтруктураПараметров.Вставить("operationTypeId", 35271);
	СтруктураПараметров.Вставить("goodsGroupCodeIn", "");
	СтруктураПараметров.Вставить("minQuantity", "");
	СтруктураПараметров.Вставить("maxQuantity", "");
	СтруктураПараметров.Вставить("maxRowsThreshold", "");
	
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, СтруктураПараметров);
	ТекстПараметровJSON = ЗаписьJSON.Закрыть();
		
	Сервер = "11.111.11.11";
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(ПутьКФайлуSSLСертификата, ПарольSSLСертификата)); 
	Попытка			
		HTTPСоединение =  Новый HTTPСоединение(Сервер, 443 ,,,,30, ssl); 
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат
	КонецПопытки;
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос("/solar-bridge-ext/ext/json-services/getContractTransactions", Заголовки);

	HTTPЗапрос.УстановитьТелоИзСтроки(ТекстПараметровJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	
	МассивРезультатЗапроса = Новый Массив;
		
	Попытка
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
		СтруктураJSON = ПрочитатьJSON(ЧтениеJSON);
		ЧтениеJSON.Закрыть();
		МассивРезультатЗапроса = СтруктураJSON.getContractTransactionsRs.getContractTransactionsPayload.contractTransactions;
	Исключение
		флгРезультатЧтенияФайла = Ложь;
	КонецПопытки;		
	
	Возврат МассивРезультатЗапроса;
	
КонецФункции



//Процедура обрабатывает полуенный результат сайта
Процедура ОбработатьРезультатЗапросаНаСайт(мсвРезультатЗапроса) Экспорт
	Перем мДокументЗаправкаСлив, СтавкаНДС, СуммаНДС, СуммаВключаетНДС, УчитыватьНДС; 
	
	ГлубинаПоискаПЛДоВыезда = Объект.ГлубинаПоискаПЛДоВыездаЛукойл;	
	ГлубинаПоискаПЛПослеВозвращения = Объект.ГлубинаПоискаПЛПослеВозвращенияЛукойл;
	ПроводитьСозданныеЗаправкиГСМ = Объект.ПроводитьСозданныеЗаправкиГСМЛукойл;
	ПересчитатьПутевыеЛисты = Объект.ПересчитатьПутевыеЛистыЛукойл;
	АЗС = Объект.АЗСЛукойл;


	Индекс             = 0;
	мсвВыборкаЗаправки = Новый Массив();
	мсвВыборкаСливы    = Новый Массив();
	
	тзТопливныеКарты = ПолучитьТопливныеКарты();
	Если НЕ ЗначениеЗаполнено(тзТопливныеКарты) Тогда
		Сообщить("Ошибка", "Топливные карты не найдены в базе");
		Возврат;
	КонецЕсли;
	
	тзТопливныеКартыМенеджеров = ПолучитьТопливныеКарты("Сотрудники");
	
	Для Инд = 0 по мсвРезультатЗапроса.Количество() - 1 Цикл
		эл = мсвРезультатЗапроса[Инд];
		СтруктураСтроки = Новый Структура();			
				
		стзПластиковаяКарта = тзТопливныеКарты.Найти(Формат(эл.cardNumberOut, "ЧН=0; ЧГ=0"), "НовыйКод");
		
		Если стзПластиковаяКарта = Неопределено  Тогда
			Сообщить("Ошибка", "Топливная карта не найдена. " + Строка(эл.cardNumberOut));
			Продолжить;
		КонецЕсли;
		
		ПластиковаяКарта = стзПластиковаяКарта.Ссылка;
		Если ПластиковаяКарта.ПометкаУдаления Тогда
			Сообщить("Предупреждение", "Топливная карта помечена на удаление. " + Строка(эл.cardNumberOut));
			Продолжить;				
		КонецЕсли;
		
		СтруктураСтроки.Вставить("ПластиковаяКарта", ПластиковаяКарта);
		СтруктураСтроки.Вставить("ТС",               ПластиковаяКарта.КомуВыдана);
		
		ТС = ПластиковаяКарта.КомуВыдана;
		
		Если ТС.ПометкаУдаления Тогда
			Сообщить("Предупреждение", "ТС помечено на удаление. " + Строка(ТС));
			Продолжить;				
		КонецЕсли;
		
		//Проставляем ГСМ или основное или то, что указанов в соответствии в тч АЗС
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("ГСМизФайла", эл.goodsName);
		НайденныеСтроки = АЗС.СоответствиеГСМ.НайтиСтроки(ПараметрыОтбора);
		Если НайденныеСтроки.Количество() > 0 Тогда
			СтруктураСтроки.Вставить("ГСМ", НайденныеСтроки[0].ГСМ);					
		Иначе
			СтруктураСтроки.Вставить("ГСМ", ТС.Модель.ОсновноеТопливо);
		КонецЕсли;
		
		
		//Валюта
		Если эл.clientCurrName = "RUR" Тогда
			СтруктураСтроки.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));				
		КонецЕсли;
		
		СтруктураСтроки.Вставить("Количество",       Число(эл.quantity));
		СтруктураСтроки.Вставить("Стоимость",        эл.sourceAmount);
		
		стрДата = эл.transDate;
		Год_ = Лев(стрДата, 4);
		Месяц_ = Сред(стрДата, 6, 2);
		День_ = Сред(стрДата, 9, 2);
		Час_ = Сред(стрДата, 12, 2);
		Минута_ = Сред(стрДата, 15, 2);
		Секунда_ = Прав(стрДата, 2);
		
		СтруктураСтроки.Вставить("Период",           Дата(Год_, Месяц_, День_, Час_, Минута_, Секунда_));
		
		СтруктураСтроки.Вставить("СтавкаНДС",        СтавкаНДС);
		СтруктураСтроки.Вставить("СуммаНДС",         СуммаНДС);
		СтруктураСтроки.Вставить("УчитыватьНДС",     УчитыватьНДС);
		СтруктураСтроки.Вставить("СуммаВключаетНДС", СуммаВключаетНДС);
		СтруктураСтроки.Вставить("КоличествоСлив",   0);
		СтруктураСтроки.Вставить("НомерТранзакции",  эл.transId);
		
		Если СтруктураСтроки.Количество > 0 Тогда
			мсвВыборкаЗаправки.Добавить(СтруктураСтроки);
		Иначе
			Если СоздаватьСливыДляОтрицательныхЗаправок Тогда
				СтруктураСтроки.Вставить("КоличествоСлив", СтруктураСтроки.Количество);
				мсвВыборкаСливы.Добавить(СтруктураСтроки);
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	СписокПЛ = Новый СписокЗначений;
	
	ТекОтветственный = уатОбщегоНазначенияПовтИсп.ПолучитьЗначениеПоУмолчаниюПользователя(Пользователи.АвторизованныйПользователь(), "ОсновнойОтветственный");
	
	КолСтрок	 = мсвВыборкаЗаправки.Количество();
	Инд			 = 0;
	Дата1		 = '00010101';
	флЗаписать	 = Ложь;
	мОтказ		 = Ложь;
	ВидОперацииСливГСМ		 = ?(АЗС.ЭтоАЗССклад, Перечисления.уатВидыОперацийСливГСМ.НаСклад, Перечисления.уатВидыОперацийСливГСМ.НаАЗС);
	ВидОперацииЗаправкаГСМ	 = ?(АЗС.ЭтоАЗССклад, Перечисления.уатВидыДвиженияГСМ.ЗаправкаПластиковаяКартаСклад, Перечисления.уатВидыДвиженияГСМ.ЗаправкаПластиковаяКарта);
	флгЕстьПутевойЛист = Ложь;
	
	Для Каждого ВыборкаЗапроса Из мсвВыборкаЗаправки Цикл
		Инд = Инд + 1;
		
		Если уатОбщегоНазначения.уатЗначениеНеЗаполнено(ВыборкаЗапроса.ТС) Тогда
			Продолжить;
		КонецЕсли;	
		
		Если Дата1 <> ВыборкаЗапроса.Период Тогда
			
			Дата1 = ВыборкаЗапроса.Период;
			
			мДокументЗаправкаСлив = Документы.уатЗаправкаГСМ.СоздатьДокумент();
			мДокументЗаправкаСлив.УчитыватьНДС = ВыборкаЗапроса.УчитыватьНДС;
			мДокументЗаправкаСлив.СуммаВключаетНДС = ВыборкаЗапроса.СуммаВключаетНДС;
			
			мДокументЗаправкаСлив.ВидДвиженияГСМ = ВидОперацииЗаправкаГСМ;
			Если ТипЗнч(АЗС.Контрагент_Склад) = Тип("СправочникСсылка.Контрагенты") Тогда
				мДокументЗаправкаСлив.ДоговорКонтрагента = уатЗаполнениеДокументов.ПолучитьОсновнойДоговорКонтрагента(АЗС.Контрагент_Склад, "СПоставщиком");
			КонецЕсли;
			
			мДокументЗаправкаСлив.Дата			 = Дата1;
			мДокументЗаправкаСлив.АЗС			 = АЗС;
			мДокументЗаправкаСлив.Ответственный	 = ТекОтветственный;
			
			флЗаписать = Истина;
			
		КонецЕсли;
		
		НоваяСтрока = мДокументЗаправкаСлив.Заправки.Добавить();
		НоваяСтрока.Дата		 = Дата1;
		НоваяСтрока.ГСМ			 = ВыборкаЗапроса.ГСМ;
		НоваяСтрока.ТС			 = ВыборкаЗапроса.ТС;
		НоваяСтрока.Цена		 = ВыборкаЗапроса.Стоимость / ?(ВыборкаЗапроса.Количество = 0, 1, ВыборкаЗапроса.Количество);
		НоваяСтрока.Количество	 = ВыборкаЗапроса.Количество + ВыборкаЗапроса.КоличествоСлив;
		НоваяСтрока.Сумма		 = ?(ЗначениеЗаполнено(ВыборкаЗапроса.КоличествоСлив) , НоваяСтрока.Количество * НоваяСтрока.Цена, ВыборкаЗапроса.Стоимость);
		
		НоваяСтрока.СтавкаНДС = ВыборкаЗапроса.СтавкаНДС;
		НоваяСтрока.СуммаНДС  = ?(ЗначениеЗаполнено(ВыборкаЗапроса.КоличествоСлив), уатОбщегоНазначенияТиповые.уатРассчитатьСуммуНДС(НоваяСтрока.Сумма,
		мДокументЗаправкаСлив.УчитыватьНДС, мДокументЗаправкаСлив.СуммаВключаетНДС,
		уатОбщегоНазначенияТиповые.уатПолучитьСтавкуНДС(НоваяСтрока.СтавкаНДС)), ВыборкаЗапроса.СуммаНДС);
		
		
		Если ВыборкаЗапроса.УчитыватьНДС = Истина И ВыборкаЗапроса.СуммаВключаетНДС = Ложь Тогда
			НоваяСтрока.Сумма = НоваяСтрока.Сумма - ВыборкаЗапроса.СуммаНДС;
		Иначе
			НоваяСтрока.Сумма = НоваяСтрока.Сумма;
		КонецЕсли;
		
		НоваяСтрока.Валюта				 = ВыборкаЗапроса.Валюта;
		НоваяСтрока.ПластиковаяКарта	 = ВыборкаЗапроса.ПластиковаяКарта;
		
		//находим путевой лист, глубина поиск ПЛ в часах
		ВремяВыезд      = ГлубинаПоискаПЛДоВыезда;
		ВремяВозврат    = ГлубинаПоискаПЛПослеВозвращения;
		
		ТаблицаПЛ = уатОбщегоНазначения.уатПутевыеЛистыВыездВозврат(ВыборкаЗапроса.ТС,Дата1, ВремяВыезд, 
		ВремяВозврат, , ?(ОбрабатыватьРассчитанныеПутевыеЛисты, Неопределено, Ложь));
		
		Если ТаблицаПЛ.Количество() > 0 Тогда
			флгЕстьПутевойЛист = Истина;

			Если СоздаватьСливыДляОтрицательныхЗаправок И ВыборкаЗапроса.Количество < 0 Тогда
				мДокументЗаправкаСлив.ПутевойЛист = ТаблицаПЛ[0].Ссылка;
				Если СписокПЛ.НайтиПоЗначению(мДокументЗаправкаСлив.ПутевойЛист) = Неопределено Тогда
					СписокПЛ.Добавить(мДокументЗаправкаСлив.ПутевойЛист);
				КонецЕсли;
			Иначе
				НоваяСтрока.ПутевойЛист = ТаблицаПЛ[0].Ссылка;
				НоваяСтрока.Водитель = ТаблицаПЛ[0].Ссылка.Водитель1;
				Если СписокПЛ.НайтиПоЗначению(НоваяСтрока.ПутевойЛист) = Неопределено Тогда
					СписокПЛ.Добавить(НоваяСтрока.ПутевойЛист);
				КонецЕсли;
			КонецЕсли; 
		КонецЕсли;                              
				
		Если флЗаписать Тогда
			Попытка
				Если ПроводитьСозданныеЗаправкиГСМ Тогда
					Если флгЕстьПутевойЛист Тогда
						мДокументЗаправкаСлив.Записать(РежимЗаписиДокумента.Проведение);
					КонецЕсли;
				КонецЕсли;
			Исключение
			КонецПопытки;
		КонецЕсли;
		флгЕстьПутевойЛист = Ложь;
	КонецЦикла;
	
	флЗаписать = Ложь;
	
	// Слив ГСМ
	Если СоздаватьСливыДляОтрицательныхЗаправок Тогда
		
		КолСтрок	 = мсвВыборкаСливы.Количество();
		Инд			 = 0;
		Дата1		 = '00010101';
		флЗаписать	 = Ложь;
		мОтказ		 = Ложь;
		
		Для Каждого ВыборкаЗапроса Из мсвВыборкаСливы Цикл
			
			Если уатОбщегоНазначения.уатЗначениеНеЗаполнено(ВыборкаЗапроса.ТС) Тогда
				Продолжить;
			КонецЕсли;	
			
			Дата1 = ВыборкаЗапроса.Период;
			
			мДокументЗаправкаСлив = Документы.уатСливГСМ.СоздатьДокумент();
			мДокументЗаправкаСлив.ВидОперации = ВидОперацииСливГСМ;
			
			мДокументЗаправкаСлив.Дата			 = Дата1;
			мДокументЗаправкаСлив.АЗС			 = АЗС;
			мДокументЗаправкаСлив.Ответственный	 = ТекОтветственный;
			
			флЗаписать = Истина;
			
			мДокументЗаправкаСлив.ГСМ			 = ВыборкаЗапроса.ГСМ;
			мДокументЗаправкаСлив.ТС			 = ВыборкаЗапроса.ТС;
			мДокументЗаправкаСлив.Количество	 = -ВыборкаЗапроса.Количество;
			мДокументЗаправкаСлив.ГСМ			 = ВыборкаЗапроса.ГСМ;
			
			//находим путевой лист
			ВремяВыезд      = ГлубинаПоискаПЛДоВыезда;
			ВремяВозврат    = ГлубинаПоискаПЛПослеВозвращения;
			
			ТаблицаПЛ = уатОбщегоНазначения.уатПутевыеЛистыВыездВозврат(ВыборкаЗапроса.ТС,Дата1, ВремяВыезд, 
			ВремяВозврат, , ?(ОбрабатыватьРассчитанныеПутевыеЛисты, Неопределено, Ложь));
			
			Если ТаблицаПЛ.Количество() > 0 Тогда
				флгЕстьПутевойЛист = Истина;
				мДокументЗаправкаСлив.ПутевойЛист = ТаблицаПЛ[0].Ссылка;
				Если СписокПЛ.НайтиПоЗначению(мДокументЗаправкаСлив.ПутевойЛист) = Неопределено Тогда
					СписокПЛ.Добавить(мДокументЗаправкаСлив.ПутевойЛист);
				КонецЕсли;
			КонецЕсли;

			
			Если флЗаписать Тогда
				Попытка
					Если ПроводитьСозданныеЗаправкиГСМ Тогда
						Если флгЕстьПутевойЛист Тогда
							мДокументЗаправкаСлив.Записать(РежимЗаписиДокумента.Проведение);						
					    КонецЕсли;
					КонецЕсли;
				Исключение
				КонецПопытки;
			КонецЕсли;
			флгЕстьПутевойЛист = Ложь;
		КонецЦикла;
		
	КонецЕсли;
	
	//обновляем информацию по путевым листам
	КолСтрок	 = СписокПЛ.Количество();
	Инд			 = 0;
	
	Для Каждого ТекСтрока Из СписокПЛ Цикл			
		мПутевойЛист	= ТекСтрока.ПолучитьОбъект();
		мЗаголовок = НСтр("ru='Ошибки при расчете итогов работы по путевому листу №'") + мПутевойЛист.Номер + " :";
		Если ПересчитатьПутевыеЛисты Тогда
			мПутевойЛист.ПересчетВыданногоГСМ();
			мПутевойЛист.ПересчетСданногоГСМ();
			мПутевойЛист.РасчетРасходаГСМ(мЗаголовок, мОтказ);
		Иначе
			мПутевойЛист.Рассчитан	= Ложь;
		КонецЕсли;	
		Если мПутевойЛист.Проведен Тогда
			мРежимЗаписи = РежимЗаписиДокумента.Проведение;
		Иначе
			мРежимЗаписи = РежимЗаписиДокумента.Запись;
		КонецЕсли;
		
		Попытка
			мПутевойЛист.Записать(мРежимЗаписи);
		Исключение
		КонецПопытки;
	КонецЦикла;
	
КонецПроцедуры

Функция ПолучитьТопливныеКарты(стрТипСправочника = "уатТС") Экспорт
	Запрос = Новый Запрос;
	тзРезультат = Новый ТаблицаЗначений;
	Запрос.Текст = "ВЫБРАТЬ
	|	уатПластиковыеКарты.Код КАК Код,
	|	уатПластиковыеКарты.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.уатПластиковыеКарты КАК уатПластиковыеКарты
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(уатПластиковыеКарты.КомуВыдана) = ТИП(Справочник." + стрТипСправочника + ")
	|	И НЕ уатПластиковыеКарты.ПометкаУдаления";
	РезультатЗапроса = Запрос.Выполнить();
	Если НЕ РезультатЗапроса.Пустой() Тогда
		тзРезультат = РезультатЗапроса.Выгрузить();	
		тзРезультат.Колонки.Добавить("НовыйКод",, "НовыйКод");  
		Для каждого эл из тзРезультат Цикл
			эл.НовыйКод = СокрЛП(эл.Код);			
		КонецЦикла;
	КонецЕсли;
	
	Возврат тзРезультат;
КонецФункции

Процедура ПересопоставитьГСМ()
	
	ПересчитатьПутевыеЛисты = Объект.ПересчитатьПутевыеЛистыЛукойл;
	//
	ВремяВыезд = Объект.ГлубинаПоискаПЛДоВыездаЛукойл;
	ВремяВыезд = ?(ЗначениеЗаполнено(ВремяВыезд), ВремяВыезд, 0);
	//
	ВремяВозврат = Объект.ГлубинаПоискаПЛПослеВозвращенияЛукойл;
	ВремяВозврат = ?(ЗначениеЗаполнено(ВремяВозврат), ВремяВозврат, 0);
	//
	//
	СоздаватьСливыДляОтрицательныхЗаправок = Объект.СоздаватьСливыДляОтрицательныхЗаправокЛукойл;
	//
	
	ДатаНачала = Объект.НачалоПериода;
    ДатаКонец = Объект.КонецПериода;	
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	уатЗаправкаГСМЗаправки.Ссылка КАК Ссылка,
	|	уатЗаправкаГСМЗаправки.ТС КАК ТС,
	|	уатЗаправкаГСМЗаправки.Дата КАК Дата
	|ИЗ
	|	Документ.уатЗаправкаГСМ.Заправки КАК уатЗаправкаГСМЗаправки
	|ГДЕ
	|	уатЗаправкаГСМЗаправки.Ссылка.ПометкаУдаления = ЛОЖЬ
	|	И уатЗаправкаГСМЗаправки.ПутевойЛист.Ссылка ЕСТЬ NULL
	|	И уатЗаправкаГСМЗаправки.Дата МЕЖДУ &ДатаНачала И &ДатаКонец
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	уатСливГСМ.Ссылка,
	|	уатСливГСМ.ТС,
	|	уатСливГСМ.Дата
	|ИЗ
	|	Документ.уатСливГСМ КАК уатСливГСМ
	|ГДЕ
	|	уатСливГСМ.ПутевойЛист.Ссылка ЕСТЬ NULL
	|	И уатСливГСМ.ПометкаУдаления = ЛОЖЬ
	|	И уатСливГСМ.Дата МЕЖДУ &ДатаНачала И &ДатаКонец";
	
	Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
	Запрос.УстановитьПараметр("ДатаКонец",ДатаКонец);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	СписокПЛ = Новый Массив();
	
	Пока Выборка.Следующий() Цикл
		
		ТаблицаПЛ = уатОбщегоНазначения.уатПутевыеЛистыВыездВозврат(Выборка.ТС,Выборка.Дата, ВремяВыезд, 
		ВремяВозврат, ,?(ОбрабатыватьРассчитанныеПутевыеЛисты, Неопределено, Ложь));
		
		Если ТаблицаПЛ.Количество() > 0 Тогда
			флгЕстьПутевойЛист = Истина;
			Если ТаблицаПЛ[0].Ссылка.Организация <> Выборка.Ссылка.Организация Тогда
				Сообщить("Предупреждение", "Организации в " + Строка(Выборка.Ссылка) + " и документа " + Строка(ТаблицаПЛ[0].Ссылка) + " не совпадают.");										
			КонецЕсли;
			
			Если ТипЗнч(Выборка.Ссылка) = Тип("ДокументСсылка.уатЗаправкаГСМ") Тогда
				Заправка = Выборка.Ссылка.ПолучитьОбъект();
				НайтиСтроки = Заправка.Заправки.НайтиСтроки(Новый Структура("Дата,ТС",Выборка.Дата,Выборка.ТС)); 
				
				
				Для каждого стр из НайтиСтроки Цикл
					стр.ПутевойЛист = ТаблицаПЛ[0].Ссылка;
					стр.Водитель = ТаблицаПЛ[0].Ссылка.Водитель1;
				КонецЦикла;
				
				Попытка 
					Заправка.Записать(РежимЗаписиДокумента.Проведение);
				Исключение
					Заправка.Записать(РежимЗаписиДокумента.Запись);					
				КонецПопытки;
				
				
			Иначе
				Слив = Выборка.Ссылка.ПолучитьОбъект();
				Слив.ПутевойЛист = ТаблицаПЛ[0].Ссылка;	
				
				Попытка 
					Слив.Записать(РежимЗаписиДокумента.Проведение);
				Исключение
					Слив.Записать(РежимЗаписиДокумента.Запись);
				КонецПопытки;
				
			КонецЕсли;
			Если СписокПЛ.Найти(ТаблицаПЛ[0].Ссылка) = Неопределено Тогда
				СписокПЛ.Добавить(ТаблицаПЛ[0].Ссылка);
			КонецЕсли;
		Иначе
			Сообщить("Предупреждение", "Не найден Путевой лист для " + Строка(Выборка.Ссылка) + ". При сопоставлении");											
		КонецЕсли;	
	КонецЦикла;
	
	Для Каждого ТекСтрока Из СписокПЛ Цикл			
		мПутевойЛист	= ТекСтрока.ПолучитьОбъект();
		мЗаголовок = НСтр("en='Errors in calculation of balance of the work by waybill №';ru='Ошибки при расчете итогов работы по путевому листу №'") + мПутевойЛист.Номер + " :";
		Отказ = Ложь;
		Если ПересчитатьПутевыеЛисты Тогда
			мПутевойЛист.ПересчетВыданногоГСМ();
			мПутевойЛист.ПересчетСданногоГСМ();
			мПутевойЛист.РасчетРасходаГСМ(мЗаголовок,Отказ);
		КонецЕсли;
		
		Если мПутевойЛист.Проведен Тогда
			мРежимЗаписи = РежимЗаписиДокумента.Проведение;
		Иначе
			мРежимЗаписи = РежимЗаписиДокумента.Запись;
		КонецЕсли;
		
		Попытка
			мПутевойЛист.Записать(мРежимЗаписи);
		Исключение
			мПутевойЛист.Записать(РежимЗаписиДокумента.Запись);
		КонецПопытки;
	КонецЦикла;
	
	
	
	
КонецПроцедуры

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

В нашем случаем это простая обработка, где с заполненными параметрами на форме, по кнопке синхронизировать, в УАТ создаются документы заправок и сливок, согласно данным сервиса, и сопопставляются путевым листам.

УАТ Интеграция Лукойл Веб-сервисы

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL, 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2582    3    0    

10

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    34642    68    45    

27

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    2355    2    2    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19057    21    22    

19

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    18832    54    50    

30

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

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    833    4    1    

5

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4033    3    2    

4

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    93003    190    217    

343