Почему не видны предопределенные элементы скопированного справочника в 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Перенос метаданных между конфигурациями 1С — обычное дело для разработчиков. Мы часто копируем справочники, документы или регистры из одной информационной базы в другую (например, из «1С:Комплексная автоматизация» в «1С:Бухгалтерия предприятия»). Однако при копировании справочников программисты регулярно сталкиваются с неприятным нюансом: в Конфигураторе список предопределенных элементов заполнен и выглядит корректно, а вот при запуске базы в режиме «1С:Предприятие» этот список пуст. Даже при попытке сделать прямой запрос к таблице через консоль мы получаем пустой результат.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы «1С:Предприятие» и рассмотрим несколько эффективных способов решения задачи.

Выясняем причины проблемы: почему элементы исчезают?

Для начала давайте разберемся с тем, как платформа 1С работает с предопределенными данными. Предопределенные элементы — это особый вид данных. Они описываются на уровне метаданных в конфигурации (в Конфигураторе), но физически должны существовать в таблицах базы данных (в режиме Предприятия), чтобы на них можно было ссылаться в коде или документах.

Когда мы просто копируем справочник из одной конфигурации в другую, физические записи в таблицах СУБД автоматически не создаются. Платформа должна инициализировать их при первом запуске или обновлении конфигурации базы данных. Однако этот процесс может заблокироваться по ряду причин:

  1. Неверная настройка свойства справочника: У скопированного справочника в свойстве «Обновление предопределенных данных» может стоять значение «Не обновлять автоматически». В этом случае платформа игнорирует новые элементы при обновлении базы данных.
  2. Глобальный запрет в информационной базе: В самой информационной базе может быть отключено автоматическое обновление предопределенных данных.
  3. Особенности работы в РИБ (распределенных базах): Если вы работаете в подчиненном узле распределенной информационной базы, создание предопределенных элементов заблокировано платформой на системном уровне. Они должны приходить исключительно через файлы обмена из главного узла.
  4. Кэширование метаданных: Локальный кэш платформы на компьютере пользователя «считает», что структура справочника уже инициализирована, и не торопится перечитывать новые предопределенные элементы из измененной конфигурации.

Рассмотрим подробнее каждый из способов решения этой проблемы.

Способ 1. Проверка свойств справочника в Конфигураторе

Прежде чем писать программный код, давайте проверим базовые настройки скопированного объекта метаданных. Это самый простой шаг, с которого всегда стоит начинать.

  1. Откроем конфигурацию в режиме Конфигуратор.
  2. Найдем наш скопированный справочник и откроем палитру его свойств.
  3. Прокрутим список свойств до раздела «Данные».
  4. Найдем свойство «Обновление предопределенных данных».
  5. Убедимся, что там установлено значение «Обновлять автоматически» (или «Авто»). Если там указано «Не обновлять», платформа никогда не создаст их в режиме «1С:Предприятие» самостоятельно.

Если свойство изначально стояло в положении «Обновлять автоматически», но элементы все равно не появились, переходим к более действенным мерам.

Способ 2. Программная инициализация предопределенных элементов

Этот способ является наиболее надежным и быстрым. Мы заставим платформу принудительно «забыть» о том, что инициализация предопределенных элементов для данного справочника уже выполнялась, и запустим этот процесс заново.

Для этого мы воспользуемся методами менеджера справочника УстановитьИнициализациюПредопределенныхДанных() и глобальным методом платформы ИнициализироватьПредопределенныеДанные(). Напишем небольшую процедуру, которую можно выполнить во внешней обработке или через консоль кода:


// Сбросим признак инициализации для нашего проблемного справочника.
// Вместо "ИмяВашегоСправочника" укажите реальное имя скопированного объекта.
Справочники.ИмяВашегоСправочника.УстановитьИнициализациюПредопределенныхДанных(Ложь);

// Запустим системный процесс инициализации предопределенных данных во всей базе
ИнициализироватьПредопределенныеДанные();

Сообщить("Принудительная инициализация предопределенных элементов успешно выполнена!");

