Лайка — расширение 1С с хранением справочников IIKO вместо SQL-запросов

Продолжаем исследовать возможности взаимодействия 1С с IIKO (Айко)

Вступление

Здравствуйте.

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

В частности, на счету нашей организации уже имеются проекты как по доработке типовой выгрузки (к примеру с получением недостающей информации из OLAP-отчета), так и разработка решения "с нуля" под задачи конкретного клиента.

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

Одним из таких вопросов было использование механизма SQL-запросов при получении справочных сведений IIKO (Наблюдение 3 из статьи //infostart.ru/public/839723/)

Настройка типовой выгрузки из IIKO в 1С

Минусы запросов

Итак, чем же плох способ получения данных SQL-запросами?

  • Для каждого типа СУБД нужно писать свой запрос (на данный момент их два: MSSQL Server и PostgreSQL). В качестве частичного решения данного вопроса нашей командой разработана "прослойка" из набора функций, позволяющих абстрагироваться от версии СУБД. Однако с изменением состава поддерживаемых систем потребуется также переработка такого решения;
  • У пользователя может не быть прав на исполнение служебных скриптов, в том числе sql.jsp;
  • Восстановление иерархии из "плоского списка" при выгрузке номенклатуры;
  • Долгое выполнение и значительная нагрузка на сервер при запросах с фильтром по полю, содержащемуся в XML (да-да, практически все типозависимые данные справочника хранятся в поле ntext в экранированном XML. При отборе по таким полям сервер сначала преобразуем XML для всех полей и уже потом происходит отбор);
  • Запрос по XML полю раз от раза будет оставаться "тяжелым";
  • Низкоуровневое решение, которое может прийти в неработоспособное состояние при обновлении версии ПО

Что предлагается взамен?

А взамен предлагается вновь воспроизвести работу BackOffice — получать обновления справочных сведений, обращаясь к сервису Update сервера IIKO.

Лайка, что это за зверь такой?

Лайка — расширение для интеграции с конфигурациями на управляемых формах с режимом совместимости 8.3.12. В расширении отражен концепт получения и обработки справочной информации из IIKO и занесение в справочники 1С: Номенклатура (like_products), Поставщики (like_users) и Склады (like_stores). Справочники имеют упрощенную структуру, но содержат необходимый минимум для обмена.

В Лайке реализован ряд служебных функций, которые позволяют взаимодействовать с данными IIKO, не углубляясь в особенности структуры данных: получение и обработка информации о сервере; возможность ведения нескольких подключений к разным серверам с фильтрацией отображаемых данных в зависимости от активного подключения; фоновое обновление данных; получение ответа сервера IIKO в виде объектаXDTO и др.

К примеру, процедура получения данных с сервера IIKO выглядит следующим образом:

Procedure Update(Parameters, ResultLink, Interactive = False) Export

ActiveConnection = like_ConnectionAtServer.GetActiveConnecton();
If ActiveConnection = Undefined Then
Return;
EndIf;

ConnectionObject = ActiveConnection.GetObject();
If Not (Interactive Or ConnectionObject.backgroundUpdate) Then
Return;
EndIf;

XMLPackage = getXMLEntitiesUpdate(ActiveConnection);
ConnectionFields = like_ConnectionAtServer.GetConnectionFields(ActiveConnection);

ObjectFields = like_CommonServer.GetObjectFieldsStructure();
ObjectFields.ConProps    = ConnectionFields;
ObjectFields.Resource   = "/resto/services/update";
ObjectFields.Namespace   = "https://izi.cloud/iiko/reading/entitiesUpdateResponse";
ObjectFields.TypeName   = "result";
ObjectFields.RequestType = "POST";
Params = New Map;
Params.Insert("methodName", "waitEntitiesUpdate");
ObjectFields.Parameters  = Params;
ObjectFields.Headers     = like_Common.getIIKOHeaders(ConnectionFields);
ObjectFields.Body   = XMLPackage;
ObjectFields.isGZIP   = True;

IIKOObject = like_CommonServer.GetIIKOObject(ObjectFields);
If IIKOObject.success Then
iiko_items = IIKOObject.entitiesUpdate.items.i;
For each item In iiko_items Do
ExeItem(ActiveConnection, item);
EndDo;
FillParents();
SetEntititesVersion(ActiveConnection, IIKOObject.entitiesUpdate.revision);
EndIf;
EndProcedure

Фоновое выполнение достигается путем вызова данной процедуры функцией ВыполнитьВФоне модуля ДлительныеОперации БСП.

Как стартануть?

  1. Скачать и установить расширение через раздел "Администрирование" (БСП) или "Все функции";
  2. Отключить у расширения "Безопасный режим" (необходимо для отправки HTTP-запросов);
  3. Перезапустить конфигурацию;
  4. В панели разделов появится Лайка
  5. Далее создаем новое подключение ("Обновлять в фоне" означает, что метод выгрузки обновлений будет происходит с периодичностью  в отдельном процессе) или сразу идем в обработку "Активирование подключения", откуда также можно его создать.
  6. Выбираем созданное подключение и жмем "Подключиться".
  7. Далее данные подгружаются автоматически (если у подключения установлена опция "Обновлять в фоне"), либо это можно сделать вручную, нажав "Обновить объекты".
  8. После загрузки сведений с сервера IIKO в справочниках должны появится соответствующие данные.
  9. Данные в справочниках фильтруются при отображении в зависимости от активного подключения.
  10. Первая загрузка может быть довольно длительной (при объемных справочниках Номенклатура сотни мегабайт в XML-представлении), но последующие (дельты) грузятся весьма быстро.
  11. Функция "Очистить данные IIKO" позволяет пометить на удаление все данные справочников, очистить служебный регистр сведений и сбросить активное подключение. Справочник "Подключения" остается невредимым.

Версии программного обеспечения

Платформа — 1С:Предприятие 8.3 (8.3.13.1690). По идее подойдет и гораздо старше, начиная с появления методов для работы с HTTP, строковые функции типа СтрРазделить.

Конфигурации — Бухгалтерия предприятия, редакция 3.0 (3.0.70.50), Управление нашей фирмой, редакция 1.6 (1.6.16.178), Управление торговлей, редакция 11 (11.4.6.166). По идее взлетит на любой конфигурации со свежей БСП с режимом совместимости 8.3.12.

IIKO — работа проверена на версиях, начиная с 5.5.4014 по 6.2.4011 (как Chain, так и RMS).

12 Comments

  1. Chrizt

    На КДПВ же хаски 🙈

    Reply
  2. oyti

    (1) «Сибирская лайка или хаски – выходец из восточного района Сибири», не?

    Reply
  3. Chrizt

    (2) Ну, по сути, все они оттуда.

    Но лайки, при ближайшем рассмотрении разительно отличаются от хаски.

    В инете вы найдёте очень много противоречивой инфы, поэтому я думаю, что это мог бы быть довольно стрёмный спор.

    Просто собака на картинке традиционно узнаётся, скорее, как хаски, нежели лайка.

    Reply
  4. vshershun

    Соединение с базой установил, написал что ОК, но при попытке обновления данных, выпадает везде где проверяет :

    IIKOObject = like_CommonServer.GetIIKOObject(ObjectFields);

    >>If IIKOObject.success Then

    Тут выпадает с ошибкой свойства:

    Лайка ОбщийМодуль.like_EntitiesAtServer.Модуль(174)}: Значение не является значением объектного типа (success)

    If IIKOObject.success Then

    Reply
  5. oyti

    (4) Да, судя по всему IIKOObject = Undefined и по всей видимости из-за

    If IIKOResponse.StatusCode <> 200 Then
    Return Undefined;
    EndIf;

    Смотрите, какой HTTP-код возвращается

    Reply
  6. oyti

    (3) Не разбираюсь в породах собак. Надеюсь, что теперь более лайковая лайка

    Reply
  7. musa1981

    День добрый. Бух. хочет получать данные из Iiko для сдачи отчетности в Налоговые органы и Рос алкоголь регулирование. Достаточно будет этой обработки?

    Reply
  8. oyti

    (7) Здравствуйте. Для сдачи отчетности в контролирующие органы, как правило, достаточно типовой выгрузки. Детали уточняйте у обслуживающей организации

    Reply
  9. BigWig

    Добрый день,

    у нас айко <version>6.4.3013.0</version>.

    при подключении получаю ответ 200 с телом

    <serverName>ХХХХХХХХХХХХХХХ</serverName><edition>default</ed­ition><version>6.4.3013.0</version><computerName>ХХХХХХХХХХХХХ</computerName><server­State>STARTED_SUCCESSFULLY</serverState><protocol null=»1″></protocol><serverAddr null=»1″></serverAddr><serverSubUrl null=»1″></serverSubUrl><port>0</port><isPresent>false</isPr­esent>

    но при запуске «Обновить объекты»

    получаю ответ: код=403, WRONG_EDITION

    версия расширения 0.1. Возможно есть новее версия Лайки ???

    или какой-то другой способ заставить работать с нашей айко ??

    спасибо

    Reply
  10. oyti

    (9) Здравствуйте.

    Да, существует более свежая версия Лайки, но она распространяется на других условиях.

    В вашей версии можно исправить процедуру InitServerInfo() в модуле like_ConnectionAtServer:

    Заменить строку:

    connectionObject.edition = «IIKO_»+Upper(XDTOResponse.edition);

    на строки:

    upCaseEdition = Upper(XDTOResponse.edition);
    connectionObject.edition = «IIKO_»+?(upCaseEdition = «DEFAULT», «RMS», upCaseEdition);
    Reply
  11. BigWig

    (10) Здравствуйте,

    спасибо за реакцию, но уже вчера сам разобрался.

    помимо корректировок в коде, необходимо увеличить еще и длину соответствущего

    поля edition справочника Подключения (даже значение «IIKO_DEFAULT» не всмещалось).

    А где можно почитать/посмотреть функционал, реализованный в новой версии ?

    и условия распространения ?

    спасибо

    Reply
  12. oyti

    (11) В следующем посте опубликована версия 0.2 с просмотром накладных. Текущая версия 0.3.5, но она не распространяется через Infostart

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *