Умная маршрутизация: о сложностях интеграции с 1С (часть 2)

Публикация № 1505500 27.08.21

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

В статье будет много примеров кода с комментариями работы расширения для обмена данными УТ11.4 с Яндекс.Маршрутизацией через выгрузку/загрузку EXCEL файла.

Принцип работы, какие задачи решает и кому подходит - описано в первой части статьи: Умная маршрутизация: кейс интеграции с 1С (часть 1)

Во второй части описана доработка "Рабочего места менеджера по доставке" в УТ 11.4 для обмена данными с Яндекс.Маршрутизацией.

Идея. Нам нужны 2 кнопки: “Загрузить” и “Выгрузить”

Создаём расширение, в нем обработку с тремя кнопками кода и – вуаля:

 

 

  1. Есть нажать на первую кнопку (левую зеленую) формируется готовый Excel. Его нужно подгрузить в Яндекс.Маршрутизацию.
  2. Яндекс.Маршрутизация оптимизирует маршруты водителей и возвращает Excel – Маршрутный лист с параметрами поездки. Если нажать кнопку 2, Маршрутный лист загрузится в 1С и раскидает заказы по маршрутным листам.
  3. Позже появилась кнопка 3 (верхняя длинная) «Стоимость работы водителей». Она открывает отчёт с итогами работы за день/неделю/месяц и авторасчёт зарплаты водителей.

Стоп, нужно же где-то взять список заказов, которые необходимо сегодня доставить. Вспоминаем, что в УТ это Обработки.РабочееМестоМенеджераПоДоставке.

Переносим кнопки туда.

 

Формируем Excel с заказами

 

Чтобы сформировать Excel, нужно решить 3 проблемы (по факту больше, конечно, но кто бы научил точно оценивать все проблемы до начала разработки):

 

Шаг 1. У нас база клиент-серверная, значит Excel сформируется на сервере, а сохранить его надо будет на клиенте. Тут всё стандартно:

&НаКлиенте
Процедура ЯМ_ЯМ_СохранитьВЭксельПосле(Команда)
    //Сохраняем в Эксель на клиенте
    СохранитьПрочитатьЭксельЯндексМаршрутизации("Сохранение");
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПрочитатьЭксельЯндексМаршрутизации(ТипКоманды)
    //Прочитать Эксель на клиенте
    Режим = РежимДиалогаВыбораФайла[ТипКоманды]; 
    ДиалогФайла = Новый ДиалогВыбораФайла(Режим); 
    Если ТипКоманды = "Сохранение" Тогда
        ДиалогФайла.ПолноеИмяФайла = "YaRouting_" + Формат(ТекущаяДата(),"ДФ=yyyyMMdd_HHMMss"); 
    КонецЕсли;
    Фильтр = "Документ Excel (*.xlsx)|*.xlsx|";                 
    ДиалогФайла.Фильтр = Фильтр; 
    ДиалогФайла.МножественныйВыбор = Ложь; 
    ДиалогФайла.Заголовок = "Выберите файл"; 
    Если ДиалогФайла.Выбрать() Тогда 
        Если ТипКоманды = "Сохранение" Тогда
            ОднаКнига = Новый ПакетОтображаемыхДокументов;
            //Создав объект "ОднаКнига", мы можем в его состав поместить несколько табличных документов каким-то таким образом:
            ДобавитьСтраницыВКнигу(ОднаКнига);
            //А сохранить в одну книгу все это хозяйство можно так:
            ОднаКнига.Записать(ДиалогФайла.ПолноеИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
        Иначе
            //Открытие файла
            Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогФайла.ПолноеИмяФайла));
            ПрочитатьИОбработатьФайлЯндексМаршрутизации(Адрес, ДиалогФайла.ПолноеИмяФайла);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

 

Шаг 2. Если вы посмотрели шаблон Excel Яндекс.Маршрутизации https://yandex.ru/routing/doc/vrp/concepts/example.html, то увидели, что в нём несколько страниц. Т.е. нужно сохранить не просто Excel, а сохранить в 1С многостраничный Excel.

Для этого мы на клиенте создаём: 

ОднаКнига = Новый ПакетОтображаемыхДокументов;

и затем серверной процедурой ДобавитьСтраницыВКнигу(ОднаКнига) создаём 4 отдельных Табличных документа, сохраняем их как листы книги ОднаКнига, а на клиенте - многостраничный Excel

ОднаКнига.Записать(ДиалогФайла.ПолноеИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX).

Для красоты вынес код в общий модуль: и читать удобнее, и использовать повторно.

&НаСервере
Процедура ДобавитьСтраницыВКнигу(ОднаКнига)
    ЯМ_ИнтеграцияСЯндексМаршрутизацией.ДобавитьСтраницыЭкселяДляЯндексМаршрутизации(ОднаКнига, ПолучитьЗаказыНаДоставку(), УникальныйИдентификатор);
КонецПроцедуры

Основная процедура общего модуля заполняет начальные параметры и добавляет 4 страницы в книгу Excel:

Процедура ДобавитьСтраницыЭкселяДляЯндексМаршрутизации(ОднаКнига, ЗаказыНаДоставку, УникальныйИдентификатор) Экспорт
    //Определяем режим времени суток
    РежимВремени = Новый Структура;
    РежимВремени.Вставить("ТекущаяДата",    ТекущаяДата());
    РежимВремени.Вставить("СейчасВечер",     ?(Час(РежимВремени.ТекущаяДата)>= 15, Истина, Ложь)        );
    РежимВремени.Вставить("СейчасВыходной", ?(ДеньНедели(РежимВремени.ТекущаяДата)>=6, Истина, Ложь));
    РежимВремени.Вставить("Суффикс",         ?(РежимВремени.СейчасВечер, "_НОЧЬ", "_ДЕНЬ"));
    РежимВремени.Вставить("СуффиксОбщий",   ?(РежимВремени.СейчасВыходной, "_ВЫХОДНОЙ", ?(РежимВремени.СейчасВечер, "_НОЧЬ", "_ДЕНЬ")));
   
    //Добавляем страницу Опций   
    ДобавитьСтраницуВЭксель(ОднаКнига, "Orders", УникальныйИдентификатор, ЗаказыНаДоставку, РежимВремени);
    ДобавитьСтраницуВЭксель(ОднаКнига, "Vehicles", УникальныйИдентификатор,,РежимВремени);
    ДобавитьСтраницуВЭксель(ОднаКнига, "Depot", УникальныйИдентификатор,,РежимВремени);
    ДобавитьСтраницуВЭксель(ОднаКнига, "Options", УникальныйИдентификатор,,РежимВремени);
   
КонецПроцедуры

И, наконец, код добавления страниц:

&НаСервере
Процедура ДобавитьСтраницуВЭксель(ОднаКнига, НазваниеСтраницыЭксель, УникальныйИдентификатор, ЗаказыНаДоставку = Неопределено, РежимВремени)
    Элт = ОднаКнига.Состав.Добавить();
    Элт.Наименование = НазваниеСтраницыЭксель;
    Элт.Данные = ВыгрузитьТабДокВовременноеХранилищеНаСервере(НазваниеСтраницыЭксель, УникальныйИдентификатор, ЗаказыНаДоставку, РежимВремени);
КонецПроцедуры

Как вы заметили, всё довольно просто. Нужно указать название нового листа Элт.Наименование  и добавить данные  Элт.Данные.

