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

· 9 мин

Содержание

Добавить предопределенный элемент в справочник 1С через расширение можно так: заимствуйте справочник в расширение, откройте у заимствованного объекта список предопределенных данных и добавьте туда новый элемент с префиксом расширения. Если в справочнике стоит «Не обновлять автоматически», сам элемент в базе создаст не платформа, а ваш код в модуле менеджера. Типовая конфигурация при этом остаётся на поддержке.

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

Что такое предопределенный элемент и чем он отличается от обычного

Предопределенный элемент — запись справочника, которая описана в метаданных. У неё есть имя (свойство ИмяПредопределенныхДанных), и код обращается к ней напрямую:

// На сервере
Ссылка = Справочники.ВидыНоменклатуры.Расш1_Маркетплейсы;

// На клиенте и сервере
Ссылка = ПредопределенноеЗначение("Справочник.ВидыНоменклатуры.Расш1_Маркетплейсы");

Отличия от обычного элемента:

  • 🔒 пользователь не может удалить его или пометить на удаление — платформа защищает такие записи;
  • 🏷️ имя живёт в метаданных, наименование и код можно менять без последствий для кода;
  • 🧩 у записи в базе свойство Предопределенный равно Истина, а ИмяПредопределенныхДанных содержит имя из метаданных;
  • ⚙️ создание записи зависит от свойства справочника «Обновление предопределенных данных».

Последний пункт — ключ ко всей теме. Свойство находится в окне редактирования справочника на закладке «Прочее» и принимает три значения:

ЗначениеКто создаёт запись в базеЧто это значит для расширения
АвтоПлатформа, если в конфигурации не задано иноеЭлемент появится сам после применения расширения
Обновлять автоматическиПлатформаЭлемент появится сам
Не обновлять автоматическиПрикладной кодНужен код создания, иначе обращение по имени даст ошибку

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) у многих справочников стоит «Не обновлять автоматически». Предопределенные данные там создаёт механизм обновления информационной базы. Поэтому одной строчки в метаданных часто мало — нужен ещё код.

Подготовка расширения и заимствование справочника

Расширения доступны в платформе 8.3.6 и новее. Работа идёт в Конфигураторе.

  1. Откройте Конфигурация → Расширения конфигурации. Если расширения ещё нет, нажмите «Добавить».
  2. В свойствах расширения задайте имя и префикс, например Расш1_. Префикс отделяет ваши объекты и имена от типовых.
  3. Откройте конфигурацию расширения. В дереве основной конфигурации найдите справочник, щёлкните правой кнопкой и выберите «Добавить в расширение».
  4. Справочник появится в дереве расширения со значком заимствования.

Режим совместимости расширения не должен быть выше режима совместимости основной конфигурации. Иначе расширение не применится. Проверьте оба свойства до начала работы.

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

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

Добавление элемента в список предопределенных данных расширения

Откройте окно редактирования заимствованного справочника, закладка «Прочее», кнопка «Предопределенные». Откроется список. Типовые элементы в нём видны, но менять их нельзя — они принадлежат основной конфигурации.

  1. Нажмите «Добавить».
  2. В поле «Имя» укажите имя с префиксом: Расш1_Маркетплейсы.
  3. Заполните «Наименование» и, если код не формируется автоматически, «Код».
  4. Сохраните расширение и обновите конфигурацию базы данных (F7 или Конфигурация → Обновить конфигурацию базы данных).

Если кнопки добавления в списке нет или она недоступна, проблема в версии платформы или в режиме совместимости. В этом случае обновите платформу либо поднимите режим совместимости расширения в допустимых пределах.

Правила для имени:

  • ✅ начинается с префикса расширения — без него Конфигуратор выдаст предупреждение при проверке;
  • ✅ латиница или кириллица без пробелов, как обычный идентификатор;
  • ❌ не совпадает с именем типового предопределенного элемента;
  • ❌ не меняется после выпуска расширения: код и данные привязаны к имени.

