В практике разработчиков на платформе 1С:Предприятие 7.7 иногда возникают задачи, которые кажутся тривиальными для современных систем, но вызывают серьезные трудности в «семерке». Одна из таких задач — необходимость программного создания объектов конфигурации (например, констант, реквизитов или справочников) прямо из кода внешней обработки во время работы пользователей.
Разберем детально, почему стандартные механизмы платформы не позволяют этого сделать «на лету», проанализируем специализированные инструменты разработчиков прошлых лет и рассмотрим наиболее надежные архитектурные альтернативы, которые помогут решить задачу без угрозы стабильности базы данных.
Чтобы понять природу этого ограничения, проанализируем архитектуру хранения данных в платформе 1С 7.7. Вся структура метаданных (описание справочников, документов, констант, регистров и их реквизитов) жестко зафиксирована в бинарном файле 1Cv7.md, расположенном в каталоге базы данных.
При запуске системы происходят следующие процессы:
1Cv7.md и кэширует ее в оперативной памяти. Любые изменения физического файла на диске не будут видны в уже запущенных сеансах без перезапуска.1Cv7.dd (для файловых баз DBF) или 1Cv7.dds (для SQL-версий). В этих файлах описано, в каких именно физических таблицах и колонках на диске хранятся данные конкретных справочников или констант.Таким образом, даже если вы найдете способ внедрить описание новой константы в файл 1Cv7.md, база данных об этом ничего не узнает. При первой же попытке обратиться к этой константе система выдаст критическую ошибку, так как физического поля для хранения значения в базе данных просто не существует.
В процессе обсуждения на форуме упоминалась внешняя компонента ActiveMD.dll. Выясним, что представляет собой этот инструмент и решает ли он задачу.
ActiveMD — это специализированная библиотека (ActiveX-компонента), которая позволяет программно изменять структуру файла 1Cv7.md напрямую из встроенного языка 1С или внешних скриптов. С ее помощью действительно можно добавить новый объект метаданных (например, константу) без открытия интерактивного окна Конфигуратора.
Однако этот метод имеет критические ограничения:
Поэтому использование подобных утилит оправдано только в узких задачах автоматизации администрирования (например, при автоматической сборке релизов конфигураций), но категорически не подходит для решения бизнес-задач конечных пользователей в работающей системе.
Если перед вами стоит задача динамического создания аналогов «констант» или настроек, которые должны быть свои в каждой из 90 баз, то лучшим решением будет уйти от использования объектов метаданных. Вместо этого мы создадим в Конфигураторе один универсальный справочник, который будет выполнять роль хранилища настроек.
Создадим справочник Настройки со следующей структурой:
Посмотрим на пример кода, который позволяет программно создавать и перезаписывать такие виртуальные «константы» прямо во время работы пользователей без монопольного доступа:
// Функция для записи или обновления виртуальной константы
Процедура УстановитьВиртуальнуюКонстанту(ИмяКонстанты, Значение) Экспорт
Спр = СоздатьОбъект("Справочник.Настройки");
Если Спр.НайтиПоКоду(ИмяКонстанты, 0) = 1 Тогда
// Если настройка уже существует, обновляем ее значение
Спр.Значение = Значение;
Спр.Записать();
Иначе
// Если настройки нет, создаем её программно "на лету"
Спр.Новый();
Спр.Код = ИмяКонстанты;
Спр.Наименование = "Динамический параметр: " + ИмяКонстанты;
Спр.Значение = Значение;
Спр.Записать();
КонецЕсли;
КонецПроцедуры
А теперь разберем по шагам, как мы можем прочитать это значение в нашей внешней обработке:
// Функция для чтения значения виртуальной константы
Функция ПолучитьВиртуальнуюКонстанту(ИмяКонстанты, ЗначениеПоУмолчанию = "") Экспорт
Спр = СоздатьОбъект("Справочник.Настройки");
Если Спр.НайтиПоКоду(ИмяКонстанты, 0) = 1 Тогда
Возврат Спр.Значение;
Иначе
Возврат ЗначениеПоУмолчанию;
КонецЕсли;
КонецФункции
Этот подход абсолютно безопасен, работает мгновенно для всех пользователей и не требует внесения изменений в структуру метаданных при добавлении новых параметров.
Если новые параметры нужны исключительно для работы конкретной внешней обработки и не требуют хранения сложных типов данных 1С (ссылок на элементы справочников или документов), мы можем сохранять их во внешнем файле настроек формата INI или XML.
Рассмотрим пример реализации работы с INI-файлом, расположенным в каталоге базы данных. Для этого воспользуемся стандартным объектом Текст:
// Процедура записи простой настройки во внешний файл
Процедура ЗаписатьНастройкуВФайл(ИмяПараметра, ЗначениеПараметра)
КаталогБД = КаталогИБ();
ИмяФайла = КаталогБД + "ext_settings.ini";
ФайлТекст = СоздатьОбъект("Текст");
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
ФайлТекст.Открыть(ИмяФайла);
КонецЕсли;
// Ищем, есть ли уже такая строка в файле
СтрокаНайдена = 0;
Для НомерСтроки = 1 По ФайлТекст.КоличествоСтрок() Цикл
Стр = ФайлТекст.ПолучитьСтроку(НомерСтроки);
Если Найти(Вг(Стр), Вг(ИмяПараметра + "=")) = 1 Тогда
ФайлТекст.ЗаменитьСтроку(НомерСтроки, ИмяПараметра + "=" + СокрЛП(Строка(ЗначениеПараметра)));
СтрокаНайдена = 1;
Прервать;
КонецЕсли;
КонецЦикла;
Если СтрокаНайдена = 0 Тогда
ФайлТекст.ДобавитьСтроку(ИмяПараметра + "=" + СокрЛП(Строка(ЗначениеПараметра)));
КонецЕсли;
ФайлТекст.Записать(ИмяФайла);
КонецПроцедуры
Такой подход избавляет от необходимости вносить изменения в базу данных 1С и отлично подходит для хранения служебных параметров внешней обработки.
В крупных проектах на 1С 7.7 для хранения динамических структур метаданных часто используется внешняя база данных SQLite совместно с мощной компонентой 1С++ (1cpp.dll). Это позволяет:
Если задача действительно требует сложного динамического моделирования данных, связка 1С 7.7 + SQLite является золотым стандартом разработки.
Если перед вами все же стоит задача разово добавить реальный объект метаданных (например, новую реквизит-константу) во все 90 разрозненных локальных баз данных, не пытайтесь делать это программно из встроенного языка.
Правильный алгоритм действий выглядит так:
1Cv7.md)..bat / .cmd) или PowerShell-скрипт, который в цикле будет обходить каталоги всех 90 баз данных, копировать туда новый файл 1Cv7.md и запускать 1С в монопольном режиме для пакетного обновления структуры данных с помощью параметров командной строки запуска 1С 7.7 (параметры /M и автозапуск выполнения реструктуризации).Этот способ гарантирует сохранность данных и исключает непредвиденные сбои в логике работы СУБД.