Перенос метаданных между конфигурациями 1С — обычное дело для разработчиков. Мы часто копируем справочники, документы или регистры из одной информационной базы в другую (например, из «1С:Комплексная автоматизация» в «1С:Бухгалтерия предприятия»). Однако при копировании справочников программисты регулярно сталкиваются с неприятным нюансом: в Конфигураторе список предопределенных элементов заполнен и выглядит корректно, а вот при запуске базы в режиме «1С:Предприятие» этот список пуст. Даже при попытке сделать прямой запрос к таблице через консоль мы получаем пустой результат.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы «1С:Предприятие» и рассмотрим несколько эффективных способов решения задачи.
Для начала давайте разберемся с тем, как платформа 1С работает с предопределенными данными. Предопределенные элементы — это особый вид данных. Они описываются на уровне метаданных в конфигурации (в Конфигураторе), но физически должны существовать в таблицах базы данных (в режиме Предприятия), чтобы на них можно было ссылаться в коде или документах.
Когда мы просто копируем справочник из одной конфигурации в другую, физические записи в таблицах СУБД автоматически не создаются. Платформа должна инициализировать их при первом запуске или обновлении конфигурации базы данных. Однако этот процесс может заблокироваться по ряду причин:
Рассмотрим подробнее каждый из способов решения этой проблемы.
Прежде чем писать программный код, давайте проверим базовые настройки скопированного объекта метаданных. Это самый простой шаг, с которого всегда стоит начинать.
Если свойство изначально стояло в положении «Обновлять автоматически», но элементы все равно не появились, переходим к более действенным мерам.
Этот способ является наиболее надежным и быстрым. Мы заставим платформу принудительно «забыть» о том, что инициализация предопределенных элементов для данного справочника уже выполнялась, и запустим этот процесс заново.
Для этого мы воспользуемся методами менеджера справочника УстановитьИнициализациюПредопределенныхДанных() и глобальным методом платформы ИнициализироватьПредопределенныеДанные(). Напишем небольшую процедуру, которую можно выполнить во внешней обработке или через консоль кода:
// Сбросим признак инициализации для нашего проблемного справочника.
// Вместо "ИмяВашегоСправочника" укажите реальное имя скопированного объекта.
Справочники.ИмяВашегоСправочника.УстановитьИнициализациюПредопределенныхДанных(Ложь);
// Запустим системный процесс инициализации предопределенных данных во всей базе
ИнициализироватьПредопределенныеДанные();
Сообщить("Принудительная инициализация предопределенных элементов успешно выполнена!");
Разберем по шагам, что делает этот код:
УстановитьИнициализациюПредопределенныхДанных(Ложь) сообщает платформе, что для указанного справочника предопределенные данные еще не были созданы в текущей области данных. Физически записи при этом не удаляются, но маркер готовности сбрасывается.ИнициализироватьПредопределенныеДанные() запускает глобальное сканирование метаданных. Платформа видит наш «сброшенный» справочник, сопоставляет описание в Конфигураторе с физической таблицей в СУБД и автоматически генерирует недостающие элементы.Поскольку наш целевой справочник был скопирован в конфигурацию «1С:Бухгалтерия предприятия», мы можем задействовать штатные механизмы Библиотеки стандартных подсистем (БСП). БСП содержит мощный программный интерфейс для обновления конфигураций.
Мы можем программно вызвать процедуру обновления предопределенных элементов через специализированные функции БСП. Для этого выполним следующий код:
// Вызываем метод БСП для принудительного обновления предопределенных элементов конкретного справочника
МетаданныеОбъекта = Метаданные.Справочники.ИмяВашегоСправочника;
ОбновлениеИнформационнойБазы.ОбновитьПредопределенныеЭлементы(МетаданныеОбъекта);
Кроме того, если мы хотим запустить полное стандартное обновление информационной базы (что также инициирует проверку всех предопределенных данных программ БСП), мы можем запустить систему «1С:Предприятие» со специальным ключом запуска в строке параметров:
/C ЗапуститьОбновлениеИнформационнойБазы
Иногда пользователи или администраторы, не дождавшись автоматического появления предопределенных элементов, создают их в режиме Предприятия вручную. В результате у нас в Конфигураторе объявлен предопределенный элемент, а в Предприятии есть точно такой же обычный элемент, но платформа «не видит» между ними связи.
В такой ситуации нам нужно связать существующий физический элемент справочника с предопределенным именем из метаданных. Для этого у любого объекта справочника существует специальный реквизит ИмяПредопределенныхДанных. Разберем пример кода, который связывает обычный элемент с предопределенным:
// Найдем вручную созданный элемент (например, по коду или наименованию)
СсылкаНаЭлемент = Справочники.ИмяВашегоСправочника.НайтиПоКоду("00001");
Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
// Указываем имя предопределенного элемента, как оно задано в Конфигураторе
ОбъектСправочника.ИмяПредопределенныхДанных = "ИмяПредопределенногоЭлементаВКонфигураторе";
Попытка
ОбъектСправочника.Записать();
Сообщить("Элемент успешно связан с предопределенным!");
Исключение
Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
После выполнения этого кода элемент в режиме «1С:Предприятие» получит специальную картинку (с шестеренкой) и станет полноценным предопределенным элементом, который можно использовать в кодовой базе конфигурации.
Если программные методы не дали результата, велика вероятность, что дело в платформенных сбоях СУБД или локальном кэше метаданных. Выполним следующие действия по шагам:
/ClearCache.Используя предложенные методики, мы гарантированно вернем видимость предопределенным элементам в любой скопированной сущности и обеспечим стабильную работу прикладного решения.