&НаСервере
Функция ВыгрузитьТабДокВовременноеХранилищеНаСервере(НазваниеСтраницыЭксель, УникальныйИдентификатор, ЗаказыНаДоставку = Неопределено, РежимВремени)
   
    Макет = Обработки.РабочееМестоМенеджераПоДоставке.ПолучитьМакет("" + НазваниеСтраницыЭксель);
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
   
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Вывести(ОбластьШапка);
    ЗаполнитьСтрокиДокумента(Макет, ТабДок, НазваниеСтраницыЭксель, ЗаказыНаДоставку, РежимВремени);
   
    АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ТабДок, УникальныйИдентификатор);
   
    Возврат АдресВременногоХранилища;
   
КонецФункции

 

Шаг 3. Шапки страниц с названием колонок (именно по ним Яндекс.Маршрутизация считывает значения параметров) мы храним в виде макетов и называем их как страницы в формируемом Excel. Это позволяет использовать парадигму, так называемого, самопишушегося кода

Макет = Обработки.РабочееМестоМенеджераПоДоставке.ПолучитьМакет("" + НазваниеСтраницыЭксель);

 

 

Orders

 

Vehicles

Depot

 

Options

 

Шаг 4. Самая неаккуратная процедура заполнения строки:

&НаСервере
Процедура ЗаполнитьСтрокиДокумента(Макет, ТабДок, НазваниеСтраницыЭксель, ЗаказыНаДоставку = Неопределено, РежимВремени)
    ////////////////////  "Depot"
    Если НазваниеСтраницыЭксель = "Depot" Тогда
        ПараметрыСклада = ПолучитьЗаполненныеПараметрыСтрокиСклада();
        //Ставим на вечер другой склад
        Если РежимВремени.СейчасВечер Тогда
            ПараметрыСклада.НомерСтроки = "2";
            ПараметрыСклада.НазваниеСклада = "МСК- Опт - ДОПЛАНИРОВАНИЕ";
        КонецЕсли;

        ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыСклада);

    ///////////////////  "Options"
    ИначеЕсли НазваниеСтраницыЭксель = "Options" Тогда
        ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПолучитьЗаполненныеПараметрыСтрокиОпций());
    ///////////////////  "Vehicles"   
    ИначеЕсли НазваниеСтраницыЭксель = "Vehicles" Тогда
        Машины = ПолучитьСписокМашин();
        Для Каждого Автомобиль ИЗ Машины Цикл
            ПараметрыМашины = ПолучитьЗаполненныеПараметрыСтрокиМашины();           

            ЗаполнитьЗначенияСвойств(ПараметрыМашины,Автомобиль.ТранспортноеСредство);
           
            ПараметрыМашины.ЯМ_НазваниеМашины = "" + Автомобиль.ТранспортноеСредство + " - [" + Автомобиль.Водитель + "]"; 
            ПараметрыМашины.ЯМ_ЛогинКурьера = Автомобиль.ТранспортноеСредство["ЯМ_ЛогинКурьера" + РежимВремени.Суффикс];
            ПараметрыМашины.ЯМ_ВремяНачалаИКонцаСмены = Автомобиль.ТранспортноеСредство["ЯМ_ВремяНачалаИКонцаСмены" + РежимВремени.Суффикс];
           
            ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыМашины);

        КонецЦикла;
    ///////////////////  "Orders"   
    ИначеЕсли НазваниеСтраницыЭксель = "Orders" Тогда
        Для Каждого СтрЗаказа ИЗ ЗаказыНаДоставку Цикл
            ПараметрыЗаказа = ПолучитьЗаполненныеПараметрыСтрокиЗаказов();
            УточненныеПараметрыЗаказа = ПолучитьУточненныеПараметрыЗаказа(СтрЗаказа);           

            ЗаполнитьЗначенияСвойств(ПараметрыЗаказа, УточненныеПараметрыЗаказа);           

            //Подбираем наиболее подходящее временное окно
            Если УточненныеПараметрыЗаказа.Свойство("ВременноеОкно" + РежимВремени.СуффиксОбщий) Тогда
                ПараметрыЗаказа.ВременноеОкно = УточненныеПараметрыЗаказа["ВременноеОкно" + РежимВремени.СуффиксОбщий];
            ИначеЕсли УточненныеПараметрыЗаказа.Свойство("ВременноеОкно" + РежимВремени.Суффикс) Тогда
                ПараметрыЗаказа.ВременноеОкно = УточненныеПараметрыЗаказа["ВременноеОкно" + РежимВремени.Суффикс];
            КонецЕсли;
           
            //ПараметрыМашины.ЯМ_НазваниеМашины = "" + Автомобиль.ТранспортноеСредство + " - [" + Автомобиль.Водитель + "]"; 
            //ПараметрыМашины.ЯМ_ЛогинКурьера = Автомобиль.ТранспортноеСредство.ЯМ_ЛогинКурьера_ДЕНЬ;
            //ПараметрыМашины.ЯМ_ВремяНачалаИКонцаСмены = Автомобиль.ТранспортноеСредство.ЯМ_ВремяНачалаИКонцаСмены_ДЕНЬ;
           
            ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыЗаказа);

        КонецЦикла;
    КонецЕсли;   
КонецПроцедуры

Тут мы себе помогли, сделав предзаполнение параметров процедурами:

ПолучитьЗаполненныеПараметрыСтрокиСклада()
ПолучитьЗаполненныеПараметрыСтрокиОпций()
ПолучитьЗаполненныеПараметрыСтрокиМашины()
ПолучитьЗаполненныеПараметрыСтрокиЗаказов()

Функции облегчают чтение кода, а по сути являются сохранённым результатом нашего 2-х месячного подбора параметров. Значения по умолчанию для нашей компании. Приведу их в спойлере, чтобы не загромождать статью:

