Почему после перевода базы 1С на SQL возникает ошибка «Переменная не определена» для общего модуля?

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

При переводе информационной базы 1С:Предприятия (в частности, конфигураций на обычных формах, таких как «Управление торговлей 10.3») из файлового режима работы в клиент-серверный (SQL) разработчики часто сталкиваются с ошибками синтаксического контроля или времени выполнения. Одной из наиболее типичных ситуаций является ошибка вида Переменная не определена (<ИмяОбщегоМодуля>) при вызове процедур и функций из модулей объектов документов или справочников.

Разберем детально, почему код, который безупречно выполнялся в файловой базе, перестает работать на сервере 1С:Предприятия, и как правильно настроить свойства общего модуля для устранения проблемы.

Анализ проблемы и поведение платформы

Рассмотрим пример ситуации. В конфигурации присутствует общий модуль Доработки, в котором объявлена экспортная процедура:


Процедура ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения, СтруктураШапкиДокумента, Дата, Ссылка, Подразделение, Отказ) Экспорт
    // Реализация логики
КонецПроцедуры

Из модуля объекта документа (например, Документ.ОтчетОРозничныхПродажах.МодульОбъекта) выполняется вызов:


Доработки.ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения, СтруктураШапкиДокумента, Дата, Ссылка, Подразделение, Отказ);

В файловом режиме данный код отрабатывает без нареканий, но после переноса базы данных на SQL-сервер при попытке проведения документа возникает исключение:


{Документ.ОтчетОРозничныхПродажах.МодульОбъекта(1520,3)}: Переменная не определена (Доработки)
<<?>>Доработки.ВыполнитьОприходованиеПартийПоВозвратамПрошлыхДней(Движения,СтруктураШапкиДокумента,Дата,Ссылка,Подразделение,Отказ);

Выясним причину ошибки

Проанализируем разницу в архитектуре выполнения кода между файловым и клиент-серверным режимами:

  1. Файловый режим работы: Весь исполняемый код выполняется в рамках одного процесса толстого клиента на рабочей станции пользователя. В этом режиме контексты клиента и сервера частично совмещены, поэтому модули объектов имеют доступ к общим модулям, у которых включен только флаг Клиент (обычное приложение).
  2. Клиент-серверный режим (SQL): Происходит четкое разделение контекстов. Код модуля объекта (включая события ОбработкаПроведения, ПередЗаписью, ПриЗаписи) всегда компилируется и выполняется исключительно на стороне сервера 1С:Предприятия. Если у общего модуля не установлен флаг Сервер, платформа 1С просто не компилирует данный модуль в серверном контексте. В результате сервер воспринимает обращение по имени модуля как обращение к неопределенной локальной переменной.

Пошаговое решение проблемы

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

  1. Откроем дерево метаданных конфигурации в режиме Конфигуратор.
  2. В ветке Общие -> Общие модули найдем модуль Доработки.
  3. Нажмем правой кнопкой мыши по модулю и откроем окно Свойства (или нажмем клавишу Alt + Enter).
  4. В разделе свойств Исполнение установим флаг Сервер.
  5. Если процедуры модуля должны вызываться как из модулей объектов (на сервере), так и из модулей форм обычного приложения (на клиенте), оставим включенным также флаг Клиент (обычное приложение).
  6. Сохраним и применим изменения в конфигурации базы данных (клавиша F7).

Тонкости настройки и флаг «Вызов сервера»

Рассмотрим подробнее распространенное заблуждение относительно флага Вызов сервера. Данный флаг необходим только тогда, когда модуль скомпилирован на сервере, но к его экспортным методам требуется обращаться напрямую из клиентского контекста (например, из тонкого клиента или клиентской процедуры модуля формы). При вызове «Сервер -> Сервер» (из модуля объекта в серверный общий модуль) флаг Вызов сервера не требуется.

Если у модуля одновременно включены свойства Сервер и Клиент (обычное приложение), платформа скомпилирует две независимые копии модуля. Обратите внимание на важные особенности такого режима:

  1. Интерактивные методы: В процедурах, выполняющихся на сервере, категорически запрещены вызовы диалоговых функций, таких как Предупреждение(), Вопрос() или ОткрытьФорму(). При выполнении на сервере они вызовут исключение.
  2. Директивы препроцессора: Если в модуле содержится смешанный код, разделяйте его инструкциями препроцессора:

#Если Клиент Тогда
    // Код, выполняемый только на клиенте
#КонецЕсли

#Если Сервер Тогда
    // Код, выполняемый только на сервере
#КонецЕсли

Диагностика с помощью проверки конфигурации

Чтобы заранее выявить все подобные несоответствия до начала активной работы пользователей на SQL-сервере, выполним встроенную проверку конфигурации:

  1. В главном меню Конфигуратора перейдем в раздел Конфигурация -> Проверка конфигурации.
  2. В открывшемся окне установим флаги:
    • Режим конфигурации: Сервер;
    • Режим конфигурации: Внешнее соединение;
    • Режим конфигурации: Клиент (обычное приложение);
    • Поиск некорректных ссылок.
  3. Нажмем кнопку Выполнить.

Инструмент выполнит синтаксический анализ для всех контекстов и покажет список мест, где серверный код пытается обратиться к не скомпилированным на сервере модулям или методам.

← На главную