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

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

В отличие от обычных ссылок, которые хранятся в таблицах базы данных и могут меняться при перепроведении документов или перезагрузке конфигурации, предопределенные значения "вшиты" в структуру метаданных. Это означает, что обращение к ним происходит мгновенно, так как системе не нужно выполнять запрос к хранилищу данных для определения внутреннего идентификатора (GUID). Именно этот механизм лежит в основе работы многих встроенных функций и операторов языка запросов.

Сущность и назначение предопределенных ссылок

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

Использование таких ссылок позволяет платформе автоматически разрешать их в актуальные идентификаторы в момент выполнения программы. Это особенно важно для типовых решений, таких как 1С:Бухгалтерия или 1С:Управление торговлей, где структура данных может значительно меняться между версиями релизов. Разработчик может смело писать код, обращаясь к элементу по его имени в конфигураторе, не опасаясь, что после обновления база данных "потеряет" связь с этим элементом.

Технически предопределенное значение хранит в себе не сам GUID, а ссылку на описание метаданных. В момент выполнения операции платформа считывает это описание и подставляет текущий актуальный идентификатор объекта. Это гарантирует, что даже если администратор базы данных переименует элемент или изменит его свойства, код продолжит работать корректно, так как привязка идет к логическому имени, а не к физическому адресу в таблице.

⚠️ Внимание: Предопределенные значения создаются только для тех объектов метаданных, у которых в свойствах установлена соответствующая галочка. Если вы попытаетесь обратиться к элементу справочника, у которого не задано предопределенное значение, система выдаст ошибку выполнения.

Стоит также отметить, что механизм предопределенных значений тесно связан с типизацией в языке 1С. Компилятор строго следит за тем, чтобы тип переменной соответствовал типу метаданных. Например, нельзя присвоить предопределенное значение документа переменной типа "СправочникСсылка". Такая строгость помогает избегать логических ошибок еще на этапе проверки модуля.

📊 Как часто вы используете предопределенные значения в коде?
Только в типовых конфигурациях
Постоянно в своих разработках
Редко, предпочитаю поиск по наименованию
Не использую, не понимаю разницы

Отличия от обычных ссылок и GUID

Чтобы окончательно разобраться в теме, необходимо четко разграничить понятия обычной ссылки, GUID и предопределенного значения. Обычная ссылка — это объект, который существует только в контексте конкретной информационной базы. Он указывает на конкретную запись в таблице. GUID (Globally Unique Identifier) — это уникальный 16-байтовый код, который присваивается объекту при его создании и теоретически никогда не повторяется.

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

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

  • 🔹 Обычная ссылка: Зависит от конкретной базы данных, требует наличия записи в таблице, может стать битой при удалении объекта.
  • 🔹 GUID: Уникальный технический идентификатор, неудобен для чтения в коде, меняется при пересоздании объекта.
  • 🔹 Предопределенное значение: Логическая ссылка на уровне метаданных, не зависит от базы, обеспечивает стабильность кода при обновлениях.

Еще одно важное отличие кроется в механизме сериализации и передачи данных. При обмене данными между разными узлами распределенной информационной базы (РИБ) предопределенные значения передаются в виде имен метаданных, а не байтовых массивов GUID. Это позволяет принимающей стороне корректно сопоставить объект, даже если порядок создания объектов в базах различался.

💡

При отладке сложных алгоритмов используйте окно "Отладка" и наведите курсор на переменную с предопределенным значением — вы увидите не только имя, но и актуальный GUID, в который оно разрешилось в текущей сессии.

Настройка и создание в конфигураторе

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

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

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

Объект метаданных Возможность создания Пример имени в коде Особенности
Перечисление Все элементы Перечисления.Статусы.ВРаботе Наиболее частый сценарий использования
Справочник Конкретные элементы Справочники.Контрагенты.ОсновнойПоставщик Требует уникального имени элемента
План счетов Конкретные счета ПланыСчетов.Хозрасчетный.Касса Имя должно совпадать с кодом или именем счета
Виды расчетов Конкретные виды ПланыВидовРасчета.ОсновныеНачисления.Оклад Используется в подсистеме зарплаты

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

Что будет, если изменить имя предопределенного значения?

Если вы измените свойство "ИмяПредопределенныхДанных" в конфигураторе и обновите базу, старый код, использующий прежнее имя, перестанет компилироваться. Система выдаст ошибку "Неизвестный идентификатор". Вам придется найти все использования старого имени и заменить их на новое.

Использование в программном коде 1С

Работа с предопределенными значениями в коде 1С интуитивно понятна и синтаксически проста. Доступ к ним осуществляется через глобальные контексты, имена которых совпадают с именами коллекций метаданных. Синтаксис обращения выглядит как цепочка свойств, разделенных точками. Это позволяет IDE 1С предоставлять мощную автоподстановку, что снижает количество опечаток.

Рассмотрим пример работы с перечислением. Допустим, у нас есть перечисление СтатусыЗаказа с элементом ВОбработке. Чтобы проверить статус документа, нам не нужно выполнять запрос к базе или искать элемент по наименованию. Мы просто сравниваем значение реквизита с предопределенным значением:

Если Заказ.Статус = Перечисления.СтатусыЗаказа.ВОбработке Тогда

Сообщить("Заказ находится в работе");

КонецЕсли;

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

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

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

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

⚠️ Внимание: Не используйте предопределенные значения в динамических запросах, формируемых через конкатенацию строк, без экранирования. Хотя сами имена безопасны, неправильное построение текста запроса может привести к синтаксическим ошибкам. Используйте параметризированные запросы.

Применение в языке запросов

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

Использование предопределенных значений в запросах позволяет избежать сложных соединений с таблицами значений для фильтрации по конкретным элементам. Например, если нужно отобрать все документы со статусом "Проведен", достаточно указать предопределенное значение в условии ГДЕ:

ВЫБРАТЬ

Документы.РеализацияТоваровУслуг.Ссылка КАК Ссылка

ИЗ

Документы.РеализацияТоваровУслуг

ГДЕ

Документы.РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ

И Документы.РеализацияТоваровУслуг.Статус = &СтатусПроведен

В параметре &СтатусПроведен передается предопределенное значение. Компилятор запросов оптимизирует такой запрос, преобразуя логическое имя в конкретный идентификатор для выполнения на стороне СУБД. Это обеспечивает высокую скорость выборки данных даже на больших объемах информации.

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

☑️ Проверка использования в запросе

Выполнено: 0 / 4

Типичные ошибки и способы их устранения

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

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

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

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

Для диагностики проблем можно использовать метод ПолучитьПредопределенноеЗначение в динамических сценариях, когда имя объекта известно только в runtime. Этот метод позволяет получить ссылку по строковому имени, что полезно при разработке универсальных обработок или расширений.

💡

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

Часто задаваемые вопросы (FAQ)

Можно ли создать предопределенное значение для группы справочника?

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

Что произойдет, если переименовать предопределенный элемент в интерфейсе 1С?

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

Как найти все использования предопределенного значения в коде?

В конфигураторе используйте команду "Найти в модулях" (Ctrl+Shift+F). Введите имя предопределенного значения (например, Перечисления.Статусы.Новый). Система найдет все места, где это значение используется в программном коде, запросах и СКД.

Можно ли использовать предопределенные значения в внешних обработках?

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

Влияет ли использование предопределенных значений на производительность базы?

Наоборот, их использование повышает производительность. Так как разрешение имени происходит на клиенте или сервере приложений без обращения к таблицам базы данных для поиска идентификатора, это снижает нагрузку на СУБД и ускоряет выполнение операций сравнения и присваивания.