Как организовать прямой обмен данными между 1С и Битрикс24 без файлов, если Битрикс инициирует загрузку?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Определение основной проблемы и ключевых требований

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

Для решения этой проблемы мы можем рассмотреть два основных подхода:

  1. Когда Битрикс24 является инициатором обмена (Push-модель). Это требует настройки доступа к 1С из внешней сети.
  2. Когда 1С является инициатором обмена (Pull-модель). В этом случае 1С сама периодически запрашивает данные у Битрикс24.

Рассмотрим каждый из подходов подробнее.

Подход 1: Битрикс24 инициирует обмен (Push-модель)

Этот подход соответствует изначальному требованию – Битрикс24 сам «толкает» данные в 1С. Для его реализации нам понадобятся следующие компоненты:

  1. HTTP-сервис в 1С: Это специальный объект конфигурации, который позволяет создать в 1С свой собственный API. Внешние системы могут обращаться к нему по протоколу HTTP/HTTPS для передачи или получения данных.
  2. Формат данных JSON: JSON (JavaScript Object Notation) является легковесным и широко используемым форматом для обмена данными в веб-сервисах. Он прост в чтении и записи как для человека, так и для программ.
  3. Публикация HTTP-сервиса на веб-сервере: Для доступности извне HTTP-сервис 1С должен быть опубликован на веб-сервере (например, Apache или IIS).
  4. Настройка сетевой доступности: Это самый критичный момент, требующий обеспечения внешнего доступа к внутреннему веб-серверу 1С.

Шаг 1: Создание HTTP-сервиса в 1С

В конфигурации 1С мы создаем новый HTTP-сервис. В нем мы определяем ресурсы (URL-пути) и методы HTTP (например, POST), которые будут обрабатывать входящие запросы от Битрикс24. Например, для загрузки товаров и счетов мы можем создать ресурсы /products и /invoices.

В модуле HTTP-сервиса или в его ресурсе мы пишем код для обработки запросов. Битрикс24 будет отправлять данные в теле POST-запроса в формате JSON. Мы должны будем прочитать это тело, разобрать JSON, загрузить данные в 1С и сформировать ответ.

Пример структуры кода для обработки POST-запроса:


// В модуле HTTP-сервиса или ресурса
Функция Post(Запрос)
    Попытка
        // Получаем тело запроса как строку JSON
        СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();

        // Создаем объект для чтения JSON
        ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

        // Читаем JSON в структуру или массив
        Данные = ЧтениеJSON.Прочитать();
        ЧтениеJSON.Закрыть();

        // Здесь начинается ваша логика обработки данных
        // Например, загрузка номенклатуры или создание документов
        // Разберем данные из структуры
        Если Данные.Свойство("ТипДанных") Тогда
            Если Данные.ТипДанных = "Номенклатура" Тогда
                // Обработка номенклатуры
                ОбработатьНоменклатуру(Данные.СписокТоваров);
            ИначеЕсли Данные.ТипДанных = "Счет" Тогда
                // Обработка счета
                ОбработатьСчет(Данные.ДанныеСчета);
            КонецЕсли;
        КонецЕсли;

        // Формируем успешный ответ
        ОтветJSON = Новый Структура("Статус, Сообщение", "Успешно", "Данные успешно загружены.");
        ЗаписьJSON = Новый ЗаписьJSON();
        ЗаписьJSON.УстановитьСтроку(Новый Строка);
        ЗаписьJSON.Записать(ОтветJSON);
        СтрокаОтветаJSON = ЗаписьJSON.Закрыть();

        Ответ = Новый HTTPСервисОтвет(200); // 200 OK
        Ответ.УстановитьТелоИзСтроки(СтрокаОтветаJSON, КодировкаТекста.UTF8);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");

        Возврат Ответ;
    Исключение
        // Обработка ошибок
        Сообщить("Ошибка при обработке запроса: " + ОписаниеОшибки());

        ОтветJSON = Новый Структура("Статус, Сообщение", "Ошибка", "Произошла ошибка при обработке данных: " + ОписаниеОшибки());
        ЗаписьJSON = Новый ЗаписьJSON();
        ЗаписьJSON.УстановитьСтроку(Новый Строка);
        ЗаписьJSON.Записать(ОтветJSON);
        СтрокаОтветаJSON = ЗаписьJSON.Закрыть();

        Ответ = Новый HTTPСервисОтвет(500); // 500 Internal Server Error
        Ответ.УстановитьТелоИзСтроки(СтрокаОтветаJSON, КодировкаТекста.UTF8);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");

        Возврат Ответ;
    КонецПопытки;
