При администрировании и поддержке баз данных на платформе 1С:Предприятие 7.7 часто накапливается внушительный каталог внешних отчетов и обработок (каталог ExtForms). В процессе рефакторинга или модификации структуры данных (например, при удалении или изменении реквизитов справочника Товары) возникает задача: найти все внешние отчеты (файлы с расширением .ert), в реквизитах диалога которых задействован конкретный тип данных, например, Справочник.Товары.
Основная сложность заключается в том, что стандартный объект встроенного языка Метаданные платформы 1С 7.7 работает исключительно с объектами конфигурации, загруженными в сессию из файла 1Cv7.MD. Штатных методов для инспекции структуры закрытых файлов .ert в платформе не предусмотрено. Открывать каждый файл интерактивно вручную слишком трудоемко, а массовый вызов стандартного метода ОткрытьФорму() приводит к выполнению предопределенной процедуры ПриОткрытии(), возможным синтаксическим и контекстным ошибкам, модальным окнам и переполнению системных ресурсов. Разберем практические способы решения этой задачи.
Для понимания принципов автоматического поиска проанализируем структуру внешнего отчета. Файл .ert представляет собой составной бинарный файл Microsoft OLE Compound File (Structured Storage). Внутри этого контейнера находятся отдельные потоки данных:
Dialog Stream — содержит визуальное описание формы и всех расположенных на ней реквизитов диалога в открытом текстовом формате в кодировке Windows-1251 (ANSI).Module Text — хранит исходный текст программного модуля отчета.Так как данные о реквизитах формы в потоке Dialog Stream не сжаты архиваторами, их можно анализировать как внешними утилитами, так и программно.
Один из надежных способов разобрать внешние файлы без запуска графического интерфейса — использование специализированной консольной утилиты GCOMP. Она предназначена для разборки и сборки метаданных 1С 7.7, включая внешние отчеты и обработки.
Рассмотрим порядок действий при таком подходе:
gcomp.exe в режиме разборки для всех файлов в каталоге ExtForms..ert на составляющие текстовые файлы: файл описания формы (диалога) и текстовый файл модуля.Справочник.Товары по полученным файлам форм стандартными средствами поиска (например, регулярными выражениями или поиском по файлам).Этот способ безопасен тем, что полностью исключает выполнение встроенного в отчеты кода и не зависит от запущенных сессий 1С:Предприятия.
Поскольку поток Dialog Stream сохраняется в незашифрованном и несжатом виде в кодировке ANSI (Windows-1251), мы можем выполнить прямой поиск байтовой последовательности имени типа данных непосредственно по файлам отчетов.
Разберем логику поиска подстроки "Справочник.Товары" средствами встроенного языка 1С 7.7. Для чтения файлов используем объект Текст или объект для работы с файловой системой (например, вспомогательные функции чтения файлов):
// Пример перебора файлов в каталоге ExtForms
Перем ФС_Объект, ИмяФайла, КаталогПоиска;
Перем ОбъектТекст, СтрПоиска;
КаталогПоиска = КаталогИБ() + "ExtForms\";
СтрПоиска = "Справочник.Товары";
ИмяФайла = ФС.НайтиПервый(КаталогПоиска + "*.ert");
Пока ПустаяСтрока(ИмяФайла) = 0 Цикл
ОбъектТекст = СоздатьОбъект("Текст");
ОбъектТекст.Открыть(КаталогПоиска + ИмяФайла);
// Проверяем наличие сигнатуры типа в содержимом файла
Если Найти(ОбъектТекст.ПолучитьТекст(), СтрПоиска) > 0 Тогда
Сообщить("Найден отчет: " + ИмяФайла);
КонецЕсли;
ИмяФайла = ФС.НайтиСледующий();
КонецЦикла;
Важное замечание: Прямой поиск строки по всему телу файла .ert может дать ложноположительные срабатывания, если строка "Справочник.Товары" встречается в комментариях модуля или в алгоритмах отчета. Для более точной фильтрации следует обращаться непосредственно к потоку Dialog Stream через внешние библиотеки или OLE Compound Storage API (например, через библиотеку activemd.dll или скрипты на PowerShell/VBScript с интерфейсом IStorage).
Если требуется проанализировать элементы диалога именно через объектную модель 1С, используют открытие формы с перехватом событий. Для этого в платформе применяется подход с подавлением штатного выполнения кода формы и отключением визуального отображения диалога.
С помощью внешних компонент-перехватчиков (hook-библиотек) подавляется визуализация окна и блокируется код процедуры ПриОткрытии(), после чего считывается коллекция элементов формы отчета. Это позволяет точно обойти визуальные реквизиты диалога без риска зависания на тяжелых запросах или модальных окнах Предупреждение().
При поиске реквизитов с определенным типом важно учитывать распространенные архитектурные особенности разработок на 1С 7.7:
ПриОткрытии() через вызов метода НазначитьТип("ИмяРеквизита", "Справочник.Товары"). В этом случае статический анализ потока диалога не покажет принадлежность к справочнику — потребуется дополнительно сканировать текст модуля на наличие вызова НазначитьТип.СписокЗначений или таблица, привязка к конкретному виду справочника задается исключительно в коде отчета. Статический поиск по диалогу в таких ситуациях неприменим.Таким образом, для получения исчерпывающего списка внешних отчетов наиболее эффективным является сочетание разбора файлов утилитой GCOMP с последующим поиском строки Справочник.Товары как в блоке диалога, так и в тексте модуля отчета.