При доработке типовых или самописных конфигураций разработчики иногда сталкиваются с ситуацией: требуется создать предопределенный элемент в справочнике через дерево метаданных конфигуратора, однако командная панель в окне предопределенных элементов оказывается неактивной, а кнопка добавления заблокирована. Разберем причину такого поведения платформы 1С:Предприятие и рассмотрим архитектурные варианты решения задачи.
Главная и наиболее частая причина недоступности кнопки добавления предопределенных элементов — справочник является подчиненным. В типовых конфигурациях (например, УПП, КА, ERP, УТ) справочник Кассы подчинен справочнику Организации.
Проанализируем механику работы платформы: у любого подчиненного справочника существует обязательный системный реквизит Владелец. Предопределенные элементы описываются на уровне метаданных в конфигураторе еще до того, как в информационной базе появятся конкретные элементы данных. Поскольку платформа не может на этапе конфигурации знать, какому именно элементу-владельцу (конкретной организации) будет принадлежать создаваемый предопределенный элемент, создание предопределенных данных для подчиненных справочников запрещено на уровне платформы.
Это правило работает в обе стороны:
Если кнопка добавления предопределенного элемента недоступна, выполним последовательную диагностику объекта метаданных:
Когда требуется автоматически подставлять определенный элемент подчиненного справочника (например, кассу при фоновом создании приходного кассового ордера или регламентных операциях), используем альтернативные подходы вместо создания предопределенных элементов.
Рассмотрим вариант, при котором связь задается непосредственно в объекте-владельце. В справочник Организации добавляем реквизит ОсновнаяКасса с типом ссылки на справочник Кассы.
В свойствах этого реквизита настраиваем связь параметров выбора по владельцу: Отбор.Владелец(Ссылка). Это исключит возможность выбрать кассу чужой организации. При выполнении алгоритма (в том числе в серверных и фоновых вызовах) касса определяется напрямую через организацию документа:
КассаДокумента = ДокументОбъект.Организация.ОсновнаяКасса;
Если ЗначениеЗаполнено(КассаДокумента) Тогда
ДокументОбъект.Касса = КассаДокумента;
КонецЕсли;
Если нежелательно менять состав реквизитов основного справочника, разберем более гибкий вариант — создание независимого регистра сведений (например, ОсновныеКассыОрганизаций).
Организация (тип СправочникСсылка.Организации).Касса (тип СправочникСсылка.Кассы) со связью параметров выбора по измерению Организация.В программном коде получение кассы по умолчанию выполняется быстрым срезом или выборкой из регистра:
Отбор = Новый Структура("Организация", ДокументОбъект.Организация);
КассаПоУмолчанию = РегистрыСведений.ОсновныеКассыОрганизаций.Получить(Отбор).Касса;
Если ЗначениеЗаполнено(КассаПоУмолчанию) Тогда
ДокументОбъект.Касса = КассаПоУмолчанию;
КонецЕсли;
Такой подход удобен тем, что пользователи с соответствующими правами могут легко перенастроить значения в режиме «1С:Предприятие» без снятия конфигурации с поддержки и без изменения метаданных документов.
Если алгоритм жестко привязан к конкретному элементу и требуется эмулировать поведение предопределенного значения в коде, сформируем псевдопредопределенный элемент через фиксированный УникальныйИдентификатор при первом запуске или обновлении базы данных.
ФиксированныйГУИД = Новый УникальныйИдентификатор("e1c1b0c0-1111-2222-3333-444455556666");
СсылкаНаКассу = Справочники.Кассы.ПолучитьСсылку(ФиксированныйГУИД);
НайденныйОбъект = СсылкаНаКассу.ПолучитьОбъект();
Если НайденныйОбъект = Неопределено Тогда
НоваяКасса = Справочники.Кассы.СоздатьЭлемент();
НоваяКасса.УстановитьСсылкуНового(СсылкаНаКассу);
НоваяКасса.Наименование = "Основная касса (авто)";
НоваяКасса.Владелец = НужнаяОрганизация;
НоваяКасса.Записать();
КонецЕсли;
В дальнейшем в коде мы всегда можем обращаться к данному элементу через метод Справочники.Кассы.ПолучитьСсылку(ФиксированныйГУИД), сохраняя стабильность ссылочной целостности базы данных.