Разработка и Конфигурация · 10 мин
Как программно получить текст модуля в 1С
Как программно получить текст модуля в 1С: выгрузка конфигурации в файлы, хранилище, чтение модулей из файлов выгрузки. Примеры кода, ограничения и ошибки.
Задача получить текст модуля программно возникает при аудите кода, поиске по конфигурации, построении внешних анализаторов и автоматизации выгрузки доработок. Важно сразу понять ключевое ограничение: встроенный язык 1С не предоставляет штатного метода вида «ПолучитьТекстМодуля()» — объект метаданных доступен через объект Метаданные, но его программный текст из режима Предприятия прочитать нельзя.
Поэтому все рабочие способы сводятся к обходным вариантам: выгрузке конфигурации в файлы через конфигуратор, получению версии модуля из хранилища конфигурации, чтению уже выгруженных файлов модулей средствами встроенного языка или использованию внешних инструментов вроде EDT. Ниже разобраны практические сценарии с кодом и ограничениями каждого подхода.
Почему текст модуля нельзя прочитать напрямую из кода
Объектная модель метаданных в 1С позволяет обойти состав конфигурации: перебрать справочники, документы, общие модули, их реквизиты и свойства. Но программный код модулей в эту модель не входит — он хранится внутри базы в скомпилированном и исходном виде, и доступа к исходнику из встроенного языка нет. Это осознанное ограничение платформы, связанное в том числе с защитой поставляемых конфигураций.
Дополнительный нюанс — модули поставки. Если конфигурация поставляется без исходных текстов (модуль закрыт поставщиком), текст физически отсутствует в базе, и никакой программный способ его не восстановит. Перед построением инструмента анализа стоит проверить, какие модули вообще доступны в исходном виде.
Способ 1. Выгрузка конфигурации в файлы через пакетный режим
Самый универсальный путь — выгрузить конфигурацию в файлы, а затем читать модули как обычные текстовые файлы. Конфигуратор запускается в пакетном режиме с параметром DumpConfigToFiles:
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F"D:\Bases\MyBase" /N"Администратор" /P"пароль" /DumpConfigToFiles "D:\Dump\Config" -format HierarchicalПосле выгрузки структура каталогов повторяет состав метаданных: общие модули лежат в CommonModules, модули объектов — рядом с описанием соответствующих объектов. Файлы модулей имеют расширение .bsl и кодировку UTF-8 с BOM. Дальше текст читается стандартным ЧтениеТекста из любой обработки.
Выгрузку можно ограничить конкретными объектами параметром -listFile с файлом списка метаданных — это ускоряет работу на больших конфигурациях, когда нужен, например, только один общий модуль. Полная выгрузка типовой конфигурации может занимать десятки минут, частичная — секунды.
Способ 2. Чтение текста модуля из файлов выгрузки
Когда файлы выгрузки уже есть на диске, текст конкретного модуля получается простой функцией. Пример для общего модуля:
Функция ПолучитьТекстМодуля(КаталогВыгрузки, ИмяМодуля) Экспорт
ПутьКФайлу = КаталогВыгрузки + "\CommonModules\" + ИмяМодуля + "\Ext\Module.bsl";
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
Чтение = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ТекстМодуля = Чтение.Прочитать();
Чтение.Закрыть();
Возврат ТекстМодуля;
КонецФункции
Обратите внимание на структуру путей при иерархическом формате выгрузки: модуль объекта документа лежит по пути Documents\ИмяДокумента\Ext\ObjectModule.bsl, модуль менеджера — ManagerModule.bsl, модуль формы — внутри каталога формы в файле Module.bsl. Точные имена файлов зависят от версии платформы, поэтому перед написанием обработки стоит один раз выгрузить конфигурацию и посмотреть фактическую структуру.
Способ 3. Получение текста модуля из хранилища конфигурации
Если разработка ведётся через хранилище, текст модуля можно получить из конкретной версии хранилища, не трогая рабочую базу. Для этого используется пакетный режим конфигуратора с параметрами /ConfigurationRepositoryF, /ConfigurationRepositoryN, /ConfigurationRepositoryP и командой получения конфигурации из хранилища с последующей выгрузкой в файлы.
Типовая схема автоматизации: создаётся служебная база, подключённая к хранилищу; скрипт обновляет её до нужной версии командой /UpdateCfg или загружает конфигурацию хранилища, затем выполняется DumpConfigToFiles. Такой контур позволяет анализировать историю изменений модуля по версиям — например, найти, в какой версии появилась конкретная строка кода.
Работа напрямую с файлами хранилища (внутренний формат каталога хранилища) недокументирована и нестабильна между версиями платформы. Делать на это production-инструменты не стоит: надёжнее связка «служебная база + пакетный конфигуратор».
- 1Убедитесь, что модуль поставляется с исходным текстом (конфигурация не закрыта)
- 2Выгрузите конфигурацию в файлы пакетным режимом конфигуратора (DumpConfigToFiles)
- 3Найдите нужный .bsl-файл в структуре выгрузки по типу объекта
- 4Прочитайте файл через ЧтениеТекста с кодировкой UTF-8
- 5Проверьте результат: текст должен начинаться с директив или кода, а не с служебных символов
Способ 4. Внешние инструменты: EDT и сторонние парсеры
1C:Enterprise Development Tools хранит проект конфигурации в файловой системе, и модули там лежат как обычные .bsl-файлы. Если команда уже работает в EDT, тексты модулей доступны напрямую из каталога проекта без всякой выгрузки — их можно читать хоть из 1С, хоть любым скриптом на Python или PowerShell.
Для разбора структуры кода (списки процедур, сигнатуры, директивы компиляции) существуют открытые парсеры языка 1С. Они принимают на вход тот же файл модуля из выгрузки. Это удобно, когда нужен не сам текст, а его структура: например, построить реестр экспортных процедур всех общих модулей.
Выбор подхода под задачу
Сравнение способов получения текста модуля
Подходит для разового аудита и CI-контуров. Минус — требует доступа к конфигуратору и времени на полную выгрузку.
Самый быстрый вариант, если выгрузка уже выполняется по расписанию. Ограничение — данные актуальны на момент последней выгрузки.
Единственный способ получить текст модуля на конкретную версию в прошлом. Требует служебной базы и настройки скриптов.
Удобен, если разработка уже ведётся в EDT: файлы модулей всегда на диске. Не подходит для баз, где разработка идёт только в конфигураторе.
Для разовой задачи «прочитать текст одного модуля» проще всего открыть конфигуратор и сохранить модуль в файл вручную через меню, не автоматизируя ничего. Программная выгрузка оправдана, когда модулей много или операция повторяется регулярно.
Типичные ошибки и ограничения
Отдельно стоит упомянуть права и лицензионные границы. Программное получение текстов модулей типовой конфигурации для внутреннего аудита — нормальная практика. А вот попытки извлечь закрытые модули сторонних поставщиков могут нарушать условия лицензионного соглашения.
Проверка результата
После получения текста стоит убедиться, что это действительно исходник, а не ошибка чтения. Признаки корректного результата: файл открывается в кодировке UTF-8, в начале идут директивы компиляции (#Если Сервер Тогда) или объявления переменных и процедур, русские комментарии читаемы. Если текст пустой, начинается с бинарных данных или содержит «кракозябры» — проверяйте путь к файлу, кодировку и закрытость модуля.
Как проверить результат
Видны процедуры, функции, директивы компиляции, читаемые комментарии
Пустая строка, бинарный мусор или нечитаемые символы — неверный путь, кодировка или закрытый модуль
Файл .bsl существует по ожидаемому пути в каталоге выгрузки
Файла нет — проверьте формат выгрузки и состав выгруженных объектов
Текст соответствует текущей версии конфигурации
Текст устарел — выгрузка выполнялась давно, нужно повторить DumpConfigToFiles
Что важно запомнить
Прямого API для чтения текста модуля в 1С нет. Рабочие пути: пакетная выгрузка конфигурации в файлы, чтение .bsl-файлов через ЧтениеТекста, получение версий из хранилища через служебную базу или файлы проекта EDT. Всегда учитывайте формат выгрузки, кодировку UTF-8 и закрытость модулей поставки.
Частые вопросы
Можно ли получить текст модуля прямо в режиме Предприятия без конфигуратора?
Штатно — нет, встроенный язык не даёт доступа к исходному тексту модулей. На практике в режиме Предприятия можно только читать заранее выгруженные файлы модулей с диска или из хранилища значений, если их туда кто-то сохранил.
Какая кодировка у файлов модулей в выгрузке конфигурации?
Файлы модулей (.bsl) выгружаются в UTF-8, как правило, с BOM. При чтении через ЧтениеТекста указывайте КодировкаТекста.UTF8 — тогда кириллица в комментариях и строковых литералах читается корректно.
Как получить текст модуля формы?
После выгрузки конфигурации в файлы модуль формы находится в каталоге соответствующей формы в файле Module.bsl, рядом с описанием формы. Путь зависит от формата выгрузки и версии платформы, поэтому точное расположение лучше уточнить по фактической структуре выгрузки.
Можно ли получить текст модуля конкретной версии из хранилища?
Да, но не напрямую. Создаётся служебная база, подключённая к хранилищу, в неё загружается конфигурация нужной версии пакетными командами конфигуратора, после чего выполняется выгрузка в файлы. Прямое чтение внутренних файлов хранилища недокументировано и ненадёжно.
Почему обработка возвращает пустой текст для некоторых модулей?
Наиболее вероятные причины: модуль закрыт поставщиком и исходника в базе нет; неверно составлен путь к файлу в структуре выгрузки; выгрузка выполнялась с ограниченным списком объектов, и нужный модуль в неё не попал. Проверяйте наличие файла на диске и состав выгруженных метаданных.
Чем EDT отличается от выгрузки конфигуратора для этой задачи?
В EDT проект конфигурации постоянно хранится в файловой системе, и модули доступны как обычные .bsl-файлы без отдельной операции выгрузки. Это удобнее для автоматизации, но требует, чтобы разработка велась в EDT или проект регулярно синхронизировался с базой.