Предопределённые элементы в 1С:Предприятие — это статичные объекты конфигурации, которые создаются на этапе разработки и автоматически появляются в базе данных при её обновлении или первоначальном запуске. Они незаменимы для хранения постоянных справочников (например, единиц измерения, валют, типов документов), перечислений (статусы заказов, виды операций) или планов видов характеристик. Без них прикладные решения теряют структурированность и требуют ручного заполнения после каждого обновления.
В этой статье мы разберём не только техническую сторону создания предопределённых элементов, но и нюансы их применения. Вы узнаете, как правильно добавлять такие элементы в справочники, перечисления и планы видов характеристик, избегая типичных ошибок. Особое внимание уделим различиям между версиями платформы 1С 8.3 и 1С 8.2, а также рассмотрим примеры кода на встроенном языке. Материал будет полезен как начинающим разработчикам, так и опытным программистам, которые хотят систематизировать свои знания.
Прежде чем перейти к практике, важно понять ключевое отличие предопределённых элементов от обычных: они не удаляются при очистке базы данных (например, через команду ЗагрузитьИнформационнуюБазуИзФайла()) и восстанавливаются при обновлении конфигурации. Это делает их идеальным инструментом для хранения системных данных, но требует осторожности при изменении их свойств в уже эксплуатируемых базах.
Что такое предопределённый элемент и зачем он нужен
Предопределённый элемент — это объект конфигурации, который существует одновременно в двух ипостасях:
- 📝 В метаданных — как часть структуры конфигурации (виден в конфигураторе).
- 🗃️ В базе данных — как запись в таблице (виден в пользовательском режиме).
Основные сценарии использования:
- 🔄 Системные справочники: валюты (
Рубль,Доллар США), единицы измерения (шт.,кг), страны. - 📊 Перечисления: статусы документов (
Новый,Оплачен,Отгружен), типы операций. - 🔧 Планы видов характеристик: свойства номенклатуры (
Цвет,Размер). - 📌 Константы с предопределёнными значениями (реже, но возможно).
Главное преимущество — гарантированное наличие таких элементов в базе даже после её полной перезагрузки. Например, если в справочнике Валюты предопределён Рубль, то при создании нового документа ПоступлениеТоваровУслуг пользователь всегда сможет выбрать его в поле Валюта, не опасаясь ошибки "Справочник пуст".
⚠️ Внимание: Предопределённые элементы нельзя удалить в пользовательском режиме (1С заблокирует эту операцию). Однако их можно отметить на удаление, что приведёт к ошибкам при обновлении конфигурации. Всегда проверяйте такие объекты перед выгрузкой изменений!
Виды объектов, поддерживающих предопределённые элементы
Не все объекты конфигурации могут содержать предопределённые элементы. В таблице ниже приведены основные типы с примерами:
| Тип объекта | Примеры использования | Особенности |
|---|---|---|
| Справочники | Валюты, ЕдиницыИзмерения, Контрагенты (группа "Типовые") |
Могут быть иерархическими. Предопределённые элементы часто используются для корневых групп. |
| Перечисления | ВидыДокументов, СтатусыЗаказов, ТипыЦен |
Все элементы перечисления по умолчанию предопределённые. Их нельзя добавлять/удалять в пользовательском режиме. |
| Планы видов характеристик | СвойстваНоменклатуры (цвет, размер), ДополнительныеРеквизиты |
Предопределённые виды характеристик используются для стандартных свойств. |
| Планы видов расчёта | ВидыРасчетаЗарплаты (оклад, премия) |
Реже используются для предопределённых элементов, но возможно. |
Важно понимать, что документы, регистры и отчёты не поддерживают предопределённые элементы в классическом понимании. Однако для документов можно создавать предопределённые шаблоны (через механизм ДокументОбъект.Заполнить()), но это уже другая тема.
Пошаговая инструкция: создание предопределённого элемента в справочнике
Рассмотрим процесс на примере справочника ЕдиницыИзмерения. Предположим, нам нужно добавить предопределённую единицу Литр.
Откройте конфигуратор и перейдите в дерево метаданных:
Общие → Справочники → ЕдиницыИзмерения.Дважды кликните на справочник, чтобы открыть его форму.
Перейдите на закладку
Данныеи нажмите кнопкуДобавить(илиIns).В поле
НаименованиевведитеЛитр, в полеПолное наименование—Литр (л).Установите флажок
Предопределённый(в нижней части формы).Заполните дополнительные реквизиты (например,
Международное обозначение—L).Сохраните изменения (кнопка
ОКилиCtrl+S).
После этого элемент появится в базе данных при следующем обновлении конфигурации. Чтобы проверить его наличие в пользовательском режиме, выполните:
Справочник = Справочники.ЕдиницыИзмерения;
Элемент = Справочник.НайтиПоНаименованию("Литр");
Если Элемент.Пустая() Тогда
Сообщить("Элемент не найден!");
Иначе
Сообщить("ID элемента: " + Элемент.УникальныйИдентификатор());
КонецЕсли;
Убедиться, что флажок "Предопределённый" установлен|
Проверить уникальность наименования (нет дублей)|
Заполнить все обязательные реквизиты|
Сохранить конфигурацию и обновить базу|
Проверить наличие элемента в пользовательском режиме-->
Работа с предопределёнными элементами через код
Иногда требуется программно получить доступ к предопределённому элементу или создать его динамически (например, при миграции данных). Для этого используются методы глобального контекста:
Получение предопределённого элемента:
// Получение по имени (для справочников)
Элемент = Справочники.Валюты.Рубль;
// Получение по идентификатору (универсальный способ)
ИдЭлемента = Новый УникальныйИдентификатор("a4f1d3b2-...-..."); // ID из конфигуратора
Элемент = Справочники.Валюты.ПолучитьСсылку(ИдЭлемента);
Создание предопределённого элемента в коде (для опытных разработчиков):
// Только для случаев, когда элемент ещё не существует в конфигурации!
Процедура СоздатьПредопределенныйЭлемент()
СправочникОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
СправочникОбъект.Наименование = "Килограмм";
СправочникОбъект.ПолноеНаименование = "Килограмм (кг)";
СправочникОбъект.МеждународноеОбозначение = "kg";
СправочникОбъект.ПометкаУдаления = Ложь;
СправочникОбъект.Записать();
// Присвоение статуса "предопределённый" (только в конфигураторе!)
// В пользовательском режиме это сделать нельзя!
КонецПроцедуры
⚠️ Внимание: Динамическое создание предопределённых элементов в пользовательском режиме не поддерживается платформой. Все манипуляции должны выполняться в конфигураторе или через механизм ЗагрузкаДанныхИзФайла() с использованием XML-шаблонов.
Для массовой работы с предопределёнными элементами удобно использовать Запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕдиницыИзмерения.Ссылка КАК Ссылка,
| ЕдиницыИзмерения.Наименование КАК Наименование
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.ЭтоГруппа = ЛОЖЬ
| И ЕдиницыИзмерения.Предопределенный = ИСТИНА";
Результат = Запрос.Выполнить();
Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при работе с предопределёнными элементами. Вот наиболее распространённые ошибки:
- 🔴 Дублирование имён: попытка создать два предопределённых элемента с одинаковым наименованием. 1С не запрещает это на этапе разработки, но при обновлении базы возникнет конфликт.
- 🔴 Изменение идентификаторов: если вы вручную поменяете
УникальныйИдентификаторпредопределённого элемента, это приведёт к разрыву ссылок в базе. - 🔴 Удаление без замены: удаление предопределённого элемента, на который ссылаются документы или регистры, вызовет ошибки целостности.
- 🔴 Несовпадение типов: попытка присвоить предопределённому элементу значение несовместимого типа (например, строковое значение в числовой реквизит).
Чтобы избежать этих проблем, следуйте правилам:
- Всегда проверяйте ссылки на предопределённые элементы перед их изменением (используйте отчёт
Анализ использования метаданныхв конфигураторе). - Для массовых изменений используйте обработки сравнения и объединения (
cf-файлы). - Перед удалением предопределённого элемента замените все ссылки на него в базе (через запрос или обработку).
Что делать, если предопределённый элемент "исчез" после обновления?
Если после обновления конфигурации предопределённый элемент не отображается в пользовательском режиме, проверьте:
1. Флаг "Предопределённый" в конфигураторе (возможно, он был сброшен).
2. Права доступа — у пользователя может не хватать прав на просмотр.
3. Отборы в формах — иногда элементы скрываются условиями отбора.
4. Целостность базы — выполните тестирование и исправление через chdbfl.exe.
Если элемент удалён физически, восстановите его из резервной копии или пересоздайте в конфигураторе с тем же УникальнымИдентификатором
Особенности работы в разных версиях 1С
Механизм предопределённых элементов эволюционировал вместе с платформой. Основные различия между версиями:
| Версия платформы | Особенности | Ограничения |
|---|---|---|
| 1С 8.2 | Поддержка предопределённых элементов только в справочниках и перечислениях. | Нет возможности программно получить список всех предопределённых элементов. |
| 1С 8.3 (до 8.3.10) | Добавлена поддержка в планах видов характеристик. Появился метод Предопределенный(). |
Нет встроенного механизма миграции предопределённых элементов между базами. |
| 1С 8.3.10 и выше | Улучшена работа с УникальнымиИдентификаторами. Появилась возможность экспорта/импорта предопределённых данных через EDT. |
В облачных решениях (1С:Fresh) некоторые методы работы с предопределёнными элементами могут быть ограничены. |
Для версий 1С 8.3.18+ доступен удобный механизм работы с предопределёнными элементами через расширения конфигурации. Это позволяет добавлять новые предопределённые элементы без изменения основной конфигурации, что критично для типовых решений.
⚠️ Внимание: В версиях 1С 8.2 и ранних 8.3 при изменении свойств предопределённого элемента (например, наименования) не обновляются ссылки в уже созданных документах. Это может привести к "битым" ссылкам. Всегда тестируйте такие изменения на копии базы!
Практические примеры: от простого к сложному
Пример 1. Добавление предопределённой валюты
Задача: создать предопределённую валюту Евро со стандартными реквизитами.
// В конфигураторе:
1. Открыть справочник "Валюты".
2. Добавить новый элемент с наименованием "Евро".
3. Установить флажок "Предопределённый".
4. Заполнить реквизиты:
- Код: "EUR"
- Кратность: 1
- Курс: 1 (по умолчанию)
5. Сохранить.
Пример 2. Массовое создание предопределённых элементов через обработку
Если нужно добавить несколько элементов (например, список стран), удобно использовать обработку:
Процедура ЗаполнитьСправочникСтраны()
МассивСтран = Новый Массив;
МассивСтран.Добавить("Россия,RU");
МассивСтран.Добавить("Германия,DE");
МассивСтран.Добавить("Франция,FR");
Для Каждого Строки Из МассивСтран Цикл
Данные = РазложитьСтрокуВМассив(Строки, ",");
Наименование = Данные[0];
Код = Данные[1];
Элемент = Справочники.Страны.СоздатьЭлемент();
Элемент.Наименование = Наименование;
Элемент.Код = Код;
Элемент.Предопределенный = Истина; // Только в конфигураторе!
Элемент.Записать();
КонецЦикла;
КонецПроцедуры
Пример 3. Использование предопределённых элементов в коде модуля
Типичная задача: при создании документа автоматически подставлять предопределённую валюту Рубль:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Новый Тогда
ЭтотОбъект.Валюта = Справочники.Валюты.Рубль;
КонецЕсли;
КонецПроцедуры
Для ускорения разработки создайте обработку-"шаблон" с часто используемыми предопределёнными элементами (валюты, единицы измерения, статусы). Это сэкономит время при написании нового кода.
FAQ: Частые вопросы по предопределённым элементам
Можно ли изменить наименование предопределённого элемента после обновления базы?
Да, но с осторожностью. Изменение наименования не ломает ссылки в базе, так как они привязаны к УникальномуИдентификатору, а не к имени. Однако:
- В уже созданных документах отобразится новое наименование.
- Если наименование используется в печатных формах или отчётах, их придётся корректировать.
- В внешних системах (например, при обмене данными) может потребоваться обновление маппинга.
Рекомендуется тестировать такие изменения на копии базы.
Как перенести предопределённые элементы из одной базы в другую?
Есть несколько способов:
- Через cf-файл: выгрузите конфигурацию с предопределёнными элементами и загрузите в целевую базу. Минус — перенесутся все изменения конфигурации.
- Через XML: используйте универсальный формат обмена данными. Пример кода для выгрузки:
Данные = Новый XMLЗапись;Данные.УстановитьСтроку();
Данные.ЗаписатьОбъект(Справочники.ЕдиницыИзмерения.Литр);
ТекстXML = Данные.Закрыть();
- Через обработку: напишите скрипт, который создаёт элементы в целевой базе с теми же
УникальнымиИдентификаторами.
Важно: при переносе следите за коллизиями идентификаторов — если в целевой базе уже есть элемент с таким же UUID, возникнет ошибка.
Почему предопределённый элемент не отображается в списке выбора?
Причин может быть несколько:
- 🔹 Отбор в форме: проверьте настройки формы справочника — возможно, элемент скрыт условием (например,
ПометкаУдаления = Ложь). - 🔹 Права доступа: у пользователя может не хватать прав на просмотр предопределённых элементов (проверьте роль
Чтениедля справочника). - 🔹 Ошибка конфигурации: если элемент был удалён в конфигураторе, но не обновлена база, он будет отсутствовать в списке.
- 🔹 Несовпадение идентификаторов: если в базе есть элемент с таким же
UUID, но другими данными, может произойти конфликт.
Для диагностики используйте запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ ЕдиницыИзмерения.Ссылка, ЕдиницыИзмерения.Наименование ИЗ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
Если элемент есть в результате запроса, но не виден в форме — проблема в интерфейсе.
Как удалить предопределённый элемент, если он больше не нужен?
Удаление предопределённого элемента — рискованная операция. Следуйте алгоритму:
- Проверьте все ссылки на элемент в базе (используйте отчёт
Анализ использования метаданных). - Если есть зависимости:
- Для документов: замените ссылки на другой элемент или удалите документы.
- Для регистров: очистите записи с этой ссылкой.
Предопределённый в конфигураторе.⚠️ Если элемент используется в типовых механизмах (например, Валюты.Рубль), его удаление может сломать функциональность!
Можно ли создать предопределённый элемент в регистре сведений?
Нет, регистры сведений (как и другие регистры) не поддерживают предопределённые элементы в классическом понимании. Однако есть обходные пути:
- 🔹 Инициализация при старте: в модуле приложения или сеанса проверять наличие записи и создавать её при отсутствии.
- 🔹 Использование справочника: создать справочник с предопределёнными элементами и ссылаться на него из регистра.
- 🔹 Константы: если данные статичные, хранить их в константах.
Пример кода для инициализации:
Процедура ПриНачалеРаботыСистемы()
Если НЕ РегистрыСведений.КурсыВалют.НайтиПоРеквизиту("Валюта", Справочники.Валюты.ДолларUSA) Тогда
Запись = РегистрыСведений.КурсыВалют.СоздатьЗапись();
Запись.Валюта = Справочники.Валюты.ДолларUSA;
Запись.Курс = 75;
Запись.Дата = ТекущаяДата();
Запись.Записать();
КонецЕсли;
КонецПроцедуры
Предопределённые элементы — это мощный инструмент для обеспечения целостности данных в 1С. Их правильное использование уменьшает риск ошибок при обновлениях и миграциях, но требует внимательного отношения к изменению свойств. Всегда тестируйте изменения на копии базы перед применением в рабочей среде!