При обновлении крупных прикладных решений на платформе «1С:Предприятие 8» (например, при переходе с конфигурации 1С:ERP Управление предприятием версии 2.2.4.93 на редакцию 2.4.10.62) технические специалисты часто сталкиваются со следующей ошибкой реструктуризации базы данных:
«Записи Регистра сведений стали неуникальными: ДвоичныеДанныеФайлов»
При этом диалоговое окно обновления блокирует дальнейшие действия: кнопка «Принять» становится недоступной, активна только кнопка «Отмена», а попытки запустить базу данных в режиме «1С:Предприятие» для очистки регистра штатными средствами или обработками вызывают ошибку отсутствия таблицы в СУБД. В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько эффективных способов её решения.
Давайте проанализируем внутреннюю архитектуру хранения файлов в решениях на базе Библиотеки стандартных подсистем (БСП). В конфигурации 1С регистр сведений ДвоичныеДанныеФайлов отвечает за хранение непосредственного содержимого присоединенных файлов (черновиков писем, картинок номенклатуры, файлов договоров и т.д.). Основным измерением этого регистра является Файл, имеющий сложный составной тип данных, определяемый через ОпределяемыйТип.ПрисоединенныйФайл или ОпределяемыйТип.ВладелецПрисоединенныхФайлов.
При переходе между мажорными редакциями (с 2.2 на 2.4) разработчики 1С оптимизируют структуру метаданных: удаляются устаревшие документы, задачи, справочники и, соответственно, связанные с ними справочники присоединенных файлов. Из состава вышеупомянутых определяемых типов исключаются неиспользуемые объекты.
Проблема кроется в поведении платформы во время реструктуризации таблиц базы данных в СУБД:
NULL.ДвоичныеДанныеФайлов является уникальным по своим измерениям, появление двух или более записей со значением Файл = Неопределено (или NULL) приводит к конфликту уникальности ключа записи. СУБД аварийно прерывает операцию реструктуризации.Теперь выясним, почему регистр невозможно очистить в режиме «1С:Предприятие» после получения ошибки. На этапе сравнения и объединения новые метаданные уже зафиксированы в Конфигураторе, но физическая реструктуризация таблиц базы данных (БД) не завершена. Попытка обратиться к регистру кодом:
НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
вызовет ошибку «Таблица не найдена», так как физическая таблица СУБД еще не приведена к новому формату метаданных, а старая структура заблокирована.
Ниже приведены проверенные практические методы обхода и устранения этой ошибки.
Этот способ позволяет решить проблему непосредственно в Конфигураторе без написания кода и выгрузки терабайтных объемов данных.
Рассмотрим порядок действий по шагам:
Файл регистра сведений ДвоичныеДанныеФайлов.При такой настройке платформа в процессе реструктуризации автоматически удалит все строки регистра, типы которых больше не входят в состав определяемого типа, вместо попытки их конвертации. Ошибка уникальности гарантированно исчезнет.
Если изменить режим сокращения типа по каким-то причинам не удается, мы можем временно модифицировать структуру регистра, чтобы обойти проверку СУБД на уникальность:
ДвоичныеДанныеФайлов. Если он находится на поддержке, включите возможность редактирования с сохранением поддержки.ВременныйИдентификатор с типом Число или Строка.Этот метод является классическим и наиболее безопасным с точки зрения сохранения целостности остальных данных. Регистр ДвоичныеДанныеФайлов зачастую занимает до 50% объема всей базы данных. Его временное удаление существенно ускорит сам процесс обновления. Для быстрой очистки нужной таблицы без написания кода подойдёт обработка для удаления записей регистров.
Выполним следующие шаги:
ДвоичныеДанныеФайлов во внешний файл.
Набор = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей();
Набор.Записать(Истина); // Запись пустого набора очищает таблицу в БД
В современные версии ERP-систем встроен отличный инструмент самодиагностики. Если вы выполняете последовательный переход, перед очередным накатыванием релиза выполните очистку неактуальных ссылок: для сокращения объёма большой базы может применяться инструмент многопоточной свёртки 1С:ERP для ускоренной очистки регистров.
Иногда физическая целостность базы данных нарушена еще до начала обновления. В этом случае перед обновлением обязательно нужно провести профилактику:
chdbfl.exe (находится в каталоге bin установленной платформы 1С). Отметьте флаг «Исправлять обнаруженные ошибки» и выполните проверку.Важное примечание: Все действия по удалению, изменению структуры данных и тестированию обязательно проводите на предварительно созданной резервной копии (бэкапе) информационной базы!