Умная маршрутизация: о сложностях интеграции с 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
31
.cfe 494,94Kb 31 Скачать бесплатно
Пример заполнения EXCEL

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

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user612295_death4321 29.08.21 22:09 Сейчас в теме
Яндекс маршрутизация не предоставляет API ? Почему пришлось взаимодействовать через Excel ?
minotavr_x86; zqzq; Albert_2008; +3 Ответить
4. greencactus 77 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 77 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 подходит для автоматизированного обмена между базами. А если в выгрузке добавят или удалят колонку, то и наименования колонок могут измениться "неведомым" образом?
Оставьте свое сообщение

См. также

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

Практика программирования WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    58389    Serginio    33    

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

WEB Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

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

вчера в 15:00    376    sorter1    2    

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

Практика программирования WEB v8 Бесплатно (free)

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

04.10.2021    4149    Neti    14    

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

Обмен через XML WEB v8 ERP2 Ювелирная промышленность и торговля Россия Бесплатно (free)

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

30.09.2021    1942    1СERP    19    

Online телефонный справочник из 1С: Зарплата и управление персоналом Промо

WEB Управление персоналом (HRM) Управление персоналом (HRM) v8 ЗУП3.x Россия Бесплатно (free)

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

10.03.2017    27304    ruha    21    

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

WEB v8 1cv8.cf Россия Бесплатно (free)

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

15.09.2021    1289    TyurinArt    5    

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

WEB v8 1cv8.cf Россия Бесплатно (free)

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

07.09.2021    2195    ix5s    21    

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

WEB v8 Бесплатно (free)

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

06.09.2021    2445    Бэнни    11    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    43050    YPermitin    42    

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

Обмен данными 1С WEB v8 Россия Бесплатно (free)

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

03.09.2021    5706    UltraUnion2005    8    

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

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

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

31.08.2021    747    ldmonster    4    

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

WEB Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

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

30.08.2021    1493    user5300    39    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    31265    anig99    6    

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

WEB v8 1cv8.cf Бесплатно (free)

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

27.08.2021    2401    mikepin    6    

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

WEB v8 Бесплатно (free)

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

20.08.2021    2748    TitanLuchs    19    

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

WEB v8 Бесплатно (free)

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

18.08.2021    4097    greencactus    36    

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

WEB v8 Украина Бесплатно (free)

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

28.07.2021    738    Pervuy    4    

Телеграм-бот как инструмент

WEB v8 1cv8.cf Бесплатно (free)

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

21.07.2021    3951    M_A_D    19    

Доработка в расширении Яндекс маркета (скачать все этикетки)

Практика программирования WEB v8 УТ11 КА2 Бесплатно (free)

Доработка кнопки "Скачать все этикетки" - выбрали каталог и сохранили все за один раз, а не 100500 раз нажимаем кнопку сохранить.

08.07.2021    986    rst_filippov    0    

Интеграция 1С 8 и HostCMS

WEB v8 1cv8.cf Бесплатно (free)

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

04.07.2021    813    Koder_Line    0    

API ОФД-Я разбор документации с примерами

WEB v8 1cv8.cf Россия Бесплатно (free)

Примеры запросов 1С для получения данных с ОФД-Ярус через API.

20.04.2021    856    www76    0    

Работа через сервис 1С-Отчетность нескольких пользователей

Регламентированная отчетность Зарплата WEB v8 v8::СПР ЗУП3.x Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Организации, в которых количество сотрудников превышает установленное значение, обязаны отправлять отчетность по телекоммуникационным каналам связи. Это может быть Контур-Экстерн, Такском или любой другой провайдер. Все чаще пользователи 1С используют сервис 1С-отчетность. И все чаще сертификат оформляется на сотрудника отдела кадров или бухгалтерии. В случае, если нужно оформить несколько сертификатов, возникают трудности в версии ЗУП 3.1.14 и более поздних. О том, как с ними справиться, пойдет речь в данной публикации.

05.04.2021    1950    keat24    1    

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

Внешние источники данных Обмен через XML Перенос данных из 1C8 в 1C8 Распределенная БД (УРИБ, УРБД) WEB v8 Бесплатно (free)

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

17.03.2021    11802    Nikola23    39    

Как отправить сообщение Telegram в группу?

WEB v8 Россия Бесплатно (free)

