При переводе информационной базы 1С:Предприятия (в частности, конфигураций на обычных формах, таких как «Управление торговлей 10.3») из файлового режима работы в клиент-серверный (SQL) разработчики часто сталкиваются с ошибками синтаксического контроля или времени выполнения. Одной из наиболее типичных ситуаций является ошибка вида Переменная не определена (<ИмяОбщегоМодуля>) при вызове процедур и функций из модулей объектов документов или справочников.
Разберем детально, почему код, который безупречно выполнялся в файловой базе, перестает работать на сервере 1С:Предприятия, и как правильно настроить свойства общего модуля для устранения проблемы.
Рассмотрим пример ситуации. В конфигурации присутствует общий модуль Доработки, в котором объявлена экспортная процедура:
Процедура ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения, СтруктураШапкиДокумента, Дата, Ссылка, Подразделение, Отказ) Экспорт
// Реализация логики
КонецПроцедуры
Из модуля объекта документа (например, Документ.ОтчетОРозничныхПродажах.МодульОбъекта) выполняется вызов:
Доработки.ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения, СтруктураШапкиДокумента, Дата, Ссылка, Подразделение, Отказ);
В файловом режиме данный код отрабатывает без нареканий, но после переноса базы данных на SQL-сервер при попытке проведения документа возникает исключение:
{Документ.ОтчетОРозничныхПродажах.МодульОбъекта(1520,3)}: Переменная не определена (Доработки)
<<?>>Доработки.ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения,СтруктураШапкиДокумента,Дата,Ссылка,Подразделение,Отказ);
Проанализируем разницу в архитектуре выполнения кода между файловым и клиент-серверным режимами:
ОбработкаПроведения, ПередЗаписью, ПриЗаписи) всегда компилируется и выполняется исключительно на стороне сервера 1С:Предприятия. Если у общего модуля не установлен флаг Сервер, платформа 1С просто не компилирует данный модуль в серверном контексте. В результате сервер воспринимает обращение по имени модуля как обращение к неопределенной локальной переменной.Для восстановления работоспособности вызовов разберем по шагам порядок настройки свойств общего модуля:
Доработки.Alt + Enter).F7).Рассмотрим подробнее распространенное заблуждение относительно флага Вызов сервера. Данный флаг необходим только тогда, когда модуль скомпилирован на сервере, но к его экспортным методам требуется обращаться напрямую из клиентского контекста (например, из тонкого клиента или клиентской процедуры модуля формы). При вызове «Сервер -> Сервер» (из модуля объекта в серверный общий модуль) флаг Вызов сервера не требуется.
Если у модуля одновременно включены свойства Сервер и Клиент (обычное приложение), платформа скомпилирует две независимые копии модуля. Обратите внимание на важные особенности такого режима:
Предупреждение(), Вопрос() или ОткрытьФорму(). При выполнении на сервере они вызовут исключение.
#Если Клиент Тогда
// Код, выполняемый только на клиенте
#КонецЕсли
#Если Сервер Тогда
// Код, выполняемый только на сервере
#КонецЕсли
Чтобы заранее выявить все подобные несоответствия до начала активной работы пользователей на SQL-сервере, выполним встроенную проверку конфигурации:
Инструмент выполнит синтаксический анализ для всех контекстов и покажет список мест, где серверный код пытается обратиться к не скомпилированным на сервере модулям или методам.