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