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

Справочники и Данные · 13 мин

Предопределенный элемент справочника 1С: что это и как с ним работать

Предопределенный элемент справочника 1С — что это, чем отличается от обычного, как создать, найти в коде и удалить. Практические инструкции и типичные ошибки.

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

Классический пример — элемент «Розничный покупатель» в справочнике «Контрагенты» типовой «Управление торговлей». Он нужен для чеков ККМ, где не указывается конкретный покупатель: программа заранее знает, какого контрагента подставить, и разработчик жестко прописал это в коде. Удалить такой элемент обычным способом нельзя — на этом построена защита от порчи логики.

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

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

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

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

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

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

Физически предопределенный элемент — такая же запись в таблице справочника базы данных, как и обычная. Отличие в служебном поле: у записи проставлен признак предопределенности и связь с именем, заданным в метаданных. Когда конфигурация обновляется, платформа сопоставляет предопределенные элементы из метаданных с записями в таблице по этому служебному признаку.

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

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

Пиктограмма в спискеОсобый значок

У предопределенных элементов в списке справочника отличается пиктограмма от обычных

Отказ при удаленииЗащита от удаления

При пометке на удаление программа выдает сообщение о невозможности удалить предопределенный элемент

Имя в метаданныхВидно в Конфигураторе

В Конфигураторе: Справочник → Прочее → Предопределенные — список имен, заданных разработчиком

Как создать предопределенный элемент в Конфигураторе

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

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

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

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

Как обратиться к предопределенному элементу из кода

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

Пример безопасного обращения:

РозничныйПокупатель = Справочники.Контрагенты.РозничныйПокупатель;

Если РозничныйПокупатель.Пустая() Тогда

ВызватьИсключение "Не найден предопределенный элемент ""Розничный покупатель""";

КонецЕсли;

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

bsl
// Получение ссылки на предопределенный элемент
СсылкаНаЭлемент = Справочники.Валюты.Рубль;

// Проверка существования перед использованием
Если СсылкаНаЭлемент.Пустая() Тогда
    // Элемент отсутствует в базе — обработать ситуацию
КонецЕсли;

Можно ли удалить или переименовать предопределенный элемент

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

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

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

Типичные проблемы: дубли и «битые» предопределенные элементы

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

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

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

Типичные ошибки
01
Удаление предопределенного элемента обходными способами — код начинает получать пустые ссылки и падать с ошибками
02
Поиск элемента по наименованию вместо обращения по предопределенному имени — логика ломается, когда пользователь переименует элемент
03
Исправление дублей удалением предопределенного, а не обычного элемента — теряется связь кода с данными
04
Переименование предопределенного элемента в метаданных без поиска всех обращений в коде — ошибки компиляции и пустые ссылки
05
Обновление боевой базы без проверки на копии — незамеченные изменения предопределенных элементов ломают учет

Когда использовать предопределенные элементы в собственных разработках

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

Не стоит делать предопределенными элементы, которые пользователь вправе удалить или существенно изменить: конкретные контрагенты, склады, сотрудники. Для таких случаев лучше подходят настройки (константы, регистры сведений), где администратор сам выбирает нужный элемент из базы, а код читает настройку.

Как хранить «особые» значения

Предопределенный элемент

Подходит, когда элемент — часть логики конфигурации и обращение идет по имени. Ограничение: требует Конфигуратора для изменения состава

Константа со ссылкой

Подходит, когда администратор должен сам выбрать значение (основная касса, основная организация). Ограничение: одно значение на базу

Регистр сведений

Подходит для нескольких настроек или настроек в разрезе организаций/пользователей. Ограничение: чуть сложнее чтение в коде

Поиск по наименованию

Допустим только как временное решение. Хрупко: переименование элемента пользователем ломает логику

Итог

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

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

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

Как понять, что элемент справочника предопределенный?

Откройте список справочника: у предопределенных элементов отличается пиктограмма. Дополнительно попробуйте пометить элемент на удаление — для предопределенного программа выдаст отказ. Точный список предопределенных элементов виден в Конфигураторе: свойства справочника → «Прочее» → «Предопределенные».

Почему после обновления появились два одинаковых элемента?

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

Можно ли изменить наименование предопределенного элемента?

Да, наименование (видимое пользователю название) можно менять в пользовательском режиме — код обращается к элементу по имени предопределенного, а не по наименованию. Но менять наименование стоит осторожно: пользователи и инструкции могут ориентироваться на старое название.

Что делать, если предопределенный элемент случайно удалили?

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

Чем предопределенные данные отличаются от поставляемых профилей и настроек?

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

Можно ли обратиться к предопределенному элементу в запросе?

Напрямую по имени в тексте запроса — нет, запрос не знает имен предопределенных элементов. Обычный прием: сначала в коде получить ссылку через Справочники.Имя.ИмяЭлемента, а затем передать ее в запрос параметром и использовать в условии отбора.