Переименование предопределенного элемента после того, как он создан в базе, разрывает связь с записью: в базе остаётся старое имя, а платформа ищет новое.

Код в модуле менеджера расширения: создание и привязка элемента

Если справочник обновляется автоматически, этот раздел можно пропустить: элемент появится при первом обращении после применения расширения. Для режима «Не обновлять автоматически» напишите процедуру, которая создаёт запись.

Где разместить код

В расширении откройте модуль менеджера заимствованного справочника (контекстное меню справочника → «Открыть модуль менеджера»). В заимствованный модуль можно добавлять собственные процедуры — основная конфигурация их не видит, но они работают при подключённом расширении.

Алгоритм

Процедура должна быть идемпотентной: сколько бы раз её ни вызвали, в базе останется ровно один элемент.

  1. Найти запись, у которой ИмяПредопределенныхДанных уже равно нужному имени. Нашли — выйти.
  2. Если пользователи раньше завели такой элемент вручную, найти его по наименованию и привязать, а не создавать дубль.
  3. Иначе создать новую запись и присвоить имя.
Процедура Расш1_СоздатьПредопределенныеЭлементы() Экспорт

	УстановитьПривилегированныйРежим(Истина);

	ИмяЭлемента = "Расш1_Маркетплейсы";

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Т.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ВидыНоменклатуры КАК Т
	|ГДЕ
	|	Т.ИмяПредопределенныхДанных = &Имя";
	Запрос.УстановитьПараметр("Имя", ИмяЭлемента);

	Если Не Запрос.Выполнить().Пустой() Тогда
		Возврат; // элемент уже есть
	КонецЕсли;

	// Ручной элемент с тем же наименованием привязываем, а не дублируем
	НайденнаяСсылка = НайтиПоНаименованию("Маркетплейсы", Истина);

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

	ЭлементОбъект.ИмяПредопределенныхДанных = ИмяЭлемента;
	ЭлементОбъект.Записать();

КонецПроцедуры

Код написан внутри модуля менеджера, поэтому НайтиПоНаименованию и СоздатьЭлемент вызываются без префикса Справочники.ВидыНоменклатуры.

Присвоить ИмяПредопределенныхДанных можно только имя, которое описано в метаданных. Если забыли добавить элемент в список предопределенных или не обновили конфигурацию базы, запись упадёт с ошибкой. Порядок всегда такой: метаданные → обновление БД → код.

Если конфигурация на БСП

В типовых на БСП 3.1 и новее в модуле менеджера многих справочников есть процедуры начального заполнения, например ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти). Если она есть у вашего справочника, удобнее не писать свой алгоритм, а дополнить типовой:

&После("ПриНачальномЗаполненииЭлементов")
Процедура Расш1_ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти)

	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "Расш1_Маркетплейсы";
	Элемент.Наименование = НСтр("ru = 'Маркетплейсы'");

КонецПроцедуры

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

Когда вызывать процедуру

  • 🔁 из обработчика обновления, если в вашей конфигурации расширения регистрируют свои обработчики;
  • 🛠️ однократно из внешней обработки или консоли кода после установки расширения;
  • 🚀 при начале работы системы на сервере — только если проверка дешёвая, как в примере (один запрос с ПЕРВЫЕ 1).

Благодаря проверке в начале процедуры повторный вызов ничего не испортит.

Группы, вложенность и дополнительные реквизиты

Предопределенная группа

Если справочник иерархический с видом «Иерархия групп и элементов», в списке предопределенных у новой строки есть флажок «Это группа». Включите его — запись станет группой. Дочерние предопределенные элементы добавляйте прямо внутрь неё: выделите группу и нажмите «Добавить».

Порядок создания в коде важен: сначала группа, потом элементы. У элемента нужно заполнить Родитель ссылкой на группу:

ЭлементОбъект.Родитель = Справочники.ВидыНоменклатуры.Расш1_ГруппаПродажиОнлайн;

