Разработка и Конфигурация · 12 мин
Как из обычного элемента справочника сделать предопределённый в 1С
Как превратить обычный элемент справочника в предопределённый в 1С: настройка в конфигураторе, привязка через имя предопределённых данных, типовые ошибки и проверка результата.
Предопределённые элементы справочников в 1С нужны, когда код конфигурации должен гарантированно обращаться к конкретному элементу — например, к валюте «Рубль», группе «Услуги» или виду номенклатуры «Товар». Обычный элемент, созданный пользователем в режиме предприятия, для этого не подходит: у него нет имени предопределённых данных, и обратиться к нему через Справочники.Валюты.Рубль нельзя. Задача сводится к тому, чтобы связать существующий элемент с именем предопределённых данных, заданным в конфигураторе.
Есть два принципиально разных сценария. Первый — конфигурация находится на поддержке и может изменяться: тогда предопределённый элемент создаётся в конфигураторе, и платформа сама свяжет его с существующим элементом базы. Второй — конфигурация типовая и дорабатывать её нельзя: тогда привязку выполняют обработкой через установку свойства ИмяПредопределенныхДанных у объекта. Оба способа рабочие, но у каждого есть условия и риски.
Ниже разобраны оба пути: подготовка, точные действия, проверка результата и типичные ошибки, из-за которых привязка «слетает» или возникают дубли элементов.
Что такое предопределённый элемент и чем он отличается от обычного
Предопределённый элемент — это элемент справочника (или плана видов характеристик, плана счетов, плана видов расчёта), который описан в конфигураторе на закладке «Предопределённые» соответствующего объекта метаданных. У него есть имя, по которому к нему обращаются из кода: Справочники.Организации.ОсновнаяОрганизация. Такое обращение не зависит от наименования, кода и ссылки — оно работает, пока существует привязка имени к элементу данных.
Обычный элемент создаётся пользователем в режиме 1С:Предприятие и существует только в базе данных. У него свойство Предопределенный равно Ложь, а ИмяПредопределенныхДанных — пустая строка. Программно найти его можно только по наименованию, коду или реквизиту, что ненадёжно: пользователь может переименовать элемент, и код перестанет работать.
Важно понимать: «сделать элемент предопределённым» — это не изменение типа записи, а установка связи. Сам элемент в базе остаётся тем же, с тем же GUID и историей в документах. Меняется только служебное поле привязки и флаг предопределённости.
Когда какой способ выбирать
Выбор способа зависит от того, можете ли вы менять конфигурацию. Если конфигурация собственная или снята с поддержки — правильный путь через конфигуратор: предопределённые элементы описываются декларативно, обновляются вместе с конфигурацией и корректно переносятся между базами. Если конфигурация типовая на полной поддержке и доработка нежелательна — используют программную привязку обработкой.
Как выбрать действие
Отдельный случай — расширения конфигурации. В расширении можно добавить собственные предопределённые элементы к заимствованному справочнику, не снимая типовую конфигурацию с поддержки. Это удобно, когда доработка должна жить отдельно от основной конфигурации и обновляться независимо.
Способ 1: через конфигуратор
Откройте конфигуратор, найдите нужный справочник в дереве конфигурации и перейдите на закладку «Предопределённые» (в некоторых версиях — кнопка «Предопределённые элементы» в палитре свойств или на закладке «Данные»). Добавьте новый элемент: задайте имя (латиницей, без пробелов — именно оно будет использоваться в коде), наименование и при необходимости заполните реквизиты.
Ключевой момент: если в базе уже есть элемент с таким же наименованием, при обновлении конфигурации базы данных платформа попытается автоматически привязать новый предопределённый элемент к существующему. Сопоставление выполняется по наименованию (и коду в некоторых случаях). Поэтому перед обновлением убедитесь, что наименование предопределённого элемента в конфигураторе в точности совпадает с наименованием существующего элемента в базе — иначе получите дубль.
- 1Откройте конфигуратор и сделайте резервную копию базы (через выгрузку в dt или средствами СУБД)
- 2В дереве конфигурации откройте нужный справочник, закладку «Предопределённые»
- 3Добавьте элемент: имя латиницей, наименование — в точности как у существующего элемента в базе
- 4Заполните реквизиты предопределённого элемента, если они должны отличаться от текущих
- 5Обновите конфигурацию базы данных (F7 в режиме отладки или через меню Конфигурация)
- 6В режиме предприятия проверьте: у элемента появился признак предопределённости, дублей не возникло
После обновления проверьте результат в пользовательском режиме: предопределённые элементы обычно выделяются в списке справочника специальной пиктограммой. Программно проверка выглядит так: Справочники.ИмяСправочника.ИмяЭлемента должна вернуть ссылку именно на тот элемент, который существовал раньше (сравните GUID до и после).
Способ 2: программная привязка без изменения конфигурации
Если конфигурацию менять нельзя, но предопределённый элемент в ней уже описан (а в базе вместо него оказался обычный дубль — типичная ситуация после загрузки данных из внешних источников), привязку выполняют кодом. У объекта справочника есть доступное для записи свойство ИмяПредопределенныхДанных.
Логика такая: находите существующий элемент (по наименованию или ссылке), получаете его объект, присваиваете имя предопределённых данных и записываете. Если предопределённый «пустой» дубль уже существует в базе отдельной записью, его предварительно нужно пометить на удаление или удалить, иначе будет конфликт имён.
Элемент = Справочники.Валюты.НайтиПоНаименованию("Рубль");
Если Не Элемент.Пустая() Тогда
Объект = Элемент.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "Рубль";
Объект.Записать();
КонецЕсли;Для выполнения такого кода используют внешнюю обработку, открываемую через «Файл — Открыть», либо консоль кода из состава инструментов разработчика. Выполнять код нужно с полными правами и в монопольном режиме не обязательно, но желательно в момент, когда с элементом никто не работает.
Особый случай: типовые конфигурации и автоматическое обновление
В типовых конфигурациях (Бухгалтерия, Управление торговлей, ЗУП) большинство нужных предопределённых элементов уже создано разработчиками. Проблема возникает, когда при первоначальном заполнении или обмене данными вместо предопределённого элемента создаётся обычный с похожим наименованием. Тогда в базе существуют два элемента: «настоящий» предопределённый и пользовательский дубль, на который заведены документы.
Здесь правильная последовательность обратная: сначала переносят ссылки с дубля на предопределённый элемент (обработкой поиска и замены значений), затем дубль помечают на удаление. Просто переименовывать дубль или пытаться сделать его предопределённым в типовой конфигурации не нужно — при очередном обновлении привязка может конфликтовать с поставляемыми данными.
Проверка результата
После любого из способов убедитесь, что привязка работает. Признаки корректного результата: обращение через менеджер справочника возвращает непустую ссылку; ссылка указывает на нужный элемент (GUID совпадает с тем, что был до привязки); в списке справочника элемент отображается с отметкой предопределённого; попытка удалить элемент интерактивно блокируется платформой.
Как проверить результат
Возвращается ссылка на нужный элемент
Возвращается пустая ссылка или ошибка «Предопределенный элемент не найден»
GUID не изменился, документы ссылаются на тот же элемент
GUID другой — создан новый элемент, старый остался дублём
Один элемент, он же предопределённый
Два и более элемента с похожими наименованиями
Платформа запрещает интерактивное удаление
Элемент удаляется как обычный — привязка не выполнена
Дополнительно полезно проверить свойства элемента кодом: Объект.Предопределенный должно быть Истина, а Объект.ИмяПредопределенныхДанных — содержать заданное имя. Это самый надёжный способ убедиться, что связь установлена на уровне данных.
Типичные ошибки и ограничения
Есть и принципиальные ограничения. Имя предопределённых данных должно существовать в метаданных: нельзя придумать имя «на лету» в режиме предприятия, не описав его в конфигураторе или расширении. Предопределённые элементы нельзя удалить интерактивно — только сняв пометку предопределённости через конфигуратор. В иерархических справочниках предопределённым может быть и группа, и элемент — это задаётся в конфигураторе отдельным признаком.
Что важно запомнить
Превращение обычного элемента в предопределённый — это установка связи с именем предопределённых данных, а не создание нового элемента. Предпочтительный путь — через конфигуратор с точным совпадением наименований; для типовых конфигураций — программная привязка через ИмяПредопределенныхДанных. Всегда делайте копию, проверяйте GUID и отсутствие дублей после операции.
Частые вопросы
Можно ли сделать элемент предопределённым без конфигуратора и без кода?
Нет. Признак предопределённости устанавливается либо платформой при обновлении конфигурации базы данных, либо программно через свойство ИмяПредопределенныхДанных. Штатными интерактивными средствами режима предприятия эта связь не редактируется — это сделано намеренно, чтобы пользователи не могли нарушить логику конфигурации.
Что будет с документами, которые ссылаются на элемент?
Ничего, если привязка выполнена к существующему элементу: его GUID не меняется, и все ссылки в документах остаются рабочими. Проблемы возникают только если вместо привязки был создан новый предопределённый элемент-дубль — тогда документы продолжают ссылаться на старый «обычный» элемент, и ссылки нужно переносить отдельной обработкой.
Почему после обновления конфигурации появился дубль элемента?
Чаще всего потому, что наименование предопределённого элемента в конфигураторе не совпало в точности с наименованием элемента в базе (лишний пробел, другой регистр, сокращение). Платформа не нашла кандидата для привязки и создала новый элемент. Лечение: перенести ссылки на предопределённый элемент, а дубль пометить на удаление.
Можно ли отменить предопределённость элемента?
Да, но только через конфигуратор: нужно удалить соответствующий элемент из списка предопределённых в метаданных и обновить конфигурацию базы данных. Сам элемент данных при этом не удаляется — он становится обычным. Учтите, что код, обращающийся к нему по имени, перестанет работать.
Работает ли программная привязка в клиент-серверном режиме и при обмене РИБ?
Присвоение имени предопределённых данных работает независимо от режима работы базы. Однако в распределённых базах РИБ привязку нужно выполнять осознанно: изменения предопределённых элементов мигрируют по своим правилам, и расхождение привязок между узлами может привести к дублям при обмене. Надёжнее выполнять привязку в центральном узле и контролировать её распространение.
Как добавить предопределённый элемент, не снимая типовую конфигурацию с поддержки?
Используйте расширение конфигурации: заимствуйте нужный справочник в расширение и добавьте на закладке предопределённых собственный элемент с уникальным именем. Типовая конфигурация при этом остаётся на поддержке, а привязка к существующему элементу базы выполняется тем же способом — через совпадение наименования при подключении расширения или программно.