Вместо предисловия
Первой черновой версии этой публикации уже чуть более года. Наконец пришло осознание, что пора поделиться накопленными решениями.
С тех пор многое произошло, как в моей личной профессиональной жизни, так и с отраслью в целом на фоне мировых событий. Однако в последнее время наблюдается явное оживление индустрии, а вместе с тем и интерес к вопросам интеграций и оптимизации бизнес-процессов.
Компания IIKO запретила выполнение SQL-запросов и Groovy-скриптов в своих облачных решениях, чем дала повод для переосмысления ряду проектов, использовавших не классические схемы обмена. Некоторые описываемые далее приемы базируются на SQL-запросах, которым есть место в коробочных решениях.
Вступление
Мне понравилось собирать информацию по крупицам и создавать сущности IIKO прямиком в 1С при реализации Лайки. Однако без решения реальной прикладной проблемы все это не более, чем набор полезных и удобных функций для узкоспециализированного взаимодействия. Не framework конечно, но фундамент для программиста.
Далее рассмотрим несколько успешных кейсов использования.
Детальные данные о продажах
А чем не устраивают данные стандартной выгрузки? Ну, к примеру, хотя бы отсутствием инструмента для учета предзаказов.
Прежде всего, давайте поразмышляем, чем же смена с наличием банкетных заказов отличается от смены без таковых? Как правило, если у нас нет предоплат, то сумма выручки идентична сумме реализации в рамках смены. Именно такие данные грузятся в 1С типовой выгрузкой без каких-либо вопросов. То есть в розничных продажах нет места задолженностям за пределами смены.
Наша команда неоднократно задумывалась над решением этой задачи, потому что периодически возникали подобного рода запросы от клиентов. Однако простого решения в лоб так и не нашлось. Были различные варианты с комбинированием сведений, доступные в типовых сценариях обмена, и данных, которые можно получить посредством OLAP и SQL.
В конечном счете представилась возможность для более глубокого и детального изучения структуры таблиц с данными сервера IIKO. А если ключевая доля сведений извлекается посредством SQL-запросов, то зачем плодить сущности и усложнять алгоритмы, добавляя другие способы получения данных? Именно поэтому акцент делается на извлечении данных из таблиц.
В Лайке уже присутствовали методы, явно упрощающие взаимодействие с сервером, однако этого было недостаточно и были добавлены пара объектов XDTO и унифицированная функция запроса.
Function RequestSQL(sqlRequest, sqlParameters = Undefined) Export
ActiveConnection = like_ConnectionAtServer.GetActiveConnecton();
If ActiveConnection = Undefined Then
LogWrite(NStr("en = 'No active connection'; ru = 'Подключение неактивно'"));
Return Undefined;
EndIf;
ConnectionFields = like_ConnectionAtServer.GetConnectionFields(ActiveConnection);
ObjectFields = like_CommonAtServer.GetObjectFieldsStructure();
ObjectFields.ConProps = ConnectionFields;
ObjectFields.Resource = "/resto/service/maintance/sql.jsp";
ObjectFields.Namespace = "https://izi.cloud/iiko/read/sql";
ObjectFields.TypeName = "root";
ObjectFields.RequestType = "GET";
If sqlParameters <> Undefined Then
For each parameter In sqlParameters Do
sqlRequest = StrReplace(sqlRequest, "["+String(parameter.Key)+"]", parameter.Value);
EndDo;
EndIf;
Params = New Map;
Params.Insert("sql", sqlRequest);
ObjectFields.Parameters = Params;
ObjectFields.isGZIP = False;
ObjectFields.Headers = like_Common.GetIIKOHeaders(ConnectionFields, ObjectFields.isGZIP);
IIKOObject = like_CommonAtServer.GetIIKOObject(ObjectFields);
If IIKOObject = Undefined Then
LogWrite(NStr("en = 'Receiving data from IIKO server error'; ru = 'Ошибка получения данных с сервера IIKO'"));
Return Undefined;
EndIf;
Return IIKOObject;
EndFunction
Благодаря новым методам, без особого труда можно получить результат в таблицу. Прямое обращение к таблицам SQL позволяет реализовывать всевозможные неклассические схемы получения данных в многочисленных разрезах и выборках.
Создание документов
Первые исследовательские версии обработок изобиловали прямыми вставками XML-сущностей и повторяющимися секциями однотипного кода. Передача документа требует реализации ряда вопросов: от соотнесения значений реквизитов до обработки сбоя отправки XML-пакета в случае, когда сервер IIKO "предлагает" другой номер.
По мере реализации проектов, модули становились лаконичней и более чутким отношением к повторному использованию кода, а для формирования XML-пакетов были созданы схемы и описаны основные используемые типы.
Безусловно, все технические моменты не должны усложнять работу бухгалтера.
В зависимости от бизнес-процессов и пожеланий заказчика возможны различные сценарии интеграции. Наиболее распространенные из них - ручной и автоматический. При ручном варианте бухгалтер целиком контролирует процесс и следит за корректностью введенных данных и создаваемых документов.
В автоматическом сценарии после анализа процессов можно сделать некоторые допущения, которые позволят осуществлять обмен по регламенту без активного участия человека. Следует заметить, что этот вариант возможен не во всех случаях и контролировать процесс, хотя и не онлайн, все же придется.
Быстрый старт
Данный раздел посвящен нетехническим специалистам и малоинтересен программистам, поэтому спрятан в спойлер.
Версии программного обеспечения
Платформа - 1С:Предприятие 8.3 (8.3.13.1690). По идее подойдет и гораздо старше, начиная с появления методов для работы с HTTP, строковые функции типа СтрРазделить.
Конфигурации - Управление торговлей, редакция 11 (11.4.12.102), Комплексная автоматизация 2 (2.4.13.203).
IIKO - работа проверена на IIKO RMS 7.4.6020.0