Переименование объекта метаданных 1С без битых ссылок
Содержание
Чтобы поменять ссылку на объект в 1С, меняют свойство Имя объекта метаданных в конфигураторе, а затем вручную правят все текстовые обращения к старому имени: модули, тексты запросов, схемы компоновки, строковые параметры. Внутренние связи (типы реквизитов, состав подсистем, права ролей) платформа перестроит сама. Строки в коде она не трогает — их ищут через Правка → Глобальный поиск и проверку конфигурации.
Всё ниже относится к платформе 8.3 и любой конфигурации на ней: БП 3.0, ЗУП 3.1, УТ 11 или самописной. Различается только одно — стоит ли конфигурация на поддержке.
Как 1С хранит ссылки на объекты конфигурации
У каждого объекта метаданных есть два «адреса»:
- 🔑 внутренний идентификатор (UUID) — его не видно в интерфейсе, по нему объекты связаны между собой внутри конфигурации;
- 🏷 Имя — строка вида
Номенклатура, по ней к объекту обращается код:Справочники.Номенклатура,Справочник.Номенклатурав запросе,Метаданные.Справочники.Номенклатура.
Отсюда простое правило. Всё, что настроено мышкой в палитре свойств, держится за UUID и переживёт переименование. Всё, что набрано текстом, держится за имя и сломается.
| Где используется объект | Чем держится | После смены имени |
|---|---|---|
| Тип реквизита, табличной части, ресурса | UUID | обновится сам |
| Состав подсистем, права в ролях | UUID | обновится сам |
| Основание документа, регистратор регистра | UUID | обновится сам |
| Код модулей | текст | нужна ручная правка |
| Тексты запросов в модулях и СКД | текст | нужна ручная правка |
| Шаблоны ограничения доступа (RLS) | текст | нужна ручная правка |
ПредопределенноеЗначение("..."), Метаданные.Найти("...") | строка | ошибка только при выполнении |
| Правила обмена, внешние обработки, COM-подключения | текст вне конфигурации | правится отдельно |
А имя таблицы в СУБД не зависит от имени объекта. В базе справочник лежит в таблице с техническим именем вроде _Reference123. Поэтому переименование не трогает данные: все элементы справочника и ссылки на них в документах останутся на месте.
Если нужно поменять только то, что видит пользователь (название в меню, заголовок списка), меняйте Синоним, а не Имя. Синоним в коде не используется, и переименование по синониму ничего не ломает.
Подготовка: что проверить до смены имени
Переименование — правка конфигурации, а не данных, но последствия ловятся не сразу. Ошибка в строковом обращении всплывёт у пользователя через неделю, когда он откроет редкий отчёт.
Перед работой:
- Сделайте выгрузку информационной базы:
Администрирование → Выгрузить информационную базув конфигураторе, файл.dt. - Сохраните конфигурацию в файл
.cf— так проще сравнить «до» и «после». - Выясните, стоит ли конфигурация на поддержке:
Конфигурация → Поддержка → Настройка поддержки. - Проверьте, есть ли расширения:
Конфигурация → Расширения конфигурации. - Узнайте, есть ли внешние потребители: обмены, внешние отчёты, интеграции через COM или HTTP-сервисы.
Не переименовывайте объекты типовой конфигурации, которая стоит на поддержке. При следующем обновлении сравнение увидит в вашем объекте и в объекте поставщика два разных объекта с разными именами, и объединение превратится в ручной разбор. Если имя типового объекта мешает, задачу почти всегда решает синоним или расширение.
Пошагово: меняем имя объекта в конфигураторе
Шаг 1. Найдите все места использования
В дереве конфигурации щёлкните объект правой кнопкой и выберите Поиск ссылок на объект. Внизу откроется окно со списком: реквизиты других объектов с этим типом, подсистемы, роли, формы. Это и есть связи через UUID, которые обновятся сами. Список полезен, чтобы понять масштаб.
Текстовые обращения этот поиск не показывает. Их ищите на шаге 4.
Шаг 2. Захватите объект в хранилище
Если база подключена к хранилищу конфигурации, захватите сам объект и все модули, где встречается имя. Иначе правку кода не получится сделать за один заход.
Шаг 3. Смените свойство Имя
- Откройте палитру свойств объекта (
Alt+Enter). - В поле Имя введите новое значение. Допустимы буквы, цифры и подчёркивание, первым символом цифра быть не может.
- При необходимости поправьте Синоним и представления объекта и списка.
Платформа сразу переименует объект в дереве и перестроит все связи по 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"
Затем пройдите вручную то, что проверка не видит:
- Схемы компоновки отчётов, где используется объект: откройте конструктор схемы, ошибка в тексте запроса покажется сразу.
- Шаблоны ограничения доступа в ролях, если в базе включён RLS.
- Внешние отчёты и обработки, которые работают с этим объектом.
- Регламентные задания и HTTP-сервисы, если они обращаются к объекту.
Переименование в распределённой базе и обменах
В распределённой информационной базе (РИБ) конфигурацию меняют только в главном узле. Подчинённые узлы получают её вместе с очередным пакетом обмена. Порядок такой:
- Внесите изменения и обновите конфигурацию базы данных в главном узле.
- Выполните обмен — изменения конфигурации уйдут в подчинённые узлы.
- В каждом подчинённом узле после получения пакета обновите конфигурацию базы данных; типовые конфигурации предлагают это сделать сами при следующем запуске.
Сами данные при обмене внутри РИБ идут по ссылкам, поэтому старое имя на них не повлияет.
С обменами между разными конфигурациями сложнее. Правила обмена, сделанные в «Конвертации данных», ссылаются на объекты по именам. После переименования:
- ⚙️ выгрузите новую структуру метаданных в «Конвертацию данных»;
- ⚙️ пересопоставьте объект в правилах и выгрузите обновлённые правила;
- ⚙️ загрузите их в обе базы обмена и проверьте обмен на копии.
Если обмен идёт через формат EnterpriseData, переименование объекта затронет обработчики модуля менеджера обмена, где объект указан по имени. Их ищите тем же глобальным поиском.
Не меняйте имя объекта в подчинённом узле РИБ. Конфигурация подчинённого узла должна совпадать с главным, правка на месте сломает получение изменений.
Когда меняют не имя, а ссылку в данных
Иногда под «поменять ссылку на объект» имеют в виду другое: в документах указан не тот элемент справочника, и надо везде заменить его на правильный. Это уже работа с данными, а не с конфигурацией.
- 🔁 В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) есть обработка «Поиск и удаление дублей» в разделе
Администрирование → Обслуживание. Она находит, где используется элемент, и заменяет его на выбранный во всех документах и регистрах. - 🔁 В коде места использования ссылки находит метод глобального контекста
НайтиПоСсылкам(). Он возвращает таблицу: какая ссылка, в каком объекте и в каком метаданном найдена.
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(НеправильныйЭлемент);
ТаблицаИспользования = НайтиПоСсылкам(МассивСсылок);
Для Каждого Строка Из ТаблицаИспользования Цикл
Сообщить(СтрШаблон("%1 — %2", Строка.Данные, Строка.Метаданные));
КонецЦикла;
Колонки результата: Ссылка, Данные, Метаданные. Саму замену удобнее делать типовой обработкой: она корректно перезаписывает проведённые документы и движения.
Замену ссылок в данных запускайте только после выгрузки базы и вне рабочего времени: обработка перезаписывает документы, и откат возможен только из копии.