Что делать, если при принятии изменений конфигурации кнопка «Принять» недоступна из-за ошибок в регистре «Двоичные данные файлов»

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

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

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

Глубинная причина ошибки в регистре «Двоичные данные файлов»

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

Блокировка кнопки «Принять» происходит из-за нарушения уникальности записей (появления дублей по ключевым измерениям регистра). Рассмотрим, в результате каких процессов это происходит при обновлении:

  1. Усечение типов в Определяемом типе. Если в процессе обновления или удаления старых доработок из состава определяемого типа ПрисоединенныйФайл исключается какой-либо справочник, то при изменении структуры БД СУБД больше не может сопоставить старые записи регистра с новым типом данных. В результате все существовавшие ссылки на объекты удаленного типа заменяются на пустые значения (NULL или пустые ссылки). Если таких записей в базе было больше одной, все они превращаются в одинаковые пустые строки, нарушая уникальность ключа.
  2. «Битые» ссылки и удаленные владельцы. В процессе эксплуатации системы пользователи могли некорректно удалить документы или элементы справочников, являющиеся владельцами присоединенных файлов. Если при этом сами записи о файлах и их двоичные данные не были удалены программно, в базе остаются «сироты» — записи, указывающие на несуществующие объекты (отображаются как <Объект не найден>). При реструктуризации метаданных эти «битые» ссылки также могут схлопнуться в одинаковые пустые идентификаторы.
  3. Некорректная настройка правил обновления конфигурации. Если при обновлении в настройках сравнения и объединения была снята галочка «Разрешить удаление объектов основной конфигурации», то старые объекты метаданных, которые должны были быть удалены платформой, остаются в системе. Из-за этого может возникнуть конфликт «двух одинаковых» объектов, один из которых дублирует функции другого, ломая логику уникальности записей в таблицах базы данных.

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

Способ 1. Проверка настроек удаления и очистка дублирующихся метаданных

Если проблема вызвана тем, что в структуре метаданных появилось два одинаковых объекта (например, два регистра сведений с похожими именами или дублирующие измерения), проанализируем настройки обновления:

  1. Откроем окно сравнения и объединения конфигураций.
  2. Убедимся, что установлена галочка «Разрешить удаление объектов основной конфигурации». Если она отключена, объекты, подлежащие удалению в новой версии, не удаляются физически, что приводит к конфликту структуры БД.
  3. Если обновление уже частично прошло и в дереве конфигурации появились два одинаковых регистра сведений ДвоичныеДанныеФайлов, найдем тот, который находится на поддержке без возможности редактирования (он обычно помечен желтым кубиком) и тот, который остался от старых доработок.
  4. Удалим устаревший дублирующий объект вручную из дерева конфигурации и повторим попытку обновления базы данных.

Способ 2. Временная отмена изменений проблемного регистра

Самый быстрый способ обойти блокировку кнопки «Принять», если обновление нужно завершить оперативно, а с данными регистра планируется разобраться позже:

  1. В окне реорганизации информации найдем строку с регистром сведений ДвоичныеДанныеФайлов.
  2. Снимем флажок (отменим изменения) конкретно для этого регистра сведений.
  3. Нажмем кнопку «Принять». Платформа обновит всю остальную структуру базы данных, минуя реструктуризацию проблемной таблицы.
  4. После успешного обновления мы сможем зайти в базу в режиме «1С:Предприятие», спокойно разобраться с дублями данных и затем повторно применить изменения для регистра.

Способ 3. Выгрузка данных регистра в XML, очистка и обратная загрузка

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

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

Способ 4. Тестирование и исправление (ТиИ) с очисткой битых ссылок

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

  1. Запустим Конфигуратор и перейдем в меню Администрирование — Тестирование и исправление...
  2. Установим флажок на проверке «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы».
  3. В нижней части окна настроек в группе параметров «При наличии битых ссылок» выберем переключатель «Очищать ссылки» (или «Удалять объекты»).
  4. Нажмем кнопку «Выполнить» и дождемся окончания процесса. Платформа просканирует таблицы базы данных, обнаружит записи регистра, ссылающиеся на несуществующие или удаленные объекты, и корректно удалит их. После этого повторим попытку обновления.

Способ 5. Очистка устаревших данных через встроенные механизмы БСП

Если мы обновляем современную конфигурацию, в которой используется БСП версии 3.1 или новее, разработчики 1С уже предусмотрели штатный инструмент для подготовки данных к переходу на новые версии.

  1. Запустим базу данных в режиме «1С:Предприятие».
  2. Перейдем в раздел Администрирование — Обслуживание — Обновление программы.
  3. Найдем и откроем гиперссылку «Очистка устаревших данных».
  4. Запустим анализ системы. Механизм автоматически определит неактуальные двоичные данные, «осиротевшие» записи и безопасно очистит их в пользовательском режиме перед тем, как мы начнем техническое обновление структуры в Конфигураторе.

