При обновлении конфигурации 1С:Бухгалтерия предприятия 2.0 (например, при переходе на релиз 2.0.29.3 и выше) многие технические специалисты сталкиваются с блокирующей ошибкой в окне «Реорганизация информации». Платформа выдает сообщение: «Записи регистра сведений стали неуникальными. Присоединенные файлы». В этой ситуации кнопка «Принять» становится неактивной, и стандартное обновление штатным способом продолжить невозможно. Давайте детально разберем причины возникновения этой ситуации и пошагово рассмотрим методы ее решения.
Прежде чем приступать к исправлению, проанализируем механику работы платформы 1С:Предприятие 8.2/8.3. Регистр сведений — это объект метаданных, уникальность записей в котором определяется комбинацией его измерений. В новых версиях конфигураций разработчики часто меняют структуру этого регистра: удаляют старые измерения, добавляют новые или изменяют тип существующих.
Рассмотрим ситуацию: в старой версии конфигурации уникальность записи в регистре ПрисоединенныеФайлы обеспечивалась тремя измерениями (например, ВладелецФайла, ИмяФайла и ДополнительныйПараметр). Если в новой версии измерение ДополнительныйПараметр удаляется, то записи, которые раньше различались только этим полем, теперь становятся идентичными. Платформа обнаруживает дубли по оставшимся измерениям и блокирует реструктуризацию базы данных, так как это нарушает базовый принцип уникальности регистра.
Также часто причиной становятся «битые ссылки». Если в базе была проведена свертка или некорректное удаление документов, в регистре могут остаться записи, ссылающиеся на несуществующих владельцев (объекты с пометкой <Объект не найден>). При реструктуризации такие записи также могут конфликтовать между собой.
Первым делом проанализируем состояние базы данных с помощью встроенных инструментов конфигуратора. Это самый безопасный способ, который помогает в случае наличия логических ошибок в таблицах. Посмотрим, как правильно настроить этот процесс:
.dt или копирование файла 1Cv8.1CD).Если проблема заключалась в некорректных внутренних ссылках, которые после свертки стали дублями, этот метод поможет очистить регистр ПрисоединенныеФайлы от лишнего «мусора».
Если «Тестирование и исправление» не помогло, нам необходимо точно выяснить, какие именно записи мешают системе. Для этого воспользуемся консолью запросов в режиме «Предприятие». Проанализируем логику поиска дубликатов. Нам нужно сгруппировать записи по всем измерениям регистра и найти те комбинации, которые встречаются более одного раза.
Пример алгоритма действий:
ПрисоединенныеФайлы.ВладелецФайла и ИмяФайла).Примерный текст запроса для поиска виновников:
ВЫБРАТЬ
ПрисоединенныеФайлы.ВладелецФайла КАК Владелец,
ПрисоединенныеФайлы.ИмяФайла КАК Имя,
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
СГРУППИРОВАТЬ ПО
ПрисоединенныеФайлы.ВладелецФайла,
ПрисоединенныеФайлы.ИмяФайла
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
После выполнения этого запроса мы увидим список владельцев и имен файлов, которые задвоены. Теперь нам нужно зайти в режим «1С:Предприятие», найти эти записи в регистре (через меню Операции — Регистры сведений) и вручную или программно удалить лишние экземпляры, оставив только по одной уникальной записи для каждой комбинации.
Как упоминалось в обсуждении на форуме, автор делал свертку базы. Это типичный сценарий появления записей-сирот. Если в поле Владелец вместо названия документа вы видите длинную строку типа <Объект не найден> (84:bf00001ec902047111e0388713063f25), значит, сам документ был удален, а запись в регистре осталась.
Рассмотрим порядок действий для очистки таких записей:
Пример кода для удаления записей с битыми ссылками:
НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Индекс = 0;
Пока Индекс < НаборЗаписей.Количество() Цикл
Запись = НаборЗаписей[Индекс];
// Проверяем, существует ли объект в базе
Если Запись.ВладелецФайла.ПолучитьОбъект() = Неопределено Тогда
НаборЗаписей.Удалить(Запись);
Продолжить;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
НаборЗаписей.Записать();
Внимание: Будьте осторожны с полной перезаписью набора записей на больших базах. В таких случаях лучше использовать отбор по владельцу или выполнять удаление порциями.
Если данных в регистре ПрисоединенныеФайлы немного или они не представляют критической ценности (например, это временные файлы или кэш), можно воспользоваться советом опытных участников форума — полностью очистить регистр перед выполнением обновления БД.
Выясним, как это сделать наиболее эффективно:
РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей().Записать();. Это полностью обнулит таблицу. После этого обновление в Конфигураторе пройдет без ошибок.Иногда ошибка кроется не в удалении полей, а в их сокращении. Проанализируем ситуацию: если в старой версии длина измерения ИмяФайла была 255 символов, а в новой версии ее ограничили до 100 символов, то файлы с именами "Отчет_за_январь_2023_года_вариант_1.pdf" и "Отчет_за_январь_2023_года_вариант_2.pdf" при обрезке до 100 символов могут стать идентичными.
В этом случае необходимо заранее переименовать файлы в базе, сократив их названия, чтобы после реструктуризации они остались уникальными. Сравнение конфигураций (основной и конфигурации поставщика) поможет точно определить, какие свойства объектов изменились.
Подводя итог, можно сказать, что проблема неуникальности записей при обновлении 1С:Бухгалтерия 2.0 — это следствие эволюции метаданных конфигурации. Для успешного решения мы рекомендуем следующий алгоритм:
После того как дублирующие или некорректные записи будут удалены из регистра ПрисоединенныеФайлы, кнопка «Принять» в окне реорганизации снова станет активной, и вы сможете успешно завершить обновление информационной базы.