При организации обмена данными между 1С и внешними системами, такими как Битрикс24, часто возникает задача передачи информации без использования промежуточных файлов. Это позволяет ускорить процесс, снизить вероятность ошибок и упростить логику взаимодействия. Однако, когда 1С находится в закрытой локальной сети, а внешняя система должна быть инициатором обмена (то есть, отправлять данные в 1С), возникают специфические сложности, связанные с сетевой доступностью. Давайте подробно разберем, как можно решить эту задачу, используя современные возможности платформы 1С и сетевые технологии.
Наша задача состоит в том, чтобы Битрикс24 отправлял данные по товарам, счетам и другой информации напрямую в 1С. После получения и обработки данных в 1С необходимо отправить ответное сообщение Битрикс24 о статусе операции. Важным условием является то, что 1С расположена в локальной сети без прямого доступа извне, что усложняет прием входящих запросов. При этом мы стремимся к бесфайловому обмену, используя для этого веб-технологии.
Для решения этой проблемы мы можем рассмотреть два основных подхода:
Рассмотрим каждый из подходов подробнее.
Этот подход соответствует изначальному требованию – Битрикс24 сам «толкает» данные в 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С и обратно.
После создания HTTP-сервиса в конфигурации, его необходимо опубликовать на веб-сервере. Это делается через меню "Администрирование" -> "Публикация на веб-сервере" в конфигураторе. Выбираем базу, указываем имя публикации и обязательно отмечаем наш HTTP-сервис. Веб-сервер (Apache или IIS) должен быть установлен на том же компьютере, где находится база 1С, или на другом сервере, который имеет к ней доступ.
Далее, самая сложная часть: обеспечение доступа к этому веб-серверу извне. Если 1С находится в локальной сети без внешнего IP-адреса, нам потребуются следующие действия:
Эти действия требуют участия системного администратора и могут быть сложными из-за корпоративной политики безопасности.
Открытие доступа к внутреннему серверу извне всегда сопряжено с рисками. Поэтому важно принять меры безопасности:
Если по причинам безопасности или сложности настройки прямого доступа к 1С "извне" невозможно, мы можем использовать обратную схему: 1С сама будет периодически обращаться к API Битрикс24, запрашивая новые данные. Этот подход часто более предпочтителен с точки зрения безопасности, так как не требует открытия входящих портов в локальную сеть 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С.
Чтобы 1С автоматически опрашивала Битрикс24, мы создаем регламентное задание, которое будет периодически вызывать процедуру ЗагрузитьДанныеИзБитрикс24() из общего модуля. Например, можно настроить опрос каждые 5-10 минут.
Для этого в конфигурации:
ЗагрузитьДанныеИзБитрикс24() с ключевым словом Экспорт.Этот подход не требует проброса портов или открытия доступа к 1С извне, что значительно упрощает настройку сетевой безопасности.
В случае, если оба описанных выше подхода не удовлетворяют требованиям безопасности или сложности реализации, есть еще один вариант, который может значительно упростить взаимодействие. Это использование Виртуальной Частной Сети (VPN).
Принцип VPN заключается в создании защищенного туннеля между двумя сетями или между отдельным компьютером и сетью. Если настроить VPN-соединение между сервером, где находится Битрикс24 (или скрипт обмена), и локальной сетью, где находится сервер 1С, то:
Для настройки VPN потребуется сервер с внешним IP-адресом, который будет выполнять роль VPN-сервера. На нем настраивается один проброшенный порт в интернет для самого VPN-сервера, а затем внутри VPN-туннеля можно организовать любой обмен. Это более сложная задача, требующая квалификации сетевого инженера, но она предоставляет наиболее безопасное и гибкое решение для доступа к локальным ресурсам.
На протяжении всего обсуждения мы многократно упоминали JSON. Важно понимать, что JSON — это всего лишь формат данных, а не протокол или способ передачи. Его ключевые преимущества:
ЧтениеJSON, ЗаписьJSON) для легкого преобразования JSON-строк в структуры и массивы 1С, и наоборот.Пример структуры JSON для номенклатуры:
{
"ТипДанных": "Номенклатура",
"СписокТоваров": [
{
"ID": "12345",
"Наименование": "Товар А",
"Артикул": "ART001",
"Цена": 100.50,
"ЕдиницаИзмерения": "шт."
},
{
"ID": "67890",
"Наименование": "Товар Б",
"Артикул": "ART002",
"Цена": 250.00,
"ЕдиницаИзмерения": "шт."
}
]
}
При получении такого JSON в 1С мы легко преобразуем его в структуру, где Данные.ТипДанных будет содержать "Номенклатура", а Данные.СписокТоваров будет массивом структур с информацией о каждом товаре.
Обычно в интеграционных проектах 1С является первоисточником учетных данных (номенклатура, цены, остатки), а CRM-системы (как Битрикс24) используются для взаимодействия с клиентами и сбора заказов, которые затем передаются в 1С. В вашей ситуации заказчик настоял на обратной схеме – Битрикс24 как источник данных для 1С. Это вполне возможно, но требует тщательной проработки логики.
Мы должны быть готовы к тому, что при такой схеме может потребоваться больше усилий на стороне 1С для адаптации к входящим данным и поддержания целостности базы.
Мы рассмотрели несколько способов организации бесфайлового обмена данными между 1С и Битрикс24, с учетом требования, что Битрикс24 инициирует загрузку данных в 1С, находящуюся в локальной сети. Каждый из подходов имеет свои преимущества и недостатки, и выбор зависит от конкретных требований безопасности, возможностей сетевой инфраструктуры и квалификации специалистов.
В любом случае, детальное изучение документации по HTTP-сервисам 1С, работе с JSON в 1С, а также по REST API Битрикс24 является критически важным. Не забывайте о тщательном тестировании и логировании всех этапов обмена, чтобы обеспечить надежность и стабильность работы вашей интеграции.