В процессе разработки программного обеспечения на платформе 1С:Предприятие часто возникает ситуация, когда в модуле формы прописан вызов метода общего модуля, однако при запуске синтаксического контроля платформы ошибки не возникают. При этом во время выполнения кода вызов несуществующей или недоступной процедуры приводит к экстренному завершению работы или ошибке компиляции. Проанализируем, почему стандартная локальная проверка кода не видит отсутствующие экспортные процедуры, и разберем эффективные способы проверки межмодульных связей как на этапе конфигурирования, так и в режиме «1С:Предприятие».
Когда мы запускаем синтаксический контроль для отдельного модуля формы (например, сочетанием клавиш Ctrl + F7), платформа 1С выполняет только локальную проверку синтаксиса встроенного языка внутри данного конкретного текста. Выясним основные причины такого поведения:
Метаданные.ОбщиеМодули во время выполнения, так как объекты метаданных хранят лишь общие свойства модуля (имя, флаги контекста компиляции), но не структуру внутреннего текста.Для того чтобы отловить ошибки обращения к несуществующим методам общих модулей на стадии разработки, необходимо запустить полную синтаксическую проверку всей базы. Разберем по шагам, как это сделать:
В режиме расширенной проверки платформа производит глубокий статический анализ связей между модулями и выводит служебные сообщения о вызовах методов, которые отсутствуют в указанных общих модулях.
Если нам необходимо программно проверить доступность метода в режиме «1С:Предприятие», прямое написание вызова вида ИмяОбщегоМодуля.ИмяПроцедуры() в блоке Попытка ... Исключение не поможет при компиляции модуля, так как платформа выдаст ошибку еще на стадии загрузки кода. Посмотрим, как обойти это ограничение с помощью динамического выполнения кода через функцию Выполнить().
Рассмотрим пример кода для клиентского или серверного модуля:
ИмяМодуля = "ОбщегоНазначенияКлиент";
ИмяМетода = "ОбновитьИнтерфейс";
// Проверяем существование самого общего модуля в метаданных
Если Метаданные.ОбщиеМодули.Найти(ИмяМодуля) <> Неопределено Тогда
// Формируем безопасный динамический код
ТекстТрансляции =
"Попытка
| " + ИмяМодуля + "." + ИмяМетода + "();
|Исключение
| ВызватьИсключение;
|КонецПопытки;";
Попытка
Выполнить(ТекстТрансляции);
Сообщить("Процедура успешно выполнена.");
Исключение
Сообщить("Метод " + ИмяМетода + " не найден или при его выполнении произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
В данном примере мы сначала проверяем наличие самого объекта метаданных через Метаданные.ОбщиеМодули.Найти(), а затем динамически вызываем нужный метод в изолированном блоке Попытка ... Исключение.
В современной разработке на 1С для предотвращения подобного рода ошибок используются внешние инструменты:
Проанализируем ситуации, когда процедура физически присутствуют в тексте общего модуля, но при вызове из модуля формы платформа выдает ошибку о том, что метод не найден:
Экспорт: В заголовке процедуры общего модуля забудут указать ключевое слово (например, написано Процедура МояПроцедура() вместо Процедура МояПроцедура() Экспорт).
#Если Сервер Тогда
Процедура ВыполнитьРасчет() Экспорт
// Серверный код
КонецПроцедуры
#КонецЕсли
ВыполнитьРасчет() в контексте тонкого клиента напрямую, платформа сообщат об отсутствии данной процедуры.Таким образом, для гарантированного выявления несуществующих или недоступных процедур общих модулей рекомендуется регулярно выполнять расширенную проверку конфигурации в Конфигураторе или переходить на использование среды 1C:EDT.