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

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='Ошибки при расчете итогов работы по путевому листу №'") + мПутевойЛист.Номер + " :";
		Отказ = Ложь;
		Если ПересчитатьПутевыеЛисты Тогда
			мПутевойЛист.ПересчетВыданногоГСМ();
			мПутевойЛист.ПересчетСданногоГСМ();
			мПутевойЛист.РасчетРасходаГСМ(мЗаголовок,Отказ);
		КонецЕсли;
		
		Если мПутевойЛист.Проведен Тогда
			мРежимЗаписи = РежимЗаписиДокумента.Проведение;
		Иначе
			мРежимЗаписи = РежимЗаписиДокумента.Запись;
		КонецЕсли;
		
		Попытка
			мПутевойЛист.Записать(мРежимЗаписи);
		Исключение
			мПутевойЛист.Записать(РежимЗаписиДокумента.Запись);
		КонецПопытки;
	КонецЦикла;
	
	
	
	
КонецПроцедуры

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

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

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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    16220    14    18    

14

Интеграция 1С и Битрикс 24 — модуль синхронизации для обмена задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18379    10    15    

16

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13068    34    8    

13

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85674    26    51    

50

Интеграция с сервисом vetmanager

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

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

12000 руб.

02.02.2021    16708    43    49    

24