Переименование объекта метаданных 1С без битых ссылок

· 9 мин

Содержание

Чтобы поменять ссылку на объект в 1С, меняют свойство Имя объекта метаданных в конфигураторе, а затем вручную правят все текстовые обращения к старому имени: модули, тексты запросов, схемы компоновки, строковые параметры. Внутренние связи (типы реквизитов, состав подсистем, права ролей) платформа перестроит сама. Строки в коде она не трогает — их ищут через Правка → Глобальный поиск и проверку конфигурации.

Всё ниже относится к платформе 8.3 и любой конфигурации на ней: БП 3.0, ЗУП 3.1, УТ 11 или самописной. Различается только одно — стоит ли конфигурация на поддержке.

Как 1С хранит ссылки на объекты конфигурации

У каждого объекта метаданных есть два «адреса»:

  • 🔑 внутренний идентификатор (UUID) — его не видно в интерфейсе, по нему объекты связаны между собой внутри конфигурации;
  • 🏷 Имя — строка вида Номенклатура, по ней к объекту обращается код: Справочники.Номенклатура, Справочник.Номенклатура в запросе, Метаданные.Справочники.Номенклатура.

Отсюда простое правило. Всё, что настроено мышкой в палитре свойств, держится за UUID и переживёт переименование. Всё, что набрано текстом, держится за имя и сломается.

Где используется объектЧем держитсяПосле смены имени
Тип реквизита, табличной части, ресурсаUUIDобновится сам
Состав подсистем, права в роляхUUIDобновится сам
Основание документа, регистратор регистраUUIDобновится сам
Код модулейтекстнужна ручная правка
Тексты запросов в модулях и СКДтекстнужна ручная правка
Шаблоны ограничения доступа (RLS)текстнужна ручная правка
ПредопределенноеЗначение("..."), Метаданные.Найти("...")строкаошибка только при выполнении
Правила обмена, внешние обработки, COM-подключениятекст вне конфигурацииправится отдельно

А имя таблицы в СУБД не зависит от имени объекта. В базе справочник лежит в таблице с техническим именем вроде _Reference123. Поэтому переименование не трогает данные: все элементы справочника и ссылки на них в документах останутся на месте.

Если нужно поменять только то, что видит пользователь (название в меню, заголовок списка), меняйте Синоним, а не Имя. Синоним в коде не используется, и переименование по синониму ничего не ломает.

Подготовка: что проверить до смены имени

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

Перед работой:

  1. Сделайте выгрузку информационной базы: Администрирование → Выгрузить информационную базу в конфигураторе, файл .dt.
  2. Сохраните конфигурацию в файл .cf — так проще сравнить «до» и «после».
  3. Выясните, стоит ли конфигурация на поддержке: Конфигурация → Поддержка → Настройка поддержки.
  4. Проверьте, есть ли расширения: Конфигурация → Расширения конфигурации.
  5. Узнайте, есть ли внешние потребители: обмены, внешние отчёты, интеграции через COM или HTTP-сервисы.

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

Перед переименованием
Выполнено: 0 / 5

Пошагово: меняем имя объекта в конфигураторе

Шаг 1. Найдите все места использования

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

Текстовые обращения этот поиск не показывает. Их ищите на шаге 4.

Шаг 2. Захватите объект в хранилище

Если база подключена к хранилищу конфигурации, захватите сам объект и все модули, где встречается имя. Иначе правку кода не получится сделать за один заход.

Шаг 3. Смените свойство Имя

  1. Откройте палитру свойств объекта (Alt+Enter).
  2. В поле Имя введите новое значение. Допустимы буквы, цифры и подчёркивание, первым символом цифра быть не может.
  3. При необходимости поправьте Синоним и представления объекта и списка.

Платформа сразу переименует объект в дереве и перестроит все связи по UUID.

Шаг 4. Обновите конфигурацию базы данных

Нажмите F7 (Конфигурация → Обновить конфигурацию базы данных). Реструктуризации данных при простой смене имени не будет: таблицы в СУБД остаются прежними. Если вместе с именем поменяли и состав реквизитов, учитывайте это при выборе времени обновления.

Свойства Имя и ПутьКДанным: что меняется в формах

В управляемой форме у каждого поля есть свойство ПутьКДанным (в англоязычной версии — DataPath). Оно указывает, какие данные выводит элемент: например, Объект.Контрагент или Список.Номенклатура.

Здесь два разных случая:

  • 📌 Переименовали реквизит объекта. Путь к данным у полей формы этого объекта перестраивается автоматически, потому что форма связана с реквизитом через метаданные. Откройте форму и убедитесь, что поле не подсвечено как ошибочное.
  • 📌 Переименовали реквизит формы (созданный в самой форме, на вкладке «Реквизиты»). Пути к данным элементов тоже обновятся, но обращения в модуле формы вида Элементы.СтароеИмя или ЭтотОбъект.СтароеИмя останутся старыми.

Отдельно проверьте динамические списки с произвольным запросом. Текст такого запроса — обычная строка, и в нём старое имя таблицы останется как было.

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

Ищем и заменяем старое имя в коде и запросах

Глобальный поиск по конфигурации

Правка → Глобальный поиск (Ctrl+Shift+F) ищет строку во всех модулях, текстах запросов и макетах. Ищите не только чистое имя, но и характерные сочетания:

Справочники.СтароеИмя
Справочник.СтароеИмя
"СтароеИмя"
.СтароеИмя

Последние два варианта нужны для строковых обращений и реквизитов. Простое имя вроде Склад даст сотни совпадений — тогда начинайте с префиксов вида Справочник. и Справочники..

Для замены в одном модуле удобна Правка → Заменить (Ctrl+H). Массовую замену по всей конфигурации делайте осторожно: слово Склад встречается и в чужих реквизитах, и в комментариях.

