Интеграция 1С и IIKO: от SQL-запросов к автоматическому обмену через расширение

10.04.26

Интеграция - Внешние источники данных

План обмена как очередь задач. String(TypeOf()) возвращает не то, что ожидаешь. Авто-сопоставление номенклатуры по токенам с порогом 0.85. Технические решения из реального проекта интеграции 1С и IIKO — без маркетинга, с кодом и граблями.

Вступление

Здравствуйте, друзья. Меня зовут Тян Семен, и вот уже несколько лет я занимаюсь интеграцией учётных систем 1С и IIKO. За это время вышло восемь публикаций: мы разбирались с SQL-запросами к серверу IIKO, учились обмениваться накладными, создавали номенклатуру из 1С и мечтали о фоновом двунаправленном обмене.

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

Для контекста: раньше мы использовали внешние обработки (.epf), типовую COM-компоненту IIKO для загрузки данных и промежуточный HTTP-сервис. Ниже – о том, чем мы всё это заменили и почему.

1. Гибридная архитектура: что где хранить

Первый вопрос, с которым сталкивается любая интеграция: где хранить данные? Если всё в 1С – решение замкнуто на одну базу. Если всё на внешнем сервисе – зависимость от интернета для мегабайтных справочников.

Мы пришли к разделению по объёму данных:

  • Справочники IIKO (номенклатура, склады, контрагенты) синхронизируются локально через дельта-запросы к сервису Update IIKO (XDTO). Это мегабайты XML, которые незачем гонять через интернет – сервер IIKO обычно в той же локальной сети.
  • Сопоставления (какой товар 1С соответствует какому товару IIKO), ревизии синхронизации и прочие метаданные хранятся во внешнем сервисе (Go, REST API). Это килобайты, и они должны быть доступны из любой базы 1С.
  • Разбор документов (накладных, заказов) выполняется сервисом – это позволяет менять логику парсинга без обновления расширения.

 

 

Расширение остаётся «тонким клиентом»: UI, сбор данных для отправки, запись результатов. Бизнес-логика разбора – на сервисе.

Практический результат: при миграции на другую конфигурацию (например, с Бухгалтерии на ERP) все сопоставления и настройки уже в сервисе. Подключил расширение к новой базе – продолжил работать.

 

2. Сквозной контекст подключения вместо «активного подключения»

Типичный паттерн интеграции с IIKO: у клиента несколько ресторанов — несколько серверов IIKO. В первых версиях мы использовали понятие активного подключения: булев флаг active на справочнике подключений, переключение вручную. Проблемы предсказуемые: забыл переключить — отправил накладную не в тот ресторан.

Решение: подключение как сквозной параметр через все формы расширения:

  • Формы списков справочников IIKO (номенклатура, склады и т.д.) получают выпадающий список подключений сверху. Данные фильтруются динамически через СоставнойФильтр динамического списка.
  • При ручной отправке документа в IIKO — подключение определяется правилами маршрутизации, а не флагом.
  • Заимствованные формы списка типовых документов (Приобретение, Реализация) получают picker подключения программно через &После("ПриСозданииНаСервере") в модуле МодификацияКонфигурацииПереопределяемый.

 

 

Технически это означает, что API серверных модулей (like_InvoicesAtServerlike_DocumentAtServerlike_EntitiesAtServer) больше не читают «активное подключение» изнутри, а принимают connection первым обязательным параметром. Рефакторинг болезненный (затронул ~20 модулей), но после него каждая функция стала чистой — без скрытых зависимостей от глобального состояния.

 

3. Автоматическая выгрузка через план обмена

Ручная выгрузка документов — основная боль. Типичный сценарий: бухгалтер проводит документ, потом вручную открывает обработку, выбирает документы, сопоставляет, нажимает «Передать». Пять-шесть кликов на каждый документ. Забыл — документ не в IIKO.

Для автоматизации мы использовали стандартный механизм платформы — план обмена как очередь задач:

  1. Подписка на событие ПриЗаписи (EventSubscription) для трёх типов документов (Приобретение, Реализация, Отгрузка). При проведении документ регистрируется в плане обмена. Подписка не вмешивается в проведение — только ставит в очередь.

  2. Регламентное задание каждые 10 минут дренирует очередь: читает зарегистрированные изменения через виртуальную таблицу Документ.X.Изменения, группирует по типу.

  3. Для каждого документа — маршрутизация по правилам: справочник like_uploadRules с табличной частью условий (FieldNameOperatorValueLink/ValueLiteral). Первое подходящее правило по приоритету определяет целевое подключение. Пустые условия = match-all.

  4. Перед отправкой — авто-сопоставление (об этом ниже). Если всё сопоставлено — отправка. Если нет — документ откладывается с записью в регистр like_deferredMatchings.

  5. При ошибке IIKO — запись в like_uploadErrors с автоматическим retry (до 5 попыток, потом ручное вмешательство через UI «Очередь выгрузки»).

 

 

Нюанс с ВыбратьИзменения: мы не используем стандартный ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения) с его семантикой номеров сообщений. Вместо этого читаем напрямую из виртуальной таблицы Документ.X.Изменения запросом ВЫБРАТЬ Изм.Ссылка ИЗ Документ.X.Изменения ГДЕ Изм.Узел = &node. Это проще, когда план обмена используется как очередь, а не как реальный механизм обмена данными.