&НаСервере
Процедура ЗаполнитьСтрокиДокумента(Макет, ТабДок, НазваниеСтраницыЭксель, ЗаказыНаДоставку = Неопределено, РежимВремени)
    ////////////////////  "Depot"
    Если НазваниеСтраницыЭксель = "Depot" Тогда
        ПараметрыСклада = ПолучитьЗаполненныеПараметрыСтрокиСклада();
        //Ставим на вечер другой склад
        Если РежимВремени.СейчасВечер Тогда
            ПараметрыСклада.НомерСтроки = "2";
            ПараметрыСклада.НазваниеСклада = "МСК- Опт - ДОПЛАНИРОВАНИЕ";
        КонецЕсли;

        ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыСклада);
       
    ///////////////////  "Options"
    ИначеЕсли НазваниеСтраницыЭксель = "Options" Тогда
        ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПолучитьЗаполненныеПараметрыСтрокиОпций());
    ///////////////////  "Vehicles"   
    ИначеЕсли НазваниеСтраницыЭксель = "Vehicles" Тогда
        Машины = ПолучитьСписокМашин();
        Для Каждого Автомобиль ИЗ Машины Цикл
            ПараметрыМашины = ПолучитьЗаполненныеПараметрыСтрокиМашины();
           
            ЗаполнитьЗначенияСвойств(ПараметрыМашины,Автомобиль.ТранспортноеСредство);
           
            ПараметрыМашины.ЯМ_НазваниеМашины = "" + Автомобиль.ТранспортноеСредство + " - [" + Автомобиль.Водитель + "]"; 
            ПараметрыМашины.ЯМ_ЛогинКурьера = Автомобиль.ТранспортноеСредство["ЯМ_ЛогинКурьера" + РежимВремени.Суффикс];
            ПараметрыМашины.ЯМ_ВремяНачалаИКонцаСмены = Автомобиль.ТранспортноеСредство["ЯМ_ВремяНачалаИКонцаСмены" + РежимВремени.Суффикс];
           
            ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыМашины);

        КонецЦикла;
    ///////////////////  "Orders"   
    ИначеЕсли НазваниеСтраницыЭксель = "Orders" Тогда
        Для Каждого СтрЗаказа ИЗ ЗаказыНаДоставку Цикл
            ПараметрыЗаказа = ПолучитьЗаполненныеПараметрыСтрокиЗаказов();
            УточненныеПараметрыЗаказа = ПолучитьУточненныеПараметрыЗаказа(СтрЗаказа);
           
            ЗаполнитьЗначенияСвойств(ПараметрыЗаказа, УточненныеПараметрыЗаказа);
           
            //Подбираем наиболее подходящее временное окно
            Если УточненныеПараметрыЗаказа.Свойство("ВременноеОкно" + РежимВремени.СуффиксОбщий) Тогда
                ПараметрыЗаказа.ВременноеОкно = УточненныеПараметрыЗаказа["ВременноеОкно" + РежимВремени.СуффиксОбщий];
            ИначеЕсли УточненныеПараметрыЗаказа.Свойство("ВременноеОкно" + РежимВремени.Суффикс) Тогда
                ПараметрыЗаказа.ВременноеОкно = УточненныеПараметрыЗаказа["ВременноеОкно" + РежимВремени.Суффикс];
            КонецЕсли;
           
            //ПараметрыМашины.ЯМ_НазваниеМашины = "" + Автомобиль.ТранспортноеСредство + " - [" + Автомобиль.Водитель + "]"; 
            //ПараметрыМашины.ЯМ_ЛогинКурьера = Автомобиль.ТранспортноеСредство.ЯМ_ЛогинКурьера_ДЕНЬ
            //ПараметрыМашины.ЯМ_ВремяНачалаИКонцаСмены = Автомобиль.ТранспортноеСредство.ЯМ_ВремяНачалаИКонцаСмены_ДЕНЬ;
           
            ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ПараметрыЗаказа);

        КонецЦикла;
       
    КонецЕсли;

КонецПроцедуры

Далее мы уточняем значение параметров строки и запускаем лаконичную  ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ЗначенияПараметров).

&НаСервере
Процедура ЗаполнитьСтрокуИДобавитьТабДок(Макет, ТабДок, ЗначенияПараметров)
   
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ЗначенияПараметров);
    ТабДок.Вывести(ОбластьСтрока);
   
КонецПроцедуры

Такой минималистичный код получился благодаря нашим ПолучитьЗаполненныеПараметры…() и тому, что мы идентично назвали параметры ячеек в макетах страниц (Проблемы шаг 3)

 

Шаг 5. Как хранить дополнительные параметры? Чтобы ускорить разработку, мы решили хранить все параметры в реквизитах Справочников. Сейчас, я бы хранил все параметры, используя стандартный механизм 1С Дополнительных Значений. Это обезопасит пользователей от потери данных, введенных в эти доп. реквизиты, например, если кто-то из сотрудников (админ, конечно, кто же ещё) снесёт расширение, а потом его опять запустит. Но было решено так:

 

 

Внешний вид карточек ТС, клиентов, склада можно посмотреть в первой части статьи - Умная маршрутизация: кейс интеграции с 1С (часть 1) 

 

Шаг 6. Но ведь нам нужны данные - список заказов. А в обработке РабочееМестоМенеджераПоДоставке этот самый список не Список, а деревоЗначений. Что ж, берём поисковик и рисуем рекурсию:

&НаСервере
Функция ПолучитьЗаказыНаДоставку()
   
    ДеревоЗнач = РеквизитФормыВЗначение("РаспоряженияНаДоставку");
    ЗаказыНаДоставку = ПолучитьПустуюТЗ();
    ОбходДереваДетально(ДеревоЗнач, ЗаказыНаДоставку);
   
    Возврат ЗаказыНаДоставку;

КонецФункции

&НаСервере
Функция ПолучитьПустуюТЗ()
   
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Распоряжение");
    ТЗ.Колонки.Добавить("Перевозчик");
    ТЗ.Колонки.Добавить("Адрес");
    ТЗ.Колонки.Добавить("Номер");
    ТЗ.Колонки.Добавить("ПолучательОтправитель");
    ТЗ.Колонки.Добавить("Вес");

    Возврат ТЗ;
   
КонецФункции

//Рекурсивная процедура
&НаСервере
Процедура ОбходДереваДетально(ПереданноеДер, ТЗ)
   
    Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл
       
        //Сообщить(СтрПолученногоДерева.Номенклатура);
        Если ЗначениеЗаполнено(СтрПолученногоДерева.Распоряжение) Тогда
            НовСтр = ТЗ.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтр, СтрПолученногоДерева);
        КонецЕсли; 
       
        Если СтрПолученногоДерева.Строки.Количество()>0 Тогда           
            ОбходДереваДетально(СтрПолученногоДерева, ТЗ);           
        КонецЕсли;
       
    КонецЦикла;
   
КонецПроцедуры

Ну вот и всё! Многостраничный EXCEL с заполненными строками для Яндекс.Маршрутизации сформирован, сохранён, казалось бы, можно идти пить чай, но нет… нужно теперь загрузить ответ от Яндекс.Маршрутизации. Ну его этот чай, поехали!

 

Загружаем данные в 1С

 

Шаг 7. Теперь файл - на клиенте, а обработка - на сервере.

&НаКлиенте
Процедура ЯМ_ЯМ_ЗагрузитьМаршрутныеЛистыИзЭксельПосле(Команда)   
    СохранитьПрочитатьЭксельЯндексМаршрутизации("Открытие");
КонецПроцедуры

Процедура получилась универсальной (см. шаг 1), несколько строчек помещаем во временное хранилище и отправляем на сервер:

Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогФайла.ПолноеИмяФайла));
            ПрочитатьИОбработатьФайлЯндексМаршрутизации(Адрес, ДиалогФайла.ПолноеИмяФайла);

&НаСервере
Процедура ПрочитатьИОбработатьФайлЯндексМаршрутизации(Адрес, ИмяФайла)
       //вывод в таблицу значений
       ЯМ_ИнтеграцияСЯндексМаршрутизацией.ПрочитатьИОбработатьФайлЯндексМаршрутизации(Адрес, ИмяФайла);  
КонецПроцедуры

 

Шаг 8. Используем современные методы чтения Excel:

Процедура ПрочитатьИОбработатьФайлЯндексМаршрутизации(Адрес, ИмяФайла) Экспорт
    //Необходимо чтение файлов XLS или XLSX
    Расширение = Прав(ИмяФайла, 4);
    Расширение = СтрЗаменить(Расширение, ".", "");
   
    ФайлПриемник = ПолучитьИмяВременногоФайла(Расширение);
    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
    ДанныеХранилища.Записать(ФайлПриемник);
  
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ФайлПриемник, СпособЧтенияЗначенийТабличногоДокумента.Значение); 
  
    //вывод в таблицу значений   
    ПЗ = Новый ПостроительЗапроса;
    //ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
    //Загружаем не весь Эксель, а только лист "Маршруты"
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.ПолучитьОбласть("Маршруты").Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
   
    ТаблицаЗначений = ПЗ.Результат.Выгрузить();
    ДозаполнитьТЗДаннымиДляЗагрузки(ТаблицаЗначений);  
   
    ЗагрузитьТочкиВМаршрутныеЛисты(ТаблицаЗначений);  

