Задача: 1С:ERP и Битрикс24 должны работать как одно целое
На производственном предприятии учёт, склад, номенклатура и заказы на производство ведутся в 1С:ERP Управление предприятием 2, а отдел продаж и руководители проектов живут в Битрикс24: сделки, воронка, задачи, смарт-процессы. Пока данные переносят руками, менеджеры видят не тот статус, склад не знает о новых заказах, а руководитель — реальную загрузку производства. Нужен двусторонний обмен, который срабатывает сам при изменении данных и не создаёт дублей.
Решение: авторский фреймворк интеграции на расширении конфигурации
Интеграция реализована не разовыми обработками, а как переиспользуемый
фреймворк — расширением конфигурации 1С (не меняя типовую ERP). Ядро —
набор общих модулей ns_Битрикс24*, разложенных по принципу «модуль
логики + модель сущности»: ns_Битрикс24Сделки/…СделкиМодель,
…Компании, …Контакты, …Товары,
…СмартПроцессы, …Задачи, …ПользовательскиеПоля.
Точки под конкретного клиента вынесены в переопределяемый модуль
ns_Битрикс24Переопределяемый, а для отладки в состав входит консоль
разработчика и обработка экспорта/импорта настроек — фреймворк переносится между
базами.
OAuth 2.0 с автопродлением токена
Подключение к порталу — полный серверный поток OAuth 2.0 Битрикс24: authorize →
получение code → обмен на access_token/refresh_token
через oauth.bitrix.info. Токены и срок жизни хранятся в регистре сведений
ns_Настройки, а перед каждым REST-запросом фреймворк сам проверяет
срок и молча продлевает доступ:
Процедура ПроверитьТокен(НастройкиПодключения)
Если ЗначениеЗаполнено(НастройкиПодключения[Перечисления.ns_ВидыНастроек.RefreshTime])
И НастройкиПодключения[Перечисления.ns_ВидыНастроек.RefreshTime] < ТекущаяДата() Тогда
ОбновитьТокен(НастройкиПодключения);
КонецЕсли;
КонецПроцедуры
Если Битрикс всё же вернул «The access token provided has expired», обработчик ошибок ловит это по тексту и инициирует обновление токена, не роняя обмен.
Одна обёртка над всем REST CRM
Поверх HTTP собран универсальный слой методов Битрикс24 — Add,
Get, List, Update, Delete,
Search, Productrows_set. Каждый вызов — это
<сущность>.<метод> (например crm.deal.add,
crm.company.list), тело сериализуется в JSON с корректной обработкой дат
Битрикс (DATE_MODIFY, CLOSEDATE и т.п.). Инкрементальная
выборка изменений идёт по фильтру >DATE_MODIFY с приведением к таймзоне
портала — тянем только то, что поменялось с прошлой сверки:
Отбор = Новый Соответствие;
Отбор.Вставить(">DATE_MODIFY", ДатаПоследнейСверки);
МассивДанных = ns_Битрикс24.List(ПолучитьСущность(),
ns_Битрикс24.GetParam("DATE_MODIFY", "ASC"), Отбор, ВозвращаемыеПоля);
Событийный обмен и защита от эхо-циклов
Изменения в 1С перехватываются подписками на события (ns_РегистрацияСправочников,
ns_РегистрацияЗадач): при записи объекта фреймворк кладёт его в очередь
обмена — регистр ns_ОбменБитрикс24. Что именно регистрировать по каждому
объекту, решает переопределяемый модуль. Чтобы данные, только что пришедшие из
Битрикс24, не улетели обратно и не зациклились, стоит двойная защита: флаг
ЗагруженИзБитрикс24 в дополнительных свойствах объекта и таблица
исключений на текущий проход обмена. Соответствие «объект 1С ↔ ID Битрикс» хранится в
регистре ns_СопоставлениеДанных — благодаря ему обмен идемпотентен и не
плодит дублей, а даты последней сверки лежат в ns_ДатыСверки.
Смарт-процессы и задачи — специфика ERP
Помимо стандартных сделок, контактов и товаров фреймворк работает со
смарт-процессами Битрикс24 (СПА): типы процессов подтягиваются из
crm.type.list в справочник, а элементы читаются и пишутся через
crm.item с указанием entityTypeId. Заказ на производство из
1С выгружается не только как сделка, но и как задача
(tasks.task) — производство и продажи видят один и тот же объект с двух
сторон. При выгрузке сделки её товарные строки синхронизируются отдельно
(crm.deal.productrows.set): если товара ещё нет в Битрикс24, он сначала
создаётся, затем привязывается к сделке.
Результат
1С:ERP и Битрикс24 обмениваются данными автоматически и в обе стороны: сделки, компании, контакты, товары с разделами, статусы воронки, задачи и смарт-процессы держатся в согласованном состоянии без ручного переноса. Обмен переживает истечение токена, не создаёт дублей за счёт регистра сопоставления и тянет только изменения по дате модификации. Поскольку это фреймворк с точкой переопределения, консолью разработчика и переносом настроек, его же движок переиспользуется на других базах — меняется только клиентская логика регистрации объектов.
Нужна такая же интеграция?
Мы собираем интеграции 1С с Битрикс24 под учёт клиента — от УТ и Розницы до 1С:ERP. Как это устроено под капотом (OAuth2, REST, событийный обмен), подробно разбираем на курсе «Интеграция 1С и Битрикс24». Смотрите и смежные кейсы: интеграция 1С:УТ 10.3 с Bitrix24 CRM и интеграция Битрикс24 для автосервиса.