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