КонецФункции

// Примерные вспомогательные процедуры
Процедура ОбработатьНоменклатуру(СписокТоваров)
    Для Каждого Товар Из СписокТоваров Цикл
        // Поиск существующей номенклатуры или создание новой
        // Обновление свойств
        // ...
    КонецЦикла;
КонецПроцедуры

Процедура ОбработатьСчет(ДанныеСчета)
    // Создание или обновление документа "Счет"
    // ...
КонецПроцедуры

Для работы с JSON в 1С мы используем объекты ЧтениеJSON и ЗаписьJSON. Они позволяют легко преобразовывать строки JSON в структуры/массивы 1С и обратно.

Шаг 2: Публикация HTTP-сервиса и настройка сети

После создания HTTP-сервиса в конфигурации, его необходимо опубликовать на веб-сервере. Это делается через меню "Администрирование" -> "Публикация на веб-сервере" в конфигураторе. Выбираем базу, указываем имя публикации и обязательно отмечаем наш HTTP-сервис. Веб-сервер (Apache или IIS) должен быть установлен на том же компьютере, где находится база 1С, или на другом сервере, который имеет к ней доступ.

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

  1. Внешний (белый) IP-адрес: Ваш внешний роутер должен иметь статический внешний IP-адрес.
  2. Проброс портов (Port Forwarding): На внешнем роутере (маршрутизаторе) необходимо настроить переадресацию портов. Это означает, что запросы, приходящие на определенный внешний порт роутера (например, 443 для HTTPS или 80 для HTTP), будут перенаправляться на внутренний IP-адрес и порт вашего веб-сервера 1С в локальной сети. Например, внешний порт 443 на внутренний IP-адрес 192.168.1.100 (IP веб-сервера 1С) и внутренний порт 443.
  3. Настройка файрвола (Firewall): На самом сервере с веб-сервером Windows Server 2012) необходимо разрешить входящие соединения на порт, который используется веб-сервером (80 для HTTP, 443 для HTTPS).
  4. Использование HTTPS: Для обеспечения безопасности передачи данных (шифрование) крайне рекомендуется использовать HTTPS. Для этого потребуется настроить SSL-сертификат на веб-сервере.
  5. Аутентификация и авторизация: В самом HTTP-сервисе 1С рекомендуется реализовать механизмы аутентификации (например, по ключу API или логину/паролю), чтобы только авторизованные запросы от Битрикс24 могли быть обработаны.

Эти действия требуют участия системного администратора и могут быть сложными из-за корпоративной политики безопасности.

Шаг 3: Безопасность при публикации

Открытие доступа к внутреннему серверу извне всегда сопряжено с рисками. Поэтому важно принять меры безопасности:

Подход 2: 1С инициирует обмен (Pull-модель)

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

Шаг 1: Использование HTTPСоединение в 1С

Для выполнения запросов из 1С к внешним HTTP/REST API мы используем объекты HTTPСоединение и HTTPЗапрос.

Пример кода для запроса данных из Битрикс24:


