К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как очистить хранилище значений в 1С

Как очистить хранилище значений в 1С: обработка данных, удаление через код, очистка в типовых конфигурациях. Проверка результата, риски и типичные ошибки.

Хранилище значений (ХранилищеЗначения) в 1С — это механизм для сохранения произвольных данных внутри реквизита объекта: картинок, файлов, сериализованных структур, настроек. Со временем такие реквизиты разрастаются, база тяжелеет, а очистить их «в lоб» через интерфейс не всегда получается, потому что содержимое хранилища не отображается в обычной форме.

Очистка хранилища значений сводится к одной операции: записать в реквизит пустое значение — Неопределено или пустой объект Новый ХранилищеЗначения(Неопределено). Сложность обычно не в самом коде, а в том, чтобы найти, где именно накопились данные, и не удалить то, что ещё нужно программе.

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

Что такое хранилище значений и когда его нужно чистить

Хранилище значений — это тип данных, который упаковывает произвольный объект в двоичный формат и сохраняет его в поле базы данных. Внутри может лежать что угодно: двоичные данные файла, картинка, таблица значений, структура с настройками отчёта. Типичные места хранения — реквизиты справочников (например, «ФайлКартинки»), регистры сведений с настройками, константы.

Признаки того, что хранилища пора чистить: база заметно разрослась без роста количества документов, выгрузка в DT занимает непропорционально много времени, типовые отчёты с присоединёнными файлами тормозят. Частый источник проблемы — регистры сведений с версиями объектов или устаревшие файлы в справочниках присоединённых файлов.

Перед очисткой важно понять, какие данные лежат в хранилище и используются ли они. Настройки в константах или регистрах могут быть нужны для работы механизмов — их слепое удаление приведёт к сбросу настроек у пользователей.

Очистка хранилища у конкретного объекта через код

Самый простой сценарий — очистить реквизит у одного элемента справочника или документа. Это делается в консоли кода (внешней обработке «Консоль кода» или аналогичной) в режиме предприятия:

Объект = СсылкаНаЭлемент.ПолучитьОбъект();

Объект.ХранилищеДанных = Неопределено;

Объект.Записать();

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

Объект.ХранилищеДанных = Новый ХранилищеЗначения(Неопределено);

Разница принципиальна: Неопределено полностью очищает поле, а пустое хранилище оставляет небольшую сериализованную обёртку. С точки зрения места в базе первый вариант эффективнее, второй — совместимее с кодом, который без проверки вызывает .Получить().

Массовая очистка хранилищ в справочнике или документах

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Попытка

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.ХранилищеДанных = Неопределено;

Объект.Записать();

Исключение