Способ 6. Обход ошибки через временное изменение структуры регистра

Если зайти в пользовательский режим не удается, а база настойчиво блокирует кнопку принятия изменений из-за дублирования ключей, применим профессиональный «лайфхак» разработчиков 1С:

  1. В Конфигураторе включим возможность изменения для регистра сведений ДвоичныеДанныеФайлов (установим режим поддержки «Редактируется с сохранением поддержки»).
  2. Добавим в данный регистр новый временный ресурс (например, назовем его ВременныйРесурс с типом Число или Строка).
  3. Попытаемся запустить обновление конфигурации базы данных (клавиша F7). Включение нового поля заставит платформу выполнить реструктуризацию по более мягкому сценарию, обойдя жесткую блокировку кнопки «Принять».
  4. После успешного обновления зайдем в режим «1С:Предприятие». База откроется, и мы сможем воспользоваться консолью запросов или обработками для удаления дублей.
  5. После исправления данных вернемся в Конфигуратор, удалим созданный временный ресурс ВременныйРесурс и вернем объект на стандартную поддержку.

Способ 7. Поиск и программное удаление дублей через консоль запросов

Иногда визуально определить, какие именно записи дублируются в регистре, невозможно, поскольку стандартная форма списка регистра при наличии дублей выдает ошибку СУБД и закрывается. Выясним точную причину с помощью Консоли запросов.

Рассмотрим подробнее текст запроса, который сгруппирует записи по измерению Файл и выведет только те элементы, у которых количество записей в физической таблице превышает одну:


ВЫБРАТЬ
    ДвоичныеДанные.Файл КАК Файл,
    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
    РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанные
СГРУППИРОВАТЬ ПО
    ДвоичныеДанные.Файл
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1

Этот запрос вернет список конкретных ссылок на справочники файлов, которые вызвали конфликт уникальности ключа. Получив этот список, мы можем написать простую обработку, которая создаст набор записей регистра с отбором по проблемному файлу и запишет пустой набор, удалив тем самым мешающий дубль:


НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Файл.Установить(ПроблемнаяСсылка);
НаборЗаписей.Записать(); // Запись пустого набора удаляет дублирующие строки

Способ 8. Прямая очистка дублей на уровне СУБД (для клиент-серверного варианта)

Для крупных баз данных, работающих под управлением MS SQL Server или PostgreSQL, наиболее быстрым и радикальным методом является исправление структуры напрямую через SQL-запросы. Перед выполнением этих шагов обязательно создайте резервную копию базы данных!

  1. Определим физическое имя таблицы регистра сведений в СУБД. Для этого в Конфигураторе выполним команду ПолучитьСтруктуруХраненияБазыДанных() через табло или воспользуемся программным кодом. Искомая таблица будет иметь имя вида _InfoRgXXXX (где XXXX — уникальный числовой идентификатор таблицы в СУБД).
  2. Откроем среду управления СУБД (например, SQL Server Management Studio) и найдем нашу базу данных.
  3. Напишем SQL-запрос для поиска строк с пустыми или дублирующимися идентификаторами файлов (в поле, соответствующем измерению _FldXXXX, которое хранит ссылку на файл).
  4. Выполним удаление дублирующихся записей так, чтобы в таблице осталась только одна уникальная запись на каждый ключ, либо полностью очистим таблицу _InfoRgXXXX с помощью инструкции TRUNCATE TABLE _InfoRgXXXX (если потеря двоичных данных не критична и их можно восстановить позже).
  5. После очистки на уровне СУБД вернемся в Конфигуратор и запустим обновление — реструктуризация завершится мгновенно и без ошибок.

Способ 9. Использование универсальных инструментов разработчика

Для предотвращения подобных ситуаций и автоматизации рутинных проверок рекомендуется использовать профессиональный набор инструментов. В составе программного комплекса «Инструменты разработчика» (ИР) присутствует мощный специализированный инструмент — «Подготовка к изменению структуры БД».

Этот инструмент позволяет просканировать базу данных на предмет любых потенциальных конфликтов реструктуризации до того, как СУБД заблокирует процесс обновления. Он автоматически находит дубли в индексах, битые ссылки, несоответствия типов данных и предлагает варианты их автоматического исправления в один клик, экономя время системных администраторов и программистов 1С.

← На главную