В практике разработки на платформе 1С:Предприятие часто возникает задача оперативного (синхронного) обмена данными между двумя информационными базами. Классический и наиболее современный подход — использование HTTP-сервисов. Однако случаются ситуации, когда ИТ-инфраструктура или требования безопасности не позволяют установить и настроить полноценный веб-сервер (Apache или IIS) для публикации базы-приемника. Рассмотрим, как решить эту задачу альтернативными методами, сохранив удобство передачи данных в формате JSON и обеспечив получение мгновенного ответа от второй системы.
Многие разработчики отказываются от COM-соединения из-за его медлительности и сложности отладки при обращении к реквизитам объектов «через точку». Если мы обращаемся к каждому реквизиту документа в другой базе через COM, каждое такое обращение инициирует сетевой вызов, что катастрофически снижает производительность. Проанализируем, как сделать это правильно, используя JSON в качестве транспортного контейнера.
Суть метода заключается в том, чтобы не передавать объекты по отдельности, а сформировать в базе-источнике одну строку JSON, передать её одним вызовом в базу-приемник и там же, на стороне приемника, разобрать её «нативным» кодом. Выясним, как это реализовать пошагово.
Шаг 1. Подготовка базы-приемника. В базе, где должны создаваться документы, создадим общий модуль (например, ИнтеграцияСБазойИсточником) и установим у него флаг «Внешнее соединение». Внутри опишем экспортную функцию:
Функция СоздатьДокументыИзJSON(ДанныеJSON) Экспорт
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ДанныеJSON);
СтруктураДанных = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Здесь реализуем логику поиска или создания объектов
// Например, создание документа ПоступлениеТоваровУслуг
НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// Заполнение реквизитов из структуры...
НовыйДок.Записать();
// Возвращаем номер созданного документа или структуру с данными
Возврат НовыйДок.Номер;
КонецФункции
Шаг 2. Вызов из базы-источника. Теперь в базе-источнике мы формируем данные и вызываем эту функцию через однократное подключение:
// Формируем данные
ДанныеДляПередачи = Новый Структура;
ДанныеДляПередачи.Вставить("КонтрагентИНН", "7701010101");
ДанныеДляПередачи.Вставить("Сумма", 15000);
// ... заполнение таблицы товаров ...
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляПередачи);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Подключаемся
Connector = Новый COMОбъект("V83.COMConnector");
Соединение = Connector.Connect("Srvr=""ServerName"";Ref=""DBName"";Usr=""Admin"";Pwd=""123"";");
// Вызываем функцию ОДИН раз
НомерДокумента = Соединение.ИнтеграцияСБазойИсточником.СоздатьДокументыИзJSON(СтрокаJSON);
Сообщить("Документ успешно создан с номером: " + НомерДокумента);
Преимущества: мы используем всего один вызов через границу процессов, что работает почти так же быстро, как HTTP-запрос. Вся сложная логика поиска ссылок (номенклатуры, контрагентов) по УИД или кодам происходит внутри базы-приемника, где у нас есть полный доступ к метаданным.
Начиная с версии платформы 8.3.20, 1С предоставляет великолепный инструмент — Автономный сервер (ibsrv.exe). Проанализируем эту ситуацию: по сути, это встроенный в платформу веб-сервер, который позволяет публиковать HTTP-сервисы без установки стороннего ПО (Apache или IIS). Это идеальный ответ на вопрос «как сделать HTTP без публикации в обычном понимании».
Разберем процесс настройки автономного сервера:
HTTP-сервис с нужными шаблонами и методами.ibsrv.exe --database-path "C:\Bases\MyBase" --http-port 8080 (для файловой базы) или аналогичные параметры для клиент-серверного варианта.Почему это удобно? Автономный сервер можно запустить как обычное приложение или как службу Windows. Он полностью берет на себя роль «прослойки», принимая входящие REST или SOAP запросы и передавая их в код 1С. Для внешней системы это выглядит как стандартный HTTP-интерфейс.
Если COM недоступен (например, разные операционные системы или ограничения прав), а автономный сервер нельзя запустить, можно рассмотреть вариант с общим файловым ресурсом. Однако классический обмен через файлы обычно асинхронен. Посмотрим, как сделать его синхронным, чтобы база-источник дождалась ответа.
Алгоритм взаимодействия выглядит следующим образом:
request_123.json) в общую папку.response_123.json).Рассмотрим пример кода ожидания в базе-источнике:
Процедура ОтправитьЗапросИЖдатьОтвета(Данные)
ИмяФайлаЗапроса = "C:\Exchange\req_" + Строка(Новый УникальныйИдентификатор) + ".json";
ИмяФайлаОтвета = СтрЗаменить(ИмяФайлаЗапроса, "req_", "res_");
// Записываем запрос
ЗаписатьДанныеВФайл(ИмяФайлаЗапроса, Данные);
// Цикл ожидания
НачалоОжидания = ТекущаяДата();
МаксимальноеВремя = 30; // 30 секунд на ответ
Пока Истина Цикл
ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
Если ФайлОтвета.Существует() Тогда
// Читаем результат
Результат = ПрочитатьДанныеИзФайла(ИмяФайлаОтвета);
// Удаляем временные файлы
УдалитьФайлы(ИмяФайлаЗапроса);
УдалитьФайлы(ИмяФайлаОтвета);
Возврат Результат;
КонецЕсли;
Если ТекущаяДата() - НачалоОжидания > МаксимальноеВремя Тогда
ВызватьИсключение "Превышено время ожидания ответа от второй базы";
КонецЕсли;
// Пауза, чтобы не нагружать процессор (доступно в 8.3.15+)
Wait(1);
КонецЦикла;
КонецПроцедуры
Важный момент: Для реализации коротких пауз в цикле (чтобы не «замораживать» систему на 100% нагрузки процессора) рекомендуется использовать команду Wait() или вызов системной паузы через КомандаСистемы (например, timeout /t 1), если версия платформы позволяет.
Проанализируем ситуацию в зависимости от ограничений:
FTP/SFTP) — используйте синхронный файловый обмен, но помните о задержках на дисковые операции.Подведем итог: Отсутствие установленного веб-сервера — не повод отказываться от удобных форматов обмена вроде JSON. Используйте COM как транспорт для строк, а логику обработки оставляйте внутри базы-приемника. Это обеспечит высокую скорость работы и чистоту кода.