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

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

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

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

---

Выясняем техническую причину сбоя

Для того чтобы эффективно решить проблему, давайте сначала разберем механизмы платформы 1С, которые приводят к возникновению этой коллизии. Ошибка уникальности записей в независимом регистре сведений ДомаЗданияСтроения возникает из-за совокупности трех факторов:

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

---

Способ 1: Полная очистка регистра (самый простой и эффективный метод)

Давайте проанализируем характер данных в регистре сведений ДомаЗданияСтроения. Этот регистр предназначен исключительно для хранения кэша загружаемого адресного классификатора (ФИАС/ГАР). В нем не содержатся никакие пользовательские данные — здесь нет ссылок на документы, контрагентов, физических лиц или проводок. Это чисто справочная информация, которую можно в любой момент повторно загрузить из внешних источников или использовать через облачный веб-сервис 1С.

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

Рассмотрим два варианта очистки регистра:

Вариант А. Очистка через пользовательский интерфейс 1С

Если база данных еще запускается в режиме «1С:Предприятие», выполним очистку штатным инструментом:

  1. Перейдем в раздел Администрирование -> Интернет-поддержка и сервисы.
  2. Раскроем группу Адресный классификатор.
  3. Найдем и запустим команду Очистить адресный классификатор.
  4. В открывшейся форме выберем вариант полного удаления загруженных регионов или очистим всю адресную информацию. После этого закроем программу и вернемся в Конфигуратор для выполнения обновления.

Вариант Б. Программная очистка (если интерфейс недоступен или зависает)

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

Запишем пустой набор записей поверх существующих данных регистра. Давайте рассмотрим этот код:


НаборЗаписей = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
НаборЗаписей.Записать(Истина);

Параметр Истина (или вызов метода без параметров, так как режим замещения активен по умолчанию) полностью сотрет все физические записи из таблицы СУБД за доли секунды. После выполнения этого кода смело запускаем обновление конфигурации базы данных (клавиша F7 в Конфигураторе) — процедура пройдет штатно.

---

Способ 2: Правильная настройка правил при сравнении и объединении

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

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

---

Способ 3: Поиск и удаление дублирующихся записей (для файловых и клиент-серверных баз)

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

Для поиска дублей нам потребуется проанализировать новые измерения регистра (которые мы можем подсмотреть в новой конфигурации поставщика) и выполнить группировку текущих данных по этим измерениям.

Разберем пример запроса, который поможет нам выявить конфликтующие записи:


ВЫБРАТЬ
    Регистр.МуниципальныйИдентификатор КАК МуниципальныйИдентификатор,
    Регистр.КодОбъекта КАК КодОбъекта,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистр.Идентификатор) КАК КоличествоДублей
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
    РегистрСведений.ДомаЗданияСтроения КАК Регистр
СГРУППИРОВАТЬ ПО
    Регистр.МуниципальныйИдентификатор,
    Регистр.КодОбъекта
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистр.Идентификатор) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Регистр.МуниципальныйИдентификатор,
    Регистр.КодОбъекта,
    Регистр.Идентификатор
ИЗ
    РегистрСведений.ДомаЗданияСтроения КАК Регистр
ГДЕ
    (Регистр.МуниципальныйИдентификатор, Регистр.КодОбъекта) В
        (ВЫБРАТЬ
            ВТ_Дубли.МуниципальныйИдентификатор,
            ВТ_Дубли.КодОбъекта
        ИЗ
            ВТ_Дубли)

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

---

Что делать после успешного завершения обновления?

После того как обновление конфигурации базы данных применилось без ошибок, нам необходимо вернуть работоспособность механизмам ввода адресов. Начиная с последних версий БСП, держать весь массив адресных данных локально в базе данных больше не требуется. Давайте рассмотрим два сценария организации дальнейшей работы:

  1. Использование веб-сервиса 1С (наиболее предпочтительный вариант): Перейдем в меню Администрирование -> Интернет-поддержка и сервисы -> Адресный классификатор и установим флаг «Использовать веб-сервис 1С для ввода и проверки адресов». При включении этой опции программа будет мгновенно искать адреса, запрашивая их напрямую с серверов фирмы 1С. База данных больше не будет раздуваться на десятки гигабайт за счет адресных таблиц, а пользователи всегда будут работать с самыми актуальными сведениями без необходимости регулярных скачиваний файлов ГАР. Для работы этого режима требуется действующий договор сопровождения (ИТС).
  2. Локальная повторная загрузка классификатора: Если сервер, на котором установлена 1С, изолирован от интернета, нам потребуется заново скачать актуальные файлы ГАР для необходимых регионов (например, через личный кабинет ИТС) и загрузить их в базу через стандартный помощник загрузки адресного классификатора. База данных заново наполнит регистр ДомаЗданияСтроения уже в новой, корректной и оптимизированной структуре.
← На главную