При обновлении нетиповых или сильно доработанных конфигураций «1С:Предприятие» (особенно часто это происходит в линейке «Бухгалтерия предприятия КОРП 3.0») технические специалисты часто сталкиваются со следующей проблемой. В процессе реструктуризации базы данных на этапе применения изменений платформа прерывает работу и выдает критическую ошибку: «ДомаЗданияСтроения. Имеются записи с одинаковыми измерениями» (или аналогичное сообщение: «Записи регистра сведений стали неуникальными»). Кнопка «Принять» в Конфигураторе становится неактивной, и дальнейшее обновление системы блокируется.
В этой статье мы подробно проанализируем, почему возникает эта ошибка, разберем физику процесса на уровне базы данных и рассмотрим несколько действенных способов решения проблемы, которые позволят успешно завершить обновление.
---
Для того чтобы эффективно решить проблему, давайте сначала разберем механизмы платформы 1С, которые приводят к возникновению этой коллизии. Ошибка уникальности записей в независимом регистре сведений ДомаЗданияСтроения возникает из-за совокупности трех факторов:
Конфигурация -> Сравнение, объединение с конфигурацией из файла. При таком сценарии штатный механизм последовательного выполнения обработчиков обновления БСП нарушается. Платформа пытается напрямую «наложить» новую структуру регистра на старую таблицу с данными, сопоставив их физические поля.Удалить...), а на его месте создан новый пустой объект. Прямое обновление со старого релиза на новый в обход промежуточных вызывает аппаратный конфликт метаданных.---
Давайте проанализируем характер данных в регистре сведений ДомаЗданияСтроения. Этот регистр предназначен исключительно для хранения кэша загружаемого адресного классификатора (ФИАС/ГАР). В нем не содержатся никакие пользовательские данные — здесь нет ссылок на документы, контрагентов, физических лиц или проводок. Это чисто справочная информация, которую можно в любой момент повторно загрузить из внешних источников или использовать через облачный веб-сервис 1С.
Поскольку данных пользователя там нет, самым разумным и быстрым решением будет полная очистка содержимого этого регистра перед запуском процесса обновления. Пустой регистр перестроится в Конфигураторе мгновенно и без каких-либо ошибок уникальности.
Рассмотрим два варианта очистки регистра:
Вариант А. Очистка через пользовательский интерфейс 1С
Если база данных еще запускается в режиме «1С:Предприятие», выполним очистку штатным инструментом:
Вариант Б. Программная очистка (если интерфейс недоступен или зависает)
Иногда объем регистра настолько огромен (сотни тысяч или миллионы записей), что стандартная очистка через интерфейс вызывает переполнение транзакций или зависание системы. В таком случае выполним быструю очистку программным кодом. Для этого запустим внешнюю обработку или воспользуемся встроенной консолью кода в режиме «1С:Предприятие».
Запишем пустой набор записей поверх существующих данных регистра. Давайте рассмотрим этот код:
НаборЗаписей = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
НаборЗаписей.Записать(Истина);
Параметр Истина (или вызов метода без параметров, так как режим замещения активен по умолчанию) полностью сотрет все физические записи из таблицы СУБД за доли секунды. После выполнения этого кода смело запускаем обновление конфигурации базы данных (клавиша F7 в Конфигураторе) — процедура пройдет штатно.
---
Если мы обновляем нетиповую конфигурацию вручную через инструмент «Сравнение и объединение», нам необходимо предотвратить некорректное сопоставление старых адресных регистров с новыми. Давайте разберем по шагам, как правильно настроить дерево сравнения:
Регистры сведений.ДомаЗданияСтроения, АдресныеОбъекты, ДополнительныеАдресныеСведения, ОриентирыАдресныхОбъектов, ИсторияАдресныхОбъектов.Удалить..., убедимся, что они не сопоставились с новыми чистыми регистрами без этого префикса. Связи между ними в окне сравнения нужно разорвать (снять соответствие).---
Если по каким-то веским причинам мы абсолютно не хотим полностью очищать регистр, нам придется локализовать конкретные записи, которые вызывают дублирование ключа при реструктуризации, и удалить именно их. Сделать это в режиме «1С:Предприятие» вручную невозможно, так как отбор по новым измерениям еще не существует в структуре метаданных предприятия.
Для поиска дублей нам потребуется проанализировать новые измерения регистра (которые мы можем подсмотреть в новой конфигурации поставщика) и выполнить группировку текущих данных по этим измерениям.
Разберем пример запроса, который поможет нам выявить конфликтующие записи:
ВЫБРАТЬ
Регистр.МуниципальныйИдентификатор КАК МуниципальныйИдентификатор,
Регистр.КодОбъекта КАК КодОбъекта,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистр.Идентификатор) КАК КоличествоДублей
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
РегистрСведений.ДомаЗданияСтроения КАК Регистр
СГРУППИРОВАТЬ ПО
Регистр.МуниципальныйИдентификатор,
Регистр.КодОбъекта
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Регистр.Идентификатор) > 1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Регистр.МуниципальныйИдентификатор,
Регистр.КодОбъекта,
Регистр.Идентификатор
ИЗ
РегистрСведений.ДомаЗданияСтроения КАК Регистр
ГДЕ
(Регистр.МуниципальныйИдентификатор, Регистр.КодОбъекта) В
(ВЫБРАТЬ
ВТ_Дубли.МуниципальныйИдентификатор,
ВТ_Дубли.КодОбъекта
ИЗ
ВТ_Дубли)
Запустив этот запрос в консоли запросов, мы увидим строки, которые после сжатия измерений превратятся в дубли. Нам останется лишь написать небольшую обработку, которая удалит лишние строки, оставив только по одной уникальной записи для каждой проблемной группы.
---
После того как обновление конфигурации базы данных применилось без ошибок, нам необходимо вернуть работоспособность механизмам ввода адресов. Начиная с последних версий БСП, держать весь массив адресных данных локально в базе данных больше не требуется. Давайте рассмотрим два сценария организации дальнейшей работы:
Администрирование -> Интернет-поддержка и сервисы -> Адресный классификатор и установим флаг «Использовать веб-сервис 1С для ввода и проверки адресов». При включении этой опции программа будет мгновенно искать адреса, запрашивая их напрямую с серверов фирмы 1С. База данных больше не будет раздуваться на десятки гигабайт за счет адресных таблиц, а пользователи всегда будут работать с самыми актуальными сведениями без необходимости регулярных скачиваний файлов ГАР. Для работы этого режима требуется действующий договор сопровождения (ИТС).ДомаЗданияСтроения уже в новой, корректной и оптимизированной структуре.