Конецпроцедуры

Вот этот кусок кода мой любимый:

    //вывод в таблицу значений   
    ПЗ = Новый ПостроительЗапроса;
    //ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
    //Загружаем не весь Эксель, а только лист "Маршруты"
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.ПолучитьОбласть("Маршруты").Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    ТаблицаЗначений = ПЗ.Результат.Выгрузить();

Он подходит для любого Excel, нужно лишь подставить верное название листа. Если Excel одностраничный, то пишем так:

    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    ТаблицаЗначений = ПЗ.Результат.Выгрузить();

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

 

Шаг 9. Привязываем данные из Excel к своим данным в 1С. Поэтому привожу код без пояснений, он очень персональный, и вам точно не подойдёт, но для целостной картины нужен:

Процедура ДозаполнитьТЗДаннымиДляЗагрузки(ТЗ)

    ТЗ.Колонки.Добавить("Вес");
    ТЗ.Колонки.Добавить("КлючСвязи");
    ТЗ.Колонки.Добавить("Распоряжение");
    ТЗ.Колонки.Добавить("Перевозчик");
    ТЗ.Колонки.Добавить("ПолучательОтправитель");
    ТЗ.Колонки.Добавить("Склад");
    ТЗ.Колонки.Добавить("Доставлено");
    ТЗ.Колонки.Добавить("ДоставляетсяПолностью");
    ТЗ.Колонки.Добавить("ВремяС");
    ТЗ.Колонки.Добавить("ВремяПо");
    ТЗ.Колонки.Добавить("АдресЗначенияПолей");
    ТЗ.Колонки.Добавить("ДополнительнаяИнформация");
    ТЗ.Колонки.Добавить("ИдентификаторМашиныДля1С");
   
    ПрефиксУИД = "" + Формат(ТекущаяДата(),"ДФ=ddMMyyhhmmss") + "_";
   
    Для Каждого Стр ИЗ ТЗ Цикл
        Стр.Вес = Стр.ВесЗаказа_Кг;
        Если ЗначениеЗаполнено(Стр.ИдентификаторМашины) Тогда
            Стр.ИдентификаторМашиныДля1С = СформироватьПравильныйКлюч(Стр.ИдентификаторМашины);
            Если ЗначениеЗаполнено(Стр.НомерЗаказа) И НЕ Стр.ТипТочки = "Склад" Тогда
                ГУИДНачало = СтрНайти(Стр.НомерЗаказа,"[GUID ");
                ГУИД = Сред(Стр.НомерЗаказа,ГУИДНачало + 6,36);
                НовыйGUID = Новый УникальныйИдентификатор(ГУИД);               

                //Если Стр.НомерЗаказа = "ЭПУТ-003737 - 02.10.2020 11:34:19 [GUID 8dcf91c6-03cc-11eb-9aff-c86000c31ebb]"
                //    ИЛИ Стр.НомерЗаказа = "ЭПУТ-003716 - 02.10.2020 11:34:19 [GUID 07cd4366-02f6-11eb-9aff-c86000c31ebb]" Тогда
                //    а=1;
                //КонецЕсли;
              
                ЗаказКлиента = Документы.ЗаказКлиента.ПолучитьСсылку(НовыйGUID);              

                Если СтрНайти("" + ЗаказКлиента,"Объект не найден") > 0 Тогда
                    ЗаказКлиента = Документы.ПоручениеЭкспедитору.ПолучитьСсылку(НовыйGUID);
                КонецЕсли;
               
                Если СтрНайти("" + ЗаказКлиента,"Объект не найден") > 0 Тогда
                    ЗаказКлиента = Документы.ЗаказНаПеремещение.ПолучитьСсылку(НовыйGUID);
                КонецЕсли;
               
                Если ЗначениеЗаполнено(ЗаказКлиента) Тогда
                    Стр.Распоряжение = ЗаказКлиента;
                    //Если ТипЗнч(ЗаказКлиента) = Тип("ДокументСсылка.ЗаказНаПеремещение") Тогда
                    //    Стр.Склад = ЗаказКлиента.СкладОтправитель;
                    //Иначе
                    //    Стр.Склад = ЗаказКлиента.Склад;
                    //КонецЕсли;
                    //Пока делаем для всех склад МСК-Опт
                    Стр.Склад = Справочники.Склады.НайтиПоНаименованию("МСК- Опт");
                    Стр.ПолучательОтправитель = Справочники.Партнеры.НайтиПоНаименованию(Стр.ТорговаяСеть);
                    Стр.Доставлено = Ложь;
                    Стр.ДоставляетсяПолностью = Истина;
                    Стр.Адрес = ЗаказКлиента.АдресДоставки;
                    Стр.АдресЗначенияПолей = ЗаказКлиента.АдресДоставкиЗначенияПолей;
                    Стр.ДополнительнаяИнформация = ЗаказКлиента.ДополнительнаяИнформацияПоДоставке;
                    Если ТипЗнч(ЗаказКлиента) = Тип("ДокументСсылка.ЗаказКлиента")
                        ИЛИ ТипЗнч(ЗаказКлиента) = Тип("ДокументСсылка.ЗаказНаПеремещение") Тогда
                        Стр.Перевозчик = ЗаказКлиента.ПеревозчикПартнер;
                        Если ЗначениеЗаполнено(Стр.Перевозчик) Тогда
                            Стр.Адрес = ЗаказКлиента.АдресДоставкиПеревозчика;
                            Стр.АдресЗначенияПолей = ЗаказКлиента.АдресДоставкиПеревозчикаЗначенияПолей;
                        КонецЕсли;
                    КонецЕсли;
                    //Уникальный номер связи строк
                    АдресУИД = Стр.Адрес;
                    АдресУИД = СтрЗаменить(АдресУИД," ","");
                    АдресУИД = СтрЗаменить(АдресУИД,",","");
                    АдресУИД = СтрЗаменить(АдресУИД,".","");
                    Стр.КлючСвязи = "" + ПрефиксУИД + Прав(АдресУИД, 12) + Лев(АдресУИД, 12) + Прав(АдресУИД, 12);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

 

Шаг 10. И, наконец, привязываем наши Заказы к машинам (Маршрутным листам, сформированным Яндекс.Маршрутизацией):

