К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как из обычного элемента справочника сделать предопределённый в 1С

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

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

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

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

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

Предопределённый элемент — это элемент справочника (или плана видов характеристик, плана счетов, плана видов расчёта), который описан в конфигураторе на закладке «Предопределённые» соответствующего объекта метаданных. У него есть имя, по которому к нему обращаются из кода: Справочники.Организации.ОсновнаяОрганизация. Такое обращение не зависит от наименования, кода и ссылки — оно работает, пока существует привязка имени к элементу данных.

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

Важно понимать: «сделать элемент предопределённым» — это не изменение типа записи, а установка связи. Сам элемент в базе остаётся тем же, с тем же GUID и историей в документах. Меняется только служебное поле привязки и флаг предопределённости.

Когда какой способ выбирать

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

Маршрут решения

Как выбрать действие

Конфигурацию можно изменять (собственная или снята с поддержки)Создайте предопределённый элемент в конфигураторе и обновите конфигурацию базы данных
Конфигурация типовая на поддержке, дорабатывать нельзяПривяжите элемент программно через свойство ИмяПредопределенныхДанных
Нужный элемент уже есть в базе и используется в документахНе создавайте новый элемент — привяжите имя к существующему, чтобы не потерять ссылки
Предопределённый элемент нужен только для обмена или расширенияРассмотрите добавление предопределённого элемента через расширение конфигурации

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

Способ 1: через конфигуратор

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

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

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и сделайте резервную копию базы (через выгрузку в dt или средствами СУБД)
  2. 2
    В дереве конфигурации откройте нужный справочник, закладку «Предопределённые»
  3. 3
    Добавьте элемент: имя латиницей, наименование — в точности как у существующего элемента в базе
  4. 4
    Заполните реквизиты предопределённого элемента, если они должны отличаться от текущих
  5. 5
    Обновите конфигурацию базы данных (F7 в режиме отладки или через меню Конфигурация)
  6. 6
    В режиме предприятия проверьте: у элемента появился признак предопределённости, дублей не возникло

После обновления проверьте результат в пользовательском режиме: предопределённые элементы обычно выделяются в списке справочника специальной пиктограммой. Программно проверка выглядит так: Справочники.ИмяСправочника.ИмяЭлемента должна вернуть ссылку именно на тот элемент, который существовал раньше (сравните GUID до и после).

Способ 2: программная привязка без изменения конфигурации

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

Логика такая: находите существующий элемент (по наименованию или ссылке), получаете его объект, присваиваете имя предопределённых данных и записываете. Если предопределённый «пустой» дубль уже существует в базе отдельной записью, его предварительно нужно пометить на удаление или удалить, иначе будет конфликт имён.

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

Для выполнения такого кода используют внешнюю обработку, открываемую через «Файл — Открыть», либо консоль кода из состава инструментов разработчика. Выполнять код нужно с полными правами и в монопольном режиме не обязательно, но желательно в момент, когда с элементом никто не работает.

Особый случай: типовые конфигурации и автоматическое обновление

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

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

Проверка результата

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

Контрольные точки

Как проверить результат

Обращение Справочники.Имя.ИмяЭлемента в коде
Норма

Возвращается ссылка на нужный элемент

Тревожный признак

Возвращается пустая ссылка или ошибка «Предопределенный элемент не найден»

GUID элемента до и после привязки
Норма

GUID не изменился, документы ссылаются на тот же элемент

Тревожный признак

GUID другой — создан новый элемент, старый остался дублём

Количество элементов с таким наименованием
Норма

Один элемент, он же предопределённый

Тревожный признак

Два и более элемента с похожими наименованиями

Удаление элемента в режиме предприятия
Норма

Платформа запрещает интерактивное удаление

Тревожный признак

Элемент удаляется как обычный — привязка не выполнена

Дополнительно полезно проверить свойства элемента кодом: Объект.Предопределенный должно быть Истина, а Объект.ИмяПредопределенныхДанных — содержать заданное имя. Это самый надёжный способ убедиться, что связь установлена на уровне данных.

Типичные ошибки и ограничения

Типичные ошибки
01
Наименование в конфигураторе не совпадает с наименованием в базе — при обновлении создаётся дубль вместо привязки
02
Попытка присвоить ИмяПредопределенныхДанных, которое не описано в конфигураторе, — платформа отклоняет запись или связь не работает
03
Привязка к имени, уже занятому другим элементом, — конфликт и ошибки при обращении к предопределённому элементу
04
Удаление «лишнего» предопределённого элемента до переноса ссылок — документы остаются с битыми ссылками
05
Выполнение привязки без резервной копии — при ошибке откат невозможен без восстановления базы

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

Итог

Что важно запомнить

Превращение обычного элемента в предопределённый — это установка связи с именем предопределённых данных, а не создание нового элемента. Предпочтительный путь — через конфигуратор с точным совпадением наименований; для типовых конфигураций — программная привязка через ИмяПредопределенныхДанных. Всегда делайте копию, проверяйте GUID и отсутствие дублей после операции.

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

Можно ли сделать элемент предопределённым без конфигуратора и без кода?

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

Что будет с документами, которые ссылаются на элемент?

Ничего, если привязка выполнена к существующему элементу: его GUID не меняется, и все ссылки в документах остаются рабочими. Проблемы возникают только если вместо привязки был создан новый предопределённый элемент-дубль — тогда документы продолжают ссылаться на старый «обычный» элемент, и ссылки нужно переносить отдельной обработкой.

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

Чаще всего потому, что наименование предопределённого элемента в конфигураторе не совпало в точности с наименованием элемента в базе (лишний пробел, другой регистр, сокращение). Платформа не нашла кандидата для привязки и создала новый элемент. Лечение: перенести ссылки на предопределённый элемент, а дубль пометить на удаление.

Можно ли отменить предопределённость элемента?

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

Работает ли программная привязка в клиент-серверном режиме и при обмене РИБ?

Присвоение имени предопределённых данных работает независимо от режима работы базы. Однако в распределённых базах РИБ привязку нужно выполнять осознанно: изменения предопределённых элементов мигрируют по своим правилам, и расхождение привязок между узлами может привести к дублям при обмене. Надёжнее выполнять привязку в центральном узле и контролировать её распространение.

Как добавить предопределённый элемент, не снимая типовую конфигурацию с поддержки?

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