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