Процедура ЗагрузитьТочкиВМаршрутныеЛисты(ТЗ) Экспорт
   
    //Обрабатываем ТЗ
    ЗаданияНаПеревозку = НайтиВсеЗаданияНаПеревозку(ТЗ);
   
    Для Каждого ТекЗадание Из ЗаданияНаПеревозку Цикл
        Если ЗначениеЗаполнено(ТекЗадание.Значение) Тогда
           
            П = Новый Структура;
            П.Вставить("ИдентификаторМашиныДля1С",ТекЗадание.Ключ);
            НайденныеСтроки = ТЗ.НайтиСтроки(П);
           
            Если НайденныеСтроки.Количество() > 2 Тогда
                Попытка
                    //Очищаем зание перед загрузкой
                    ОбЗадание = ТекЗадание.Значение.ПолучитьОбъект();
                    ОбЗадание.Маршрут.Очистить();
                    ОбЗадание.Распоряжения.Очистить();
                    ОбЗадание.ЯМ_Км_План = 0;        
                   
                    ТЗНайденныеСтроки = ТЗ.СкопироватьКолонки();
                   
                    Для Каждого Стр Из НайденныеСтроки Цикл
                                                                       
                        //Считаем километры ЯМ_Км_План
                        Если ЗначениеЗаполнено(Стр.ДлинаПутиДоТочки_Км) Тогда
                            ОбЗадание.ЯМ_Км_План = ОбЗадание.ЯМ_Км_План + Стр.ДлинаПутиДоТочки_Км;
                            //ОбЗадание.ЯМ_Км_Факт = ОбЗадание.ЯМ_Км_Факт + Стр.ДлинаПутиДоТочки_Км;
                        КонецЕсли;
                       
                        Если Стр.ТипТочки = "Склад" Тогда
                            //Парсим время
                            Попытка
                                Если СтрНайти(Стр.ВремяПрибытияНаЗаказ_Склад,"1.") > 0 Тогда
                                    ТекДатаСтрока = "" + Формат(ОбЗадание.Дата + 24*60*60,"ДФ=yyyyMMdd");
                                    СтрВремя = СтрЗаменить(Стр.ВремяПрибытияНаЗаказ_Склад,"1.","");
                                Иначе
                                    ТекДатаСтрока = "" + Формат(ОбЗадание.Дата,"ДФ=yyyyMMdd");
                                    СтрВремя = Стр.ВремяПрибытияНаЗаказ_Склад;
                                КонецЕсли;
                                СтрВремя = СтрЗаменить(СтрВремя,":","");
   
                                ТекДата = Дата(ТекДатаСтрока + СтрВремя);
                               
                                Если Не ЗначениеЗаполнено(ОбЗадание.ДатаВремяРейсаПланС) Тогда
                                    ОбЗадание.ДатаВремяРейсаПланС      = ТекДата;
                                Иначе
                                    Если ТекДата > ОбЗадание.ДатаВремяРейсаПланС Тогда
                                        ОбЗадание.ДатаВремяРейсаПланПо = ТекДата;
                                    Иначе
                                        ОбЗадание.ДатаВремяРейсаПланПо = ОбЗадание.ДатаВремяРейсаПланС; 
                                        ОбЗадание.ДатаВремяРейсаПланС  = ТекДата;
                                    КонецЕсли;
                                КонецЕсли;
                            Исключение
                            КонецПопытки;
                        Иначе
                            //Копируем строки массива в ТЗ,чтобы потом загрузить в документ
                            НовСтр_ТЗНайденныеСтроки = ТЗНайденныеСтроки.Добавить();
                            ЗаполнитьЗначенияСвойств(ТЗНайденныеСтроки,Стр);
                            НовСтр_Маршрут         = ОбЗадание.Маршрут.Добавить();
                            ЗаполнитьЗначенияСвойств(НовСтр_Маршрут,Стр);
                           
                            НовСтр_Распоряжения = ОбЗадание.Распоряжения.Добавить();
                            ЗаполнитьЗначенияСвойств(НовСтр_Распоряжения,Стр);
                        КонецЕсли;
                    КонецЦикла;
                   
                    //ТЗНайденныеСтроки.Свернуть("Адрес,ВремяС,ВремяПо,КлючСвязи,Доставлено,АдресЗначенияПолей,ДополнительнаяИнформация","Вес");
                    //ОбЗадание.Маршрут.Загрузить(ТЗНайденныеСтроки);
                   
                    ТЗНов = ОбЗадание.Маршрут.Выгрузить();
                    ТЗНов.Свернуть("Адрес,Зона,ВремяС,ВремяПо,КлючСвязи,Доставлено,АдресЗначенияПолей,ДополнительнаяИнформация","Вес,Объем");
                    ОбЗадание.Маршрут.Загрузить(ТЗНов);
                   
                    //ОбЗадание.Статус = Перечисления.СтатусыЗаданийНаПеревозку.КПогрузке;
                    //ОбЗадание.ЯМ_ПлатимЗаЧасРаботыПередРейсом = Истина;
                    ОбЗадание.ЯМ_Час_План = (ОбЗадание.ДатаВремяРейсаПланПо - ОбЗадание.ДатаВремяРейсаПланС)/3600;
                    ОбЗадание.Записать();
                Исключение
                КонецПопытки;
            КонецЕсли

            //Заполняем документ Задание на перевозку

        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Ура. Теперь можно допить чай. Осталось нарисовать для начальника волшебную кнопку “Стоимость Работ Водителей”:

&НаКлиенте
Процедура ЯМ_ЯМ_СтоимостьРаботВодителейПосле(Команда)
    //
    ОткрытьФорму("Отчет.ЯМ_СтоимостьРаботВодителей.Форма");
КонецПроцедуры

 

Делаем отчёт о работе водителя

 

Шаг 11. Делаем запрос на СКД:

ВЫБРАТЬ
    СУММА(1) КАК ВсегоТочек,
    СУММА(ВЫБОР
            КОГДА ЗаданиеНаПеревозкуМаршрут.Доставлено
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК ДоставленоТочек,
    СУММА(ВЫБОР
            КОГДА ЗаданиеНаПеревозкуМаршрут.Доставлено
                ТОГДА 0
            ИНАЧЕ 1
        КОНЕЦ) КАК НеДоставленоТочек,
    МАКСИМУМ(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_ТарифЗаКм) КАК ЯМ_ТарифЗаКм,
    МАКСИМУМ(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_ТарифЗаТочку) КАК ЯМ_ТарифЗаТочку,
    МАКСИМУМ(ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Км_План, 0)) КАК ЯМ_Км_План,
    МАКСИМУМ(ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Км_Факт, 0)) КАК ЯМ_Км_Факт,
    МАКСИМУМ(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_СтоимостьРейса) КАК ЯМ_СтоимостьРейса,
    ЗаданиеНаПеревозкуМаршрут.Ссылка.ТранспортноеСредство КАК ТранспортноеСредство,
    ЗаданиеНаПеревозкуМаршрут.Ссылка.Водитель КАК Водитель,
    ЗаданиеНаПеревозкуМаршрут.Ссылка КАК ЗаданиеНаПеревозку,
    ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Час_План, 0) КАК ЯМ_Час_План,
    ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Час_Факт, 0) КАК ЯМ_Час_Факт
ПОМЕСТИТЬ ВТТочки
ИЗ
    Документ.ЗаданиеНаПеревозку.Маршрут КАК ЗаданиеНаПеревозкуМаршрут
ГДЕ
    ЗаданиеНаПеревозкуМаршрут.Ссылка.Дата >= &ДатаНачала
    И ЗаданиеНаПеревозкуМаршрут.Ссылка.Дата <= &ДатаОкончания
    И ЗаданиеНаПеревозкуМаршрут.Ссылка.Проведен = ИСТИНА
