Как исправить ошибку «Переменная не определена» при обращении к общему модулю в 1С?

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

При доработке типовых конфигураций, переносе кода между версиями или обновлении часто возникает синтаксическая ошибка вида «Переменная не определена» с указанием имени общего модуля. Проанализируем типичный пример ошибки при формировании печатной формы документа:


{Документ.НарядЗаказ.МодульМенеджера(534,28)}: Переменная не определена (ФормированиеПечатныхФорм)
        СведенияОКлиенте = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Шапка.Клиент, Шапка.Дата, ,);
{Документ.НарядЗаказ.МодульМенеджера(705,17)}: Переменная не определена (ФормированиеПечатныхФорм)
                                                + ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента);
{Документ.НарядЗаказ.МодульМенеджера(707,43)}: Переменная не определена (ФормированиеПечатныхФорм)
        ОбластьМакета.Параметры.СуммаПрописью = ФормированиеПечатныхФорм.СформироватьСуммуПрописью(Шапка.СуммаДокумента);

Выясним причину такого поведения платформы и разберем по шагам, как исправить эту проблему и избежать её в будущем.

Причина 1: Переименование или перенос общего модуля при обновлении

В процессе развития типовых конфигураций и внедрения Библиотеки стандартных подсистем (БСП) разработчики часто оптимизируют архитектуру: общие модули разделяются по контекстам исполнения или объединяются. Модуль ФормированиеПечатныхФорм мог быть разделен на ФормированиеПечатныхФормКлиент, ФормированиеПечатныхФормСервер, либо его функциональность перенесена в подсистему печати.

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

  1. Откроем глобальный поиск в конфигураторе (сочетание клавиш Ctrl + Shift + F).
  2. В поле поиска введем имя вызываемой функции с открывающей скобкой, например: СведенияОЮрФизЛице(.
  3. В области поиска укажем Модули и запустим сканирование конфигурации.
  4. Посмотрим, в каких модулях объявлены экспортные функции или как они вызываются в других типовых документах конфигурации.
  5. Заменим имя устаревшего модуля в коде на найденное актуальное имя.

В современных конфигурациях получение сведений об организациях и контрагентах также может выполняться через менеджеры соответствующих справочников или модули ОбщегоНазначенияБП, КонтрагентыСервер, СведенияОКонтрагентах.

Причина 2: Несоответствие контекста компиляции модуля

Модуль менеджера любого объекта метаданных всегда компилируется исключительно на стороне сервера. Если общий модуль физически существует в дереве метаданных, но платформа выдает ошибку о неопределенной переменной, проблема заключается в настройках доступности модуля.

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

  1. Найдем требуемый общий модуль в ветке Общие > Общие модули дерева конфигурации.
  2. Откроем палитру свойств модуля (клавиша F4).
  3. Проверим наличие флага Сервер. Если флаг снят, а установлены только Клиент (управляемое приложение) или Клиент (обычное приложение), то серверный контекст (включая модуль менеджера) данный модуль не видит.
  4. Установим флаг Сервер, если методы модуля должны выполняться на стороне сервера.
  5. Если формирование печатных форм выполняется в фоновых заданиях или внешних сервисах, убедимся в корректности флагов Внешнее соединение.

Причина 3: Использование стандартных функций платформы вместо общих модулей

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

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


// Вместо: ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента)
СтрокаСуммы = Формат(Шапка.СуммаДокумента, "ЧДЦ=2; ЧГ=3,0");

// Вместо: ФормированиеПечатныхФорм.СформироватьСуммуПрописью(Шапка.СуммаДокумента)
ПараметрыПрописи = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
ОбластьМакета.Параметры.СуммаПрописью = ЧислоПрописью(Шапка.СуммаДокумента, "Л = ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

Такой подход делает код печатной формы автономным и исключает возникновение ошибок при последующих обновлениях конфигурации.

Причина 4: Сбои кэша метаданных

Если общий модуль существует, все свойства и флаги контекста компиляции выставлены верно, но ошибка сохраняется, проанализируем состояние кэша конфигуратора. В редких случаях платформа может кэшировать старое дерево метаданных. В такой ситуации помогает перезапуск конфигуратора с очисткой временных файлов сеанса.

← На главную