Строки, которые не ловит синтаксический контроль

Синтаксическая проверка видит Справочники.СтароеИмя в коде и сразу ругается. Но есть обращения, которые она пропустит — ошибка возникнет только при выполнении:

// Всё это строки: компилятор не знает, что внутри имя объекта
Мета = Метаданные.Справочники.Найти("СтароеИмя");
Менеджер = Справочники["СтароеИмя"];
Значение = ПредопределенноеЗначение("Справочник.СтароеИмя.Основной");
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.СтароеИмя";

Тексты запросов тоже строки. Их проверяет только выполнение или ручной просмотр в конструкторе запроса.

Поиск по файлам выгрузки

Если конфигурация большая, удобнее выгрузить её в файлы: Конфигурация → Выгрузить конфигурацию в файлы. Получится каталог XML-файлов и модулей .bsl, по которому можно искать обычными средствами с регулярными выражениями. Тот же каталог даёт выгрузка из командной строки:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /DumpConfigToFiles "D:\Dump" /Out "D:\Dump\log.txt"

Номер платформы в пути подставьте свой. После выгрузки ищите старое имя, например, через findstr /S /I "СтароеИмя" *.bsl *.xml в каталоге выгрузки.

В 1С:EDT для объектов метаданных есть рефакторинг переименования: он правит и обращения в коде. Если проект уже ведётся в EDT, переименование там проходит заметно быстрее.

Проверяем результат и ищем битые ссылки

После правок запустите Конфигурация → Проверка конфигурации. Отметьте:

  • ✅ проверку логической целостности конфигурации;
  • ✅ поиск некорректных ссылок;
  • ✅ синтаксический контроль модулей для всех режимов, в которых работает база (тонкий клиент, сервер, внешнее соединение).

Тот же набор проверок можно запускать по расписанию через командную строку:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F "D:\Bases\Test" /CheckConfig -ConfigLogIntegrity -IncorrectReferences -ThinClient -Server /Out "D:\check.txt"

Затем пройдите вручную то, что проверка не видит:

  1. Схемы компоновки отчётов, где используется объект: откройте конструктор схемы, ошибка в тексте запроса покажется сразу.
  2. Шаблоны ограничения доступа в ролях, если в базе включён RLS.
  3. Внешние отчёты и обработки, которые работают с этим объектом.
  4. Регламентные задания и HTTP-сервисы, если они обращаются к объекту.
Диагностика: выберите симптом

Переименование в распределённой базе и обменах

В распределённой информационной базе (РИБ) конфигурацию меняют только в главном узле. Подчинённые узлы получают её вместе с очередным пакетом обмена. Порядок такой:

  1. Внесите изменения и обновите конфигурацию базы данных в главном узле.
  2. Выполните обмен — изменения конфигурации уйдут в подчинённые узлы.
  3. В каждом подчинённом узле после получения пакета обновите конфигурацию базы данных; типовые конфигурации предлагают это сделать сами при следующем запуске.

Сами данные при обмене внутри РИБ идут по ссылкам, поэтому старое имя на них не повлияет.

С обменами между разными конфигурациями сложнее. Правила обмена, сделанные в «Конвертации данных», ссылаются на объекты по именам. После переименования:

  • ⚙️ выгрузите новую структуру метаданных в «Конвертацию данных»;
  • ⚙️ пересопоставьте объект в правилах и выгрузите обновлённые правила;
  • ⚙️ загрузите их в обе базы обмена и проверьте обмен на копии.

Если обмен идёт через формат EnterpriseData, переименование объекта затронет обработчики модуля менеджера обмена, где объект указан по имени. Их ищите тем же глобальным поиском.

Не меняйте имя объекта в подчинённом узле РИБ. Конфигурация подчинённого узла должна совпадать с главным, правка на месте сломает получение изменений.

Когда меняют не имя, а ссылку в данных

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

  • 🔁 В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) есть обработка «Поиск и удаление дублей» в разделе Администрирование → Обслуживание. Она находит, где используется элемент, и заменяет его на выбранный во всех документах и регистрах.
  • 🔁 В коде места использования ссылки находит метод глобального контекста НайтиПоСсылкам(). Он возвращает таблицу: какая ссылка, в каком объекте и в каком метаданном найдена.
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(НеправильныйЭлемент);
ТаблицаИспользования = НайтиПоСсылкам(МассивСсылок);
Для Каждого Строка Из ТаблицаИспользования Цикл
	Сообщить(СтрШаблон("%1 — %2", Строка.Данные, Строка.Метаданные));
КонецЦикла;

Колонки результата: Ссылка, Данные, Метаданные. Саму замену удобнее делать типовой обработкой: она корректно перезаписывает проведённые документы и движения.

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

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

Пропадут ли данные справочника после смены его имени?
Нет. Таблица в СУБД имеет техническое имя и не зависит от свойства Имя. Все элементы и ссылки на них сохранятся.
Почему после переименования отчёт открывается, но без отбора?
Пользовательские настройки отчёта хранят поля как строковые пути. Поле со старым именем не нашлось, и платформа молча удалила его из настроек. Настройте вариант заново.
Можно ли переименовать объект, если база в хранилище?
Можно. Захватите объект и все модули, где упоминается имя, переименуйте и поместите изменения одним заходом, чтобы другие разработчики не получили конфигурацию с ошибками.
Сколько времени займёт обновление базы после переименования?
При смене только имени — секунды: реструктуризации нет. Долго идёт обновление, если одновременно меняли состав или типы реквизитов.
Что делать, если переименовать нужно объект типовой конфигурации?
Поменяйте синоним — его видят пользователи, а код от него не зависит. Если нужно изменить поведение объекта, используйте расширение вместо правки типового объекта.