СГРУППИРОВАТЬ ПО
    ЗаданиеНаПеревозкуМаршрут.Ссылка,
    ЗаданиеНаПеревозкуМаршрут.Ссылка.ТранспортноеСредство,
    ЗаданиеНаПеревозкуМаршрут.Ссылка.Водитель,
    ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Час_Факт, 0),
    ЕСТЬNULL(ЗаданиеНаПеревозкуМаршрут.Ссылка.ЯМ_Час_План, 0)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТТочки.ВсегоТочек КАК ВсегоТочек,
    ВТТочки.ДоставленоТочек КАК ДоставленоТочек,
    ВТТочки.НеДоставленоТочек КАК НеДоставленоТочек,
    ВТТочки.ЯМ_ТарифЗаКм КАК ЯМ_ТарифЗаКм,
    ВТТочки.ЯМ_ТарифЗаТочку КАК ЯМ_ТарифЗаТочку,
    ВТТочки.ЯМ_Км_План КАК ЯМ_Км_План,
    ВТТочки.ЯМ_Км_Факт КАК ЯМ_Км_Факт,
    ВТТочки.ЯМ_СтоимостьРейса КАК ЯМ_СтоимостьРейса,
    ВТТочки.ТранспортноеСредство КАК ТранспортноеСредство,
    ВТТочки.Водитель КАК Водитель,
    ВТТочки.ЗаданиеНаПеревозку КАК ЗаданиеНаПеревозку,
    ВТТочки.ЯМ_Час_План КАК ЯМ_Час_План,
    ВТТочки.ЯМ_Час_Факт КАК ЯМ_Час_Факт,
    ВТТочки.ЯМ_Км_План - ВТТочки.ЯМ_Км_Факт КАК Км_Разница,
    ВТТочки.ЯМ_Час_План - ВТТочки.ЯМ_Час_Факт КАК Час_Разница
ИЗ
    ВТТочки КАК ВТТочки

 

Шаг 12. Проставляем Ресурсы и Настройки:

 

 

 

Шаг 13. Отчёт готов!

 

 

Ну да, не 3 проблемы, а 13. Обычно при оценке проекта первое впечатление не врёт, поэтому… его нужно смело умножать на 3 и прибавлять ещё 2, на всякий случай. Но кто бы научил правильно считать эти эстимэйты…

 

Благодарю за ваше бесценное время!

 

 

Само расширение можно скачать из вложения к статье. Там же можно увидеть полный листинг кода.

Шаблон Excel можно взять на сайте Яндекс.Маршрутизации: https://yandex.ru/routing/doc/vrp/concepts/example.html

Там же есть описание всех параметров: https://yandex.ru/routing/doc/vrp/concepts/excel-fill-guide.html

Также во вложении к публикации шаблон с примером заполнения EXCEL, который мы после 2-х месяцев подбора выработали под потребности нашей компании (напомню, 3-5 машин, около 40 заказов в день, доставка в две смены, без выходных). 

Скачать файлы

Наименование Файл Версия Размер
Умная маршрутизация: кейс интеграции с 1С. Расширение

.cfe 494,94Kb
35
.cfe 494,94Kb 35 Скачать бесплатно
Пример заполнения EXCEL

.xlsx 15,98Kb
31
.xlsx 15,98Kb 31 Скачать бесплатно

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user612295_death4321 29.08.21 22:09 Сейчас в теме
Яндекс маршрутизация не предоставляет API ? Почему пришлось взаимодействовать через Excel ?
minotavr_x86; zqzq; Albert_2008; +3 Ответить
4. greencactus 78 02.09.21 20:42 Сейчас в теме
(1) Да, API отличный.
Но ведь Эксель же обязательно нужен в любой автоматизации :)
А если серьёзно, то у нас так настроен процесс постройки маршрутного листа - формируется Эксель - утверждается,
потом загружается в маршрутизацию другим сотрудником
формируется маршрут - если что не так прям в экселе правятся параметры (для скорости) - загружается повторно
Если всё ок - отправляется электронно водителям для загрузки в машину и обратно в 1С.
Для нас через API было сложнее на момент написания кода, сейчас всё уже работает как часы, можно и на API перейти.
Подробнее почему именно так описал в первой части статьи https://infostart.ru/1c/articles/1499581/
5. user612295_death4321 02.09.21 21:54 Сейчас в теме
(4) Понятно. Ну мы примерно так же внедряли похожую систему Maxoptra. Обкатали на экселях, далее написали подсистему.

Автоматизация транспортной логистики, тема специфическая)) У каждого логиста свой взгляд на правильный маршрут)
2. tamepjlah 2 01.09.21 05:49 Сейчас в теме
За статью, однозначно, плюс.
Глаз зацепился за фразу
Т.е. на входе любой Excel, а на выходе - удобная ТаблицаЗначений, в которой колонки названы как в исходном Excel. И не нужно сопоставлять колонки по ячейкам.

и поскольку обслуживаю несколько мелких фирм с огромными хотелками, ушел писать универсальную загрузку. И при тестировании обнаружилось, что не такой уж любой Excel может быть на входе.
1) Пытаюсь загрузить файл - файл1 (я не активно пишу комментарии, поэтому как вставить картинку в текст не знаю, пусть будут прикреплённые файлы). На строчке ПЗ.Результат.Выгрузить() получаем ошибку "Ожидается выражение "ВЫБРАТЬ""
2) Пытаюсь загрузить файл - файл2. На выходе получаем очень странную таблицу значений (файл3) со странными названиями колонок. Плюс к этому почему-то имеются дубли колонок (например _11 и _12 и _13 или _81 и _82) - стоит отметить, что в колонках 6-36 указана дата 01.01.1900 с форматом ячейки ДД.
3) Попробовал убрать объединение ячеек и в колонках 6-36 указал число. На выходе получил таблицу значений (файл4) с интересными строками _1-_9. При этом пропали данные за 1 число (на скрине этого не видно, но их нет).
Прикрепленные файлы:
3. greencactus 78 02.09.21 20:36 Сейчас в теме
(2) Клёвый комент!! 5 баллов за пробу.
_1 _2 _3 это 1С пытается сделать колонки уникальными в случае если названия колонок в первоначальном Экселе одинаковые. Или если 1С не смогла создать колонку с таким названием (например как у вас - название колонки это число, а в 1С все переменные должны начинаться с буквы или _, поэтому 1С создаёт колонки с пустым названием и добавляет к пустым названием _НомерПоПорядку)
Если шаблон Экселя одинаковый, то эти «Не правильные_Правильные» названия будут всегда одинаковыми и на них можно ссылаться.

Ещё я бы удалил первые 6 строк в вашем Экселе и строкой с названиями колонок сделал бы строку номер 7 (нижняя колонка шапки) . У меня так несколько загрузчиков запчастей из Автодока и Автопитера работают и там такие же как у вас «Не правильные» колонки.

Ещё раз спасибо за коммент - прям мёд на сердце :)
6. tamepjlah 2 03.09.21 05:44 Сейчас в теме
(3) Получается, что данный код загрузки из Excel подходит для автоматизированного обмена между базами. А если в выгрузке добавят или удалят колонку, то и наименования колонок могут измениться "неведомым" образом?
7. greencactus 78 12.11.22 02:18 Сейчас в теме
(6) Долго не заходил на инфостарт =)

Хотел написать, нет, но ты прав. Если в Экселе будет много колонок, которые не называются по человечески (Сумма, Цена, Количество остатков) то вставив в середину новую или удалив первую, названия колонок собьётся.

Если колонки с человеческими названиями, то собьются только если у тебя добавится колонка с одинаковым названием раньше твоей (Типа Номенклатура, Номенклатура, Цена, Сумма, Сумма, Сумма).

