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