Почему новый предопределенный элемент справочника не отображается в режиме 1С:Предприятие?

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

При доработке типовых конфигураций (например, 1С:ЗУП 3.1, 1С:ERP, 1С:КА) разработчики нередко сталкиваются с ситуацией: в конфигураторе в справочник добавлен новый предопределенный элемент, конфигурация базы данных успешно обновлена, однако в режиме «1С:Предприятие» новый элемент отсутствует в форме списка, а прямые запросы к таблице базы данных возвращают пустой результат. При этом в программном коде обращение к менеджеру справочника вида Справочники.ПоказателиРасчетаЗарплаты.ИмяЭлемента компилируется без синтаксических ошибок, но при попытке получить данные или использовать ссылку в расчетах система выдает ошибку: Предопределенный элемент отсутствует в данных.

Разберем подробно механизм работы платформы «1С:Предприятие 8.3» с предопределенными данными, выясним причины такого поведения и рассмотрим все доступные способы исправления ситуации.

Механизм хранения предопределенных данных в платформе 8.3

Проанализируем архитектуру хранения предопределенных элементов. В платформе 8.3 предопределенные элементы разделены на два независимых уровня:

  1. Уровень метаданных конфигурации: описание элемента (его имя, синоним, тип), хранящееся в дереве конфигурации. Именно поэтому синтаксическая конструкция Справочники.ПоказателиРасчетаЗарплаты.A_1111 успешно проходит проверку компилятора метаданных — для платформы это валидная ссылка.
  2. Уровень физических данных таблицы СУБД: реальная строка в таблице базы данных со сформированным уникальным идентификатором (GUID) и заполненным системным реквизитом ИмяПредопределенныхДанных.

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


ВЫБРАТЬ
    Показатели.Ссылка,
    Показатели.Предопределенный,
    Показатели.ИмяПредопределенныхДанных,
    Показатели.Представление
ИЗ
    Справочник.ПоказателиРасчетаЗарплаты КАК Показатели

Запрос не вернет наш новый элемент, поскольку в таблице базы данных физическая запись попросту отсутствует. При попытке разыменовать ссылку или обратиться к свойствам объекта система выдает исключение Предопределенный элемент отсутствует в данных.

Причина: свойство «Обновление предопределенных данных»

Выясним, почему платформа не создает физическую запись автоматически при обновлении конфигурации базы данных (по нажатию F7).

В типовых конфигурациях, построенных на базе «Библиотеки стандартных подсистем» (БСП), для ускорения реструктуризации базы данных у корня конфигурации свойство Обновление предопределенных данных установлено в значение Не обновлять автоматически. Если у конкретного справочника в свойствах на вкладке «Прочее» значение параметра установлено как Авто, объект наследует общее поведение конфигурации, и автоматическое создание физических строк в СУБД блокируется.

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

Способ 1. Программное обновление предопределенных данных через менеджер объекта

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

Выполним на сервере (через внешнюю обработку или консоль кода) следующую команду:

Справочники.ПоказателиРасчетаЗарплаты.ОбновитьПредопределенныеДанные();

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

Способ 2. Изменение свойства справочника в конфигураторе

Если мы хотим, чтобы для конкретного справочника новые предопределенные элементы всегда создавались автоматически при обновлении конфигурации базы данных, изменим параметры метаданных объекта. Разберем порядок действий по шагам:

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

При применении изменений платформа выполнит реструктуризацию таблицы и автоматически создаст физические записи для всех объявленных предопределенных элементов.

Способ 3. Ручная привязка существующего элемента к имени предопределенного

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

Для этого необходимо программно заполнить стандартный реквизит ИмяПредопределенныхДанных у существующего элемента базы данных:


// Получаем ссылку на существующий элемент справочника
ОбъектСправочника = ВыбраннаяСсылка.ПолучитьОбъект();

// Имя должно в точности совпадать с именем в дереве метаданных конфигуратора
ОбъектСправочника.ИмяПредопределенныхДанных = "A_1111";

// Записываем объект для фиксации связи
ОбъектСправочника.Записать();

После записи объект приобретает признак предопределенного (в интерфейсе появляется значок с точкой), и к нему можно будет обращаться через точку от менеджера справочника.

Особенности и важные нюансы работы с предопределенными данными

Проанализируем дополнительные технические правила, которые необходимо учитывать при разработке:

  1. Уникальность имени: значение реквизита ИмяПредопределенныхДанных должно быть строго уникальным в пределах одной таблицы. Попытка назначить одно и то же имя двум разным элементам приведет к ошибке нарушения уникальности.
  2. Очистка привязки: если требуется сделать предопределенный элемент обычным пользовательским (например, при удалении предопределенного элемента из конфигурации), достаточно программно присвоить Объект.ИмяПредопределенныхДанных = "" и выполнить запись объекта.
  3. Особенности распределенных баз данных (РИБ): в распределенных информационных базах добавление и привязку предопределенных элементов следует производить исключительно в главном узле. Создание элементов в периферийных узлах вручную до прихода изменений из главного узла может привести к конфликтам сопоставления и ошибке дублирования предопределенных данных при очередном обмене.
← На главную