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

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

Что такое хранилище значений и почему оно разрастается

Хранилище значений (ValueStorage) — это бинарный файл с расширением .v8d (для файлового варианта базы) или таблица в СУБД (для клиент-серверного), где 1С хранит:

  • 📊 Кэшированные результаты запросов — для ускорения повторных обращений
  • 🔄 Временные данные сеансов — например, промежуточные расчёты отчётов
  • 📎 Прикреплённые файлы — если они хранятся в базе, а не во внешнем хранилище
  • 🔑 Настройки пользователей — персональные параметры интерфейса

Основные причины разрастания:

  1. Долго работающие сеансы — если пользователи не закрывают 1С днями, временные данные накапливаются.
  2. Неоптимизированные отчёты — сложные запросы с большими выборками кэшируются целиком.
  3. Ошибки в коде — когда разработчики явно сохраняют данные в хранилище через ПоместитьВоВременноеХранилище(), но не очищают их.
  4. Архивные версии объектов — при включённой версиирования метаданных.
📊 Как часто вы очищаете хранилище значений в 1С?
Раз в месяц
Только при замедлении работы
Никогда не очищал
По расписанию (автоматически)

В клиент-серверном варианте хранилище значений может занимать до 30-50% от размера базы данных, а в файловом — разрастаться до сотен гигабайт. При этом 1С:Предприятие не предоставляет встроенных инструментов для его анализа: вы не увидите, какие именно данные занимают место, без специальных запросов.

Как проверить текущий размер хранилища значений

Перед очисткой необходимо оценить масштаб проблемы. Способы зависят от типа базы:

Тип базы Метод проверки Команда/путь
Файловая Просмотр размера файла .v8d Панель управления → Свойства файла или команда
dir /s "C:\Путь\К\Базе\*.v8d"
Клиент-серверная (PostgreSQL) SQL-запрос к системным таблицам
SELECT pg_size_pretty(pg_total_relation_size('"ValueStorage"'));
Клиент-серверная (MS SQL) Запрос к sys.tables
SELECT SUM(reserved_page_count) * 8.0 / 1024 AS [SizeMB]

FROM sys.dm_db_partition_stats

WHERE object_id = OBJECT_ID('ValueStorage');

Любая Через конфигуратор (только размер) Администрирование → Тестирование и исправление → Показать размеры таблиц

Для файловой базы можно использовать PowerShell-скрипт для мониторинга:

$path = "C:\1C_Bases\YourBase\"

$v8d = Get-ChildItem -Path $path -Filter *.v8d

$size = $v8d.Length / 1GB

Write-Host "Размер хранилища: $size ГБ"

💡

Если размер хранилища превышает 10 ГБ, но в базе нет архивных данных — это признак утечки памяти в конфигурации. Проверьте код на наличие циклов с помещением данных во временное хранилище без последующего удаления.

Способы очистки хранилища значений

Выбор метода зависит от версии платформы, типа базы и ваших прав доступа. Рассмотрим все варианты от самого безопасного к наиболее рискованному.

1. Автоматическая очистка через конфигуратор

