При сопровождении сильно доработанных баз 1С:Предприятия 7.7 нередко возникает задача сформировать единую пользовательскую инструкцию или распечатать документацию по конфигурации и внешним отчетам. Штатный интерфейс Конфигуратора 1С 7.7 не предоставляет инструментов для пакетного экспорта справки, позволяя просматривать раздел Описание только вручную по каждому объекту отдельно.
Разберем внутреннее устройство хранения справки в платформе 7.7, выясним причины ограничений и детально рассмотрим несколько способов извлечения текстов описаний для их дальнейшей компоновки и печати.
Проанализируем возможности системного объекта Метаданные. Во встроенном языке 1С 7.7 объект Метаданные открывает доступ ко многим свойствам конфигурации: идентификаторам, синонимам, комментариям, типам реквизитов и составу табличных частей. Однако платформа полностью лишена встроенных функций и методов для чтения поля справки (описания) объекта.
Кроме того, ссылки между статьями справки внутри 1С 7.7 используют внутреннюю адресацию платформы. Если просто скопировать текст вручную, навигация нарушается. Чтобы автоматизировать извлечение документации в исходном виде, необходимо обратиться к структуре самих файлов конфигурации.
Файл конфигурации 1Cv7.md, а также внешние отчеты и обработки с расширением .ert физически представляют собой составные бинарные файлы формата Microsoft OLE Structured Storage (Compound File Binary Format). Внутри такого файла организована виртуальная файловая система со своими хранилищами (папками) и потоками данных (файлами).
Тексты описаний объектов метаданных хранятся внутри этих потоков в формате RTF (Rich Text Format). Это означает, что при выгрузке потоков мы получаем полноценный форматированный текст, в котором сохраняются шрифты, таблицы, списки и даже встроенные графические изображения (хранящиеся прямо внутри RTF в шестнадцатеричном виде).
Рассмотрим наиболее популярный и надежный инструмент для разборки файлов 1С 7.7 — консольную утилиту gcomp. Данная утилита предназначена для разборки файла 1Cv7.md и внешних файлов .ert на исходные текстовые составляющие с возможностью их обратной сборки.
Разберем по шагам процесс получения справки с помощью gcomp:
1Cv7.md или внешние отчеты .ert.
gcomp -d -v -i 1Cv7.md -o SourceMD
SourceMD. Внутри дерева каталогов для каждого объекта метаданных (справочников, документов, отчетов) будут созданы отдельные файлы, содержащие исходный код модулей, структуры реквизитов и файлы описаний с расширением .rtf или .txt.
gcomp -d -v -i Report.ert -o SourceReport
Полученные RTF-файлы содержат исходное форматирование справки объектов, их можно сразу открывать в текстовых процессорах, редактировать, компоновать в единый документ и отправлять на печать.
Если требуется выгружать описания непосредственно из запущенной базы 1С или формировать отчет программно, используют внешние компоненты, умеющие работать с потоками Compound-файлов или перехватывать внутренние структуры движка 1С 7.7:
1Cv7.md, так и внешних обработок .ert). С ее помощью можно программно обойти хранилища объектов метаданных, найти поток описания и считать его содержимое во встроенный язык.Поскольку формат файла конфигурации стандартизирован, мы можем извлечь справку полностью автономно без запуска Конфигуратора 1С и без регистрации внешних компонент. Разберем пример реализации такого подхода на языке Python с использованием библиотеки для разбора структурированных хранилищ olefile.
Посмотрим на пример скрипта, который открывает файл конфигурации или внешнего отчета, обходит потоки и сохраняет все найденные описания в отдельные файлы RTF:
import os
import olefile
md_path = "1Cv7.md"
output_dir = "ExtractedHelp"
os.makedirs(output_dir, exist_ok=True)
if olefile.isOleFile(md_path):
with olefile.OleFileIO(md_path) as ole:
storage_tree = ole.listdir()
for path_parts in storage_tree:
stream_name = path_parts[-1]
# Потоки со справкой и описанием обычно содержат Help или Description
if "Help" in stream_name or "Description" in stream_name:
full_stream_path = "/".join(path_parts)
safe_name = "_".join(path_parts) + ".rtf"
data = ole.openstream(path_parts).read()
with open(os.path.join(output_dir, safe_name), "wb") as f_out:
f_out.write(data)
Подобную процедуру можно реализовать также с помощью функций Windows API (через функцию StgOpenStorage и интерфейсы IStorage, IStream) в PowerShell или C#.
После того как все RTF-файлы описаний извлечены из конфигурации и внешних отчетов, перейдем к завершающему этапу подготовки документации:
.chm с помощью компилятора Microsoft HTML Help Workshop, получив полноценную интерактивную документацию.