К статье
Практический материал

Справочники и Данные · 11 мин

Как перенести предопределенные элементы справочника в 1С

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

Предопределённые элементы справочника — это записи, которые созданы не пользователем, а разработчиком конфигурации, и связаны с элементами метаданных. Их перенос вызывает больше всего вопросов: обычная выгрузка через стандартные обработки часто теряет связь с метаданными, и после загрузки элемент становится «обычным», а программный код, обращающийся к нему по имени, перестаёт работать.

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

Ключевая сложность в том, что в 1С:Предприятии 8.3 предопределённые элементы хранятся в таблице справочника, а их связь с метаданными определяется полем имени предопределённых данных. Если просто скопировать элементы через COM-соединение или обработку выгрузки/загрузки, это поле либо обнулится, либо запишется некорректно — итогом будут дубли и ошибки вида «Предопределенный элемент не найден».

Как проверить, какие предопределённые элементы есть в справочнике

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

Если конфигурация приёмника не содержит предопределённых элементов с такими же именами, переносить их «как есть» бессмысленно: связь с метаданными в приёмнике установить будет не с чем. Сначала сопоставьте имена в обеих конфигурациях и составьте таблицу соответствий — это сэкономит время на этапе загрузки.

Пиктограмма элементаЖёлтая точка или особый значок

Элемент предопределённый, требуется сохранить имя предопределённых данных

В конфигураторе нет предопределённых данныхРежим обновления предопределённых данных отключён

Проверьте настройку «Обновление предопределённых данных» в свойствах конфигурации

Элемент в базе есть, но код его не находитПотеряна связь с метаданными

Проверьте значение поля ИмяПредопределенныхДанных у элемента

Способ 1: автоматическое создание при обновлении конфигурации

Самый безопасный способ «перенести» предопределённые элементы — не переносить их вовсе, а дать платформе создать их автоматически. Если в конфигурации приёмника предопределённые элементы описаны в метаданных, то при обновлении конфигурации базы данных платформа сама создаст их в таблицах. Для этого в свойствах конфигурации должно быть установлено значение «Обновление предопределённых данных» — «Автоматически».

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

Порядок действий при обновлении конфигурации
  1. 1
    Сделайте резервную копию базы приёмника
  2. 2
    Откройте конфигуратор, проверьте свойство «Обновление предопределённых данных»
  3. 3
    Установите значение «Автоматически» и выполните обновление конфигурации базы данных
  4. 4
    Откройте справочник в режиме предприятия и убедитесь, что предопределённые элементы созданы
  5. 5
    При необходимости верните прежнее значение настройки обновления

Способ 2: типовая обработка выгрузки и загрузки данных XML

Для переноса между разными конфигурациями чаще всего используют универсальную обработку «Выгрузка и загрузка данных XML». Она позволяет выгрузить элементы справочника в файл и загрузить их в другую базу с сохранением ссылок по GUID. Однако для предопределённых элементов есть нюанс: стандартная версия обработки выгружает элементы как обычные, и поле имени предопределённых данных может быть потеряно.

Чтобы перенос прошёл корректно, проверьте настройки обработки: должна быть включена выгрузка предопределённых элементов и, при необходимости, режим поиска по уникальному идентификатору. Если ваша версия обработки не поддерживает перенос имени предопределённых данных, загружайте элементы как обычные, а затем доработайте их программно — об этом ниже.

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

Способ 3: программный перенос и установка имени предопределённых данных

Когда обработки не справляются, имя предопределённых данных устанавливают программно. У объекта справочника есть свойство «ИмяПредопределенныхДанных», которое доступно для записи. Типовой сценарий: найти элемент в приёмнике по наименованию или GUID, установить ему нужное имя и записать.

bsl
Элемент = Справочники.Валюты.НайтиПоНаименованию("USD");
Если Не Элемент.Пустая() Тогда
    Объект = Элемент.ПолучитьОбъект();
    Объект.ИмяПредопределенныхДанных = "USD";
    Объект.Записать();
КонецЕсли;

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

Перенос предопределённых элементов в управляемом приложении и на сервере

В клиент-серверном варианте и при использовании управляемых форм есть дополнительные ограничения. Начиная с поздних версий платформы 8.3, прямое обращение к предопределённым элементам на клиенте через конструкцию вида Справочники.Валюты.USD может быть недоступно — используйте вызовы на сервере или функцию ПредопределенноеЗначение, которая работает и в клиентском контексте.

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

Типичные ошибки и как их избежать

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

Типичные ошибки при переносе
01
Загрузка без сопоставления GUID — в приёмнике появляются дубли, ссылки из документов указывают на старые элементы
02
Присвоение имени предопределённых данных, которого нет в метаданных — ошибка при записи или при обновлении конфигурации
03
Перенос без резервной копии — при ошибке восстановить связи элементов с документами становится трудоёмко
04
Игнорирование пометки удаления старого дубля — пользователи продолжают выбирать неправильный элемент в документах

Чтобы избежать этих проблем, всегда работайте по схеме: резервная копия → сопоставление элементов → загрузка → проверка → удаление дублей с заменой ссылок. Для замены ссылок используйте типовую обработку «Поиск и удаление дублей» из состава библиотеки стандартных подсистем — она корректно переназначит ссылки из документов на основной элемент.

Как проверить результат переноса

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

Дополнительно проверьте документы, которые используют эти элементы: откройте несколько документов до и после переноса и убедитесь, что реквизиты заполнены теми же значениями. Если база большая, выборочной проверки по нескольким типам документов обычно достаточно, чтобы выявить системную проблему.

Контрольные точки

Как проверить результат

Пиктограмма элемента в списке
Норма

Значок предопределённого элемента, дублей нет

Тревожный признак

Элемент выглядит как обычный или существует в двух экземплярах

Обращение из кода по имени
Норма

Возвращается ссылка на нужный элемент

Тревожный признак

Ошибка «Предопределенный элемент не найден»

Ссылки в документах
Норма

Реквизиты указывают на корректный элемент

Тревожный признак

Пустые значения или ссылки на дубли

Итог

Что важно запомнить

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

Частые вопросы

Можно ли удалить предопределённый элемент справочника?

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

Почему после загрузки элемент стал обычным, а не предопределённым?

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

Что делать, если в приёмнике уже есть предопределённый элемент с таким именем?

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

Переносятся ли предопределённые элементы при конвертации данных 2.1?

Да, в «Конвертации данных» можно настроить правила конвертации объектов для предопределённых элементов и указать поиск по имени предопределённых данных. Это один из надёжных способов при регулярных обменах между разнородными конфигурациями.

Как найти все предопределённые элементы, потерявшие связь с метаданными?

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

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

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