Самый надёжный способ для неопытных пользователей:

  1. Закройте все сеансы 1С.
  2. Откройте конфигуратор в режиме Администратор.
  3. Перейдите в Администрирование → Тестирование и исправление.
  4. Установите флаги:
    • 🔹 Проверять логическую целостность
    • 🔹 Проверять ссылочную целостность
    • 🔹 Реиндексировать таблицы
    • 🔹 Очищать хранилище значений
  5. Нажмите Выполнить и дождитесь завершения.
  6. Сделать резервную копию базы|Закрыть все сеансы пользователей|Проверить свободное место на диске (нужно минимум 20% от размера базы)|Отключить регламентные задания|Предварительно проанализировать размер хранилища-->

    Этот метод очищает только неиспользуемые данные, которые не привязаны к активным сеансам или объектам метаданных. Он безопасен, но может не дать значительного эффекта, если хранилище забито "живыми" данными.

    2. Ручная очистка через SQL (для клиент-серверных баз)

    Для PostgreSQL или MS SQL можно выполнить прямую очистку таблицы. Внимание: это удалит ВСЁ содержимое хранилища, включая данные активных сеансов!

    Для PostgreSQL:

    TRUNCATE TABLE "ValueStorage";
    

    VACUUM FULL "ValueStorage";

    Для MS SQL:

    TRUNCATE TABLE ValueStorage;
    

    DBCC SHRINKFILE (N'YourDatabase_Data' , 0, TRUNCATEONLY);

    Что будет если очистить хранилище во время работы пользователей?

    Все активные сеансы будут разорваны с ошибкой "Не найдено значение во временном хранилище". Пользователи потеряют несохранённые данные в открытых документах и отчётах. Восстановление потребует перезапуска 1С и возможного повторного ввода информации.

    3. Программная очистка на встроенном языке

    Для избирательной очистки можно использовать скрипт:

    Процедура ОчиститьХранилищеЗначений()
    

    // Получаем список всех ключей хранилища

    МассивКлючей = Новый Массив;

    ХранилищеЗначений = Новый ХранилищеЗначений;

    Попытка

    Для Каждого Ключ Из ХранилищеЗначений.ПолучитьКлючи() Цикл

    МассивКлючей.Добавить(Ключ);

    КонецЦикла;

    // Удаляем все значения старше 30 дней

    ТекущаяДата = ТекущаяДата();

    Для Каждого Ключ Из МассивКлючей Цикл

    ДатаСоздания = ХранилищеЗначений.ПолучитьДополнительнуюИнформацию(Ключ).Дата;

    Если ДатаСоздания < ТекущаяДата - 30 Тогда

    ХранилищеЗначений.Удалить(Ключ);

    КонецЕсли;

    КонецЦикла;

    Исключение

    Сообщить("Ошибка при очистке: " + ОписаниеОшибки());

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

    КонецПроцедуры

    Этот код удаляет только данные старше 30 дней. Для полной очистки замените условие на Если Истина Тогда.

    4. Очистка через утилиту chdbfl.exe

    Для файловой базы можно использовать штатную утилиту chdbfl.exe, которая находится в каталоге установки 1С:

    chdbfl.exe "C:\Путь\К\Базе\" /CValueStorage

    Ключи утилиты:

    • 🔧 /CValueStorage — очистка хранилища значений
    • 🔧 /D — дефрагментация файла базы
    • 🔧 /L — ведение лога (пример: /L"C:\log.txt")
    💡

    Утилита chdbfl.exe работает только с файловой базой 1С и требует монопольного доступа. Перед запуском обязательно закройте все сеансы и сделайте резервную копию.

    Типичные ошибки и как их избежать

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

    ⚠️ Внимание: Если после очистки пользователи получают ошибку "Не найдено значение во временном хранилище (XXX)", это означает, что были удалены данные активных сеансов. Восстановить их можно только из резервной копии или повторным вводом.
    Ошибка Причина Решение
    База не открывается после очистки Повреждение файла .v8d при прерывании процесса Восстановить из бэкапа или использовать chdbfl /R для ремонта
    Ошибка "Нет прав на очистку" Недостаточно прав в СУБД или файловой системе Запустить от имени администратора или выдать права на таблицу ValueStorage
    Хранилище не уменьшилось Данные заняты активными сеансами или архивными версиями Использовать Тестирование и исправление с флагом Сжать базу
    Зависание при очистке Большой объём данных или фрагментация Разбить процесс на части или использовать VACUUM в PostgreSQL

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

    ВЫБРАТЬ
    

    ХранилищеЗначений.ПолучитьКлючи() КАК Ключ,

    ХранилищеЗначений.ПолучитьДополнительнуюИнформацию(Ключ).Размер КАК Размер,

    ХранилищеЗначений.ПолучитьДополнительнуюИнформацию(Ключ).Дата КАК Дата

    ИЗ

    ХранилищеЗначений КАК ХранилищеЗначений

    ГДЕ

    ХранилищеЗначений.ПолучитьДополнительнуюИнформацию(Ключ).Размер > 1000000 // Более 1 МБ

    Когда очистка хранилища значений бесполезна

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

    • 🔄 Активное использование версиирования — если в конфигурации включено ведение версий объектов, хранилище будет постоянно пополняться. Очистка удалит историю изменений.
    • 📈 Большие отчёты с кэшированием — некоторые отчёты (например, Анализ субконто или Оборотно-сальдовая ведомость) активно используют кэш. Их очистка приведёт к замедлению при следующем запуске.
    • 🔗 Интеграции через COM и HTTP-сервисы — временные данные могут использоваться для обмена с внешними системами. Их удаление нарушит работу интеграций.
    • 🛠 Кастомизированные конфигурации — если разработчики явно сохраняют данные во временное хранилище (например, для межсеансового обмена), очистка приведёт к ошибкам.

В таких случаях лучше:

  1. Настроить автоматическую архивацию старых данных (через регламентные задания).
  2. Оптимизировать код конфигурации, чтобы уменьшить использование хранилища.
  3. Перенести крупные файлы во внешнее хранилище (например, на файловый сервер).
💡

Если хранилище разрастается из-за отчётов, добавьте в их модули команду ОчиститьКэшЗначений() после формирования. Это уменьшит накопление временных данных.