Нюанс с String(TypeOf()): под русской платформой String(TypeOf(docRef)) возвращает синоним документа ("Приобретение товаров и услуг"), а не идентификатор метаданного. Для определения типа документа используем Metadata.FindByType(TypeOf(docRef)).Name — он возвращает каноничное "ПриобретениеТоваровУслуг" независимо от локали.

 

4. Авто-сопоставление номенклатуры

Сопоставление «товар 1С ↔ товар IIKO» — самая трудоёмкая часть первоначальной настройки. У клиента 500-5000 позиций номенклатуры, каждую нужно сопоставить вручную.

Мы автоматизировали это в два этапа:

Этап 1 — по коду IIKO. У клиентов, перешедших с типового обмена, часто есть дополнительный реквизит «Код IIKO» у номенклатуры (через механизм БСП «Дополнительные реквизиты и сведения»). Если он заполнен — ищем совпадение по num в справочнике like_products. Один JOIN-запрос, мгновенно.

Этап 2 — по наименованию (нечёткий поиск). Если кода нет — разбираем наименование на токены:

  • Убираем стоп-слова (в/сс/мзамшт).
  • Выделяем числа и единицы измерения (500мл1кг3.2%) в отдельные группы.
  • Считаем взвешенное совпадение оставшихся токенов с наименованиями IIKO.

Порог совпадения — 0.85 (настраиваемый). Если превышен — предлагаем пару. Если нет — оставляем для ручного сопоставления.

Визуальный контроль: авто-сопоставленные строки подсвечиваются жёлтым через программное условное оформление (ConditionalAppearance.Items.Add(), фильтр по булеву флагу matched). Три кнопки: «Подтвердить авто» (снять флаг, оставить значения), «Сбросить авто» (очистить likeRef), «По артикулу» (запустить этап 1 вручную).

 

 

При автоматической выгрузке авто-сопоставление запускается перед каждой отправкой. Если появился новый товар — система попробует сопоставить сама и, только если не справится, отложит документ для ручного разрешения.

 

5. Встраивание в типовые формы через расширение

Отдельно хочу остановиться на паттерне встраивания, который мы используем для добавления функциональности в стандартные формы типовых конфигураций (КА, ERP, УТ).

 

 

Расширение заимствует модуль МодификацияКонфигурацииПереопределяемый и добавляет обработчики через &После:

  • &После("ПриСозданииНаСервере") — программно создаём реквизиты формы (ИзменитьРеквизиты), элементы UI (Форма.Элементы.Добавить), команды и условное оформление. Фильтруем по Форма.ИмяФормы чтобы работать только с нужными формами.

  • &После("ВыполнитьПереопределяемуюКоманду") — обрабатываем нажатие кнопки «Отправить в IIKO», которую добавили в серверном хуке.

Ключевой приём: РеквизитФормы(Имя, Тип, Путь, Заголовок) — третий параметр это путь (имя родительской таблицы для колонок), не заголовок. На этом спотыкались не раз.

Этот же паттерн мы используем для добавления picker'а подключения в заимствованные формы списков документов — реквизит like_connection создаётся программно и привязывается к элементу формы через УстановитьДействие("ПриИзменении", ...).

 

Что дальше

Из ближайших технических задач:

  • Расширение авто-сопоставления на партнёров, склады и организации (сейчас работает только для номенклатуры).
  • Миграция правил маршрутизации в сервис — чтобы управлять ими централизованно из любой базы 1С.
  • Оценка условий правил с ссылочными типами — сейчас ValueLink в табличной части хранит составной тип (CatalogRef.*), сравнение через прямое = вместо XMLString.

Если тема интересна — в следующей публикации могу подробнее разобрать протокол IIKO: особенности XDTO-схем, авторизацию через SHA1-хэш, нюансы GZIP-сжатия и различия между RMS и Chain.

 

Заключение

 

 

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

  • План обмена отлично работает как очередь задач, если не использовать семантику номеров сообщений.
  • String(TypeOf()) возвращает синоним, а не имя метаданного — используйте Metadata.FindByType().Name.
  • Сквозной параметр подключения вместо глобального состояния — больше кода при рефакторинге, но каждая функция становится предсказуемой.
  • Авто-сопоставление по токенам с порогом 0.85 закрывает 70-80% номенклатуры без ручного вмешательства (по нашим наблюдениям).

Буду рад вопросам и обратной связи в комментариях.

Вступайте в нашу телеграмм-группу Инфостарт

IIKO расширение интеграция Лайка

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

35000 руб.

15.11.2022    31279    46    49    

47

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

05.10.2022    13474    15    8    

16

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

122000 руб.

19.08.2020    29653    27    3    

29

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    53991    123    107    

84

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    8921    24    4    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. IamAlexy 345 11.04.26 15:10 Сейчас в теме
А как теперь данные из самой IIKO получаете, если это не через типовую COM-компоненту, то через их открытое API?
Или какой-то иной способ ?
2. oyti 68 11.04.26 21:13 Сейчас в теме
(1)
А как теперь данные из самой IIKO получаете, если это не через типовую COM-компоненту, то через их открытое API?
Или какой-то иной способ ?

Здравствуйте.
С механизмом можно ознакомиться в предыдущих статьях.
Для отправки сообщения требуется регистрация/авторизация