Как организовать связь объектов и обмен данными между различными базами 1С?

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

При межбазовом взаимодействии разработчики 1С часто сталкиваются с задачей ссылаться на данные из другой конфигурации. Прямое использование ссылки на справочник из внешнего информационного массива невозвможно на физическом уровне базы данных. Рассмотрим по шагам, как правильно связать объекты двух разных баз, как использовать COM-соединения без ошибок и какие современные механизмы интеграции лучше применять в архитектуре решений.

Хранение уникального идентификатора (GUID) сторонней базы

Проанализируем задачу, когда реквизит документа в базе-приемнике должен ссылаться на элемент справочника из базы-источника. Оптимальный вариант решения — не тянуть всю структуру справочника «вживую», а сохранять уникальный идентификатор (GUID) объекта исходной базы.

Разберем вариант реализации этого подхода:

  1. В базе-приемнике создадим реквизит с типом УникальныйИдентификатор или Строка (фиксированной длины 36 символов). Использование типа УникальныйИдентификатор предпочтительнее для экономии объема базы данных и удобства вызова системных функций.
  2. При синхронизации или выборе объекта из внешнего источника сохраним текстовый или бинарный GUID объекта источника в этот реквизит.
  3. Для формирования готовой ссылки на объект в базе-приемнике или получения связанных данных выполним поиск по значению сохраненного идентификатора.

Посмотрим на пример кода формирования ссылки по сохраненному GUID в базе-приемнике:


ИдентификаторСтрокой = "123e4567-e89b-12d3-a456-426614174000";
ГуидОбъекта = Новый УникальныйИдентификатор(ИдентификаторСтрокой);
СсылкаНаКонтрагента = Справочники.Контрагенты.ПолучитьСсылку(ГуидОбъекта);

Важно: Метод ПолучитьСсылку() генерирует ссылку на элемент даже в том случае, если самого объекта в текущей базе еще не существует. Для проверки реального наличия записи в БД следует выполнять запрос к справочнику или проверять заполненность объекта через ЗначениеЗаполнено(СсылкаНаКонтрагента.ПолучитьОбъект()).

Особенности работы с COM-соединением и обход интерактивных окон

Если для получения сведений используется прямое подключение к базе 1С, выясним причину частых зависаний и проблем с модальными окнами при запуске сеанса.

При использовании объекта 1C83.Application при старте базы могут выполняться интерактивные обработчики обновления, проверки релиза, вызовы форм или модальные предупреждения. Поскольку клиентское приложение запускается в фоновом/скрытом режиме, появление модального окна блокирует выполнение кода, из-за чего процесс программного входа «зависает».

Для решения этой проблемы придерживаемся следующих правил:

  1. Использование COMConnector вместо Application: Для программного обмена данными и вызова экспортных процедур подключаемся через объект COMConnector. Он не инициирует запуск графического интерфейса и отсекает вывод большинства пользовательских форм.
  2. Проверка типа соединения в базе-источнике: В модуле сеанса или при старте базы-источника организуем проверку режима работы. Если соединение является внешним, отключаем показ предупреждений и процедур проверки обновлений.

Рассмотрим пример правильного разрывания COM-соединения и очистки ресурсов памяти:


// Создание COM-подключения
COMОбъект = Новый COMОбъект("v83.COMConnector");
Соединение = COMОбъект.Connect("Srvr=""ServerName"";Ref=""BaseName"";Usr=""User"";Pwd=""Password"";");

// Выполнение необходимых операций...

// Корректное завершение работы и очистка переменной
Соединение = Неопределено;
COMОбъект = Неопределено;

Чтобы проверить, завершился ли сеанс во внешней базе, перейдем в базу-источник и откроем список Активные пользователи. При присвоении переменной значения Неопределено сборщик мусора очищает ссылку и закрывает сеанс внешней базы.

Архитектурные альтернативы COM-соединению

Технология COM является платформозависимой (работает только в среде ОС Windows) и фирма «1С» относит её к устаревшим механизмам интеграции. При высокой нагрузке или при работе сервера 1С на базе Linux COM-соединения не обеспечат нужной стабильности.

Рассмотрим более современные и устойчивые подходы к интеграции систем:

  1. HTTP-сервисы и Web-сервисы: База-источник публикует Web- или HTTP-сервис. База-приемник отправляет REST/SOAP запрос (например, пересылая GUID объекта) и моментально получает в ответ нужные расчетные данные или представления в формате JSON/XML. Это устраняет зависимость от интерфейсных процессов и разрядности платформы.
  2. Планы обмена и «Конвертация данных»: Если между базами требуется регулярная синхронизация справочников и документов, настраиваем план обмена. В базу-приемник передаются не полноценные документы, а их «легкие» копии со стандартными реквизитами и сохраненными GUID. Передача изменений выполняется в фоновом режиме по расписанию.
  3. Открытие документов по навигационным ссылкам: Для реализации требования «просмотреть оригинальный документ из базы-источника» не требуется держать активное COM-соединение. Достаточно сформировать навигационную ссылку (формата e1cib/data/...) и передать её системной функции ЗапуститьПриложение(). Документ откроется в полноценном клиенте базы-источника.
← На главную