Автоматизация очистки: регламентные задания и скрипты

Ручная очистка — неудобна для крупных баз. Лучше настроить автоматическое выполнение по расписанию. Варианты:

1. Регламентное задание в 1С

Создайте задание с периодичностью 1 раз в неделю:

Процедура ОчисткаХранилищаЗначенийНаСервере()

Хранилище = Новый ХранилищеЗначений;

МассивКлючей = Хранилище.ПолучитьКлючи();

Для Каждого Ключ Из МассивКлючей Цикл

Попытка

Если Хранилище.ПолучитьДополнительнуюИнформацию(Ключ).Дата < НачалоДня(ТекущаяДата()) - 7 Тогда

Хранилище.Удалить(Ключ);

КонецЕсли;

Исключение

// Игнорируем ошибки доступа к занятым данным

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

КонецЦикла;

КонецПроцедуры

2. SQL-задание для PostgreSQL

Создайте задачу в pgAgent или cron:

# Ежедневная очистка старых данных (старше 7 дней)

psql -U postgres -d your_database -c "

DELETE FROM \"ValueStorage\"

WHERE \"Date\" < CURRENT_DATE - INTERVAL '7 days';"

3. PowerShell-скрипт для файловой базы

Запланируйте в Планировщике заданий Windows:

$path = "C:\1C_Bases\YourBase\"

$chdbfl = "C:\Program Files\1cv8\8.3.x.xxx\bin\chdbfl.exe"

Start-Process -FilePath $chdbfl -ArgumentList "$path /CValueStorage /L`"$path\cleanup.log`"" -Wait

Для безопасности настройте:

  • 📅 Время выполнения — в период минимальной нагрузки (ночью).
  • 📤 Уведомления — отправляйте лог администратору по email.
  • 🔄 Резервирование — делайте бэкап перед каждой очисткой.

Альтернативные способы уменьшения хранилища

Если очистка не помогает или невозможна, рассмотрите альтернативные методы:

Метод Когда применять Эффективность
Перенос прикреплённых файлов во внешнее хранилище Если в хранилище лежат документы, изображения, архивы ⭐⭐⭐⭐⭐ (до 90% экономии места)
Отключение версиирования объектов Если не ведётся аудит изменений ⭐⭐⭐ (экономия зависит от активности редактирования)
Оптимизация запросов в отчётах Если хранилище забито кэшем сложных отчётов ⭐⭐⭐⭐ (уменьшает прирост нового мусора)
Разделение базы на информационные регистры Для очень крупных баз (100+ ГБ) ⭐⭐ (требует доработки конфигурации)
Архивация и выгрузка старых данных Если в базе данные за 5+ лет ⭐⭐⭐⭐ (но требует места для архивов)

Для переноса прикреплённых файлов используйте типовой механизм Внешнее хранилище значений (доступен с версии платформы 8.3.14). Пример настройки:

// В модуле приложения

ПодключитьВнешнееХранилищеЗначений(

Новый ОписаниеВнешнегоХранилищаЗначений(

ТипВнешнегоХранилищаЗначений.ФайловаяСистема,

"\\server\1C_Attachments\",

Истина

)

);

💡

Перенос прикреплённых файлов во внешнее хранилище — самый эффективный способ уменьшить размер базы без потери данных. После миграции файл .v8d может уменьшиться в 2-3 раза.

FAQ: Частые вопросы по очистке хранилища значений

Можно ли очистить хранилище значений без остановки 1С?

Нет, для полной очистки требуется монопольный доступ. В клиент-серверном варианте можно удалить только неиспользуемые данные через SQL, но это рискованно. Для файловой базы обязательно закрытие всех сеансов.

Как восстановить данные, если после очистки пропали прикреплённые файлы?

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

Почему после очистки файл .v8d не уменьшился?

Файловая система может не сразу освободить место. Для файловой базы выполните chdbfl /D (дефрагментация). В PostgreSQL запустите VACUUM FULL.

Как очистить хранилище для конкретного пользователя?

Используйте скрипт с фильтрацией по идентификатору сеанса:

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

Запрос.Текст = "ВЫБРАТЬ Ключ ИЗ ХранилищеЗначений ГДЕ Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Пользователь", ИдентификаторПользователя);

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

ХранилищеЗначений.Удалить(Результат.Ключ);

КонецЦикла;

Безопасно ли использовать утилиты вроде 1Cv8Cleaner?

Стороние утилиты могут повредить базу, если не учитывают особенности вашей конфигурации. Рекомендуем использовать только штатные средства (chdbfl, конфигуратор) или SQL-запросы.

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