Как исправить ошибку «Записи Регистра сведений стали неуникальными: ДвоичныеДанныеФайлов» при обновлении 1С:ERP?

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

При обновлении крупных прикладных решений на платформе «1С:Предприятие 8» (например, при переходе с конфигурации 1С:ERP Управление предприятием версии 2.2.4.93 на редакцию 2.4.10.62) технические специалисты часто сталкиваются со следующей ошибкой реструктуризации базы данных:

«Записи Регистра сведений стали неуникальными: ДвоичныеДанныеФайлов»

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

Выясняем истинную причину ошибки реструктуризации

Давайте проанализируем внутреннюю архитектуру хранения файлов в решениях на базе Библиотеки стандартных подсистем (БСП). В конфигурации 1С регистр сведений ДвоичныеДанныеФайлов отвечает за хранение непосредственного содержимого присоединенных файлов (черновиков писем, картинок номенклатуры, файлов договоров и т.д.). Основным измерением этого регистра является Файл, имеющий сложный составной тип данных, определяемый через ОпределяемыйТип.ПрисоединенныйФайл или ОпределяемыйТип.ВладелецПрисоединенныхФайлов.

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

Проблема кроется в поведении платформы во время реструктуризации таблиц базы данных в СУБД:

  1. В базе данных физически остаются записи файлов, ссылающиеся на удаленные типы объектов.
  2. В процессе обновления СУБД пытается привести типы данных к новому составу, определенному в обновленной конфигурации.
  3. Все ссылки на исключенные из определяемого типа справочники заменяются платформой на пустые ссылки или значения NULL.
  4. Поскольку регистр сведений ДвоичныеДанныеФайлов является уникальным по своим измерениям, появление двух или более записей со значением Файл = Неопределено (или NULL) приводит к конфликту уникальности ключа записи. СУБД аварийно прерывает операцию реструктуризации.

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


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

вызовет ошибку «Таблица не найдена», так как физическая таблица СУБД еще не приведена к новому формату метаданных, а старая структура заблокирована.

Ниже приведены проверенные практические методы обхода и устранения этой ошибки.


Метод 1. Настройка свойства «Режим сокращения типа» (Самый быстрый способ)

Этот способ позволяет решить проблему непосредственно в Конфигураторе без написания кода и выгрузки терабайтных объемов данных.

Рассмотрим порядок действий по шагам:

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

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


Метод 2. Временное изменение метаданных (Обход через добавление ресурса)

Если изменить режим сокращения типа по каким-то причинам не удается, мы можем временно модифицировать структуру регистра, чтобы обойти проверку СУБД на уникальность:

  1. В исходной конфигурации (до обновления базы данных) найдите регистр ДвоичныеДанныеФайлов. Если он находится на поддержке, включите возможность редактирования с сохранением поддержки.
  2. Добавьте в регистр новый временный ресурс, например, ВременныйИдентификатор с типом Число или Строка.
  3. Запустите обновление базы данных. Поскольку структура изменилась, СУБД создаст временную таблицу и распределит записи, не вызывая конфликта уникальности по ключевым полям.
  4. После завершения реструктуризации и успешного обновления конфигурации удалите созданный временный ресурс и еще раз обновите базу данных.

Метод 3. Очистка через XML (Выгрузка — Обновление — Загрузка)

Этот метод является классическим и наиболее безопасным с точки зрения сохранения целостности остальных данных. Регистр ДвоичныеДанныеФайлов зачастую занимает до 50% объема всей базы данных. Его временное удаление существенно ускорит сам процесс обновления. Для быстрой очистки нужной таблицы без написания кода подойдёт обработка для удаления записей регистров.

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

  1. В исходной рабочей базе (на релизе 2.2.4.93) запустите режим «1С:Предприятие».
  2. Используя универсальную обработку «Выгрузка и загрузка данных XML», выгрузите все данные регистра сведений ДвоичныеДанныеФайлов во внешний файл.
  3. Очистите регистр в исходной базе. Для этого можно воспользоваться внешней обработкой со следующим кодом:
    
    Набор = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей();
    Набор.Записать(Истина); // Запись пустого набора очищает таблицу в БД
    
  4. Запустите Конфигуратор и выполните обновление до версии 2.4.10.62. Реструктуризация пустого регистра пройдет мгновенно и без ошибок.
  5. После успешного обновления запустите базу в режиме «1С:Предприятие» и загрузите данные обратно из XML-файла с помощью той же обработки. При загрузке битые ссылки, вызвавшие конфликт, будут пропущены или не создадут дублирующихся записей.

Метод 4. Очистка устаревших данных штатными средствами БСП

В современные версии ERP-систем встроен отличный инструмент самодиагностики. Если вы выполняете последовательный переход, перед очередным накатыванием релиза выполните очистку неактуальных ссылок: для сокращения объёма большой базы может применяться инструмент многопоточной свёртки 1С:ERP для ускоренной очистки регистров.

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

Метод 5. Использование утилиты CHDBFL и Тестирования и исправления (ТиИ)

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

  1. Закройте все сеансы работы с базой данных.
  2. Запустите утилиту проверки физической целостности файлов базы данных chdbfl.exe (находится в каталоге bin установленной платформы 1С). Отметьте флаг «Исправлять обнаруженные ошибки» и выполните проверку.
  3. После завершения работы утилиты откройте Конфигуратор и перейдите в меню Администрирование — Тестирование и исправление...
  4. Установите настройки тестирования так, как показано ниже:
    • Флаги проверки: выбрать все доступные проверки физической и логической целостности.
    • При наличии ссылок на несуществующие объекты: выбрать Очищать ссылки.
    • При частичной потере данных объектов: выбрать Удалять объект.
  5. Запустите процесс. После завершения исправления ошибок повторите попытку обновления конфигурации; при обслуживании нескольких систем удобно настроить автоматическое архивирование, обновление и тестирование баз 1С по расписанию.

Важное примечание: Все действия по удалению, изменению структуры данных и тестированию обязательно проводите на предварительно созданной резервной копии (бэкапе) информационной базы!

← На главную