При выполнении обмена данными между информационными базами через прямое COM-соединение разработчики нередко сталкиваются с критической ошибкой: «Ошибка при вызове метода контекста (ВыполнитьВыгрузку): Произошла исключительная ситуация: Ошибка инициализации модуля... Переменная не определена (РежимДиалогаВопрос)». При этом при попытке открыть указанный модуль в конфигураторе разработчик часто видит пустую строку или код, в котором отсутствует упомянутая переменная.
Разберем детально, почему возникает данная ситуация, в какой именно базе искать источник проблемы и как правильно адаптировать программный код для работы во внешнем соединении.
Проанализируем ключевые факторы, приводящие к сбою инициализации модулей:
ВнешнееСоединение). В этом окружении полностью отсутствуют интерфейсные функции платформы и системные перечисления для диалогов, такие как РежимДиалогаВопрос, КнопкиДиалогаВопрос, КодВозвратаДиалога, а также методы Вопрос() и Предупреждение().Самый быстрый и надежный способ локализовать недопустимый код во всех модулях объекта — запустить встроенную проверку конфигуратора в целевой базе (базе-приемнике):
Посмотрим, как правильно изолировать интерфейсный код в модулях объектов и общих модулях. Нельзя просто объявить клиентский вызов внутри общего тела модуля — его необходимо защитить инструкциями препроцессора.
Рассмотрим пример ошибочного кода:
// ОШИБКА: значение по умолчанию вычисляется при инициализации модуля в любом контексте
Процедура ЗадатьВопросПользователю(ТекстВопроса, Режим = РежимДиалогаВопрос.ДаНет)
#Если Клиент Тогда
Ответ = Вопрос(ТекстВопроса, Режим);
#КонецЕсли
КонецПроцедуры
Перепишем данный участок кода корректно. Исключим клиентские системные типы из параметров и полностью изолируем вызов:
// ПРАВИЛЬНО: значение по умолчанию задается внутри клиентского блока
Процедура ЗадатьВопросПользователю(ТекстВопроса, Режим = Неопределено)
#Если Клиент И НЕ ВнешнееСоединение Тогда
Если Режим = Неопределено Тогда
Режим = РежимДиалогаВопрос.ДаНет;
КонецЕсли;
Ответ = Вопрос(ТекстВопроса, Режим);
#КонецЕсли
КонецПроцедуры
Если место сбоя не удается определить визуально, воспользуемся отладчиком:
bin\conf установленной платформы создадим или отредактируем конфигурационный файл comcntrcfg.xml:
<config xmlns="http://v8.1c.ru/v8/comcntrcfg">
<debugconfig enable="true" url="tcp://localhost" protocol="tcp"/>
</config>
Если номера строк в тексте ошибки по-прежнему не совпадают с текстом модуля, выполним сброс кэшированных метаданных:
1C:Enterprise 8.3 Server Agent).%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).