При разработке расширений для платформы 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда в режиме тонкого клиента функционал работает безупречно, однако при запуске толстого клиента возникает ошибка вида «Переменная не определена», указывающая на имя общего модуля основной конфигурации. Разберем по шагам, почему возникает такое поведение платформы и как правильно адаптировать код расширения для корректной работы во всех клиентских режимах.
Проанализируем механику работы платформы при выполнении кода в различных клиентах. Главное различие кроется в компиляции таких модулей, как модуль менеджера, модуль объекта и модуль набора записей:
Сервер (без признаков Клиент или Вызов сервера), платформа без проблем находит модуль, так как обращение происходит в серверном контексте.Кроме того, имеет значение режим работы толстого клиента: «Управляемое приложение» или «Обычное приложение». Если модуль основной конфигурации скомпилирован с признаком Клиент (управляемое приложение), а запуск выполняется в обычном приложении без флага Клиент (обычное приложение), платформа также не предоставит доступ к данному общему модулю.
Рассмотрим самое надежное и быстрое решение, если вызов серверного модуля расположен в расширяемом модуле объекта или менеджера. Необходимо явно ограничить компиляцию этого блока инструкциями препроцессора, исключив его компиляцию в контексте толстого клиента управляемого приложения на стороне клиента.
Обернем вызовы процедур и функций в следующую конструкцию:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
// Вызов серверного общего модуля основной конфигурации
ИмяСерверногоМодуля.ИмяПроцедуры();
#КонецЕсли
Если логика должна гарантированно выполняться исключительно на сервере, применим более строгое условие компиляции:
#Если Сервер Тогда
ИмяСерверногоМодуля.ВыполнитьДействие();
#КонецЕсли
При таком подходе платформа просто пропустит эти строки при сборке клиентского контекста толстого клиента, что предотвратит возникновение ошибки.
Рассмотрим ситуацию, когда логику требуется вызывать из клиентского контекста форм или команд расширения, но заимствованный модуль основной конфигурации не имеет флага Вызов сервера. Поскольку в расширении невозможно изменить свойства заимствованного модуля основной конфигурации без снятия конфигурации с поддержки, создадим вспомогательный модуль-посредник.
Разберем по шагам алгоритм настройки:
МойПроксиМодульСервер.Сервер и Вызов сервера.
Процедура ВызватьМетодОсновнойКонфигурации(Параметр1) Экспорт
ИмяСерверногоМодуляКонфигурации.НужнаяПроцедура(Параметр1);
КонецПроцедуры
&НаКлиенте
Процедура КомандаОбработки(Команда)
МойПроксиМодульСервер.ВызватьМетодОсновнойКонфигурации(Истина);
КонецПроцедуры
Если ошибка возникает при обращении из модуля формы расширения, выясним контекст выполнения процедуры. Прямой вызов серверного общего модуля из метода с директивой &НаКлиенте в толстом клиенте завершится ошибкой, если у модуля нет флага клиентского вызова.
Организуем переход на сервер штатным механизмом формы:
&НаКлиенте
Процедура ДействиеНаКлиенте()
ВыполнитьДействиеНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьДействиеНаСервере()
// В данном контексте серверный общий модуль доступен всегда
ИмяСерверногоМодуля.ВыполнитьДействие();
КонецПроцедуры
Обратим внимание на настройки самого расширения в списке расширений конфигурации. Если расширение работает в режиме «Безопасный режим», платформа блокирует доступ к привилегированным общим модулям и ограничивает вызовы небезопасных операций, что может выглядеть как недоступность модуля. Отключим флаг Безопасный режим в свойствах расширения через меню «Управление расширениями», если расширению требуются полные права на взаимодействие с функционалом основной конфигурации.