При выполнении обмена данными между конфигурациями (например, при выгрузке из Управления торговлей, Зарплаты и управления персоналом в Бухгалтерию предприятия) через прямое внешнее подключение пользователи и разработчики могут столкнуться с аварийной остановкой процесса. Разберем детально, почему возникает исключительная ситуация, как устроена работа контекстов платформы 1С и какими способами можно восстановить работоспособность обмена данными.
Типовой текст ошибки в журнале регистрации или окне сообщений выглядит следующим образом:
{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(2487)}: Ошибка при вызове метода контекста (ПроизвестиЧтениеДанных): Произошла исключительная ситуация: Ошибка инициализации библиотеки модулей
{ОбщийМодуль.ОбменДаннымиВМоделиСервиса.Модуль(473,30)}: Переменная не определена (СообщенияРаспределенноеВыполнениеКомандИнтерфейс)
Выясним причину такого поведения платформы. Когда внешняя программа подключается к базе данных 1С через механизм V83.COMConnector, платформа создает специфический контекст выполнения — Внешнее соединение. В этом режиме действуют строгие правила компиляции программных модулей:
ОбменДаннымиВМоделиСервиса имеет активное свойство Внешнее соединение. В строках своего кода он обращается к общему модулю СообщенияРаспределенноеВыполнениеКомандИнтерфейс, у которого флаг Внешнее соединение снят разработчиками типового решения.В итоге при первой попытке установить COM-соединение с информационной базой платформа начинает компиляцию окружения, наталкивается на неизвестный в данном контексте идентификатор и выбрасывает исключение Переменная не определена еще до фактического запуска процедур выгрузки или загрузки данных. Примечательно, что данный код отвечает за функционал сервиса 1cfresh и для локальных баз не имеет практического значения, но блокирует компиляцию всей библиотеки модулей.
Если информационная база уже снята с полной поддержки или есть возможность включить возможность редактирования конфигурации («Редактируется с сохранением поддержки»), рассмотрим самый быстрый вариант прямого исправления:
СообщенияРаспределенноеВыполнениеКомандИнтерфейс.F4).F7).Поскольку исходный текст самого модуля не меняется, при установке последующих официальных релизов конфигурации объединение метаданных пройдет в штатном режиме без конфликтов.
Проанализируем альтернативный вариант исправления на уровне программного кода. Если не требуется включать доступность всего модуля во внешнем соединении, можно локализовать место вызова в общем модуле ОбменДаннымиВМоделиСервиса.
Для этого проблемный блок вызова обрамляется условием препроцессора, исключающим компиляцию фрагмента в контексте внешнего соединения:
#Если Не ВнешнееСоединение Тогда
// Вызов функционала распределенного выполнения команд сервиса
СообщенияРаспределенноеВыполнениеКомандИнтерфейс.ОбработатьКоманду();
#КонецЕсли
Такой подход гарантирует, что при обращении через COM-коннектор платформа пропустит данный участок кода и успешно завершит процедуру инициализации модулей.
Рассмотрим ситуацию, когда конфигурация находится на полной поддержке поставщика, а вносить изменения в структуру базы запрещено правилами сопровождения. В таком случае рекомендуется временно изменить транспорт передачи данных:
Проанализируем логику взаимодействия баз при прямом подключении. Сбой происходит на стороне той базы данных, к которой подключаются по протоколу COM. Если архитектура настроек позволяет поменять инициатора сеанса, синхронизацию можно выполнить без ошибок:
Сервер или управляемого клиента, где все модули успешно скомпилированы.Современные версии Библиотеки стандартных подсистем поддерживают работу обменов не только через COM, но и через подключение к Web-сервисам информационной базы. Разберем преимущества этого пути:
В некоторых случаях после обновления на данный релиз пользователи также могут встретить ошибку: Поле объекта не обнаружено (ГруппаКонтактнаяИнформацияПолеЮрАдресКонтрагента) при попытке открыть карточку контрагента. Разберем по шагам, как быстро устранить данное проявление без доработки конфигурации: