Представим стандартную рабочую ситуацию: в процессе разработки или поддержки крупной информационной базы накопилось внушительное количество внешних обработок или печатных форм (например, около 300 файлов с расширением .epf). Встал вопрос о необходимости перенести их все непосредственно в дерево метаданных конфигурации, сделав встроенными объектами. Делать это вручную через стандартный конфигуратор — монотонный, долгий и подверженный ошибкам процесс, который может занять целый рабочий день.
В этой статье мы подробно разберем, как автоматизировать данный процесс, используя механизмы пакетной работы платформы 1С:Предприятие, выгрузку конфигурации в XML-файлы и среду разработки 1C:EDT.
Прежде чем перейти к практическим решениям, проанализируем важный архитектурный аспект платформы 1С. Во встроенном языке 1С в режиме «1С:Предприятие» нет возможности динамически изменять структуру метаданных конфигурации. Объекты метаданных доступны только для чтения. Вы не можете написать код вроде Метаданные.Обработки.Добавить(). Любые изменения структуры дерева конфигурации должны выполняться до компиляции и обновления базы данных — на уровне файлов исходного кода или утилит конфигуратора.
Этот способ идеально подходит для традиционной разработки в конфигураторе. Мы воспользуемся механизмом выгрузки конфигурации в файлы XML, программно внедрим туда наши обработки и загрузим конфигурацию обратно. Весь процесс можно полностью автоматизировать с помощью скриптов (например, на PowerShell, OneScript или Python).
Рассмотрим по шагам данный алгоритм:
"C:\Program Files\1cv8\8.3.X.X\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /N "Администратор" /P "Пароль" /DumpConfigToFiles "C:\ConfigXML"
/DumpExternalDataProcessorOrReportToFiles. Нам нужно в цикле запустить эту команду для каждого из 300 файлов:
"C:\Program Files\1cv8\8.3.X.X\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /DumpExternalDataProcessorOrReportToFiles "C:\OutXML\ИмяОбработки" "C:\SourceEPF\ИмяОбработки.epf"
C:\ConfigXML\DataProcessors\ (или C:\ConfigXML\Reports\, если это внешние отчеты).
Configuration.xml (или Configuration.mdo в зависимости от версии платформы). Нам необходимо программно открыть этот XML-документ и добавить новые узлы в секцию дочерних объектов обработок <ChildObjects> -> <DataProcessor>.
Пример добавляемой структуры для каждого импортированного объекта:
<ChildObjects>
<DataProcessor>ИмяНовойОбработки1</DataProcessor>
<DataProcessor>ИмяНовойОбработки2</DataProcessor>
</ChildObjects>
"C:\Program Files\1cv8\8.3.X.X\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /LoadConfigFromFiles "C:\ConfigXML"
/UpdateDBCfg.
Если вы ведете разработку в современной среде 1C:EDT (Enterprise Development Tools), задача массового импорта решается еще проще, поскольку EDT по умолчанию работает с проектом как с набором исходных файлов в иерархической структуре каталогов.
Выясним последовательность действий для массового переноса в EDT:
src/ExternalDataProcessors/. Переместите папки всех нужных обработок в каталог встроенных обработок: src/DataProcessors/..mdo. Откройте эти файлы и с помощью групповой замены в текстовом редакторе (например, VS Code) измените тип метаданных с ExternalDataProcessor на DataProcessor.src/Configuration.mdo. В секции дочерних объектов конфигурации добавьте строки с именами перенесенных обработок.src/DataProcessors/, сопоставит их с записями в Configuration.mdo и корректно отобразит их в дереве проекта. Вам останется лишь применить изменения к информационной базе.Если жесткое добавление обработок в дерево метаданных конфигурации не является обязательным архитектурным требованием, рассмотрите возможность использования типового справочника Библиотеки Стандартных Подсистем (БСП) ДополнительныеОтчетыИОбработки. Это позволит не снимать конфигурацию с поддержки и обновлять файлы обработок "на лету" без отключения пользователей от базы.
Для этого мы можем написать простую обработку, которая за один проход прочитает файлы из каталога и загрузит их в справочник. Посмотрим на пример кода:
ВыборкаФайлов = НайтиФайлы("C:\SourceEPF\", "*.epf");
Для Каждого Файл Из ВыборкаФайлов Цикл
НовыйОбъект = Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
НовыйОбъект.Наименование = Файл.ИмяБезРасширения;
НовыйОбъект.ХранилищеОбработки = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Файл.ПолноеИмя));
НовыйОбъект.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется;
// Заполняем остальные обязательные реквизиты БСП в зависимости от версии вашей конфигурации
// ...
НовыйОбъект.Записать();
КонецЦикла;
Подведем итоги: выбор решения зависит от ваших задач. Если вам необходимо "чистое" дерево метаданных конфигурации для жесткого контроля версий, используйте первый метод с пакетной выгрузкой XML или второй метод с использованием среды EDT. Если же вам критически важно быстро предоставить функционал пользователям без изменения метаданных самой конфигурации — воспользуйтесь программным заполнением справочника БСП.