При разработке и сопровождении сложных конфигураций 1С программисты часто сталкиваются с необходимостью аудита расширений. Одной из специфических задач является проверка: затронуты ли расширением такие важные части системы, как модуль сеанса, модуль управляемого приложения или модуль обычного приложения. Это критично для своевременного переноса "хотфиксов" в основную конфигурацию или для контроля целостности бизнес-логики.
Однако стандартный подход через обращение к глобальной коллекции Метаданные здесь не работает привычным образом. Давайте разберем по шагам, почему возникает эта сложность и какими методами мы можем определить факт наличия изменений в этих модулях.
Проанализируем сначала причину проблемы. Когда мы пытаемся обратиться к свойству Метаданные.МодульСеанса, платформа возвращает Неопределено. Согласно справке 1С, это нормальное поведение. Дело в том, что в объектной модели метаданных эти модули не являются самостоятельными объектами (как Справочники или Документы), а являются свойствами корневого объекта конфигурации.
Поскольку во встроенном языке не предусмотрена работа со значениями этих свойств напрямую как с объектами, мы не можем получить их текст или программно сравнить версии "на лету" простым обращением. Однако платформа предоставляет другие инструменты для анализа структуры метаданных.
Начиная с версии платформы 8.3.9, для всех объектов метаданных реализован метод ЕстьИзмененияРасширениямиКонфигурации(). Этот метод позволяет определить, что объект конфигурации был расширен в текущем сеансе. Разберем, как применить его к нашей задаче.
Важно понимать: так как модуль сеанса или модуль внешнего соединения — это свойства всей конфигурации, проверять нужно именно корень метаданных. Рассмотрим пример кода:
// Проверка наличия изменений во всей конфигурации
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
Сообщить("В текущем сеансе задействованы расширения, затрагивающие корневые свойства конфигурации.");
КонецЕсли;
Нюанс использования: Метод вернет Истина, если в расширении изменен любой элемент, относящийся к конфигурации в целом (например, изменен заголовок системы, состав префиксов или любой из корневых модулей). Точечно определить, что изменен именно модуль сеанса, этим методом невозможно, но он отлично подходит для первичного фильтра.
Для более детального анализа нам потребуется обратиться к менеджеру расширений. Проанализируем ситуацию: если нам нужно оповещать программистов о наличии кода в расширениях, мы можем перебрать все активные расширения и проверить их содержимое.
Разберем пример обхода расширений:
МассивРасширений = РасширенияКонфигурации.Получить();
Для Каждого ТекущееРасширение Из МассивРасширений Цикл
// Проверяем, активно ли расширение в данный момент
Если ТекущееРасширение.Активно Тогда
// Анализируем метаданные расширения
ОбъектМетаданныхРасширения = ТекущееРасширение.Метаданные;
// Внимание: прямое обращение к свойству модуля здесь также
// вернет Неопределено, но сам факт наличия расширения
// дает нам повод для более глубокого аудита.
Сообщить("Проверка расширения: " + ТекущееРасширение.Имя);
КонецЕсли;
КонецЦикла;
В современных версиях платформы появился более мощный инструмент — метод ПолучитьОбъектыИзмененныеРасширениямиКонфигурации(). Он возвращает массив объектов метаданных, которые были модифицированы. Посмотрим на пример его использования для целей аудита:
ИзмененныеОбъекты = ПолучитьОбъектыИзмененныеРасширениямиКонфигурации();
Для Каждого ОбъектМетаданных Из ИзмененныеОбъекты Цикл
Если ОбъектМетаданных = Метаданные Тогда
Сообщить("Внимание! Расширены корневые свойства конфигурации (модули приложения, сеанса и т.д.)");
КонецЕсли;
КонецЦикла;
Этот способ является наиболее предпочтительным, так как он позволяет быстро отсеять "тихие" расширения, которые добавляют новые объекты, от тех, что вмешиваются в работу стандартных модулей.
Если ваша задача — контролировать перенос исправлений из расширений в основную конфигурацию, одних только программных методов внутри 1С может быть недостаточно. Выясним, какие дополнительные шаги помогут автоматизировать этот процесс:
&После("ПриНачалеСеанса") добавьте запись в лог или параметр сеанса, указывающий на версию расширения./DumpCustomExtensionToFiles в каталоге появятся файлы типа Ext/SessionModule.bsl. Если такой файл существует и не пуст — модуль расширен.Таким образом, хотя прямого способа получить текст Метаданные.МодульСеанса не существует, сочетание метода ЕстьИзмененияРасширениямиКонфигурации() и анализа коллекции активных расширений позволяет эффективно решать задачи контроля и уведомления о внесенных изменениях.