Как реализовать прямую загрузку документов между базами 1С:Бухгалтерия 3.0 без промежуточных файлов

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

В практике разработчика 1С часто возникает задача организовать обмен данными между двумя идентичными базами (например, разными филиалами или организациями в 1С:Бухгалтерия 3.0). Стандартные механизмы, такие как «Синхронизация данных», требуют длительной настройки узлов и планов обмена. Если же стоит задача сделать «одну кнопку» для оперативного переноса документов, нам необходимо рассмотреть методы прямого подключения одной базы к другой.

В этой статье мы подробно разберем несколько технических подходов: от классического COM-соединения до современных HTTP-сервисов и OData. Мы проанализируем, как обойти проблемы с правами доступа и технические ограничения серверных платформ.

Способ 1. Использование технологии COM-соединения (V83.COMConnector)

Это один из самых популярных методов среди разработчиков для решения задачи «одной кнопки». Суть заключается в том, что база-приемник программно подключается к базе-источнику, создает там сеанс и может напрямую читать данные или вызывать экспортные функции модулей.

Рассмотрим пример кода для установки соединения с серверной базой:


Попытка
    COMСоединитель = Новый COMОбъект("V83.COMConnector");
    ПараметрыПодключения = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""UserName"";Pwd=""Password"";";
    Соединение = COMСоединитель.Connect(ПараметрыПодключения);
    Сообщить("Соединение успешно установлено!");
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Разберем ситуацию, когда мы уже получили объект Соединение. Теперь мы можем обращаться к метаданным удаленной базы. Например, выберем документы «Реализация товаров и услуг» за определенный период:


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

Важный нюанс: при использовании V83.COMConnector не запускается графический интерфейс второй базы. Это работает быстро, но помните, что внутри такого соединения недоступны процедуры, объявленные в модулях форм или в модулях с признаком «Клиент».

Способ 2. Решение проблемы с доменной авторизацией

Часто при попытке подключения возникает ошибка «Идентификация пользователя не выполнена». Это происходит, когда в базах используется Windows-аутентификация. Если мы хотим использовать доменного пользователя, строка подключения должна содержать только адрес сервера и имя базы, но работать код должен от имени пользователя, имеющего права в обеих системах.

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

Способ 3. Универсальный обмен через XML с программной оберткой

Если конфигурации абсолютно идентичны (один и тот же релиз БП 3.0), можно воспользоваться встроенной обработкой ВыгрузкаЗагрузкаДанныхXML. Чтобы реализовать «одну кнопку», мы можем написать программную обертку, которая будет вызывать методы этой обработки без участия пользователя.

Преимущество этого метода в том, что он автоматически обрабатывает ссылочную целостность — при переносе документа подтянутся и необходимые справочники (Контрагенты, Номенклатура), если их еще нет в базе-приемнике.

Способ 4. Современный подход через OData (REST API)

Проанализируем ситуацию, когда базы находятся в разных сетях или есть сложности с регистрацией COM-компонент на 64-битных серверах. В этом случае идеально подходит интерфейс OData. Это встроенный в 1С механизм, позволяющий получать данные по протоколу HTTP в формате JSON.

Для реализации этого метода выполним следующие шаги:

  1. В базе-источнике опубликуем информационную базу на веб-сервере (Apache или IIS).
  2. В настройках публикации разрешим использование стандартного интерфейса OData.
  3. В базе-приемнике используем объект HTTPЗапрос для получения данных.

Пример получения списка документов через HTTP-запрос:


Соединение = Новый HTTPСоединение("server.com", , "Логин", "Пароль");
Запрос = Новый HTTPЗапрос("/BaseName/odata/standard.odata/Document_РеализацияТоваровУслуг?$format=json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Обработка полученного JSON
КонецЕсли;

Этот метод считается более «продвинутым», так как он не зависит от разрядности системы и работает стабильнее в веб-клиентах.

Технические сложности: 64-битный сервер и COM

Рассмотрим ситуацию, когда сервер 1С работает под управлением 64-битной ОС. Часто при вызове Новый COMОбъект("V83.COMConnector") возникает ошибка «Класс не зарегистрирован». Это происходит из-за того, что 1С пытается найти 64-битную версию библиотеки, которая не всегда корректно прописана в реестре.

Чтобы решить эту проблему, выполним настройку COM+ Application в Windows:

  1. Откроем «Службы компонентов».
  2. Создадим новое пустое приложение COM+.
  3. В разделе «Компоненты» добавим comcntr.dll из каталога установленной платформы 1С.
  4. В свойствах созданного приложения на вкладке «Активация» укажем «Процесс сервера».

Это позволит 64-битному процессу 1С успешно взаимодействовать с компонентой обмена.

Использование формата EnterpriseData (ED)

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

Преимущество в том, что в БП 3.0 уже есть готовые модули для разбора этого формата. База-приемник «узнает» документ и сама распределит данные по нужным реквизитам и табличным частям, что значительно сокращает объем кода в нашей обработке с «одной кнопкой».

Подведем итог: Для реализации простой и быстрой загрузки в рамках одной локальной сети лучше всего подходит COM-соединение с использованием выделенного пользователя 1С. Если же требуется работа через интернет или повышенная стабильность, стоит обратить внимание на HTTP-сервисы или OData.

← На главную