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

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    15983    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

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

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

5040 руб.

04.05.2021    17983    9    15    

13

SALE! 10%

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

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

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

28000 25200 руб.

28.05.2015    84990    26    51    

50

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС 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    89133    163    216    

320

[Расширение] БОР-Навигатор.Культура

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

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25902    9    0    

7