Почему быстро растет таблица BinaryData в 1С 8.3.27 и как остановить этот рост

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

С выходом платформы 1С:Предприятие 8.3.27 многие администраторы баз данных столкнулись с пугающим явлением: системная таблица BinaryData начинает увеличиваться в размерах на десятки и сотни гигабайт за считанные дни. Это происходит даже в тех базах, где включено хранение файлов в томах на диске. Ситуация осложняется тем, что стандартные средства обслуживания, такие как «Тестирование и исправление», не всегда помогают, а база перестает выгружаться в формат .dt, выдавая ошибку «Ошибка блочного хранения двоичных данных».

В этой статье мы подробно разберем, что это за таблица, почему механизм очистки дает сбой и какими способами можно вернуть размер базы в разумные пределы — для этого подойдёт инструмент для свертки и сжатия базы 1С. Мы пройдем путь от диагностики причин до радикальных методов миграции данных.

Причина возникновения таблицы BinaryData: новый механизм хранения

Прежде всего, проанализируем ситуацию: начиная с версии 8.3.23, компания 1С начала внедрять новый механизм блочного хранения двоичных данных. Если раньше значения реквизитов с типом ХранилищеЗначения записывались непосредственно в таблицу соответствующего объекта (справочника или документа), то теперь платформа разбивает их на блоки и складывает в общую таблицу BinaryData.

Этот механизм задуман для оптимизации: блоки данных могут дублироваться (дедупликация), а также их проще передавать частями. Однако в релизах платформы 8.3.27 (особенно в ранних сборках до .1851) алгоритм очистки устаревших версий данных оказался недоработан. Рассмотрим подробнее, как это работает в SQL:

  1. Когда вы записываете новый файл или меняете объект с ХранилищеЗначения, старые данные в BinaryData не удаляются мгновенно.
  2. Они помечаются как «удаленные» путем записи специального значения в поле f_num. Если f_num равен 0 — данные актуальны. Если больше 0 — это метка времени, когда блок стал неактуальным.
  3. Специальный фоновый процесс платформы должен периодически выполнять команду DELETE FROM BinaryData WHERE f_num > 0.

Проблема заключается в том, что в версиях 8.3.27.1606, 8.3.27.1688 и некоторых других этот процесс либо не запускается, либо блокируется из-за огромного объема данных, вызывая переполнение лога транзакций SQL-сервера.

Способ 1. Обновление платформы (рекомендуемый метод)

Первым делом нам необходимо выяснить версию установленной платформы. Если вы используете релиз ниже 8.3.27.1851, то вы столкнулись с официально зарегистрированной ошибкой 60026399. В новых сборках (например, 8.3.27.2073 и выше) механизмы очистки были существенно доработаны.

После обновления платформы при первом запуске или при обращении к данным система инициирует очистку. Посмотрим на критически важный момент: очистка может занять длительное время и вызвать «зависание» системы, так как SQL будет выполнять массированный DELETE. В некоторых случаях администраторы наблюдают гигантские транзакции, которые «отъедают» всё место на диске под лог транзакций (LDF) или tempdb.

Способ 2. Выгрузка и загрузка через файл .dt

Если обновление платформы не помогает или база уже настолько раздута, что стандартная очистка не справляется, рассмотрим классический метод — выгрузку в .dt и загрузку в новую базу. Как показывает практика, при формировании файла .dt платформа игнорирует помеченные на удаление блоки (где f_num > 0).

Однако здесь нас может подстерегать ловушка: ошибка «Ошибка хранилища двоичных данных». Если вы столкнулись с ней, выполним следующие шаги:

  1. Попробуем запустить «Тестирование и исправление» с установленной галкой «Сжатие хранилища двоичных данных» (доступно в новых релизах 27-й платформы) — для этой задачи есть инструментарий для автоматизированной очистки и сжатия базы.
  2. Если ТИИ падает, попробуем перевести базу в файловый вариант (через бэкап SQL), выполнить реструктуризацию там, а затем вернуть в клиент-серверный вариант.
  3. Проанализируем расширения конфигурации. Часто проблемы возникают из-за того, что в расширениях добавлены реквизиты в объекты, уже имеющие ХранилищеЗначения.

Способ 3. Прямая очистка средствами SQL (для опытных администраторов)

Если размер таблицы BinaryData исчисляется сотнями гигабайт и база «стоит», некоторые специалисты прибегают к прямой очистке через SQL-запрос. Внимание: этот метод официально не поддерживается и требует обязательного бэкапа!

Разберем логику запроса. Нам нужно удалить только те записи, которые сама 1С считает мусором:


-- Проверка количества мусорных записей
SELECT COUNT(*) FROM BinaryData WHERE f_num > 0;

-- Удаление мусорных записей (выполнять порциями, чтобы не переполнить лог)
DELETE TOP (10000) FROM BinaryData WHERE f_num > 0;

Важно помнить, что если вы удалите записи, где f_num = 0, вы безвозвратно потеряете живые данные (картинки, файлы, печатные формы). Поэтому работаем только с записями, помеченными значением больше нуля.

Способ 4. Управление внешним хранилищем

Выясним причину, почему даже при внешних томах таблица растет. Платформа всё равно использует BinaryData для данных размером менее 2048 байт. Чтобы снизить нагрузку на SQL, можно вынести и это хранилище во внешние файлы через настройки сервера 1С.

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

  1. Зайдем в консоль администрирования серверов 1С — удобнее через инструмент расширенного администрирования баз и сеансов 1С.
  2. В свойствах информационной базы найдем раздел управления хранилищем двоичных данных.
  3. Установим использование внешнего хранилища (в каталоге кластера создастся папка BinDataStrg).

Важный нюанс: папка BinDataStrg теперь является неотъемлемой частью вашей базы. Делайте её бэкап одновременно с бэкапом SQL-базы, иначе при восстановлении вы получите «битые» ссылки в объектах.

Способ 5. Откат режима совместимости и пересохранение данных

Если ни один из методов не помогает и BinaryData продолжает бесконтрольно расти, проанализируем радикальный метод миграции данных обратно в старый формат хранения (до 8.3.23). Это требует временного изменения метаданных.

Рассмотрим алгоритм, предложенный участниками сообщества:

  1. Установим режим совместимости с версией 8.3.25 или ниже.
  2. В свойствах конфигурации установим «Режим использования блочного хранения двоичных данных» в значение «Не использовать».
  3. Запустим реструктуризацию. Платформа начнет переносить данные из BinaryData обратно в таблицы объектов.

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


Для Каждого СсылкаИзВыборки Из Справочники.ПрисоединенныеФайлы.Выбрать() Цикл
    Объект = СсылкаИзВыборки.ПолучитьОбъект();
    Если Объект <> Неопределено Тогда
        Данные = Объект.СодержимоеФайла.Получить();
        Объект.СодержимоеФайла = Новый ХранилищеЗначения(Данные);
        Объект.Записать();
    КонецЕсли;
КонецЦикла;

Такой подход заставляет платформу перезаписать данные в текущем формате. После завершения миграции и очистки таблицы BinaryData (через .dt), можно снова возвращаться на современные режимы работы, но уже на стабильном релизе платформы.

Резюме и рекомендации

Проанализировав ситуацию, мы видим, что проблема роста BinaryData — это «болезнь роста» новых механизмов платформы. Чтобы минимизировать риски, придерживайтесь следующих правил:

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

← На главную