Пред.история: При доработке конфигурации ЗУП (доработка делается в расширении) очень понадобилось создать собственный справочник с предопределенными элементами. Решить задачу стандартным образом - ни как, поиск в интернете дал отрицательный результат, типа в конфигурации на сей день это еще не реализовано. Задача на грани срыва и тут именно в голову :) приходит мысль: - а в чем особое различие между пользовательскими и предопределенными элементами? Основное: пользователь не может менять Имя и при открытии они всегда на верху (в первых строках) + запрет на удаление. Вот тут и возникла идея создать собственные "предопределенные" элементы. Пример выполнен на самом простом нужном мне справочнике.
1. Создаем справочник с нужными реквизитами, добавляем еще реквизит типа Булево (имя свое, типа "НеИзменять", а заголовок "Предопределенный").
2. Создаем Форму элемента и Форму списка.
3. В обоих формах процедуры "ПриОткрытии". В Форме списка еще процедуру для первоначального заполнения типа ЗаполнитьПредопределенные() и получается почти идеальный справочник.
Модуль формы элемента:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.НеИзменять Тогда
//выдаем предупреждение оставляем Наименование без изменения
Элементы.Наименование.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
Модуль формы списка:
&НаСервере
Процедура ПриОткрытииНаСервере()
//Проверим, есть ли что-нибудь в справочнике
КолЭлементов = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|КОЛИЧЕСТВО(ССЫЛКА) КАК ВсегоЭлементов
|ИЗ
| Справочник.Тар_КатегорииСотрудников КАК Тар_КатегорииСотрудников";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КолЭлементов = КолЭлементов + Выборка.ВсегоЭлементов;
КонецЦикла;
Если КолЭлементов = 0 Тогда //Если справочник еще пустой
ЗаполнитьПредопределенные();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПредопределенные()
// заполним "предопределенными" элементами
НовыйЭл = Справочники.Тар_КатегорииСотрудников.СоздатьЭлемент();
НовыйЭл.Наименование = "Первая";
НовыйЭл.НеИзменять = Истина;
НовыйЭл.Коэффициент = 1.1;
НовыйЭл.Записать();
НовыйЭл = Справочники.Тар_КатегорииСотрудников.СоздатьЭлемент();
НовыйЭл.Наименование = "Вторая";
НовыйЭл.НеИзменять = Истина;
НовыйЭл.Коэффициент = 1.2;
НовыйЭл.Записать();
НовыйЭл = Справочники.Тар_КатегорииСотрудников.СоздатьЭлемент();
НовыйЭл.Наименование = "Высшая";
НовыйЭл.НеИзменять = Истина;
НовыйЭл.Коэффициент = 1.3;
НовыйЭл.Записать();
Элементы.Список.Обновить();
КонецПроцедуры
Модуль объекта:
Процедура ПередУдалением(Отказ)
//Очень нужная вещь, но.... для РАСШИРЕНИЯ НЕ работает!!!
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
// Как-то странно работает!
// Задано условие, что если справочник пустой
// нужно заполнить его "предопределенными" элементами
// но..., ошибка записи предопределенных!
КонецПроцедуры
Вот практически все решение задачи за исключением запрета удаления "предопределенных". Возможно кому-то пригодится как шаблон для собственных нужд, пока 1С-ники не внедрят эту функцию в расширение.
Буду очень благодарен тому, кто подскажет решение на запрет удаления. Возможно кто-то предложит более оптимально-эффективный вариант.
Расширение тестировалось на Платформе 8.3.16.1224, но должно работать и на других. Прикрепляю файл с готовым примером реализации.