Как исправить ошибку инициализации библиотеки модулей при обмене через внешнее соединение в 1С:Бухгалтерия?

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

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

Типовой текст ошибки в журнале регистрации или окне сообщений выглядит следующим образом:

{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(2487)}: Ошибка при вызове метода контекста (ПроизвестиЧтениеДанных): Произошла исключительная ситуация: Ошибка инициализации библиотеки модулей
{ОбщийМодуль.ОбменДаннымиВМоделиСервиса.Модуль(473,30)}: Переменная не определена (СообщенияРаспределенноеВыполнениеКомандИнтерфейс)

Причина ошибки и особенности компиляции при COM-соединении

Выясним причину такого поведения платформы. Когда внешняя программа подключается к базе данных 1С через механизм V83.COMConnector, платформа создает специфический контекст выполнения — Внешнее соединение. В этом режиме действуют строгие правила компиляции программных модулей:

  1. Платформа инициализирует и компилирует только те общие модули, у которых в свойствах выставлен флаг Внешнее соединение.
  2. Все имена общих модулей с точки зрения встроенного языка являются глобальными идентификаторами. Если один общий модуль обращается к процедурам или функциям другого модуля, зависимый модуль обязан быть доступен в текущем контексте.
  3. В конфигурации общий модуль ОбменДаннымиВМоделиСервиса имеет активное свойство Внешнее соединение. В строках своего кода он обращается к общему модулю СообщенияРаспределенноеВыполнениеКомандИнтерфейс, у которого флаг Внешнее соединение снят разработчиками типового решения.

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

Способ 1. Корректировка свойств общего модуля в конфигураторе

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

  1. Откроем информационную базу в режиме Конфигуратор.
  2. В дереве метаданных перейдем в ветку Общие → Общие модули.
  3. Найдем модуль СообщенияРаспределенноеВыполнениеКомандИнтерфейс.
  4. Откроем палитру свойств данного модуля (через контекстное меню или клавишу F4).
  5. В блоке свойств контекста установим флаг напротив пункта Внешнее соединение.
  6. Обновим конфигурацию базы данных (клавиша F7).

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

Способ 2. Экранирование вызова инструкциями препроцессора

Проанализируем альтернативный вариант исправления на уровне программного кода. Если не требуется включать доступность всего модуля во внешнем соединении, можно локализовать место вызова в общем модуле ОбменДаннымиВМоделиСервиса.

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


#Если Не ВнешнееСоединение Тогда
    // Вызов функционала распределенного выполнения команд сервиса
    СообщенияРаспределенноеВыполнениеКомандИнтерфейс.ОбработатьКоманду();
#КонецЕсли

Такой подход гарантирует, что при обращении через COM-коннектор платформа пропустит данный участок кода и успешно завершит процедуру инициализации модулей.

Способ 3. Временный переход на обмен через файлы или сетевой каталог

Рассмотрим ситуацию, когда конфигурация находится на полной поддержке поставщика, а вносить изменения в структуру базы запрещено правилами сопровождения. В таком случае рекомендуется временно изменить транспорт передачи данных:

  1. Откроем параметры синхронизации данных в обеих информационных базах.
  2. Переключим транспорт сообщений с прямого подключения через внешнее соединение на обмен через общий сетевой каталог или FTP.
  3. Выгрузка из исходной базы будет формировать XML-файл в указанную папку, а база-приемник выполнит загрузку стандартным серверным кодом без создания COM-сессии.
  4. После выхода официального обновления с исправлением ошибки настройки прямого подключения можно вернуть обратно.

Способ 4. Изменение направления инициализации сессии

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

  1. Если ошибка возникает в базе Бухгалтерии предприятия при подключении со стороны программы Управление торговлей, запустим обмен из интерфейса самой Бухгалтерии.
  2. В этом случае Бухгалтерия предприятия будет выступать клиентом, а исполнение кода в ней пойдет в контексте Сервер или управляемого клиента, где все модули успешно скомпилированы.
  3. COM-соединение откроется на стороне Управления торговлей, где подобная ошибка отсутствует, и обмен завершится корректно.

Способ 5. Переход на прямое подключение через Web-сервисы

Современные версии Библиотеки стандартных подсистем поддерживают работу обменов не только через COM, но и через подключение к Web-сервисам информационной базы. Разберем преимущества этого пути:

  1. База публикуется на веб-сервере (IIS или Apache).
  2. В настройках подключения вместо каталога или COM-параметров указывается адрес опубликованной базы и учетные данные.
  3. При вызове процедур обмена весь код выполняется строго в контексте Сервер, поэтому свойства общих модулей для внешнего соединения не влияют на успешность выполнения операций.

Устранение сопутствующей ошибки отображения контактной информации

В некоторых случаях после обновления на данный релиз пользователи также могут встретить ошибку: Поле объекта не обнаружено (ГруппаКонтактнаяИнформацияПолеЮрАдресКонтрагента) при попытке открыть карточку контрагента. Разберем по шагам, как быстро устранить данное проявление без доработки конфигурации:

  1. Перейдем в раздел Администрирование → Общие настройки → Виды контактной информации.
  2. Раскроем группу Контактная информация справочника "Контрагенты".
  3. Проверим наличие пустых или некорректно расположенных элементов (например, когда первой строкой идет пустая запись или адрес электронной почты вместо юридического адреса).
  4. С помощью стрелок изменения порядка переместим стандартный элемент Юридический адрес на первую позицию либо сдвинем пустой элемент в самый конец списка.
  5. После изменения очередности сохраним настройки. Форма элемента справочника Контрагенты начнет открываться в стандартном режиме.
← На главную