При межбазовом взаимодействии разработчики 1С часто сталкиваются с задачей ссылаться на данные из другой конфигурации. Прямое использование ссылки на справочник из внешнего информационного массива невозвможно на физическом уровне базы данных. Рассмотрим по шагам, как правильно связать объекты двух разных баз, как использовать COM-соединения без ошибок и какие современные механизмы интеграции лучше применять в архитектуре решений.
Проанализируем задачу, когда реквизит документа в базе-приемнике должен ссылаться на элемент справочника из базы-источника. Оптимальный вариант решения — не тянуть всю структуру справочника «вживую», а сохранять уникальный идентификатор (GUID) объекта исходной базы.
Разберем вариант реализации этого подхода:
УникальныйИдентификатор или Строка (фиксированной длины 36 символов). Использование типа УникальныйИдентификатор предпочтительнее для экономии объема базы данных и удобства вызова системных функций.Посмотрим на пример кода формирования ссылки по сохраненному GUID в базе-приемнике:
ИдентификаторСтрокой = "123e4567-e89b-12d3-a456-426614174000";
ГуидОбъекта = Новый УникальныйИдентификатор(ИдентификаторСтрокой);
СсылкаНаКонтрагента = Справочники.Контрагенты.ПолучитьСсылку(ГуидОбъекта);
Важно: Метод ПолучитьСсылку() генерирует ссылку на элемент даже в том случае, если самого объекта в текущей базе еще не существует. Для проверки реального наличия записи в БД следует выполнять запрос к справочнику или проверять заполненность объекта через ЗначениеЗаполнено(СсылкаНаКонтрагента.ПолучитьОбъект()).
Если для получения сведений используется прямое подключение к базе 1С, выясним причину частых зависаний и проблем с модальными окнами при запуске сеанса.
При использовании объекта 1C83.Application при старте базы могут выполняться интерактивные обработчики обновления, проверки релиза, вызовы форм или модальные предупреждения. Поскольку клиентское приложение запускается в фоновом/скрытом режиме, появление модального окна блокирует выполнение кода, из-за чего процесс программного входа «зависает».
Для решения этой проблемы придерживаемся следующих правил:
COMConnector. Он не инициирует запуск графического интерфейса и отсекает вывод большинства пользовательских форм.Рассмотрим пример правильного разрывания COM-соединения и очистки ресурсов памяти:
// Создание COM-подключения
COMОбъект = Новый COMОбъект("v83.COMConnector");
Соединение = COMОбъект.Connect("Srvr=""ServerName"";Ref=""BaseName"";Usr=""User"";Pwd=""Password"";");
// Выполнение необходимых операций...
// Корректное завершение работы и очистка переменной
Соединение = Неопределено;
COMОбъект = Неопределено;
Чтобы проверить, завершился ли сеанс во внешней базе, перейдем в базу-источник и откроем список Активные пользователи. При присвоении переменной значения Неопределено сборщик мусора очищает ссылку и закрывает сеанс внешней базы.
Технология COM является платформозависимой (работает только в среде ОС Windows) и фирма «1С» относит её к устаревшим механизмам интеграции. При высокой нагрузке или при работе сервера 1С на базе Linux COM-соединения не обеспечат нужной стабильности.
Рассмотрим более современные и устойчивые подходы к интеграции систем:
e1cib/data/...) и передать её системной функции ЗапуститьПриложение(). Документ откроется в полноценном клиенте базы-источника.