При обновлении нетиповых или доработанных конфигураций на платформе «1С:Предприятие 8.3» специалисты часто сталкиваются со специфическими ошибками сопоставления метаданных. Одна из самых распространенных и ставящих в тупик проблем — сообщение вида: «В регистре сведений ... задано одинаковое имя для реквизита и измерения (или ресурса)». Чаще всего эта ошибка проявляется при обновлении «1С:Бухгалтерия предприятия 3.0» (включая версию КОРП), когда процесс затрагивает регистры, связанные с адресными сведениями, такие как ДополнительныеАдресныеСведения или АдресныеОбъекты.
В этой статье мы подробно разберем техническую природу возникновения этой ошибки, проанализируем риски «быстрого» решения, найденного пользователями на форуме, и рассмотрим три безопасных профессиональных метода обновления конфигурации с гарантированным сохранением всех исторических данных.
Давайте разберем по шагам, что происходит в базе данных в момент обновления. Фирма «1С» регулярно проводит рефакторинг кода и структуры данных своих решений. В частности, при переходе на новые адресные классификаторы (ФИАС/ГАР) разработчики приняли решение изменить структуру хранения данных. Поля, которые ранее имели статус Ресурсов (например, КодИФНСФЛ, КодИФНСФЛ, OKATO, OKTMO), в новых релизах были переведены в статус Реквизитов (или наоборот).
Если бы ваша конфигурация была полностью типовой (находилась «на замке», то есть на поддержке без возможности изменения), платформа выполнила бы это преобразование автоматически во время применения обновления. Однако в нетиповых конфигурациях логика сравнения и объединения работает иначе:
.cf) механизм сравнения обнаруживает, что в новой конфигурации поставщика появился новый Реквизит с именем КодИФНСФЛ. Система помечает его на добавление.КодИФНСФЛ. Платформа по умолчанию защищает измененные или находящиеся на поддержке объекты от автоматического удаления, поэтому старый ресурс не снимается и не удаляется.КодИФНСФЛ и реквизит КодИФНСФЛ.В процессе обсуждения на форуме пользователи находят следующее решение: зайти в меню Конфигурация — Настройка поддержки, включить возможность изменения, а в окне сравнения и объединения нажать кнопку «Разрешить удалять объекты из основной конфигурации». После этого старый ресурс удаляется, новый реквизит создается, и обновление успешно завершается.
Выясним, чем грозит такое решение на практике. Внимание: это действие сопряжено с высоким риском потери данных!
Когда вы разрешаете удаление старого ресурса из основной конфигурации, платформа физически удаляет соответствующую колонку из таблицы СУБД. Все накопленные в ней исторические данные безвозвратно стираются. Новый реквизит создается абсолютно пустым. Для регистра ДополнительныеАдресныеСведения это может быть не смертельно, так как адресный классификатор можно перезагрузить из внешних источников ФНС. Но если аналогичный конфликт метаданных произойдет в регистрах взаиморасчетов, остатков товаров или других критически важных учетных механизмах, вы получите колоссальную потерю данных и крах баланса учета.
Поэтому рассмотрим профессиональные и безопасные методы обхода этой проблемы.
Самый надежный способ избежать конфликта метаданных — не пытаться «перепрыгнуть» через 10-20 релизов за один раз, используя общий файл конфигурации (.cf).
При последовательном обновлении шаг за шагом с использованием файлов обновлений (.cfu) платформа выполняет штатные процедуры перехода. Разработчики «1С» закладывают в каждый релиз специальные обработчики обновления.
Этот процесс выглядит так:
КодИФНСФЛ во временное хранилище или оперативную память.Если вы ограничены во времени и последовательное обновление сотен релизов физически невозможно, переходим к следующему способу.
Если вам необходимо обновиться «одним махом» через файл .cf, выполним процедуру ручного переноса данных. Рассмотрим этот процесс по шагам.
Шаг 1. Переименование конфликтующего объекта в исходной базе
Перед началом процедуры сравнения откройте конфигуратор вашей рабочей базы. Найдите конфликтующий регистр сведений (например, ДополнительныеАдресныеСведения) и вручную измените имя старого ресурса. Например, переименуйте КодИФНСФЛ в КодИФНСФЛ_Старый. Нажмите F7, чтобы применить изменения к базе данных.
Шаг 2. Сравнение и объединение конфигураций
Запустите процедуру объединения с новым файлом конфигурации (.cf). Теперь конфликта имен не возникнет: система увидит, что в файле обновления есть новый реквизит КодИФНСФЛ, и спокойно создаст его. При этом ваш переименованный ресурс КодИФНСФЛ_Старый останется нетронутым вместе со всеми историческими данными. Выполните объединение и обновите конфигурацию базы данных (F7).
Шаг 3. Программный перенос данных
Теперь нам необходимо перенести информацию из старой колонки в новую. Для этого создадим внешнюю обработку и напишем простой код для переноса данных. Проанализируем пример кода:
Выборка = РегистрыСведений.ДополнительныеАдресныеСведения.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем менеджер записи для модификации текущей строки
МенеджерЗаписи = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
// Заполняем новый реквизит данными из старого ресурса
МенеджерЗаписи.КодИФНСФЛ = Выборка.КодИФНСФЛ_Старый;
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
Сообщить("Ошибка записи строки: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Запустите данную обработку в режиме «1С:Предприятие». Она корректно скопирует все значения. После завершения работы скрипта обязательно проверьте визуально несколько записей в регистре через функции технического специалиста.
Шаг 4. Удаление временного объекта
Вернитесь в конфигуратор, найдите ресурс КодИФНСФЛ_Старый и удалите его из структуры регистра сведений за ненадобностью. Примените изменения по клавише F7. Данные успешно спасены и перенесены!
Если вы точно знаете, что конфликтующий регистр сведений в вашей конфигурации не подвергался доработкам со стороны программистов, а просто оказался «снят с замка» за компанию с другими объектами, мы можем использовать метод временного возврата на поддержку.
Выполним следующие шаги:
Конфигурация — Настройка поддержки.ДополнительныеАдресныеСведения).Используя эти инструкции, вы сможете уверенно решать любые конфликты метаданных при обновлении нестандартных баз 1С, гарантируя сохранность и целостность информации в базах данных ваших клиентов и предприятий.