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

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

Для чего нужны предопределённые элементы в 1С

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

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

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

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

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

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

У предопределённого элемента есть два слоя свойств. Имя предопределённых данных задаётся разработчиком и не меняется пользователем, а наименование, код и прочие реквизиты заполняются в базе при первом запуске или обновлении. Пользователь видит «Российский рубль», а код обращается к Справочники.Валюты.НайтиПоИмени("RUB") или к менеджеру предопределённого элемента.

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

Для чего они нужны на практике

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

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

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

Как код обращается к предопределённым элементам

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

В современных конфигурациях на БСП применяется переопределяемый модуль, где предопределённые значения перечислены явно, а в коде используется функция вида ПредопределенноеЗначение("Справочник.Валюты.RUB"). Такое обращение работает и на клиенте, и на сервере, и не требует запроса к базе для получения ссылки.

bsl
СсылкаРубль = ПредопределенноеЗначение("Справочник.Валюты.RUB");
// или через менеджер:
СсылкаРубль = Справочники.Валюты.НайтиПоИмени("RUB");

Важно понимать разницу между двумя вызовами. ПредопределенноеЗначение возвращает ссылку без обращения к данным объекта, а поиск по имени выполняет запрос и вернёт пустую ссылку, если элемент в базе отсутствует. Для проверки существования элемента используют метод ПолучитьСсылку с последующей проверкой заполненности.

Типовые сценарии использования

Бухгалтерский учёт: план счетов

План счетов — самый наглядный пример. Практически все счета типового плана предопределённые: 01, 10, 41, 51, 62, 68 и так далее. Проводки в документах формируются именно по этим счетам, поэтому их удаление или смена кода нарушит учёт. Пользователь может добавлять собственные субсчета (например, 10.11), и они будут обычными элементами, подчинёнными предопределённому родителю.

Зарплата: виды расчётов

Начисления «Оплата по окладу», «Премия», удержания «НДФЛ» — предопределённые элементы планов видов расчёта. Алгоритмы расчёта зарплаты, формирования ведомостей и отчётности в фонды ссылаются на них. Если бухгалтеру нужна особая премия, он создаёт новый элемент копированием — он будет обычным и не сломается при обновлении.

Торговля: валюты, ставки НДС, типы цен

Справочник валют содержит предопределённый рубль, перечисления ставок НДС жёстко привязаны к алгоритмам расчёта документов, а типовые цены («Закупочная», «Розничная») часто поставляются предопределёнными, чтобы механизмы ценообразования работали «из коробки» сразу после установки.

Режимы обновления предопределённых данных

У объекта метаданных есть свойство «Обновление предопределённых данных» с тремя вариантами: «Авто», «Не обновлять» и «Обновлять». Режим определяет, что произойдёт с элементами базы при обновлении конфигурации.

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

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

Сравнение режимов обновления

Авто

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

Не обновлять

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

Обновлять

Подходит для жёстко контролируемых данных вроде плана счетов. Ограничение: любые отклонения от типового состояния будут устранены при обновлении.

Типичные проблемы и их диагностика

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

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

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

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

Как проверить корректность работы

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

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

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

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

Наличие типовых элементов в списке справочника
Норма

Элементы присутствуют, помечены как предопределённые, не удаляются

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

Элемент отсутствует или удаляется без предупреждений

Проведение типового документа
Норма

Документ проводится, проводки формируются по правильным счетам

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

Ошибка «предопределённый элемент не найден» или пустые счета в проводках

Поведение при обновлении релиза
Норма

Новые предопределённые элементы появляются автоматически

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

После обновления код падает с ошибками поиска элементов

Когда создавать свой предопределённый элемент

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

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

Порядок создания предопределённого элемента
  1. 1
    Откройте объект в конфигураторе и перейдите: Прочее → Предопределённые данные.
  2. 2
    Добавьте элемент, задайте уникальное имя и наименование.
  3. 3
    Проверьте режим обновления предопределённых данных у объекта.
  4. 4
    Обновите конфигурацию базы данных и убедитесь, что элемент появился в режиме «Предприятие».
  5. 5
    Замените в коде поиск по наименованию на ПредопределенноеЗначение и протестируйте.
Итог

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

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

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

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

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

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

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

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

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

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

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

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

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

Где посмотреть список всех предопределённых элементов объекта?

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