Регистры сведений в 1С:Предприятие — это ключевые объекты конфигурации, которые хранят исторические данные, настройки системных параметров или справочную информацию. Со временем они могут разрастаться до гигантских объёмов, замедляя работу базы, усложняя резервное копирование или даже вызывая ошибки при обновлениях. Но просто так удалить записи из регистра нельзя: это чревато потерей критичных данных, нарушением ссылочной целостности или сбоем бизнес-процессов.
В этой статье мы разберём все безопасные способы очистки регистров сведений — от ручных методов через интерфейс 1С до автоматизированных обработок и прямых SQL-запросов. Вы узнаете, как подготовить базу к чистке, какие инструменты использовать для разных версий платформы (включая 1С:Предприятие 8.3), и как избежать типичных ошибок, которые приводят к потере данных. Особое внимание уделим регистрам сведений с периодичностью "Секунда" — их очистка требует особых подходов из-за огромного количества записей.
Почему регистры сведений нуждаются в очистке
Основные причины, по которым администраторы и разработчики прибегают к очистке регистров:
- 📉 Производительность: регистры с миллионами записей тормозят отчёты, замедляют проведение документов и увеличивают время резервного копирования.
- 💾 Размер базы данных: раздутые регистры занимают десятки гигабайт на диске, что усложняет миграцию или обновление платформы.
- 🔄 Ошибки обновлений: при переходе на новые релизы 1С может блокировать обновление из-за конфликтов в данных регистров.
- 🗑️ Устаревшие данные: в регистрах накапливаются записи за прошлые годы, которые больше не нужны для работы (например, курсы валют 10-летней давности).
Однако не все регистры можно чистить одинаково. Например, регистр ПараметрыСеанса хранит временные настройки пользователей и очищается автоматически, а регистр ЦеныНоменклатуры может содержать критичные для бизнеса данные. Прежде чем приступать к удалению, необходимо:
- Определить тип регистра (периодический, независимый, с подчинением регистратору).
- Проанализировать ссылочную целостность — не используются ли записи в документах или отчётах.
- Создать резервную копию базы (об этом подробнее в следующем разделе).
⚠️ Внимание: Очистка регистров сведенийРасчетЗарплаты,НДФЛилиСтраховыеВзносыможет привести к некорректному расчёту зарплаты и штрафам от налоговой. Перед чисткой таких регистров обязательно проконсультируйтесь с бухгалтером!
Подготовка к очистке: резервное копирование и анализ данных
Первый и обязательный шаг перед любыми манипуляциями с регистрами — создание резервной копии базы данных. Даже если вы планируете удалять только старые записи, ошибка в запросе или сбой платформы может привести к потере актуальных данных. В 1С:Предприятие 8.3 есть несколько способов бэкапа:
- 💾 Через конфигуратор:
Администрирование → Выгрузить информационную базу(файл.dt). - 🔄 С помощью SQL-сервера: если база работает на Microsoft SQL Server или PostgreSQL, сделайте бэкап через
SQL Server Management Studioилиpg_dump. - ⏳ Точка восстановления: в файловом варианте 1С можно создать точку отката через
Администрирование → Поддержка и обслуживание → Архивные копии.
После бэкапа необходимо проанализировать структуру регистра. Для этого:
- Откройте регистр в конфигураторе (
Объекты → Регистры сведений). - Изучите его измерения (по чему группируются данные) и ресурсы (что хранится).
- Проверьте, есть ли у регистра периодичность (день, месяц, секунда) — это определит сложность очистки.
Для анализа объёма данных можно использовать стандартный отчёт Анализ использования дискового пространства (доступен в 1С:Предприятие 8.3.20+). Он покажет, какие регистры занимают больше всего места. Альтернатива — SQL-запрос к системным таблицам:
SELECT
T.name AS TableName,
S.row_count AS RowCount,
CAST(S.reserved_page_count * 8.0 / 1024 AS DECIMAL(10, 2)) AS ReservedMB
FROM
sys.tables T
INNER JOIN
sys.dm_db_partition_stats S ON T.object_id = S.object_id
WHERE
T.name LIKE '%_РС%' -- Фильтр по регистрам сведений
ORDER BY
S.reserved_page_count DESC;
⚠️ Внимание: Если вы работаете с облачной версией 1С:Fresh, возможности прямого SQL-запроса могут быть ограничены. В этом случае используйте встроенные отчёты или обратитесь в поддержку 1С.
Способы очистки регистров сведений
Существует несколько методов удаления данных из регистров, каждый из которых подходит для разных сценариев. Выбор зависит от версии платформы, типа регистра и ваших прав доступа.
1. Ручная очистка через интерфейс 1С
Самый простой, но и самый медленный способ — удаление записей вручную через форму регистра. Подходит для небольших объёмов данных (до 10–20 тысяч записей). Инструкция:
- Откройте регистр сведений в режиме
1С:Предприятие(например, через менюВсе функции → Регистры сведений). - Установите отбор по дате или другому измерению, чтобы отфильтровать ненужные записи.
- Выделите строки (можно использовать
Shift+Clickдля группового выделения) и нажмитеУдалить.
Минусы метода:
- ⏳ Очень долго для больших регистров (может занять часы).
- 🔒 Нет возможности отменить массовое удаление.
- 🛑 Может заблокировать базу для других пользователей на время операции.
Перед массовым удалением вручную проверьте, не используются ли записи в отчётах. Например, в регистре КурсыВалют старые курсы могут потребоваться для пересчёта документов ретроспективно.
2. Очистка с помощью обработки "Удаление помеченных объектов"
Более эффективный способ — использование стандартной обработки Удаление помеченных объектов (доступна в Все функции → Стандартные → Удаление помеченных объектов). Она позволяет:
- 🗑️ Удалять записи пакетно, без блокировки интерфейса.
- 🔍 Фильтровать данные по дате, измерениям или признаку пометки на удаление.
- ⏱️ Запускать очистку в фоновом режиме (в 1С:Предприятие 8.3.18+).
Алгоритм работы:
- Пометить ненужные записи в регистре (через обработку или программно).
- Запустить
Удаление помеченных объектовс фильтром по типу объектаРегистрСведений.ИмяВашегоРегистра. - Дождаться завершения операции (можно отслеживать прогресс в журнале регистрации).
Пример кода для пометки записей старше 2020 года:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрСведений.ЦеныНоменклатуры КАК Регистр
|ГДЕ
| Регистр.Период < &ДатаГраница";
Запрос.УстановитьПараметр("ДатаГраница", НачалоДня('20200101'));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Регистр = Выборка.Регистр;
Регистр.УстановитьПометкуУдаления(Истина);
Регистр.Записать();
КонецЦикла;
3. Прямое удаление через SQL (для опытных пользователей)
Самый быстрый, но и самый рискованный метод — выполнение SQL-запроса напрямую к базе данных. Подходит только для администраторов с доступом к серверу SQL Server/PostgreSQL и пониманием структуры таблиц 1С.
Преимущества:
- ⚡ Мгновенное удаление миллионов записей (за секунды).
- 🛠️ Гибкость: можно удалять данные по сложным условиям.
Пример запроса для очистки регистра КурсыВалют за 2018 год:
DELETE FROM _InfoRg234 -- _InfoRg{ID регистра} -- уточните ID в meta-data!
WHERE Period < '2019-01-01'
AND ValuteCode NOT IN (
SELECT ValuteCode
FROM _InfoRg234
WHERE Period >= '2019-01-01'
GROUP BY ValuteCode
);
⚠️ Внимание: Неправильный SQL-запрос может полностью разрушить базу, включая служебные таблицы 1С. Всегда тестируйте запросы на копии базы и используйте транзакции (BEGIN TRANSACTION/ROLLBACK).
Как узнать ID регистра для SQL-запроса?
ID регистра можно найти в метаданных конфигурации. Для этого:
1. Откройте конфигуратор.
2. Перейдите в Объекты → Регистры сведений.
3. Выделите нужный регистр и посмотрите его УникальныйИдентификатор в палитре свойств (вкладка "Прочее").
4. В SQL-таблицах 1С регистры сведений имеют префикс _InfoRg + ID (например, _InfoRg1234).
4. Специализированные обработки для очистки
Для упрощения работы существуют готовые обработки от 1С и сторонних разработчиков:
| Обработка | Назначение | Поддерживаемые версии | Ссылка (источник) |
|---|---|---|---|
Универсальная очистка регистров |
Массовое удаление записей с фильтрами по дате, измерениям и ресурсам | 8.3.10+ | Инфостарт, ITS |
Очистка истории изменений |
Удаление устаревших записей из регистров сведений с периодичностью | 8.3.8+ | 1С:Галлерея решений |
SQL Cleaner for 1C |
Пакетное удаление через SQL с визуальным конструктором запросов | 8.3.14+ (SQL) | GitHub (open-source) |
Пример использования обработки Универсальная очистка регистров:
- Скачайте обработку с Инфостарта и откройте её в 1С.
- Выберите регистр сведений из списка (например,
ЦеныНоменклатуры). - Укажите период очистки (например, "до 01.01.2020").
- Запустите предварительный просмотр, чтобы увидеть, сколько записей будет удалено.
- Подтвердите очистку и дождитесь завершения.
Создана резервная копия базы|Проверена ссылочная целостность (нет зависимых документов)|Выбран правильный метод очистки (ручной/SQL/обработка)|Тестирование проведено на копии базы|Пользователи предупреждены о временной блокировке-->
Очистка регистров с периодичностью "Секунда"
Регистры сведений с периодичностью Секунда (например, ЛогСообщений, СеансыПользователей) накапливают данные с высокой скоростью и могут достигать сотен миллионов записей. Их очистка требует особого подхода:
- 🚫 Не используйте стандартное удаление через интерфейс — оно заблокирует базу на часы.
- ⚡ Оптимальный метод — пакетное удаление через SQL с разбивкой на порции (по 10–50 тысяч записей за транзакцию).
- 🔄 Для PostgreSQL: используйте
DELETE WITH LIMIT, чтобы избежать блокировок.
Пример SQL-запроса для Microsoft SQL Server:
WHILE EXISTS (SELECT 1 FROM _InfoRg1234 WHERE Period < '2020-01-01')
BEGIN
DELETE TOP (50000)
FROM _InfoRg1234
WHERE Period < '2020-01-01';
WAITFOR DELAY '00:00:01'; -- Пауза, чтобы не перегружать сервер
END;
Для 1С:Предприятие на PostgreSQL:
DO $$
DECLARE
rows_deleted INTEGER;
BEGIN
WHILE TRUE LOOP
DELETE FROM _info_rg1234
WHERE period < '2020-01-01'
LIMIT 50000;
GET DIAGNOSTICS rows_deleted = ROW_COUNT;
EXIT WHEN rows_deleted = 0;
COMMIT;
RAISE NOTICE 'Удалено записей: %', rows_deleted;
END LOOP;
END $$;
⚠️ Внимание: Очистка регистров с секундной периодичностью может занять несколько часов даже на мощном сервере. Планируйте работу на время минимальной нагрузки (например, ночью) и следите за Журналом регистрации на предмет ошибок.
Типичные ошибки и как их избежать
Даже опытные администраторы 1С допускают ошибки при очистке регистров. Вот самые распространённые из них и способы их предотвращения:
| Ошибка | Последствия | Как избежать |
|---|---|---|
| Удаление без бэкапа | Потеря критичных данных, невозможность восстановления | Всегда создавайте резервную копию перед очисткой |
| Неправильный SQL-запрос | Повреждение структуры базы, ошибки при запуске 1С | Тестируйте запросы на копии базы, используйте транзакции |
| Очистка регистров с зависимыми документами | Сбои при проведении документов, ошибки в отчётах | Проверяйте ссылочную целостность через отчёт Анализ использования объектов |
| Удаление в рабочее время | Блокировка пользователей, падение производительности | Планируйте очистку на время минимальной нагрузки |
Одна из самых коварных ошибок — удаление записей, на которые ссылаются документы. Например, если вы очистите старые курсы валют, а в базе есть документы ПоступлениеТоваров с ссылкой на эти курсы, при перепроведении документов возникнет ошибка:
Ошибка при выполнении обработчика события:
{ОбщийМодуль.Валюты.Модуль(123)}: Не найден курс валюты USD на 15.05.2018!
Чтобы этого избежать, перед очисткой выполните запрос для проверки ссылок:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Документ.Ссылка КАК СсылкаНаДокумент
ИЗ
Документ.ПоступлениеТоваров КАК Документ
ГДЕ
Документ.Валюта.Курс В
(ВЫБРАТЬ
РегистрСведений.КурсыВалют.Ссылка
ИЗ
РегистрСведений.КурсыВалют
ГДЕ
РегистрСведений.КурсыВалют.Период < &ДатаГраница)
Всегда проверяйте регистры на наличие зависимых объектов перед очисткой. Даже если запись кажется устаревшей, она может использоваться в архивных документах или отчётах.
Автоматизация очистки: регламентные задания
Чтобы не очищать регистры вручную, можно настроить регламентные задания в 1С. Это позволит:
- ⏰ Запускать очистку по расписанию (например, раз в месяц).
- 📊 Архивировать данные перед удалением (сохранять в отдельный регистр или файл).
- 📧 Отправлять отчёты об выполнении на email администратора.
Пример настройки регламентного задания для очистки регистра ЛогСообщений:
- Откройте
Администрирование → Регламентные задания. - Создайте новое задание с типом
Выполнение кода. - Укажите код очистки (см. пример ниже) и расписание (например, каждое 1-е число месяца в 3:00).
- Настройте уведомления об ошибках.
Код для регламентного задания:
Процедура ВыполнитьОчисткуЛога() Экспорт
ДатаГраница = ТекущаяДата() - 365; // Удаляем записи старше года
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрСведений.ЛогСообщений КАК Лог
|ГДЕ
| Лог.Период < &ДатаГраница";
Запрос.УстановитьПараметр("ДатаГраница", НачалоДня(ДатаГраница));
Результат = Запрос.Выполнить();
Количество = 0;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Лог = Выборка.Лог;
Лог.Удалить();
Количество = Количество + 1;
КонецЦикла;
ЗаписьЖурналаРегистрации("ОчисткаЛогаСообщений",
УровеньЖурналаРегистрации.Информация,
,
,
"Удалено записей: " + Количество);
КонецПроцедуры
Для ускорения работы можно использовать асинхронное выполнение (в 1С:Предприятие 8.3.20+):
АсинхроннаяПроцедура ОчиститьЛогАсинхронно()
ВыполнитьОчисткуЛога();
КонецПроцедуры
// Запуск в регламентном задании:
ОчиститьЛогАсинхронно();
Восстановление данных после ошибочной очистки
Если вы случайно удалили критичные записи из регистра, есть несколько способов восстановления:
- Из резервной копии:
- Восстановите базу из бэкапа (полностью или частично с помощью
1Cv8.epf). - Используйте инструменты вроде 1С:Ремонт для избирательного восстановления объектов.
- Восстановите базу из бэкапа (полностью или частично с помощью
- Если включена настройка
Полный протоколвАдминистрирование → Журналы регистрации, можно найти и восстановить удалённые записи.
- Если удаление выполнялось в транзакции, которая не была зафиксирована (
COMMIT), выполнитеROLLBACK.
Пример восстановления данных из журнала регистрации (если велся полный протокол):
// Получаем список удалённых записей за последний час
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖурналРегистрации.Данные КАК Данные
|ИЗ
| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации
|ГДЕ
| ЖурналРегистрации.Событие = &Событие
| И ЖурналРегистрации.ДатаВремя > ДобавитьКДате(ТекущаяДата(), -1, ''Час'')";
Запрос.УстановитьПараметр("Событие", "Удаление объекта: РегистрСведений.ЦеныНоменклатуры");
Результат = Запрос.Выполнить();
⚠️ Внимание: Восстановление данных из журнала регистрации требует глубоких знаний структуры 1С и часто невозможно без помощи специалистов. Если вы не уверены в своих силах, обратитесь в службу поддержки 1С или к сертифицированному партнёру.
FAQ: Частые вопросы по очистке регистров сведений
Можно ли очистить регистр сведений без конфигуратора?
Да, но с ограничениями. В режиме 1С:Предприятие вы можете:
- Удалять записи вручную через форму регистра (медленно, но безопасно).
- Использовать обработки с правами администратора (например,
Универсальная очистка регистров).
Однако для массовой очистки или работы с SQL всё равно потребуется конфигуратор или доступ к серверу базы данных.
Как очистить регистр ПараметрыСеанса?
Регистр ПараметрыСеанса хранит временные настройки пользователей и очищается автоматически при завершении сеанса. Если он разросся, выполните:
- Закройте все сеансы пользователей (
Администрирование → Активные пользователи → Завершить сеансы). - Запустите тестирование и исправление базы с флагом
Пересчёт итогов. - Если проблема осталась, используйте SQL-запрос:
DELETE FROM _InfoRg{ID} WHERE SessionID NOT IN (SELECT SessionID FROM _1SJourn)
Что делать, если после очистки регистра перестали работать отчёты?
Скорее всего, в отчётах использовались данные из удалённых записей. Проверьте:
- Настройки отчёта: возможно, в нём жёстко заданы периоды, за которые данные были удалены.
- Зависимости: откройте схему компоновки данных отчёта и найдите ссылки на очищенный регистр.
- Журнал регистрации: там могут быть ошибки вида
Не найдено значение параметра X в регистре Y.
Решение: восстановите критичные записи из бэкапа или скорректируйте периоды в отчёте.
Как очистить регистр сведений в облачной версии 1С:Fresh?
В 1С:Fresh прямой доступ к SQL запрещён, поэтому:
- Используйте встроенные обработки (например,
Очистка историив разделеАдминистрирование). - Обратитесь в поддержку 1С:Fresh с запросом на очистку — они выполнят её на стороне сервера.
- Для регистров типа
ЛогСообщенийнастройте автоматическое архивирование через регламентные задания.
Обратите внимание: в Fresh некоторые регистры (например, связанные с расчётом зарплаты) очищать запрещено.
Можно ли очистить регистр частично, оставив только последние данные?
Да, это стандартная практика. Например, чтобы оставить в регистре КурсыВалют только записи за последний год, используйте:
- В ручном режиме: установите отбор по дате и удалите записи старше
ДобавитьКДате(ТекущаяДата(), -365). - Через SQL:
DELETE FROM _InfoRg{ID}WHERE Period < DATEADD(year, -1, GETDATE())
- С помощью обработки: в
Универсальной очистке регистровукажите дату отсечения.