Как исправить ошибку «Задано одинаковое имя для реквизита и ресурса/измерения» при обновлении 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При обновлении нетиповых или доработанных конфигураций на платформе «1С:Предприятие 8.3» специалисты часто сталкиваются со специфическими ошибками сопоставления метаданных. Одна из самых распространенных и ставящих в тупик проблем — сообщение вида: «В регистре сведений ... задано одинаковое имя для реквизита и измерения (или ресурса)». Чаще всего эта ошибка проявляется при обновлении «1С:Бухгалтерия предприятия 3.0» (включая версию КОРП), когда процесс затрагивает регистры, связанные с адресными сведениями, такие как ДополнительныеАдресныеСведения или АдресныеОбъекты.

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

Почему возникает эта ошибка: технические детали

Давайте разберем по шагам, что происходит в базе данных в момент обновления. Фирма «1С» регулярно проводит рефакторинг кода и структуры данных своих решений. В частности, при переходе на новые адресные классификаторы (ФИАС/ГАР) разработчики приняли решение изменить структуру хранения данных. Поля, которые ранее имели статус Ресурсов (например, КодИФНСФЛ, КодИФНСФЛ, OKATO, OKTMO), в новых релизах были переведены в статус Реквизитов (или наоборот).

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

  1. При ручном обновлении через файл конфигурации (.cf) механизм сравнения обнаруживает, что в новой конфигурации поставщика появился новый Реквизит с именем КодИФНСФЛ. Система помечает его на добавление.
  2. В то же время в вашей основной измененной конфигурации всё еще существует старый Ресурс с точно таким же именем КодИФНСФЛ. Платформа по умолчанию защищает измененные или находящиеся на поддержке объекты от автоматического удаления, поэтому старый ресурс не снимается и не удаляется.
  3. В результате при попытке объединения система пытается создать в рамках одного регистра сведений два поля с абсолютно одинаковыми идентификаторами: ресурс КодИФНСФЛ и реквизит КодИФНСФЛ.
  4. Платформа блокирует данную операцию и выдает ошибку, так как СУБД не может существовать с колонками-дублями в одной таблице.

Анализ быстрого решения с форума: кнопка «Разрешить удалять объекты» и её риски

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

Выясним, чем грозит такое решение на практике. Внимание: это действие сопряжено с высоким риском потери данных!

Когда вы разрешаете удаление старого ресурса из основной конфигурации, платформа физически удаляет соответствующую колонку из таблицы СУБД. Все накопленные в ней исторические данные безвозвратно стираются. Новый реквизит создается абсолютно пустым. Для регистра ДополнительныеАдресныеСведения это может быть не смертельно, так как адресный классификатор можно перезагрузить из внешних источников ФНС. Но если аналогичный конфликт метаданных произойдет в регистрах взаиморасчетов, остатков товаров или других критически важных учетных механизмах, вы получите колоссальную потерю данных и крах баланса учета.

Поэтому рассмотрим профессиональные и безопасные методы обхода этой проблемы.

Способ 1. Последовательное порелизное обновление (Рекомендуемый)

Самый надежный способ избежать конфликта метаданных — не пытаться «перепрыгнуть» через 10-20 релизов за один раз, используя общий файл конфигурации (.cf).

При последовательном обновлении шаг за шагом с использованием файлов обновлений (.cfu) платформа выполняет штатные процедуры перехода. Разработчики «1С» закладывают в каждый релиз специальные обработчики обновления.

Этот процесс выглядит так:

  1. При переходе на промежуточный релиз запускается обработчик, который программно считывает данные из старого ресурса КодИФНСФЛ во временное хранилище или оперативную память.
  2. Затем структура базы реорганизуется: создается новый реквизит.
  3. Обработчик переносит сохраненные данные в новое поле.
  4. Старый ресурс безопасно удаляется, когда данные уже успешно скопированы.

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

Способ 2. Временное переименование объектов и ручной перенос данных

Если вам необходимо обновиться «одним махом» через файл .cf, выполним процедуру ручного переноса данных. Рассмотрим этот процесс по шагам.

Шаг 1. Переименование конфликтующего объекта в исходной базе
Перед началом процедуры сравнения откройте конфигуратор вашей рабочей базы. Найдите конфликтующий регистр сведений (например, ДополнительныеАдресныеСведения) и вручную измените имя старого ресурса. Например, переименуйте КодИФНСФЛ в КодИФНСФЛ_Старый. Нажмите F7, чтобы применить изменения к базе данных.

Шаг 2. Сравнение и объединение конфигураций
Запустите процедуру объединения с новым файлом конфигурации (.cf). Теперь конфликта имен не возникнет: система увидит, что в файле обновления есть новый реквизит КодИФНСФЛ, и спокойно создаст его. При этом ваш переименованный ресурс КодИФНСФЛ_Старый останется нетронутым вместе со всеми историческими данными. Выполните объединение и обновите конфигурацию базы данных (F7).

Шаг 3. Программный перенос данных
Теперь нам необходимо перенести информацию из старой колонки в новую. Для этого создадим внешнюю обработку и напишем простой код для переноса данных. Проанализируем пример кода:


Выборка = РегистрыСведений.ДополнительныеАдресныеСведения.Выбрать();
Пока Выборка.Следующий() Цикл
    // Создаем менеджер записи для модификации текущей строки
    МенеджерЗаписи = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
    МенеджерЗаписи.Прочитать();
    
    Если МенеджерЗаписи.Выбран() Тогда
        // Заполняем новый реквизит данными из старого ресурса
        МенеджерЗаписи.КодИФНСФЛ = Выборка.КодИФНСФЛ_Старый;
        Попытка
            МенеджерЗаписи.Записать(Истина);
        Исключение
            Сообщить("Ошибка записи строки: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Запустите данную обработку в режиме «1С:Предприятие». Она корректно скопирует все значения. После завершения работы скрипта обязательно проверьте визуально несколько записей в регистре через функции технического специалиста.

Шаг 4. Удаление временного объекта
Вернитесь в конфигуратор, найдите ресурс КодИФНСФЛ_Старый и удалите его из структуры регистра сведений за ненадобностью. Примените изменения по клавише F7. Данные успешно спасены и перенесены!

Способ 3. Временный возврат объектов на полную поддержку

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

Выполним следующие шаги:

  1. Откройте окно Конфигурация — Настройка поддержки.
  2. Найдите в дереве метаданных нужный регистр сведений (например, ДополнительныеАдресныеСведения).
  3. Измените правило поддержки для этого объекта и всех его подчиненных объектов на «Объект поставщика редактируется с сохранением поддержки» или полностью верните его на стандартную поддержку («Объект поставщика не редактируется»).
  4. После того как напротив регистра снова появится значок закрытого желтого замочка, запустите процесс обновления. Платформа распознает этот объект как полностью типовой и автоматически проведет реструктуризацию поля из ресурса в реквизит с сохранением всех данных СУБД без написания дополнительных скриптов.

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

← На главную