А если новые колонки будут иметь новые уникальные названия, то всё ок. Хоть добавляй, хоть удаляй, хоть местами меняй.

А для обмена между базами мне больше http-сервисы нравятся и быстрее работают и результат он-лайн =)
Оставьте свое сообщение

См. также

Публикация сборки сайта через 1С

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Демонстрация возможного сценария развертывания сайта через 1С HTTP сервис на примере сборки react-app.

03.03.2023    1877    van_za    7    

26

Пагинация в 1С

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Те, кому приходилось делать REST API на базе HTTP-сервисов 1С, могли в какой-то момент столкнуться с необходимостью разработки методов, которые позволяли бы возвращать данные с пагинацией, т.е. последовательными порциями. В языках общего назначения пагинация реализуется простым использованием операторов OFFSET и LIMIT в SQL-запросе к базе данных. В языке запросов 1С оператора OFFSET нет, поэтому всем приходится решать эту задачу обходными способами. Один из таких обходных способов представлен в этой статье.

09.01.2023    1840    aleksei_adamov    36    

21

1С бакэнд (каталог товаров)

WEB-интеграция Платформа 1С v8.3 1С:Розница Россия Бесплатно (free)

Серверная часть на 1с8 для веб каталога. Попробую поделиться опытом, как я использовал 1С в качестве веб сервера для веб витрины.

01.01.2023    1348    aldar    5    

20

Возможности доработки выгрузки из 1С в Битрикс

WEB-интеграция Платформа 1С v8.3 Управленческий учет Бесплатно (free)

В статье собраны некоторые полезные и интересные примеры доработок выгрузки из 1С на сайты на платформе Битрикс (Возможно, что-то подойдёт и для WordPress и других платформ, принимающих типовую выгрузку на сайт из 1С). Доработки рассмотрены без привязки к конкретным конфигурациям, примеры кода взяты в основном из доработок УТ 10 и 11. Некоторые доработки требуют изменений на стороне Битрикса, некоторые укладываются в типовой функционал. Примеры взяты из личного опыта, возможно, описание где-то не полное, т.к. доработки делались в разное время. Если материал будет интересен или будут аналогичные актуальные задачи, буду стараться дополнять статью более подробным описанием и примерами.

01.11.2022    1145    de0nis    2    

12

Реализация нестандартных (для 1С) интерфейсных решений в Web-клиенте

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

Онлайн-сервисы, построенные на 1С, могут использовать все многообразие веб-технологий. О том, как спроектировать, реализовать и красиво оформить интерфейс продукта 1С, в докладе на конференции Infostart Event 2021 Post-Apocalypse рассказал CTO компании WiseAdvice Олег Филиппов.

21.10.2022    6394    comol    15    

69

Работа с 1С:Аналитика Промо

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

4500 рублей

Rest API от чайника для чайников

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

На написание статьи побудило чтение книги "Технологии интеграции "1С:Предприятия 8.3"" Хрусталевой Е.Ю. В первой главе там постоянно чередуются слова REST, REST-интерфейс, архитектура REST и т.д. Мне стало интересно, я начал копать, что это такое, и тема оказалась достаточно интересной.

06.06.2022    12027    zeltyr    2    

11

Загрузка выпусков подкаста Радио 1С Энтерпрайз

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Код для загрузки всех выпусков подкаста Радио 1С Энтерпрайз для оффлайн-прослушивания.

29.04.2022    1133    q_i    9    

16

УПП: Ошибка при взаимодействии с ФСС

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

При обновлении релиза УПП до 1.3.178.2 пользователи начали жаловаться, что не отправляются в ФСС документы "Ответ на запрос ФСС для расчета пособия" и "Сведения о застрахованных лицах, ФСС". В статье предложен вариант обхода данной ошибки, возможно, это кому-то поможет.

28.04.2022    1417    alex_bob    8    

3

Методика интеграции HTML редакторов в поле HTML документа базы 1С

WEB-интеграция Платформа 1С v8.3 Платформа 1C v8.2 Бесплатно (free)

В статье описаны критерии WYSIWYG HTML редакторов и общая картина интеграции с платформенными механизмами. На момент платформы 1С 8.3 и возможно для будущих релизов описание будет скорее всего актуально. Апробировано на 1С 8.3.20 и 8.2.12, а также на мобильной платформе 8.3.19.59.

12.04.2022    1775    user1206119    2    

13

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

Создание кодогенератора для Postman

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Опишу порядок разработки кодогенератора для Postman c использованием OneScript и HTTPКоннектор.

13.03.2022    1376    malikov_pro    2    

9

Как из 1С отдать миллионы строк в BI и успеть это сделать быстро

Консолидация данных Анализ и проектирование ИТ-систем WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

На онлайн-митапе «Бизнес-анализ по данным базы 1С. Интеграция c платформами BI» выступил ведущий разработчик WiseAdvice.tech Дмитрий Фурцев. Дмитрий рассказал о том, как отдать миллионы строк из 1С в платформу бизнес-аналитики и не потратить на это сутки.

14.02.2022    5011    Fudj1k    11    

22

Передача сообщений из 1С в MS Teams

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример организации уведомлений в канал MS Teams.

09.02.2022    2152    Alex_YAM    4    

23

Работа с 1С через протокол OData

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В данной статье мы будем рассматривать работу с данными информационной базы через протокол OData (далее OData).

17.12.2021    29341    ProgrammingStore    26    

86

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Подключение к HTTP-сервису с авторизацией посредством передачи клиентского SSL-сертификата

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

В статье хочу поделиться опытом настройки подключения 1С к стороннему HTTP-сервису, использующему авторизацию посредством передачи клиентского SSL-сертификата.

07.12.2021    10304    kholkin    12    

104

Тонкости и подводные камни работы типового модуля интеграции Битрикс24 и 1С (Часть 2)

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Это вторая часть цикла статей, посвящённых типовому модулю интеграции 1С Предприятия и Битрикс24. Цель данной части: рассмотреть тонкости, связанные с обменом товарами и сопутствующими сущностями (спойлер - единицы измерения и свойства товаров). Также затронем некоторые нюансы связи сущностей 1С и Б24 (относящиеся не только к товарам) и их побочное влияние при переносе данных из модуля в модуль (при смене конфигурации, переустановки или обновлении модуля).

27.11.2021    7835    freegman74    16    

18

Web консоль управления сеансами 1С

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мы дали ему название adm1c, он позволяет посредством веб доступа удалять или смотреть на сеансы в 1С базах и при необходимости удалять их. Да и что тут такого, сказали бы, есть же консоль на win, с нее же это можно делать, и все верно, но есть пара но.

26.11.2021    3068    4ernuy    16    

28

Реализация перевода текста средствами Azure

WEB-интеграция Локализация решений Платформа 1С v8.3 Россия Бесплатно (free)

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

19.11.2021    708    user1559835    2    

4

Тонкости и подводные камни работы типового модуля интеграции Битрикс24 и 1С

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Цель статьи - указать на подводные камни и нюансы, о которых “не пишут на заборах” и которые встретились мне за время внедрения типового модуля интеграции 1С и Битрикс24. Будет интересна для людей, кто подумывает о том, чтобы настроить интеграцию, и хотят понять, с чем столкнутся. А также для тех, кто уже работает с подобным обменом, столкнулся с какими-то из описанных ситуаций и хочет понять, что пошло не так и “как жить дальше”. Постараюсь все описать “человеческим” языком с минимальной долей терминов, так как статья, надеюсь, будет полезна не только программистам.