Разберем по шагам, что делает этот код:

  1. Метод УстановитьИнициализациюПредопределенныхДанных(Ложь) сообщает платформе, что для указанного справочника предопределенные данные еще не были созданы в текущей области данных. Физически записи при этом не удаляются, но маркер готовности сбрасывается.
  2. Метод ИнициализироватьПредопределенныеДанные() запускает глобальное сканирование метаданных. Платформа видит наш «сброшенный» справочник, сопоставляет описание в Конфигураторе с физической таблицей в СУБД и автоматически генерирует недостающие элементы.

Способ 3. Применение инструментов БСП (Библиотеки стандартных подсистем)

Поскольку наш целевой справочник был скопирован в конфигурацию «1С:Бухгалтерия предприятия», мы можем задействовать штатные механизмы Библиотеки стандартных подсистем (БСП). БСП содержит мощный программный интерфейс для обновления конфигураций.

Мы можем программно вызвать процедуру обновления предопределенных элементов через специализированные функции БСП. Для этого выполним следующий код:


// Вызываем метод БСП для принудительного обновления предопределенных элементов конкретного справочника
МетаданныеОбъекта = Метаданные.Справочники.ИмяВашегоСправочника;
ОбновлениеИнформационнойБазы.ОбновитьПредопределенныеЭлементы(МетаданныеОбъекта);

Кроме того, если мы хотим запустить полное стандартное обновление информационной базы (что также инициирует проверку всех предопределенных данных программ БСП), мы можем запустить систему «1С:Предприятие» со специальным ключом запуска в строке параметров:

/C ЗапуститьОбновлениеИнформационнойБазы

Способ 4. Что делать, если элементы созданы вручную (Связывание данных)

Иногда пользователи или администраторы, не дождавшись автоматического появления предопределенных элементов, создают их в режиме Предприятия вручную. В результате у нас в Конфигураторе объявлен предопределенный элемент, а в Предприятии есть точно такой же обычный элемент, но платформа «не видит» между ними связи.

В такой ситуации нам нужно связать существующий физический элемент справочника с предопределенным именем из метаданных. Для этого у любого объекта справочника существует специальный реквизит ИмяПредопределенныхДанных. Разберем пример кода, который связывает обычный элемент с предопределенным:


// Найдем вручную созданный элемент (например, по коду или наименованию)
СсылкаНаЭлемент = Справочники.ИмяВашегоСправочника.НайтиПоКоду("00001");

Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
    ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
    
    // Указываем имя предопределенного элемента, как оно задано в Конфигураторе
    ОбъектСправочника.ИмяПредопределенныхДанных = "ИмяПредопределенногоЭлементаВКонфигураторе";
    
    Попытка
        ОбъектСправочника.Записать();
        Сообщить("Элемент успешно связан с предопределенным!");
    Исключение
        Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

После выполнения этого кода элемент в режиме «1С:Предприятие» получит специальную картинку (с шестеренкой) и станет полноценным предопределенным элементом, который можно использовать в кодовой базе конфигурации.

Способ 5. Очистка кэша и реструктуризация (Административные методы)

Если программные методы не дали результата, велика вероятность, что дело в платформенных сбоях СУБД или локальном кэше метаданных. Выполним следующие действия по шагам:

  1. Тестирование и исправление (ТиИ): Откроем Конфигуратор, зайдем в меню «Администрирование» -> «Тестирование и исправление...». Обязательно выберем пункт «Реструктуризация таблиц информационной базы» и запустим процесс. Реструктуризация полностью пересоздает физические таблицы в СУБД, что вынуждает платформу заново переписать предопределенные элементы из конфигурации.
  2. Очистка кэша платформы 1С: Иногда платформа "залипает" на старой схеме данных. Закроем все сеансы 1С, удалим информационную базу из списка запуска и добавим её заново (это очистит локальный кэш метаданных). Также можно запустить 1С с параметром командной строки /ClearCache.

Используя предложенные методики, мы гарантированно вернем видимость предопределенным элементам в любой скопированной сущности и обеспечим стабильную работу прикладного решения.

← На главную