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