Помещать свой предопределенный элемент внутрь типовой предопределенной группы можно. А вот переносить типовые предопределенные элементы в свою группу не стоит: обновление конфигурации может вернуть их на место или сломать иерархию.

Реквизиты, которые нужно заполнить сразу

В списке предопределенных задаются только имя, код, наименование и признак группы. Остальные реквизиты (тип, ставка НДС, единица измерения) заполняйте в коде перед Записать():

ЭлементОбъект.Описание = "Создан расширением Расш1";

Если реквизит — ваш собственный, добавленный в заимствованный справочник расширением, он доступен в коде так же, как типовой, по своему имени с префиксом.

💡 Проверьте, есть ли у справочника проверка заполнения обязательных реквизитов в ОбработкаПроверкиЗаполнения. При программной записи она не вызывается, и элемент может сохраниться с пустым обязательным полем. Пользователь потом не сможет записать его из формы.

Распределённая база, отключение расширения и другие ошибки

Диагностика: выберите симптом

Распределённая информационная база

В РИБ запись должна появиться один раз — в главном узле, а в подчинённые прийти обменом. В начале процедуры создания добавьте проверку:

Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
	Возврат; // это подчинённый узел, элемент придёт из главного
КонецЕсли;

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

Отключение и удаление расширения

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

Перед установкой расширения и первым запуском процедуры в рабочей базе сделайте выгрузку .dt или резервную копию СУБД. Программная запись в справочник затрагивает всех пользователей сразу.

Проверка элемента в режиме 1С:Предприятие

Запустите базу из Конфигуратора с отладкой (F5) — расширение применится автоматически.

  1. Поставьте точку останова в процедуре создания и пройдите её по шагам (F11, F10). Убедитесь, что ветка привязки ручного элемента срабатывает так, как вы ожидаете.
  2. Откройте справочник через «Все функции» → «Справочники» (команда включается в Сервис → Параметры флажком «Отображать команду Все функции»). Новый элемент должен быть в списке, а команда удаления на нём — недоступна.
  3. Выполните запрос в консоли запросов:
ВЫБРАТЬ
	Т.Ссылка,
	Т.Наименование,
	Т.ИмяПредопределенныхДанных
ИЗ
	Справочник.ВидыНоменклатуры КАК Т
ГДЕ
	Т.Предопределенный

Строка Расш1_Маркетплейсы должна встречаться ровно один раз. Две строки — дубль, ни одной — процедура не отработала.

  1. Вызовите процедуру ещё раз и повторите запрос. Количество строк не должно измениться.
  2. Проверьте работу под пользователем без полных прав: обращение к элементу по имени не требует прав на запись, а создание — требует. Поэтому в процедуре стоит УстановитьПривилегированныйРежим(Истина).
Перед передачей расширения в рабочую базу
Выполнено: 0 / 5

Частые вопросы

Можно ли изменить наименование типового предопределенного элемента из расширения?
В метаданных — нет, типовые строки списка предопределенных в расширении не редактируются. Наименование записи в базе можно поменять обычным способом, на код это не влияет.
Сохранится ли элемент после обновления типовой конфигурации?
Да. Обновление меняет основную конфигурацию, а элемент описан в расширении. После обновления проверьте, что расширение применяется без ошибок.
Нужно ли снимать конфигурацию с поддержки?
Нет. В этом и смысл расширения: основная конфигурация остаётся на полной поддержке и обновляется штатно.
Можно ли добавить предопределенный элемент в справочник, созданный самим расширением?
Да, у собственного справочника расширения список предопределенных редактируется полностью, как в обычной конфигурации.
Можно ли сделать предопределенным уже существующий обычный элемент?
Да. Добавьте имя в список предопределенных расширения, обновите конфигурацию базы и присвойте это имя записи через ИмяПредопределенныхДанных, как в ветке привязки из примера. Ссылки в документах не изменятся.