Как организовать обмен данными между базами 1С без публикации на веб-сервере

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

В практике разработки на платформе 1С:Предприятие часто возникает задача оперативного (синхронного) обмена данными между двумя информационными базами. Классический и наиболее современный подход — использование HTTP-сервисов. Однако случаются ситуации, когда ИТ-инфраструктура или требования безопасности не позволяют установить и настроить полноценный веб-сервер (Apache или IIS) для публикации базы-приемника. Рассмотрим, как решить эту задачу альтернативными методами, сохранив удобство передачи данных в формате JSON и обеспечив получение мгновенного ответа от второй системы.

Метод 1. Оптимизированное COM-соединение с использованием 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-запрос. Вся сложная логика поиска ссылок (номенклатуры, контрагентов) по УИД или кодам происходит внутри базы-приемника, где у нас есть полный доступ к метаданным.

Метод 2. Использование Автономного сервера 1С

Начиная с версии платформы 8.3.20, 1С предоставляет великолепный инструмент — Автономный сервер (ibsrv.exe). Проанализируем эту ситуацию: по сути, это встроенный в платформу веб-сервер, который позволяет публиковать HTTP-сервисы без установки стороннего ПО (Apache или IIS). Это идеальный ответ на вопрос «как сделать HTTP без публикации в обычном понимании».

Разберем процесс настройки автономного сервера:

  1. В конфигурации базы-приемника создаем обычный HTTP-сервис с нужными шаблонами и методами.
  2. Вместо настройки веб-сервера через конфигуратор, мы запускаем исполняемый файл платформы из командной строки.
  3. Для запуска используется команда вида: ibsrv.exe --database-path "C:\Bases\MyBase" --http-port 8080 (для файловой базы) или аналогичные параметры для клиент-серверного варианта.

Почему это удобно? Автономный сервер можно запустить как обычное приложение или как службу Windows. Он полностью берет на себя роль «прослойки», принимая входящие REST или SOAP запросы и передавая их в код 1С. Для внешней системы это выглядит как стандартный HTTP-интерфейс.

Метод 3. Синхронный файловый обмен («Опрос папки»)

Если COM недоступен (например, разные операционные системы или ограничения прав), а автономный сервер нельзя запустить, можно рассмотреть вариант с общим файловым ресурсом. Однако классический обмен через файлы обычно асинхронен. Посмотрим, как сделать его синхронным, чтобы база-источник дождалась ответа.

Алгоритм взаимодействия выглядит следующим образом:

  1. База-источник записывает файл-запрос (например, request_123.json) в общую папку.
  2. Сразу после записи база-источник входит в цикл ожидания файла-ответа (response_123.json).
  3. База-приемник в этот момент работает в режиме «прослушки» (регламентное задание или обработка ожидания с интервалом в 1 секунду).
  4. Как только база-приемник видит файл-запрос, она обрабатывает его, создает документы и записывает файл-ответ.
  5. База-источник видит появление файла-ответа, считывает его (получая номер документа) и удаляет оба файла.

Рассмотрим пример кода ожидания в базе-источнике:


Процедура ОтправитьЗапросИЖдатьОтвета(Данные)
    ИмяФайлаЗапроса = "C:\Exchange\req_" + Строка(Новый УникальныйИдентификатор) + ".json";
    ИмяФайлаОтвета = СтрЗаменить(ИмяФайлаЗапроса, "req_", "res_");
    
    // Записываем запрос
    ЗаписатьДанныеВФайл(ИмяФайлаЗапроса, Данные);
    
    // Цикл ожидания
    НачалоОжидания = ТекущаяДата();
    МаксимальноеВремя = 30; // 30 секунд на ответ
    
    Пока Истина Цикл
        ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
        Если ФайлОтвета.Существует() Тогда
            // Читаем результат
            Результат = ПрочитатьДанныеИзФайла(ИмяФайлаОтвета);
            // Удаляем временные файлы
            УдалитьФайлы(ИмяФайлаЗапроса);
            УдалитьФайлы(ИмяФайлаОтвета);
            Возврат Результат;
        КонецЕсли;
        
        Если ТекущаяДата() - НачалоОжидания > МаксимальноеВремя Тогда
            ВызватьИсключение "Превышено время ожидания ответа от второй базы";
        КонецЕсли;
        
        // Пауза, чтобы не нагружать процессор (доступно в 8.3.15+)
        Wait(1); 
    КонецЦикла;
КонецПроцедуры

Важный момент: Для реализации коротких пауз в цикле (чтобы не «замораживать» систему на 100% нагрузки процессора) рекомендуется использовать команду Wait() или вызов системной паузы через КомандаСистемы (например, timeout /t 1), если версия платформы позволяет.

Сравнение и выбор решения

Проанализируем ситуацию в зависимости от ограничений:

Подведем итог: Отсутствие установленного веб-сервера — не повод отказываться от удобных форматов обмена вроде JSON. Используйте COM как транспорт для строк, а логику обработки оставляйте внутри базы-приемника. Это обеспечит высокую скорость работы и чистоту кода.

← На главную