Интеграция конфигураций «1С:Предприятие» с внешними веб-ресурсами — одна из наиболее частых задач современных разработчиков. Особенно остро этот вопрос стоит в медицинских организациях, где требуется оперативно передавать заказы на исследования из 1С:Медицина в сторонние лаборатории и мгновенно получать результаты анализов обратно.
В этой статье мы подробно разберем, как правильно организовать двусторонний обмен данными между вашей базой 1С и внешним сайтом, написанным на Python (или любом другом языке/фреймворке), используя современные кроссплатформенные механизмы платформы «1С:Предприятие 8.3».
В некоторых старых руководствах и на форумах (например, в сообщении №4) для отправки запросов предлагается использовать внешние Windows-компоненты, такие как WinHttp.WinHttpRequest.5.1 или MSScriptControl.ScriptControl для разбора JSON. Мы настоятельно рекомендуем отказаться от этого подхода по следующим причинам:
MSScriptControl является 32-битным. На современных 64-битных серверах 1С он просто не инициализируется без сложных системных манипуляций.Прежде чем приступать к написанию кода в 1С, необходимо запросить у разработчика веб-сайта техническое задание или спецификацию API. Нам понадобятся следующие данные:
https://api.lab.ru/v1/orders.POST.Рассмотрим, как правильно сформировать структурированный текстовый файл JSON на стороне 1С. Для этого мы будем использовать встроенный объект ЗаписьJSON и сериализовать структуру данных.
Разберем по шагам пример формирования данных заказа:
// Создаем структуру с данными заказа
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("id_1c", "DOC-000124");
ДанныеЗаказа.Вставить("patient_fio", "Иванов Иван Иванович");
ДанныеЗаказа.Вставить("patient_birthdate", "1985-05-12");
ДанныеЗаказа.Вставить("organization", "Клиника Альфа");
// Добавляем массив заказываемых исследований
МассивИсследований = Новый Массив;
МассивИсследований.Добавить("Клинический анализ крови");
МассивИсследований.Добавить("Общий анализ мочи");
ДанныеЗаказа.Вставить("tests", МассивИсследований);
// Сериализуем структуру в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
СтрокаJSON = ЗаписьJSON.Закрыть();
Теперь рассмотрим процесс создания защищенного HTTPS-соединения и отправки сформированной JSON-строки на сервер. Обратите внимание, что для работы с защищенным протоколом HTTPS мы обязательно инициализируем объект ЗащищенноеСоединениеOpenSSL.
// Определяем параметры подключения
Сервер = "api.yourlabsite.ru"; // Указываем только имя домена, без "https://"
Порт = 443; // Стандартный SSL-порт
ПутьКРесурсу = "/api/v1/orders"; // Путь к принимающей функции сайта
// Создаем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Настраиваем HTTP-соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, ЗащищенноеСоединение);
// Формируем запрос
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer ВАШ_ТОКЕН_БЕЗОПАСНОСТИ");
// Записываем JSON-строку в тело запроса
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеМаркераПоследовательностиБайтов.НеИспользовать);
// Отправляем запрос и обрабатываем ответ сервера
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
// Проверяем статус ответа (200 - OK, 201 - Created)
Если HTTPОтвет.КодСостояния = 200 Или HTTPОтвет.КодСостояния = 201 Тогда
СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Разбираем ответ от сервера сайта
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
РезультатОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Получаем присвоенный сайтом ID заказа
ИдентификаторНаСайте = РезультатОтвета.Получить("site_order_id");
ВызватьАльтернативноеДействие = Ложь;
Иначе
ЗаписьЖурналаРегистрации("Интеграция.Сайт", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка сервера. Код ответа: " + HTTPОтвет.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Интеграция.Сайт", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка отправки данных: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем ситуацию, когда лаборатория на стороне сайта выполнила исследования и нам нужно загрузить результаты обратно в 1С. Существует два основных архитектурных подхода к решению этой задачи:
РегламентныеЗадания (фоновое задание), которое, например, каждые 30 минут обращается к сайту с запросом: «Есть ли готовые результаты для наших заказов?». Если сайт возвращает массив готовых результатов, 1С обрабатывает их и записывает в систему. Это самый простой и безопасный способ, не требующий публикации базы 1С "наружу".HTTPСервисы. База 1С должна иметь постоянный внешний статический IP-адрес или домен, защищенный SSL-сертификатом.Поскольку в конфигурации 1С:Медицина обрабатываются медицинские данные пациентов, при обмене необходимо строго соблюдать требования законодательства о персональных данных (в РФ — ФЗ-152 «О персональных данных»):
Резюме: Интеграция 1С с внешними сайтами — это стандартная процедура, реализуемая штатными средствами платформы 1С. Откажитесь от использования COM-объектов в пользу кроссплатформенных объектов HTTPСоединение и встроенных механизмов сериализации JSON. Это гарантирует быструю, стабильную и безопасную работу вашей информационной системы.