При доработке типовых конфигураций, переносе кода между версиями или обновлении часто возникает синтаксическая ошибка вида «Переменная не определена» с указанием имени общего модуля. Проанализируем типичный пример ошибки при формировании печатной формы документа:
{Документ.НарядЗаказ.МодульМенеджера(534,28)}: Переменная не определена (ФормированиеПечатныхФорм)
СведенияОКлиенте = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Шапка.Клиент, Шапка.Дата, ,);
{Документ.НарядЗаказ.МодульМенеджера(705,17)}: Переменная не определена (ФормированиеПечатныхФорм)
+ ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента);
{Документ.НарядЗаказ.МодульМенеджера(707,43)}: Переменная не определена (ФормированиеПечатныхФорм)
ОбластьМакета.Параметры.СуммаПрописью = ФормированиеПечатныхФорм.СформироватьСуммуПрописью(Шапка.СуммаДокумента);
Выясним причину такого поведения платформы и разберем по шагам, как исправить эту проблему и избежать её в будущем.
В процессе развития типовых конфигураций и внедрения Библиотеки стандартных подсистем (БСП) разработчики часто оптимизируют архитектуру: общие модули разделяются по контекстам исполнения или объединяются. Модуль ФормированиеПечатныхФорм мог быть разделен на ФормированиеПечатныхФормКлиент, ФормированиеПечатныхФормСервер, либо его функциональность перенесена в подсистему печати.
Чтобы быстро найти, куда переместились требуемые функции, выполним следующие действия:
СведенияОЮрФизЛице(.В современных конфигурациях получение сведений об организациях и контрагентах также может выполняться через менеджеры соответствующих справочников или модули ОбщегоНазначенияБП, КонтрагентыСервер, СведенияОКонтрагентах.
Модуль менеджера любого объекта метаданных всегда компилируется исключительно на стороне сервера. Если общий модуль физически существует в дереве метаданных, но платформа выдает ошибку о неопределенной переменной, проблема заключается в настройках доступности модуля.
Разберем по шагам проверку свойств общего модуля:
Для базовых операций, таких как вывод суммы прописью и форматирование чисел, не обязательно зависеть от специфических общих модулей конфигурации. Платформа 1С:Предприятие содержит встроенные инструменты, доступные в любом контексте выполнения.
Посмотрим на пример замены вызовов сторонних модулей на платформенные функции:
// Вместо: ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента)
СтрокаСуммы = Формат(Шапка.СуммаДокумента, "ЧДЦ=2; ЧГ=3,0");
// Вместо: ФормированиеПечатныхФорм.СформироватьСуммуПрописью(Шапка.СуммаДокумента)
ПараметрыПрописи = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
ОбластьМакета.Параметры.СуммаПрописью = ЧислоПрописью(Шапка.СуммаДокумента, "Л = ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Такой подход делает код печатной формы автономным и исключает возникновение ошибок при последующих обновлениях конфигурации.
Если общий модуль существует, все свойства и флаги контекста компиляции выставлены верно, но ошибка сохраняется, проанализируем состояние кэша конфигуратора. В редких случаях платформа может кэшировать старое дерево метаданных. В такой ситуации помогает перезапуск конфигуратора с очисткой временных файлов сеанса.