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

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

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

Выясним причину блокировки: платформенное ограничение подчиненных справочников

Главная и наиболее частая причина недоступности кнопки добавления предопределенных элементов — справочник является подчиненным. В типовых конфигурациях (например, УПП, КА, ERP, УТ) справочник Кассы подчинен справочнику Организации.

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

Это правило работает в обе стороны:

  1. Если у справочника на вкладке «Владельцы» указан хотя бы один справочник-владелец, кнопка добавления предопределенных элементов становится недоступной.
  2. Если у справочника уже созданы предопределенные элементы, платформа не позволит включить для него подчинение другим объектам метаданных.

Чек-лист предварительной проверки объекта в конфигураторе

Если кнопка добавления предопределенного элемента недоступна, выполним последовательную диагностику объекта метаданных:

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

Альтернативные архитектурные решения задачи

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

Решение 1. Добавление реквизита в справочник-владелец

Рассмотрим вариант, при котором связь задается непосредственно в объекте-владельце. В справочник Организации добавляем реквизит ОсновнаяКасса с типом ссылки на справочник Кассы.

В свойствах этого реквизита настраиваем связь параметров выбора по владельцу: Отбор.Владелец(Ссылка). Это исключит возможность выбрать кассу чужой организации. При выполнении алгоритма (в том числе в серверных и фоновых вызовах) касса определяется напрямую через организацию документа:


КассаДокумента = ДокументОбъект.Организация.ОсновнаяКасса;
Если ЗначениеЗаполнено(КассаДокумента) Тогда
    ДокументОбъект.Касса = КассаДокумента;
КонецЕсли;

Решение 2. Хранение соответствий в регистре сведений

Если нежелательно менять состав реквизитов основного справочника, разберем более гибкий вариант — создание независимого регистра сведений (например, ОсновныеКассыОрганизаций).

  1. Создаем непериодический независимый регистр сведений.
  2. Добавляем измерение Организация (тип СправочникСсылка.Организации).
  3. Добавляем ресурс Касса (тип СправочникСсылка.Кассы) со связью параметров выбора по измерению Организация.

В программном коде получение кассы по умолчанию выполняется быстрым срезом или выборкой из регистра:


Отбор = Новый Структура("Организация", ДокументОбъект.Организация);
КассаПоУмолчанию = РегистрыСведений.ОсновныеКассыОрганизаций.Получить(Отбор).Касса;
Если ЗначениеЗаполнено(КассаПоУмолчанию) Тогда
    ДокументОбъект.Касса = КассаПоУмолчанию;
КонецЕсли;

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

Решение 3. Программное создание элемента с фиксированным Уникальным Идентификатором (UUID)

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


ФиксированныйГУИД = Новый УникальныйИдентификатор("e1c1b0c0-1111-2222-3333-444455556666");
СсылкаНаКассу = Справочники.Кассы.ПолучитьСсылку(ФиксированныйГУИД);

НайденныйОбъект = СсылкаНаКассу.ПолучитьОбъект();
Если НайденныйОбъект = Неопределено Тогда
    НоваяКасса = Справочники.Кассы.СоздатьЭлемент();
    НоваяКасса.УстановитьСсылкуНового(СсылкаНаКассу);
    НоваяКасса.Наименование = "Основная касса (авто)";
    НоваяКасса.Владелец = НужнаяОрганизация;
    НоваяКасса.Записать();
КонецЕсли;

В дальнейшем в коде мы всегда можем обращаться к данному элементу через метод Справочники.Кассы.ПолучитьСсылку(ФиксированныйГУИД), сохраняя стабильность ссылочной целостности базы данных.

← На главную