// В общем модуле, который может быть вызван регламентным заданием
Процедура ЗагрузитьДанныеИзБитрикс24() Экспорт
    // Параметры для подключения к Битрикс24 API
    АдресСервераБитрикс24 = "ваш_домен.bitrix24.ru";
    ПутьКМетодуAPI = "/rest/ваш_метод_api"; // Например, /rest/crm.product.list для товаров
    ТокенДоступа = "ваш_токен_доступа_битрикс24"; // Получите его в настройках Битрикс24

    Попытка
        // Создаем HTTPСоединение
        Соединение = Новый HTTPСоединение(АдресСервераБитрикс24, , , , , Истина); // Истина - для HTTPS

        // Создаем HTTPЗапрос
        Запрос = Новый HTTPЗапрос(ПутьКМетодуAPI);

        // Устанавливаем заголовки (например, для аутентификации)
        // Для Битрикс24 обычно токен передается в URL или в теле, в зависимости от метода
        Запрос.УстановитьПараметрТела("auth", ТокенДоступа);
        // Дополнительные параметры запроса, например, фильтр для получения новых данных
        // Запрос.УстановитьПараметрТела("filter[>DATE_UPDATE]", Формат(ДатаПоследнейЗагрузки, "ДФ=yyyy-MM-dd HH:mm:ss"));

        // Отправляем POST или GET запрос (в зависимости от API Битрикс24)
        // Если API ожидает JSON в теле
        ТелоЗапроса = Новый Структура();
        ТелоЗапроса.Вставить("filter", Новый Структура(">", "DATE_UPDATE", Формат(ДатаПоследнейЗагрузки, "ДФ=yyyy-MM-dd HH:mm:ss")));
        ТелоЗапроса.Вставить("auth", ТокенДоступа);

        ЗаписьJSON = Новый ЗаписьJSON();
        ЗаписьJSON.УстановитьСтроку(Новый Строка);
        ЗаписьJSON.Записать(ТелоЗапроса);
        СтрокаТелаJSON = ЗаписьJSON.Закрыть();

        Запрос.УстановитьТелоИзСтроки(СтрокаТелаJSON, КодировкаТекста.UTF8, "application/json");


        Ответ = Соединение.Отправить(Запрос);

        Если Ответ.КодСостояния = 200 Тогда
            // Успешный ответ
            СтрокаJSON = Ответ.ПолучитьТелоКакСтроку();

            // Обработка полученных JSON-данных
            ЧтениеJSON = Новый ЧтениеJSON();
            ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
            ДанныеОтБитрикс = ЧтениеJSON.Прочитать();
            ЧтениеJSON.Закрыть();

            // Далее ваша логика загрузки данных в 1С
            Если ДанныеОтБитрикс.Свойство("result") Тогда
                Для Каждого Элемент Из ДанныеОтБитрикс.result Цикл
                    // Обработка каждого элемента (товара, счета и т.д.)
                    // Поиск, создание, обновление в справочниках и документах 1С
                    Сообщить("Обработка элемента: " + Элемент.ID);
                КонецЦикла;
            КонецЕсли;

            // Обновляем дату последней успешной загрузки
            ЗаписатьДатуПоследнейЗагрузки(ТекущаяДата());

        Иначе
            // Обработка ошибки
            Сообщить("Ошибка при запросе к Битрикс24. Код состояния: " + Ответ.КодСостояния + ", Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;

    Исключение
        Сообщить("Общая ошибка при работе с HTTP: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

// Функция для получения даты последней загрузки (например, из константы)
Функция ПолучитьДатуПоследнейЗагрузки()
    Возврат Константы.ДатаПоследнейЗагрузкиБитрикс24.Получить();
КонецФункции

// Процедура для записи даты последней загрузки
Процедура ЗаписатьДатуПоследнейЗагрузки(Дата)
    Константы.ДатаПоследнейЗагрузкиБитрикс24.Установить(Дата);
КонецПроцедуры

В этом примере мы создаем HTTPСоединение к домену Битрикс24, формируем HTTPЗапрос и отправляем его. Полученный ответ в формате JSON разбираем и используем для загрузки данных в 1С.

Шаг 2: Настройка фонового задания

Чтобы 1С автоматически опрашивала Битрикс24, мы создаем регламентное задание, которое будет периодически вызывать процедуру ЗагрузитьДанныеИзБитрикс24() из общего модуля. Например, можно настроить опрос каждые 5-10 минут.

Для этого в конфигурации:

  1. Создаем новый Общий модуль (если его еще нет), например, "ОбменСБитрикс24Сервер". Убедитесь, что для него установлен флажок "Сервер".
  2. В этом модуле размещаем нашу процедуру ЗагрузитьДанныеИзБитрикс24() с ключевым словом Экспорт.
  3. Создаем новый объект "Регламентное задание", указываем имя, метод (ссылку на нашу экспортную процедуру) и настраиваем расписание (например, каждые 5 минут).

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

Использование VPN как альтернатива сетевым настройкам

В случае, если оба описанных выше подхода не удовлетворяют требованиям безопасности или сложности реализации, есть еще один вариант, который может значительно упростить взаимодействие. Это использование Виртуальной Частной Сети (VPN).

Принцип VPN заключается в создании защищенного туннеля между двумя сетями или между отдельным компьютером и сетью. Если настроить VPN-соединение между сервером, где находится Битрикс24 (или скрипт обмена), и локальной сетью, где находится сервер 1С, то:

  1. Обе системы будут находиться как бы в одной логической сети.
  2. Внешний доступ к серверу 1С через проброс портов не потребуется. Битрикс24 сможет обращаться к внутреннему IP-адресу веб-сервера 1С так, как если бы он находился в той же локальной сети.
  3. Весь трафик будет зашифрован внутри VPN-туннеля, что повышает безопасность.

Для настройки VPN потребуется сервер с внешним IP-адресом, который будет выполнять роль VPN-сервера. На нем настраивается один проброшенный порт в интернет для самого VPN-сервера, а затем внутри VPN-туннеля можно организовать любой обмен. Это более сложная задача, требующая квалификации сетевого инженера, но она предоставляет наиболее безопасное и гибкое решение для доступа к локальным ресурсам.

Важность JSON как формата обмена данными

На протяжении всего обсуждения мы многократно упоминали JSON. Важно понимать, что JSON — это всего лишь формат данных, а не протокол или способ передачи. Его ключевые преимущества:

Пример структуры JSON для номенклатуры:


{
    "ТипДанных": "Номенклатура",
    "СписокТоваров": [
        {
            "ID": "12345",
            "Наименование": "Товар А",
            "Артикул": "ART001",
            "Цена": 100.50,
            "ЕдиницаИзмерения": "шт."
        },
        {
            "ID": "67890",
            "Наименование": "Товар Б",
            "Артикул": "ART002",
            "Цена": 250.00,
            "ЕдиницаИзмерения": "шт."
        }
    ]
}

При получении такого JSON в 1С мы легко преобразуем его в структуру, где Данные.ТипДанных будет содержать "Номенклатура", а Данные.СписокТоваров будет массивом структур с информацией о каждом товаре.

Архитектурные соображения и роль первоисточника данных

Обычно в интеграционных проектах 1С является первоисточником учетных данных (номенклатура, цены, остатки), а CRM-системы (как Битрикс24) используются для взаимодействия с клиентами и сбора заказов, которые затем передаются в 1С. В вашей ситуации заказчик настоял на обратной схеме – Битрикс24 как источник данных для 1С. Это вполне возможно, но требует тщательной проработки логики.

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

Заключение и рекомендации

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

  1. Если принципиально, чтобы Битрикс24 был инициатором, то вам потребуется публикация HTTP-сервиса 1С с пробросом портов и тщательной настройкой безопасности.
  2. Если приоритет на безопасности и простоте настройки сети, то лучше организовать 1С как инициатора, которая будет опрашивать API Битрикс24 по расписанию.
  3. Для максимальной безопасности и гибкости, рассмотрите настройку VPN между Битриксом и вашей локальной сетью.

В любом случае, детальное изучение документации по HTTP-сервисам 1С, работе с JSON в 1С, а также по REST API Битрикс24 является критически важным. Не забывайте о тщательном тестировании и логировании всех этапов обмена, чтобы обеспечить надежность и стабильность работы вашей интеграции.

← На главную