Работа с регистрами сведений в 1С:Предприятие — одна из самых частых задач как для разработчиков, так и для опытных пользователей. Эти объекты конфигурации хранят исторические данные, настройки параметров, курсы валют и другую динамическую информацию. Однако со временем регистры «засоряются» устаревшими записями, что приводит к замедлению работы базы, ошибкам при обменах данными или некорректным расчётам. Очистка регистра сведений может потребоваться при:
— миграции данных между базами;
— исправлении ошибок в учёте;
— оптимизации производительности;
— тестировании новых механизмов.
Но неправильное удаление записей чревато потерей критичной информации или нарушением ссылочной целостности. В этой статье разберём 5 способов очистки — от ручных до программных, с учётом нюансов периодических и непериодических регистров, а также привязки к измерениям.
1. Когда требуется очистка регистра сведений?
Прежде чем приступать к удалению данных, важно понять, действительно ли это необходимо. Регистры сведений в 1С делятся на два типа:
- 📅 Периодические — хранят данные с привязкой к дате (например, курсы валют, цены номенклатуры). Здесь очистка актуальна для удаления устаревших записей или исправления ошибок за прошлые периоды.
- 🔄 Непериодические — содержат актуальные настройки без привязки ко времени (например, параметры учётной политики). Их очистка обычно связана с полным сбросом конфигурации.
Типичные сценарии, требующие очистки:
- 🚨 Ошибки в данных — например, неверно загруженные курсы валют за прошлый год, которые искажают отчёты.
- 🗑️ Устаревшие записи — цены на номенклатуру, которые давно не актуальны, но занимают место в базе.
- 🔄 Тестирование — перед массовой загрузкой данных нужно удалить тестовые записи.
- ⚡ Оптимизация производительности — крупные регистры с миллионами записей тормозят работу системы.
⚠️ Внимание: Очистка регистров сведений, к которым привязаны документы (например, регистрЦеныНоменклатурыс ссылками на документыУстановкаЦен), может привести к ошибкам при проведениях. Всегда проверяйте ссылочную целостность перед массовым удалением!
Если вы не уверены, какие именно записи нужно удалить, начните с анализа данных через отчёты или запросы. Например, запрос для поиска дублирующихся записей в периодическом регистре:
ВЫБРАТЬ
РегистрСведений.ИмяРегистра.Период,
РегистрСведений.ИмяРегистра.Измерение1,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
РегистрСведений.ИмяРегистра КАК РегистрСведений.ИмяРегистра
СГРУППИРОВАТЬ ПО
РегистрСведений.ИмяРегистра.Период,
РегистрСведений.ИмяРегистра.Измерение1
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
2. Способ 1: Ручная очистка через интерфейс 1С
Самый простой, но и самый ограниченный метод — удаление записей непосредственно в пользовательском интерфейсе. Он подходит для небольших регистров или единичных записей, когда не требуется массовая обработка. Алгоритм действий:
- Откройте список регистра сведений через меню
Операции → Регистры сведений → [Имя регистра]. - Установите отбор по нужному периоду или измерению (например, по конкретной номенклатуре или валюте).
- Выделите записи, которые требуется удалить (можно использовать
Ctrl+Aдля выделения всех видимых строк). - Нажмите
Deleteили выберите командуДействия → Удалить помеченные.
Преимущества метода:
- ✅ Не требует знаний программирования.
- ✅ Визуальный контроль над удаляемыми данными.
Недостатки:
- ❌ Медленная работа при большом объёме данных (интерфейс подгружает записи порциями).
- ❌ Нет возможности удалить записи по сложным условиям (например, «все цены старше 2 лет, кроме акционных»).
- ❌ Риск случайного удаления актуальных данных при неверном отборе.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 8) ручное удаление записей из регистров сведений может быть заблокировано правами доступа. В этом случае потребуется временно выдать пользователю роль Администратор или использовать программные методы.
Перед массовым удалением через интерфейс уменьшите период отбора до минимально необходимого — это ускорит загрузку данных и снизит риск зависания клиентского приложения.
3. Способ 2: Очистка через обработку «Универсальный отбор и обработка данных»
Для пользователей, не владеющих программированием, но нуждающихся в гибкой очистке, подойдёт стандартная обработка УниверсальныйОтборИОбработкаДанных.epf. Она позволяет:
- 🔍 Настраивать сложные отборы по нескольким измерениям и ресурсам.
- 🗑️ Удалять записи пакетами (например, по 1000 строк за раз).
- 📊 Просматривать данные перед удалением.
Как использовать обработку:
- Скачайте обработку из каталога
1Cv8.tmpl(папка с шаблонами конфигурации) или найдите её в интернете (например, на Инфостарте). - Откройте её в режиме
1С:ПредприятиечерезФайл → Открыть. - В поле
Тип объектавыберитеРегистр сведенийи укажите нужный регистр. - Настройте отбор (например,
Период МЕНЬШЕ &ДатаНачала). - Нажмите
Выполнить, затемУдалить помеченные.
Пример настройки отбора для удаления курсов валют старше 2023 года:
| Поле отбора | Условие | Значение |
|---|---|---|
| Период | Меньше | 01.01.2023 |
| Валюта | В списке | USD, EUR, GBP |
Обработка поддерживает сохранение настроек отборов в файлы, что удобно для регулярной очистки. Однако у неё есть ограничения:
- Не работает с регистрами, для которых отключено интерактивное удаление.
- Не позволяет удалять данные по сложным алгоритмам (например, «оставить только последнюю запись по каждому измерению»).
Сделать резервную копию базы|Проверить права доступа пользователя|Настроить тестовый отбор на небольшом периоде|Сохранить настройки отбора в файл-->
4. Способ 3: Программная очистка с помощью запроса
Для массового удаления данных с гибкими условиями оптимально использовать встроенный язык 1С. Ниже приведён универсальный код, который очищает записи регистра сведений с учётом отборов по периоду и измерениям. Метод подходит для периодических и непериодических регистров.
Базовый шаблон кода:
Процедура ОчиститьРегистрСведений(ИмяРегистра, ДатаНачала, ДатаОкончания = Неопределено, ОтборПоИзмерениям = Неопределено) Экспорт
// Проверяем, существует ли регистр
Если Не ЗначениеЗаполнено(Метаданные.РегистрыСведений[ИмяРегистра]) Тогда
Возврат Ложь;
КонецЕсли;
// Формируем запрос на удаление
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрСведений." + ИмяРегистра + ".Период КАК Период,
| РегистрСведений." + ИмяРегистра + ".Ссылка КАК Ссылка
|ИЗ
| РегистрСведений." + ИмяРегистра + " КАК РегистрСведений." + ИмяРегистра + "
|ГДЕ
| РегистрСведений." + ИмяРегистра + ".Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
// Добавляем отбор по измерениям, если переданы
Если ОтборПоИзмерениям <> Неопределено Тогда
Для Каждого ЭлементОтбора Из ОтборПоИзмерениям Цикл
Запрос.Текст = Запрос.Текст + "
| И РегистрСведений." + ИмяРегистра + "." + ЭлементОтбора.Ключ + " = &" + ЭлементОтбора.Ключ;
Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
КонецЦикла;
КонецЕсли;
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Если ДатаОкончания = Неопределено Тогда
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));
Иначе
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Удаляем записи
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
НаборЗаписей.Прочитать();
Пока НаборЗаписей.Следующий() Цикл
НаборЗаписей.Удалить();
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Возврат Истина;
КонецПроцедуры
Пример вызова процедуры для очистки курсов валют за 2022 год:
Отбор = Новый Соответствие;
Отбор.Вставить("Валюта", Справочники.Валюты.НайтиПоНаименованию("Доллар США"));
Результат = ОчиститьРегистрСведений("КурсыВалют", '20220101', '20221231', Отбор);
Критичный нюанс: При удалении записей через набор записей (РегистрыСведений[...].СоздатьНаборЗаписей()) 1С автоматически проверяет права доступа и ссылочную целостность. Если запись используется в документах, возникнет ошибка. В этом случае потребуется предварительно удалить или перепровести связанные документы.
Что делать, если при удалении возникает ошибка "Нарушение ссылочной целостности"?
Ошибка означает, что запись регистра сведений используется в другом объекте (например, в документе или отчёте). Решения:
1. Найдите все документы, ссылающиеся на запись, через запрос по регистру СсылкаНаНас.
2. Удалите или перепроведите эти документы.
3. Если документы удалять нельзя, используйте метод ПометитьНаУдаление() вместо полного удаления.
4. В крайнем случае отключите проверку ссылочной целостности (не рекомендуется для рабочих баз!).
5. Способ 4: Прямое удаление через SQL (для опытных пользователей)
Для крупных баз с миллионами записей программные методы 1С могут работать слишком медленно. В этом случае ускорения можно добиться прямым SQL-запросом к базе данных. Этот способ требует:
- 🔧 Доступа к серверу 1С:Предприятие или файловой базе.
- 🛠️ Знаний структуры таблиц 1С (например, префиксы
_InfoRgдля регистров). - 🔒 Административных прав на сервере SQL.
Алгоритм действий для MS SQL Server:
- Определите физическое имя таблицы регистра. Например, для регистра
ЦеныНоменклатурыимя таблицы будет_InfoRg{ГУИД}. ГУИД можно найти в конфигураторе через свойствоПолноеИмя. - Подключитесь к базе через SQL Server Management Studio.
- Выполните запрос на удаление. Пример для периодического регистра:
DELETE FROM _InfoRg12345WHERE Period BETWEEN '2020-01-01' AND '2020-12-31'
AND Ref1 = (SELECT _IDRRef FROM _Reference8 WHERE _Description = 'USD')
где
Ref1— измерение «Валюта», а_Reference8— таблица справочника валют.
Предупреждения при работе с SQL:
- ⚠️ Всегда делайте резервную копию базы перед прямым удалением.
- ⚠️ Удаление через SQL не проверяет ссылочную целостность — это может привести к ошибкам в 1С.
- ⚠️ После массового удаления выполните
Тестирование и исправлениебазы в конфигураторе.
⚠️ Внимание: Структура таблиц 1С может изменяться при обновлении платформы. Например, в версиях 8.3.20+ появились дополнительные служебные поля для регистров. Перед выполнением SQL-запросов сверяйте актуальную структуру через SELECT TOP 1 * FROM ИмяТаблицы.
| Тип базы | Префикс таблиц регистров | Пример запроса |
|---|---|---|
| MS SQL | _InfoRg{ГУИД} | DELETE FROM _InfoRg12345 WHERE Period < '2023-01-01' |
| PostgreSQL | info_rg{id} | DELETE FROM info_rg12345 WHERE period < '2023-01-01' |
| Файловая (1Cv8.1CD) | Не поддерживается | Используйте встроенный язык |
Прямое удаление через SQL — самый быстрый метод для крупных баз, но и самый опасный. Используйте его только если другие способы неэффективны, и вы уверены в структуре данных.
6. Способ 5: Очистка через внешние обработки (Инфостарт, GitHub)
Если вам нужно регулярно очищать регистры по сложным правилам, имеет смысл использовать готовые обработки от сообщества. Популярные решения:
- 🔧 «Универсальная очистка регистров» (Инфостарт) — поддерживает сохранение шаблонов отборов, пакетное удаление, логирование.
- 📊 «Анализ и очистка данных» — визуализирует связи между объектами перед удалением.
- 🔄 «Перенос данных» (КД 2/3) — позволяет очищать регистры в рамках миграции между базами.
Пример использования обработки с Инфостарта:
- Скачайте обработку (например,
ОчисткаРегистровСведений.epf). - Откройте её в режиме
1С:Предприятие. - Выберите регистр и настройте отбор (например, по дате и измерениям).
- Запустите предварительный просмотр записей, которые будут удалены.
- Подтвердите очистку.
Преимущества готовых обработок:
- ✅ Поддержка сложных сценариев (например, «оставить только последнюю запись по каждому измерению»).
- ✅ Логирование действий для отката изменений.
- ✅ Интерфейс проще, чем написание кода с нуля.
Недостатки:
- ❌ Не все обработки бесплатны (цена от 500 до 5000 рублей).
- ❌ Требуется проверка кода на наличие вредоносных вставок (особенно для скачанных с непроверенных источников).
Перед использованием сторонних обработок:
- Проверьте отзывы и рейтинг на Инфостарте или GitHub.
- Протестируйте на копии базы.
- Изучите исходный код (если он открыт) на предмет потенциальных уязвимостей.
7. Особенности очистки периодических регистров
Периодические регистры сведений имеют специфику, которую важно учитывать при очистке:
- 📅 Привязка к дате: Записи хранят историю изменений, поэтому удаление за прошлый период может повлиять на отчёты.
- 🔄 Последовательность записей: В некоторых регистрах (например,
ОстаткиТоваров) важна хронология — удаление промежуточных записей нарушит расчёты. - 🔒 Блокировки: Если период закрыт (например, в бухгалтерии), редактирование может быть запрещено.
Типичные ошибки при работе с периодическими регистрами:
| Ошибка | Причина | Решение |
|---|---|---|
| Не удаляется запись за текущий день | В 1С текущий день считается незакрытым | Удалите запись через день или используйте КонецДня() в отборе |
| После удаления нарушились отчёты | Удалены записи, на которые ссылаются документы | Восстановите данные из резервной копии или перепроведите документы |
| Медленная очистка | Индексы на таблице регистра фрагментированы | Выполните реиндексацию таблицы через SQL |
Для безопасной очистки периодических регистров:
- Всегда начинайте с тестового удаления на небольшом периоде.
- Используйте транзакции в коде, чтобы откатить изменения при ошибке:
НачатьТранзакцию();Попытка
ОчиститьРегистрСведений(...);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки());
КонецПопытки;
- Проверяйте зависимые регистры. Например, удаление из
ЦеныНоменклатурыможет повлиять наСебестоимостьТоваров.
8. Автоматизация очистки: регламентные задания
Если очистка регистров требуется регулярно (например, ежемесячное удаление устаревших курсов валют), целесообразно настроить регламентное задание. Это позволит:
- ⏰ Запускать очистку в нерабочее время (ночью).
- 📊 Вести лог выполненных операций.
- 🔄 Автоматически архивировать данные перед удалением.
Пример создания регламентного задания в конфигураторе:
- Откройте конфигуратор и перейдите в
Общие → Регламентные задания. - Создайте новое задание с типом
Выполнение кода. - В поле
Кодвставьте процедуру очистки (см. Способ 3). - Настройте расписание (например,
Ежемесячно, 1 число в 3:00). - Укажите пользователя, от имени которого будет выполняться задание (должен иметь права на редактирование регистра).
Код для регламентного задания с логированием:
Процедура ВыполнитьОчистку() Экспорт
Попытка
// Логируем начало
ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Информация, , , "Начало очистки");
Отбор = Новый Соответствие;
Отбор.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("840")); // Доллар США
Результат = ОчиститьРегистрСведений("КурсыВалют", НачалоГода(ТекущаяДата()) - 365, НачалоГода(ТекущаяДата()) - 1, Отбор);
Если Результат Тогда
ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Информация, , , "Успешно удалено записей");
Иначе
ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Ошибка, , , "Ошибка при очистке");
КонецЕсли;
Исключение
ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Ошибка, , ,
"Исключение: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для отслеживания результатов выполнения:
- Перейдите в
Администрирование → Журнал регламентных заданий. - Отфильтруйте записи по имени вашего задания.
- Проверьте статус (
ВыполненоилиОшибка) и комментарии.
⚠️ Внимание: Регламентные задания в файловом варианте 1С выполняются только при открытой базе. Для серверного варианта настройте задание на кластере 1С:Предприятие.
Автоматизация очистки экономит время, но требует тщательного тестирования. Всегда проверяйте результаты первого запуска вручную, даже если код отработал без ошибок.
FAQ: Частые вопросы по очистке регистров сведений
❓ Можно ли восстановить удалённые записи из регистра сведений?
Да, но только если:
- У вас есть резервная копия базы до момента удаления. Восстановите её и экспортируйте нужные данные.
- Включён механизм версионирования (например, в 1С:Документооборот).
- Удаление выполнялось через
ПометитьНаУдаление()— тогда записи можно вернуть программно.
Если данные удалены напрямую через SQL без резервной копии, восстановление невозможно.
❓ Почему после очистки регистра отчёты показывают неверные данные?
Это происходит из-за:
- Нарушения ссылочной целостности — в отчёте используются данные из связанных регистров или документов, которые ссылались на удалённые записи.
- Кэширования — обновите отчёт (
F5) или перезапустите сеанс 1С. - Неполной очистки — например, удалены цены, но остались остатки товаров по старым ценам.
Решение: проверьте цепочку связанных объектов и при необходимости восстановите данные.
❓ Как очистить регистр сведений, если на него стоят права?
Варианты обхода ограничений:
- Временно выдайте пользователю роль
Администратор. - Используйте внешнее соединение через
COMConnectorс правами администратора. - Выполните очистку через SQL (если права настроены только на уровне 1С, а не на уровне СУБД).
- Напишите обработку с повышенными правами:
Если Не ПолныеПрава() ТогдаЗапрос = Новый Запрос("ВЫПОЛНИТЬ ПРИВИЛЕГИРОВАННОЕ ДЕЙСТВИЕ ...");
КонецЕсли;
❓ Можно ли очистить регистр сведений без блокировки базы?
Да, но с оговорками:
- Для небольших регистров (до 10 000 записей) блокировка будет кратковременной и незаметной для пользователей.
- Для крупных регистров используйте пакетное удаление (по 1000–5000 записей за раз) с задержками между пакетами:
Для Счетчик = 1 По 10 ЦиклУдалитьПачкуЗаписей(1000);
Пауза(1000); // Задержка 1 секунда
КонецЦикла;
- В клиент-серверном