07.11.2021    11179    freegman74    13    

34

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

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

Окей, Google

WEB-интеграция Платформа 1С v8.3 Россия Бесплатно (free)

Пример интеграции Google Ассистента с 1С. В основе которого лежит платформа Dialogflow CX для понимания естественного языка.

28.10.2021    2086    Soloist    6    

29

Повышение производительности веб-сервисов. Переиспользование сеансов

WEB-интеграция HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Повышение производительности веб-сервисов. Переиспользование сеансов. Практическая реализация.

20.10.2021    4557    sorter1    3    

47

WEB/HTTP сервисы. Базовые отличия и применение на практике

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Рассказываем о WEB и HTTP сервисах, их практическом применении, о шишках, которые мы набили, и о выводах, которые сделали. Спойлер: тех, кто дочитает статью до конца, ждет бонус от автора.

04.10.2021    26681    Neti    23    

111

Интеграция 1С с ГИИС ДМДК

WEB-интеграция Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 Ювелирная промышленность и торговля Россия Бесплатно (free)

ГИИС ДМДК - единая информационная платформа для взаимодействия участников рынка драгоценных металлов и драгоценных камней. с 01.09.21 стартовал обязательный обмен данными с Федеральной пробирной палатой (ФПП) исключительно через ГИИС. А постепенно - с 01.01.2022 и с 01.03.2022 - все данные о продаже драгоценных металлов и камней должны быть интегрированы с ГИИС. У многих пользователей возникает вопрос как автоматизировать обмен между программой 1С и ГИИС ДМДК. В настоящей статье ВЦ Раздолье поделится своим опытом о реализации такого обмена. Автор статьи - Мордовин Антон - архитектор систем на базе 1С Внедренческого центра "Раздолье".

30.09.2021    35980    1СERP    159    

30

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Быстрое чтение составных http сообщений multipart/form-data

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Алгоритм быстрого разбора составного http сообщения multipart/form-data.

26.09.2021    2966    cherkasovvitalik    4    

56

Интеграция 1С с Битрикс24 через вебхуки

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Пример получения токена и http запрос к API битрикса.

15.09.2021    8821    TyurinArt    11    

31

Обмен с HTTP сервисом файлами по формату multipart/form-data

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Потребовалось отправить картинку в теле запроса в HTTP сервис методом POST, куча реализаций, но есть маленькие нюансы, если хотя бы кому-то поможет, то уже это было не напрасно.

07.09.2021    10259    ix5s    25    

66

Разработка гибридного web-приложения на 1С, возможности и ограничения

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Все чаще разработчики склоняются к использованию 1C в качестве бэкенда при разработке веб-приложений. Но благодаря встраиванию веб-клиента 1С в сайт можно получить еще больше готовой функциональности. О том, как реализовать гибридное приложение за счет связки 1С с другими веб-технологиями, рассказал разработчик компании Neti Эльдар Мингалиев.

06.09.2021    5021    Бэнни    12    

51

Работа с WEB-сервисами под HTTPS на примере прямого обмена между базами (1С – 1С) 

WEB-интеграция Платформа 1С v8.3 Россия Бесплатно (free)

Использование веб-сервисов 1С при обмене 1С – 1С позволяет быстро передавать достаточно большие объемы данных из базы-источника в базу-приемник в объектах языка 1С. Данный метод обмена может применяться при бесшовной интеграции между двумя базами 1С, но требует определенной серверной инфраструктуры (установленного и настроенного WEB-сервера).

03.09.2021    11438    UltraUnion2005    9    

35

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

В курсе обобщен опыт работы аналитика на проектах в течение пяти лет, в нескольких фирмах. Подходы к написанию документов унифицированы и по возможности не привязаны к конфигурациям 1С.

3 500 рублей

Глава 2. Как я написал (собрал с инфостарта) свой парсер сайта 1С Releases

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

Путешествие начинающего программиста 1С. Глава вторая. Призываем экспертов в комментарии, оптимизируем код, ругаемся на кривые руки автора. Автор же, в свою очередь, делится своим опытом, читает умные комментарии, стремится дать те знания, за которыми он сидел ночами тем, кто их хочет найти.

31.08.2021    2788    ldmonster    9    

12

Взаимодействие с api Честный знак (Молочная продукция)

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

Обзор основных примеров взаимодействия с Честным знаком по api для нетиповых конфигураций.

30.08.2021    13537    user5300    68    

54

Встраивание форм 1С на страницы сайта

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В платформе 8.3.16 появилась возможность выводить на страницах сайта информацию из веб-клиента 1С так, что пользователь даже не заметит, что работает с платформой. Руководитель компании Айтон Михаил Пинягин на онлайн-митапе «Web-клиенты для 1С» рассказал о том, какие особенности нужно учесть при настройке встраиваемого веб-клиента, и какие возможности он дает.

27.08.2021    7837    mikepin    10    

61

Гарри Поттер и подкапотное пространство веб-клиента

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

При разработке сайтов, интегрированных с 1С через HTTP-сервисы, приходится бороться с кодировками, искать производительные интерфейсные решения и задумываться над безопасностью. В ходе онлайн-митапа «Web-клиенты для 1С» Юрий Лазаренко показал на практике, как работает магия самодельного веб-клиента и как решать проблемы, возникающие при интеграции.

20.08.2021    5495    TitanLuchs    19    

41

Умная маршрутизация: кейс интеграции с 1С (часть 1)

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Как мы решали проблемы с доставкой в нашем интернет-магазине, внедрили новый бизнес-процесс за 3 месяца и научились меньшим количеством машин привозить больше заказов клиентам.

18.08.2021    6418    greencactus    42    

61

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Сравнительный анализ вариантов интеграции между системами

Файловый обмен (TXT, XML, DBF), FTP WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

На Infostart Meetup «Интеграционные решения для 1С» выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами кейсами из собственной практики: какие интеграционные решения остаются актуальными до сих пор, а каких приемов стоит избегать – даже в безвыходных ситуациях.

30.07.2021    4233    SergeyN    1    

10

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика (Украина)

WEB-интеграция Платформа 1С v8.3 Украина Бесплатно (free)

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика, Украина. Тестирование проводил на 1С:Предприятие 8.3 (8.3.10.2561).

28.07.2021    3193    Pervuy    5    

5

Пример организации HTTP сервиса на 1С: Документооборот. Источник 1С: ЕРП => Приемник 1С: Документооборот

WEB-интеграция Платформа 1С v8.3 1С:Документооборот Бесплатно (free)

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

13.05.2021    4344    Flover    1    

23

Настраиваем авторизацию пользователей 1С через Okta

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Чем больше в компании различных конфигураций и сервисов, тем актуальнее становится проблема единой системы авторизации single Sign-On. Его лидером практически безоговорочно считается Okta. Но на просторах интернета очень мало информации про интеграцию 1С с Okta через протокол OpenID Connect. Что ж, настало время восполнить недостающие пробелы и перевернуть эту печальную страницу в вашей истории

30.04.2021    6280    ripreal1    16    

40

Правила обмена больше не нужны

Внешние источники данных Обмен между базами 1C WEB-интеграция Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Бесплатно (free)

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    18858    Nikola23    40    

79