Разработка и Конфигурация · 9 мин
Как очистить хранилище значений в 1С
Как очистить хранилище значений в 1С: обработка данных, удаление через код, очистка в типовых конфигурациях. Проверка результата, риски и типичные ошибки.
Хранилище значений (ХранилищеЗначения) в 1С — это механизм для сохранения произвольных данных внутри реквизита объекта: картинок, файлов, сериализованных структур, настроек. Со временем такие реквизиты разрастаются, база тяжелеет, а очистить их «в lоб» через интерфейс не всегда получается, потому что содержимое хранилища не отображается в обычной форме.
Очистка хранилища значений сводится к одной операции: записать в реквизит пустое значение — Неопределено или пустой объект Новый ХранилищеЗначения(Неопределено). Сложность обычно не в самом коде, а в том, чтобы найти, где именно накопились данные, и не удалить то, что ещё нужно программе.
Ниже разобраны способы очистки: через код в консоли, через типовые средства конфигурации, с помощью универсальных обработок, а также как проверить результат и чего опасаться перед массовой обработкой.
Что такое хранилище значений и когда его нужно чистить
Хранилище значений — это тип данных, который упаковывает произвольный объект в двоичный формат и сохраняет его в поле базы данных. Внутри может лежать что угодно: двоичные данные файла, картинка, таблица значений, структура с настройками отчёта. Типичные места хранения — реквизиты справочников (например, «ФайлКартинки»), регистры сведений с настройками, константы.
Признаки того, что хранилища пора чистить: база заметно разрослась без роста количества документов, выгрузка в DT занимает непропорционально много времени, типовые отчёты с присоединёнными файлами тормозят. Частый источник проблемы — регистры сведений с версиями объектов или устаревшие файлы в справочниках присоединённых файлов.
Перед очисткой важно понять, какие данные лежат в хранилище и используются ли они. Настройки в константах или регистрах могут быть нужны для работы механизмов — их слепое удаление приведёт к сбросу настроек у пользователей.
Очистка хранилища у конкретного объекта через код
Самый простой сценарий — очистить реквизит у одного элемента справочника или документа. Это делается в консоли кода (внешней обработке «Консоль кода» или аналогичной) в режиме предприятия:
Объект = СсылкаНаЭлемент.ПолучитьОбъект();
Объект.ХранилищеДанных = Неопределено;
Объект.Записать();
Если конфигурация при чтении реквизита ожидает именно объект хранилища, а не Неопределено, безопаснее записать пустое хранилище:
Объект.ХранилищеДанных = Новый ХранилищеЗначения(Неопределено);
Разница принципиальна: Неопределено полностью очищает поле, а пустое хранилище оставляет небольшую сериализованную обёртку. С точки зрения места в базе первый вариант эффективнее, второй — совместимее с кодом, который без проверки вызывает .Получить().
Массовая очистка хранилищ в справочнике или документах
Когда чистить нужно сотни или тысячи объектов, пишется цикл по выборке. Ключевые правила безопасной массовой обработки: выбирать только ссылки (без данных), получать объект внутри цикла, оборачивать запись в транзакцию и обработку исключений.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.ХранилищеДанных = Неопределено;
Объект.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаХранилища",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Для больших объёмов имеет смысл обрабатывать данные порциями с выводом прогресса, чтобы не блокировать работу пользователей надолго. В клиент-серверном варианте тяжёлую обработку лучше запускать в фоновом задании в нерабочее время.
Очистка хранилищ в регистрах сведений и константах
Регистры сведений с ресурсами типа «ХранилищеЗначения» — частый накопитель мусора: история версий, протоколы обменов, кэши. Очистить ресурс можно через набор записей: прочитать набор по отбору, установить ресурс в Неопределено, записать. Если данные в регистре не нужны целиком, проще полностью очистить регистр методом УстановитьИспользованиеИтогов не требуется — достаточно записать пустой набор или использовать обработку удаления.
Константы с хранилищем значений очищаются аналогично объектам: присвоить константе Неопределено через менеджер константы и записать. Например: Константы.НастройкиОбмена.Установить(Неопределено) — но сначала проверьте, не хранятся ли там рабочие настройки интеграции.
В типовых конфигурациях часть данных хранилищ очищается штатно: регистрами удаления устаревших версий объектов, регламентными заданиями очистки истории, обработкой «Удаление помеченных объектов». Сначала проверьте штатные механизмы — они безопаснее самописных циклов.
- 1Определите, в каких объектах и реквизитах накопились данные
- 2Сделайте резервную копию базы
- 3Проверьте очистку на одном тестовом объекте
- 4Запустите массовую обработку с обработкой ошибок
- 5Проверьте работу конфигурации и выполните сжатие базы
Очистка через типовые средства и универсальные обработки
Не всегда нужен код. В конфигурациях на БСП (Библиотека стандартных подсистем) есть регламентные задания очистки устаревших данных, обработка «Групповое изменение реквизитов» позволяет массово установить значение реквизита — в том числе очистить хранилище, если обработка поддерживает этот тип. Найти её можно в разделе «Администрирование» — «Обслуживание».
Универсальные внешние обработки («Универсальный подбор и обработка объектов», консоли кода) позволяют отобрать объекты запросом и выполнить произвольный код над каждым. Это удобно, когда нет доступа к конфигуратору или нет желания писать обработку с нуля, но требует права на запуск внешних обработок и понимания последствий.
Способы очистки
Быстро для единичных объектов и тестов; требует права и аккуратности, нет защиты от ошибок
Подходит для массовой регулярной очистки; требует разработки и тестирования
Штатно и безопасно в типовых; не всегда поддерживает тип ХранилищеЗначения
Автоматическая очистка устаревших данных; работает только для предусмотренных механизмов
Проверка результата и освобождение места
После очистки убедитесь, что данные действительно удалены: прочитайте реквизит у нескольких объектов и проверьте, что Получить() возвращает Неопределено. Затем оцените эффект на размер базы — здесь есть нюанс.
Удалённые данные остаются внутри файла 1Cv8.1CD как незанятое место. Чтобы файл физически уменьшился, выполните «Тестирование и исправление» с включённой реструктуризацией таблиц (в монопольном режиме). В клиент-серверном варианте аналогичную роль играют средства СУБД: shrink для MS SQL, vacuum для PostgreSQL — их выполняет администратор СУБД.
Как проверить результат
Получить() возвращает Неопределено
Старые данные всё ещё читаются
Формы и отчёты открываются без ошибок
Ошибки обращения к удалённым данным
Уменьшился после сжатия/реструктуризации
Размер прежний — сжатие не выполнялось
Типичные ошибки и ограничения
Главная ошибка — очистка без резервной копии. Вторая по частоте — удаление данных, которые используются: например, настройки обменов или макеты в хранилищах. Перед массовой обработкой выгрузите содержимое нескольких хранилищ и убедитесь, что понимаете, что внутри.
Ещё одна ловушка — обмен данными. Если база участвует в РИБ или обмене через планы обмена, изменение объектов приведёт к регистрации изменений и передаче их в другие узлы. Для больших объёмов это может перегрузить обмен; иногда целесообразно временно снять регистрацию.
Частые вопросы
Чем отличается запись Неопределено от пустого ХранилищеЗначения?
Неопределено полностью очищает поле в базе. Пустое хранилище (Новый ХранилищеЗначения(Неопределено)) оставляет сериализованную обёртку, но совместимо с кодом, который без проверки вызывает метод Получить(). Для освобождения места лучше первый вариант.
Почему после очистки размер базы не уменьшился?
Файл базы не сжимается автоматически — удалённые данные остаются внутри как свободное место. Выполните «Тестирование и исправление» с реструктуризацией для файловой базы или сжатие средствами СУБД для клиент-серверной.
Можно ли очистить хранилище без программирования?
Частично. В типовых конфигурациях на БСП есть «Групповое изменение реквизитов» и регламентные задания очистки устаревших данных. Но для произвольных реквизитов типа ХранилищеЗначения чаще всего потребуется консоль кода или обработка.
Опасно ли очищать хранилища в рабочей базе днём?
Для единичных объектов — обычно безопасно. Массовая обработка создаёт нагрузку и блокировки, поэтому большие объёмы лучше обрабатывать в нерабочее время, а «Тестирование и исправление» требует монопольного доступа.
Как узнать, какие хранилища занимают больше всего места?
Точных штатных отчётов по размеру реквизитов нет. Ориентируйтесь на таблицы с наибольшим числом записей и известные «тяжёлые» места: присоединённые файлы, версии объектов, протоколы обменов. В клиент-серверном варианте размер таблиц виден средствами СУБД.
Что важно запомнить
Хранилище значений очищается записью Неопределено в реквизит с последующей записью объекта. Перед массовой обработкой обязательна резервная копия, после очистки — проверка работы конфигурации и сжатие базы для реального освобождения места.