Работа с предопределенными элементами в 1С:Предприятие — одна из ключевых задач при настройке конфигураций. Эти элементы отличаются от обычных тем, что их идентификаторы жестко закреплены в коде системы, что обеспечивает стабильность ссылки даже при переносе базы или обновлении. Однако часто возникает ситуация, когда уже существующий элемент справочника нужно сделать предопределенным — например, при доработке типовых конфигураций или миграции данных из старой системы.
Процесс преобразования кажется простым только на первый взгляд. На практике он требует учета множества нюансов: от корректного задания UUID до проверки ссылочной целостности. Ошибки на этом этапе могут привести к потере данных при обновлении конфигурации или конфликтам при обмене данными между базами. В этой статье мы разберем все этапы — от подготовки до финальной проверки, — а также рассмотрим альтернативные подходы для разных версий платформы.
Что такое предопределенные элементы и зачем они нужны
Предопределенные элементы в 1С — это объекты метаданных, которые создаются не пользователем в процессе работы, а разработчиком на этапе конфигурирования. Их главные особенности:
- 🔹 Фиксированный идентификатор — каждый элемент имеет уникальный
UUID, который не меняется при переносе базы или обновлении. - 🔹 Гарантированное наличие — система автоматически создает их при инициализации базы данных.
- 🔹 Защита от удаления — пользователь не может удалить их через интерфейс (только программно).
- 🔹 Использование в коде — на них можно ссылаться напрямую в модулях, не боясь, что ссылка "обломится".
Типичные примеры применения: Справочники (виды номенклатуры, единицы измерения, валюты), Планы видов характеристик (стандартные свойства товаров), Перечисления (статусы документов).
Без предопределенных элементов сложно обеспечить стабильную работу типовых механизмов, например, обмена данными между базами или интеграции с внешними системами.
⚠️ Внимание: В конфигурациях на управляемых формах (8.3+) предопределенные элементы могут вести себя иначе, чем в обычных. Например, при изменении свойств такого элемента через интерфейс система может создать его копию вместо модификации оригинала.
Подготовка к преобразованию: что нужно проверить до начала
Прежде чем делать элемент предопределенным, выполните обязательные проверки:
- Анализ ссылок — убедитесь, что на элемент нет ссылок из других объектов (документов, регистров). Используйте отчет
"Анализ ссылочной целостности"(Все функции → Стандартные → Анализ ссылочной целостности). - Резервное копирование — создайте резервную копию базы данных. Преобразование может привести к необратимым изменениям.
- Права доступа — проверьте, что у вашей учетной записи есть права на изменение конфигурации (
Администрирование → Пользователи). - Версия платформы — в 1С:Предприятие 8.3.20+ алгоритм может отличаться от более ранних версий.
Особое внимание уделите идентификатору объекта. Если вы преобразуете элемент, который уже используется в коде (например, в обработках или отчетах), после изменения его UUID все ссылки станут невалидными. В таких случаях лучше создать новый предопределенный элемент и перенастроить ссылки на него.
Метод 1: Преобразование через конфигуратор (стандартный способ)
Это самый надежный способ, который работает во всех актуальных версиях платформы. Инструкция:
- Откройте конфигуратор в режиме
"1С:Предприятие"(с правами администратора). - Перейдите в ветку метаданных к нужному справочнику (
Объекты → Справочники → [ВашСправочник]). - В палитре свойств справочника найдите вкладку
"Данные"и раздел"Предопределенные элементы". - Нажмите
"Добавить"и заполните поля:- 📌 Имя — уникальный идентификатор (латиницей, без пробелов, например
"BaseCurrencyRUB"). - 📌 Синоним — отображаемое имя (можно на русском).
- 📌 Значение — выберите существующий элемент справочника из списка.
- 📌 Имя — уникальный идентификатор (латиницей, без пробелов, например
- Сохраните конфигурацию (
F7) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных). - 🔧 Метод
УстановитьПредопределенноеДанное()доступен только в режиме конфигуратора. - 🔧 Имя предопределенного данного (
"BaseCurrencyRUB") должно совпадать с именем в метаданных. - 🔧 После выполнения кода требуется обновление конфигурации базы.
- 🔸 1С:Предприятие 7.7 — предопределенные элементы создавались только через конфигуратор, без программного интерфейса. Требуется ручное редактирование
MD-файлов. - 🔸 1С:Предприятие 8.2 — появился метод
УстановитьПредопределенноеДанное(), но работа сUUIDбыла менее стабильной. - 🔸 1С:Предприятие 8.3 (до 8.3.15) — добавлена поддержка предопределенных элементов в управляемых формах, но оставались проблемы с обменом данными.
- 🔸 1С:Предприятие 8.3.16+ — реализована полноценная поддержка
UUID, улучшена стабильность при обновлениях. - Экспорт/импорт через XML:
- 📤 Экспортируйте справочник в
XML(Все функции → Выгрузка данных). - 📥 Редактируйте файл вручную, добавляя атрибут
IsPredefined="true". - 📥 Импортируйте обратно с флагом
"Создавать предопределенные".
- 📤 Экспортируйте справочник в
- Использование обработок:
- 🛠 Применяйте готовые обработки из каталога Infostart (например,
"Универсальная обработка предопределенных элементов"). - 🛠 Настройте параметры для вашего справочника и запустите в тестовом режиме.
- 🛠 Применяйте готовые обработки из каталога Infostart (например,
После обновления проверьте результат в пользовательском режиме. Предопределенный элемент должен отображаться с иконкой замочка 🔒 в списке справочника.
☑️ Проверка после преобразования
Метод 2: Программное создание предопределенного элемента
Если стандартный способ недоступен (например, в старых версиях платформы) или нужно автоматизировать процесс, используйте встроенный язык 1С. Пример кода для создания предопределенного элемента в справочнике "Валюты":
// Получаем ссылку на справочник
Справочник = Справочники.Валюты;
// Создаем новый предопределенный элемент
НовыйЭлемент = Справочник.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Российский рубль";
НовыйЭлемент.Код = "810";
НовыйЭлемент.ПометкаУдаления = Ложь;
// Устанавливаем как предопределенный
НовыйЭлемент.УстановитьПредопределенноеДанное("BaseCurrencyRUB");
// Записываем в базу
НовыйЭлемент.Записать();
Ключевые моменты:
⚠️ Внимание: При программном создании предопределенных элементов в 1С:Предприятие 8.3.18+ может срабатывать контроль уникальности имен. Если имя уже используется, система выдаст ошибку "Предопределенное данное с таким именем уже существует".
Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при работе с предопределенными элементами. Рассмотрим самые распространенные:
| Ошибка | Причина | Решение |
|---|---|---|
| Элемент не становится предопределенным после обновления | Не выполнено обновление конфигурации базы данных | Запустите Конфигурация → Обновить конфигурацию базы данных |
| Дублирование элементов после преобразования | Система создала новый элемент вместо модификации существующего | Удалите дубликат вручную или через обработку |
| Ошибка "Не найден предопределенный элемент" | Не совпадает имя в метаданных и в коде | Проверьте регистр и синтаксис в методе УстановитьПредопределенноеДанное() |
| Потеря ссылок на элемент в документах | Изменился UUID элемента при преобразовании | Используйте обработку для переназначения ссылок |
Одна из самых коварных ошибок — неявное дублирование. Например, если вы преобразуете элемент, на который уже есть ссылки в регистрах сведений, система может создать его копию с новым UUID, оставив старую версию. Чтобы этого избежать, всегда проверяйте результат через запрос:
ВЫБРАТЬ
Ссылка,
ЭтоПредопределенныеДанные() КАК Предопределенный
ИЗ
Справочник.Валюты
Если после преобразования элемент исчез из списка справочника, проверьте фильтр "Показывать предопределенные" в настройках формы. Иногда система скрывает их по умолчанию.
Особенности работы в разных версиях 1С
Алгоритм создания предопределенных элементов эволюционировал вместе с платформой. Основные отличия:
В последних версиях (8.3.20+) появилась возможность массового преобразования элементов в предопределенные через обработки. Например, для переноса данных из старой базы в новую:
Пример кода для массового преобразования
Предупреждение: Этот код следует запускать только в тестовой базе!
Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Попытка // Пробуем установить как предопределенный Выборка.Ссылка.УстановитьПредопределенноеДанное("Ном_" + Выборка.Ссылка.УникальныйИдентификатор()); Сообщить("Успешно: " + Выборка.Наименование); Исключение Сообщить("Ошибка: " + ОписаниеОшибки()); КонецПопытки; КонецЦикла;// Получаем все элементы справочника
Для работы с 1С:ERP или 1С:КА 2.4 рекомендуется использовать типовой механизм "Перенос данных", который автоматически обрабатывает предопределенные элементы при миграции.
Альтернативные подходы: когда стандартные методы не работают
Если преобразование через конфигуратор или программно невозможно (например, из-за ограничений версий или прав), рассмотрите эти варианты:
- 🔧 Подключитесь к базе через SQL и обновите поле
IsPredefinedв таблице справочника. - 🔧 Обязательно сделайте бэкап перед изменением!
⚠️ Внимание: Ручное редактирование базы данных через SQL может нарушить целостность данных. Этот метод следует использовать только в крайних случаях и после тестирования на копии базы.
Прежде чем применять альтернативные методы, оценивайте риски. Например, редактирование XML может привести к ошибкам загрузки, если структура файла будет нарушена.
FAQ: Частые вопросы по предопределенным элементам
Можно ли сделать предопределенным элемент, который уже используется в документах?
Да, но с осторожностью. Система сохраняет ссылки на элемент, однако при некоторых операциях (например, обновлении конфигурации) может создать дубликат. Перед преобразованием проверьте все ссылки через запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Документ.Ссылка КАК Документ,
Документ.Дата,
Документ.Номенклатура КАК СсылкаНаЭлемент
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Номенклатура = &СсылкаНаЭлемент
Если найдутся документы, лучше создать новый предопределенный элемент и переназначить ссылки.
Почему после обновления конфигурации предопределенный элемент исчез?
Это типичная проблема при конфликте версий. Возможные причины:
- 🔹 В новой версии конфигурации элемент с таким именем уже существует (но с другим
UUID). - 🔹 При обновлении был сброшен флаг
"Сохранять предопределенные данные". - 🔹 Элемент был помечен на удаление в старой версии.
Решение: проверьте журнал обновления (Администрирование → Журнал регистрации) и восстановите элемент через конфигуратор.
Как перенести предопределенные элементы между базами?
Используйте типовой механизм "Выгрузка/загрузка данных XML" с флагом "Включая предопределенные элементы". Альтернатива — обработка "Универсальный обмен данными" (доступна на Infostart). Важно:
- 🔹 В целевой базе должны существовать справочники с теми же именами предопределенных элементов.
- 🔹 При конфликте
UUIDсистема может создать дубликаты.
Для сложных случаев (например, переноса между разными конфигурациями) используйте "Конвертацию данных".
Можно ли отменить предопределенность элемента?
Технически да, но это не рекомендуется. Чтобы убрать статус предопределенного:
- Удалите элемент из списка предопределенных в конфигураторе.
- Обновите конфигурацию базы.
- Удалите все ссылки на элемент в коде (иначе будут ошибки при запуске).
Как проверить, является ли элемент предопределенным программно?
Используйте функцию ЭтоПредопределенныеДанные():
Если Справочники.Номенклатура.НайтиПоНаименованию("Товар 1").ЭтоПредопределенныеДанные() Тогда
Сообщить("Элемент предопределенный");
Иначе
Сообщить("Элемент обычный");
КонецЕсли;
Для проверки по ссылке:
Сообщить(Справочники.Номенклатура.ПустаяСсылка().ЭтоПредопределенныеДанные()); // Вернет Ложь