ЗаписьЖурналаРегистрации("ОчисткаХранилища",

УровеньЖурналаРегистрации.Ошибка,,,

ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Для больших объёмов имеет смысл обрабатывать данные порциями с выводом прогресса, чтобы не блокировать работу пользователей надолго. В клиент-серверном варианте тяжёлую обработку лучше запускать в фоновом задании в нерабочее время.

Очистка хранилищ в регистрах сведений и константах

Регистры сведений с ресурсами типа «ХранилищеЗначения» — частый накопитель мусора: история версий, протоколы обменов, кэши. Очистить ресурс можно через набор записей: прочитать набор по отбору, установить ресурс в Неопределено, записать. Если данные в регистре не нужны целиком, проще полностью очистить регистр методом УстановитьИспользованиеИтогов не требуется — достаточно записать пустой набор или использовать обработку удаления.

Константы с хранилищем значений очищаются аналогично объектам: присвоить константе Неопределено через менеджер константы и записать. Например: Константы.НастройкиОбмена.Установить(Неопределено) — но сначала проверьте, не хранятся ли там рабочие настройки интеграции.

В типовых конфигурациях часть данных хранилищ очищается штатно: регистрами удаления устаревших версий объектов, регламентными заданиями очистки истории, обработкой «Удаление помеченных объектов». Сначала проверьте штатные механизмы — они безопаснее самописных циклов.

Порядок безопасной очистки
  1. 1
    Определите, в каких объектах и реквизитах накопились данные
  2. 2
    Сделайте резервную копию базы
  3. 3
    Проверьте очистку на одном тестовом объекте
  4. 4
    Запустите массовую обработку с обработкой ошибок
  5. 5
    Проверьте работу конфигурации и выполните сжатие базы

Очистка через типовые средства и универсальные обработки

Не всегда нужен код. В конфигурациях на БСП (Библиотека стандартных подсистем) есть регламентные задания очистки устаревших данных, обработка «Групповое изменение реквизитов» позволяет массово установить значение реквизита — в том числе очистить хранилище, если обработка поддерживает этот тип. Найти её можно в разделе «Администрирование» — «Обслуживание».

Универсальные внешние обработки («Универсальный подбор и обработка объектов», консоли кода) позволяют отобрать объекты запросом и выполнить произвольный код над каждым. Это удобно, когда нет доступа к конфигуратору или нет желания писать обработку с нуля, но требует права на запуск внешних обработок и понимания последствий.

Способы очистки

Консоль кода

Быстро для единичных объектов и тестов; требует права и аккуратности, нет защиты от ошибок

Собственная обработка

Подходит для массовой регулярной очистки; требует разработки и тестирования

Групповое изменение реквизитов

Штатно и безопасно в типовых; не всегда поддерживает тип ХранилищеЗначения

Регламентные задания БСП

Автоматическая очистка устаревших данных; работает только для предусмотренных механизмов

Проверка результата и освобождение места

После очистки убедитесь, что данные действительно удалены: прочитайте реквизит у нескольких объектов и проверьте, что Получить() возвращает Неопределено. Затем оцените эффект на размер базы — здесь есть нюанс.

Удалённые данные остаются внутри файла 1Cv8.1CD как незанятое место. Чтобы файл физически уменьшился, выполните «Тестирование и исправление» с включённой реструктуризацией таблиц (в монопольном режиме). В клиент-серверном варианте аналогичную роль играют средства СУБД: shrink для MS SQL, vacuum для PostgreSQL — их выполняет администратор СУБД.

Контрольные точки

Как проверить результат

Чтение реквизита после очистки
Норма

Получить() возвращает Неопределено

Тревожный признак

Старые данные всё ещё читаются

Работа конфигурации
Норма

Формы и отчёты открываются без ошибок

Тревожный признак

Ошибки обращения к удалённым данным

Размер файла базы
Норма

Уменьшился после сжатия/реструктуризации

Тревожный признак

Размер прежний — сжатие не выполнялось

Типичные ошибки и ограничения

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

Ещё одна ловушка — обмен данными. Если база участвует в РИБ или обмене через планы обмена, изменение объектов приведёт к регистрации изменений и передаче их в другие узлы. Для больших объёмов это может перегрузить обмен; иногда целесообразно временно снять регистрацию.

Типичные ошибки
01
Очистка без резервной копии — данные невозможно восстановить
02
Запись Неопределено там, где код ждёт объект хранилища — ошибки при чтении
03
Игнорирование планов обмена — всплеск трафика в РИБ
04
Ожидание мгновенного уменьшения файла базы без сжатия
05
Очистка регистров с настройками — сброс параметров у пользователей

Частые вопросы

Чем отличается запись Неопределено от пустого ХранилищеЗначения?

Неопределено полностью очищает поле в базе. Пустое хранилище (Новый ХранилищеЗначения(Неопределено)) оставляет сериализованную обёртку, но совместимо с кодом, который без проверки вызывает метод Получить(). Для освобождения места лучше первый вариант.

Почему после очистки размер базы не уменьшился?

Файл базы не сжимается автоматически — удалённые данные остаются внутри как свободное место. Выполните «Тестирование и исправление» с реструктуризацией для файловой базы или сжатие средствами СУБД для клиент-серверной.

Можно ли очистить хранилище без программирования?

Частично. В типовых конфигурациях на БСП есть «Групповое изменение реквизитов» и регламентные задания очистки устаревших данных. Но для произвольных реквизитов типа ХранилищеЗначения чаще всего потребуется консоль кода или обработка.

Опасно ли очищать хранилища в рабочей базе днём?

Для единичных объектов — обычно безопасно. Массовая обработка создаёт нагрузку и блокировки, поэтому большие объёмы лучше обрабатывать в нерабочее время, а «Тестирование и исправление» требует монопольного доступа.

Как узнать, какие хранилища занимают больше всего места?

Точных штатных отчётов по размеру реквизитов нет. Ориентируйтесь на таблицы с наибольшим числом записей и известные «тяжёлые» места: присоединённые файлы, версии объектов, протоколы обменов. В клиент-серверном варианте размер таблиц виден средствами СУБД.

Итог

Что важно запомнить

Хранилище значений очищается записью Неопределено в реквизит с последующей записью объекта. Перед массовой обработкой обязательна резервная копия, после очистки — проверка работы конфигурации и сжатие базы для реального освобождения места.