При разработке специализированных инструментов анализа кода, обработок аудита конфигурации или систем контроля качества нередко возникает задача программного чтения исходного кода модулей. Рассмотрим, почему нельзя получить текст модулей напрямую через объектную модель метаданных в режиме «1С:Предприятие», и разберем практические способы решения этой задачи.
Выясним причину, по которой стандартное обращение к коллекции метаданных не возвращает текст программного модуля. Если мы обратимся к объекту через Метаданные.ОбщиеМодули.ИмяМодуля, то получим доступ исключительно к описательным свойствам объекта конфигурации:
Клиент (управляемое приложение), Сервер, Внешнее соединение, Вызов сервера, Привилегированный.Сам исполняемый исходный код в пользовательском режиме «1С:Предприятие» недоступен, поскольку конфигурация выполняется в скомпилированном виде. Кроме того, если конфигурация находится на поддержке без возможности редактирования или модуль защищен паролем, исходный код отсутствует в открытом доступе на уровне метаданных.
Разберем по шагам наиболее надежный и штатный способ программного получения текстов общих модулей. Он заключается в запуске Конфигуратора в пакетном режиме для пакетной выгрузки конфигурации в файлы с последующим чтением полученных файлов исходного кода.
В выгруженной иерархии каждый общий модуль сохраняется в виде отдельного файла с расширением .bsl по пути CommonModules/ИмяМодуля/Ext/Module.bsl. Проанализируем пример кода внешней обработки, выполняющей пакетную выгрузку и чтение текста:
КаталогВыгрузки = "C:\Temp\ConfigDump\";
СтрокаПодключения = СтрокаСоединенияИнформационнойБазы();
// Формируем параметры пакетного запуска Конфигуратора
ПараметрыЗапуска = "DESIGNER /IBConnectionString """ + СтрокаПодключения + """ /DumpConfigToFiles """ + КаталогВыгрузки + """";
// Выполняем запуск приложения и дожидаемся завершения выгрузки
ЗапуститьПриложение(ПараметрыЗапуска, , Истина);
// Читаем текст конкретного общего модуля
ПутьКФайлуМодуля = КаталогВыгрузки + "CommonModules\ОбщегоНазначенияКлиентСервер\Ext\Module.bsl";
Файл = Новый Файл(ПутьКФайлуМодуля);
Если Файл.Существует() Тогда
Чтение = Новый ЧтениеТекста(ПутьКФайлуМодуля, КодировкаТекста.UTF8);
ТекстМодуля = Чтение.Прочитать();
Чтение.Закрыть();
Сообщить("Длина полученного текста модуля: " + СтрДлина(ТекстМодуля));
КонецЕсли;
Посмотрим на параметры, которые использованы в данном сценарии:
/DumpIBConfigToFiles).Истина в методе ЗапуститьПриложение() гарантирует, что выполнение кода продолжится только после полной записи всех файлов на диск.ЧтениеТекста с кодировкой КодировкаТекста.UTF8 считывает исходный текст модуля без искажения символов.Рассмотрим альтернативный сценарий, актуальный для современных процессов разработки. Если на проекте настроена выгрузка исходников конфигурации в репозиторий Git или используется среда разработки 1C:Enterprise Development Tools (1C:EDT), исходные тексты модулей уже хранятся в файловой системе.
В этом случае отпадает необходимость каждый раз вызывать запуск Конфигуратора. Достаточно программно обратиться к рабочей копии репозитория и выполнить чтение нужного файла модуля с помощью объекта ТекстовыйДокумент или ЧтениеТекста:
ТекстДок = Новый ТекстовыйДокумент;
ПутьКМодулю = "C:\GitRepo\src\cf\CommonModules\МойОбщийМодуль\Ext\Module.bsl";
Попытка
ТекстДок.Прочитать(ПутьКМодулю, КодировкаТекста.UTF8);
ВсегоСтрок = ТекстДок.КоличествоСтрок();
Сообщить("Модуль успешно прочитан. Количество строк: " + ВсегоСтрок);
Исключение
Сообщить("Ошибка при чтении файла модуля: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем низкоуровневый вариант, применяемый при разработке сложных утилит администрирования. Конфигурация хранится в системной таблице базы данных CONFIG (или CONFIGSAVE для несохраненной конфигурации) в виде сжатых двоичных блоков.
Данный подход требует прямого обращения к СУБД или к файлу базы данных .1CD с последующей распаковкой потоков данных по алгоритму Deflate/zlib. Однако для решения большинства прикладных задач автоматизации рекомендуется использовать пакетную выгрузку через Конфигуратор, так как это штатный и безопасный механизм платформы.