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