Отправка сообщения в группу Telegram.

01.03.2021    2955    kite2    2    

Альфа-Авто 5.0 и современные HTTP сервисы

WEB v8 1cv8.cf Автомобили, автосервисы УУ Бесплатно (free)

Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.

01.03.2021    1145    osivv    1    

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

WEB v8 Россия Бесплатно (free)

Есть база, с пользователем/паролем, нужно подключиться к Odata из другой базы 1С, получить элементы справочника.

24.02.2021    973    user823999    6    

Интеграция с API WB (Wildberries). Создание карточки товара (спецификации)

WEB v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Опыт интеграции с API WB (Wildberries), опыт создания карточки товара, получение токенов API WB.

18.01.2021    29128    jenyavp    57    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

WEB Интеграция v8 v8::УФ 1cv8.cf Бесплатно (free)

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    3927    SizovE    25    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

Практика программирования WEB Универсальные функции v8 v8::УФ 1cv8.cf Бесплатно (free)

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    1241    SizovE    4    

Как сделать интеграцию (обмен) с интернет-магазином? Пошаговый план действий (Часть 1)

WEB v8 1cv8.cf УУ Бесплатно (free)

C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.

19.11.2020    8789    markbraer    12    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    2238    SizovE    2    

Web Dashboard (мобильная и десктопная версия): оптимальная схема организации взаимодействия с зоопарком систем

WEB v8 Бесплатно (free)

Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.

10.11.2020    13943    SizovE    2    

Отладка модуля ДиадокПро

WEB v8 1cv8.cf Бесплатно (free)

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

30.10.2020    4457    Максим-777    18    

JSON примеры меню B2B web-приложения "Личный кабинет" на движке EDIbot для телефона/десктопа

WEB v8 Бесплатно (free)

Рассмотрим на примерах работу движка EDIbot при организации меню B2B "Личного кабинета" (мобильная версия, версия десктоп) грузовладельца WMS-системы.

29.10.2020    1363    SizovE    0    

Обмен с сайтом посредством Post-запроса, json

WEB v8 1cv8.cf Бесплатно (free)

Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.

29.10.2020    5851    John_d    26    

Организация HTTP публикации каталога товаров используя PostgREST

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу порядок установки настройки и использования PostgREST на примере организации каталога товаров.

05.10.2020    1675    malikov_pro    2    

Интеграционная прослойка(middleware) на Golang. Часть 5 - Обмен с 1С через HTTP-сервисы платформы

WEB v8 Бесплатно (free)

В этой статье научим прослойку отправлять данные в 1С, для этого используем HTTP-сервисы платформы. Обменяемся данными с новым справочником Клиенты. Но главное создадим HTTP-сервис для получения сообщений из очереди RabbitMQ.

28.09.2020    2697    dmitry-irk38    4    

Отладка http сервиса

WEB v8 Бесплатно (free)

При разработке http сервиса возникает ситуация, а как протестировать http сервис? Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?

23.09.2020    5386    hpi    12    

Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

WEB v8 1cv8.cf Бесплатно (free)

Пошаговое руководство по созданию http-сервиса (часть вторая). Передача параметра в http сервис.

22.09.2020    8634    hpi    7    

Организация данных и вариант обработки для организации обмена с сайтом

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант организации данных и обработки для обмена с сайтом.

22.09.2020    1847    malikov_pro    4    

Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

Практика программирования Обмен данными 1С WEB v8 1cv8.cf Бесплатно (free)

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

18.09.2020    1609    R_o_n_n_y    5    

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант формирования запроса

11.09.2020    5618    malikov_pro    15    

Ферма приложений на Kubernetes

WEB v8 Бесплатно (free)

При эксплуатации большого количества информационных систем 1С, предоставляющих интернет-сервисы, возникают проблемы, связанные с зависимостью от производительности и стабильности веб-сервера. Как объединить отдельно стоящие веб-сервера с помощью платформы Kubernetes для централизованного мониторинга всех опубликованных интернет-сервисов на конференции Infostart Event 2019 Inception рассказал программист компании BIA Technologies Владимир Кирбаба.

24.08.2020    2693    ComboBoy    1    

Использование шаблонного процессора для формирования HTML страниц

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу использование шаблонного процессора Handlebars запущенного на Node.js

24.08.2020    2062    malikov_pro    26