Работа с регистрами сведений в 1С:Предприятие — одна из самых частых задач как для разработчиков, так и для опытных пользователей. Эти объекты конфигурации хранят исторические данные, настройки параметров, курсы валют и другую динамическую информацию. Однако со временем регистры «засоряются» устаревшими записями, что приводит к замедлению работы базы, ошибкам при обменах данными или некорректным расчётам. Очистка регистра сведений может потребоваться при:

— миграции данных между базами;

— исправлении ошибок в учёте;

— оптимизации производительности;

— тестировании новых механизмов.

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

1. Когда требуется очистка регистра сведений?

Прежде чем приступать к удалению данных, важно понять, действительно ли это необходимо. Регистры сведений в делятся на два типа:

  • 📅 Периодические — хранят данные с привязкой к дате (например, курсы валют, цены номенклатуры). Здесь очистка актуальна для удаления устаревших записей или исправления ошибок за прошлые периоды.
  • 🔄 Непериодические — содержат актуальные настройки без привязки ко времени (например, параметры учётной политики). Их очистка обычно связана с полным сбросом конфигурации.

Типичные сценарии, требующие очистки:

  • 🚨 Ошибки в данных — например, неверно загруженные курсы валют за прошлый год, которые искажают отчёты.
  • 🗑️ Устаревшие записи — цены на номенклатуру, которые давно не актуальны, но занимают место в базе.
  • 🔄 Тестирование — перед массовой загрузкой данных нужно удалить тестовые записи.
  • Оптимизация производительности — крупные регистры с миллионами записей тормозят работу системы.
⚠️ Внимание: Очистка регистров сведений, к которым привязаны документы (например, регистр ЦеныНоменклатуры с ссылками на документы УстановкаЦен), может привести к ошибкам при проведениях. Всегда проверяйте ссылочную целостность перед массовым удалением!

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

ВЫБРАТЬ

РегистрСведений.ИмяРегистра.Период,

РегистрСведений.ИмяРегистра.Измерение1,

КОЛИЧЕСТВО(*) КАК Количество

ИЗ

РегистрСведений.ИмяРегистра КАК РегистрСведений.ИмяРегистра

СГРУППИРОВАТЬ ПО

РегистрСведений.ИмяРегистра.Период,

РегистрСведений.ИмяРегистра.Измерение1

ИМЕЮЩИЕ

КОЛИЧЕСТВО(*) > 1

📊 Как часто вам приходится очищать регистры сведений в 1С?
Ежемесячно
Раз в квартал
Только при ошибках
Никогда не очищал

2. Способ 1: Ручная очистка через интерфейс 1С

Самый простой, но и самый ограниченный метод — удаление записей непосредственно в пользовательском интерфейсе. Он подходит для небольших регистров или единичных записей, когда не требуется массовая обработка. Алгоритм действий:

  1. Откройте список регистра сведений через меню Операции → Регистры сведений → [Имя регистра].
  2. Установите отбор по нужному периоду или измерению (например, по конкретной номенклатуре или валюте).
  3. Выделите записи, которые требуется удалить (можно использовать Ctrl+A для выделения всех видимых строк).
  4. Нажмите Delete или выберите команду Действия → Удалить помеченные.

Преимущества метода:

  • ✅ Не требует знаний программирования.
  • ✅ Визуальный контроль над удаляемыми данными.

Недостатки:

  • ❌ Медленная работа при большом объёме данных (интерфейс подгружает записи порциями).
  • ❌ Нет возможности удалить записи по сложным условиям (например, «все цены старше 2 лет, кроме акционных»).
  • ❌ Риск случайного удаления актуальных данных при неверном отборе.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 8) ручное удаление записей из регистров сведений может быть заблокировано правами доступа. В этом случае потребуется временно выдать пользователю роль Администратор или использовать программные методы.
💡

Перед массовым удалением через интерфейс уменьшите период отбора до минимально необходимого — это ускорит загрузку данных и снизит риск зависания клиентского приложения.

3. Способ 2: Очистка через обработку «Универсальный отбор и обработка данных»

Для пользователей, не владеющих программированием, но нуждающихся в гибкой очистке, подойдёт стандартная обработка УниверсальныйОтборИОбработкаДанных.epf. Она позволяет:

  • 🔍 Настраивать сложные отборы по нескольким измерениям и ресурсам.
  • 🗑️ Удалять записи пакетами (например, по 1000 строк за раз).
  • 📊 Просматривать данные перед удалением.

Как использовать обработку:

  1. Скачайте обработку из каталога 1Cv8.tmpl (папка с шаблонами конфигурации) или найдите её в интернете (например, на Инфостарте).
  2. Откройте её в режиме 1С:Предприятие через Файл → Открыть.
  3. В поле Тип объекта выберите Регистр сведений и укажите нужный регистр.
  4. Настройте отбор (например, Период МЕНЬШЕ &ДатаНачала).
  5. Нажмите Выполнить, затем Удалить помеченные.

Пример настройки отбора для удаления курсов валют старше 2023 года:

Поле отбораУсловиеЗначение
ПериодМеньше01.01.2023
ВалютаВ спискеUSD, EUR, GBP

Обработка поддерживает сохранение настроек отборов в файлы, что удобно для регулярной очистки. Однако у неё есть ограничения:

  • Не работает с регистрами, для которых отключено интерактивное удаление.
  • Не позволяет удалять данные по сложным алгоритмам (например, «оставить только последнюю запись по каждому измерению»).

Сделать резервную копию базы|Проверить права доступа пользователя|Настроить тестовый отбор на небольшом периоде|Сохранить настройки отбора в файл-->

4. Способ 3: Программная очистка с помощью запроса

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

Базовый шаблон кода:

Процедура ОчиститьРегистрСведений(ИмяРегистра, ДатаНачала, ДатаОкончания = Неопределено, ОтборПоИзмерениям = Неопределено) Экспорт

// Проверяем, существует ли регистр

Если Не ЗначениеЗаполнено(Метаданные.РегистрыСведений[ИмяРегистра]) Тогда

Возврат Ложь;

КонецЕсли;

// Формируем запрос на удаление

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

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

"ВЫБРАТЬ

| РегистрСведений." + ИмяРегистра + ".Период КАК Период,

| РегистрСведений." + ИмяРегистра + ".Ссылка КАК Ссылка

|ИЗ

| РегистрСведений." + ИмяРегистра + " КАК РегистрСведений." + ИмяРегистра + "

|ГДЕ

| РегистрСведений." + ИмяРегистра + ".Период МЕЖДУ &ДатаНачала И &ДатаОкончания";

// Добавляем отбор по измерениям, если переданы

Если ОтборПоИзмерениям <> Неопределено Тогда

Для Каждого ЭлементОтбора Из ОтборПоИзмерениям Цикл

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

| И РегистрСведений." + ИмяРегистра + "." + ЭлементОтбора.Ключ + " = &" + ЭлементОтбора.Ключ;

Запрос.УстановитьПараметр(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);

КонецЦикла;

КонецЕсли;

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);

Если ДатаОкончания = Неопределено Тогда

Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));

Иначе

Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));

КонецЕсли;

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

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

// Удаляем записи

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

НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Период.Установить(Выборка.Период);

НаборЗаписей.Прочитать();

Пока НаборЗаписей.Следующий() Цикл

НаборЗаписей.Удалить();

КонецЦикла;

НаборЗаписей.Записать();

КонецЦикла;

Возврат Истина;

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

Пример вызова процедуры для очистки курсов валют за 2022 год:

Отбор = Новый Соответствие;

Отбор.Вставить("Валюта", Справочники.Валюты.НайтиПоНаименованию("Доллар США"));

Результат = ОчиститьРегистрСведений("КурсыВалют", '20220101', '20221231', Отбор);

Критичный нюанс: При удалении записей через набор записей (РегистрыСведений[...].СоздатьНаборЗаписей()) автоматически проверяет права доступа и ссылочную целостность. Если запись используется в документах, возникнет ошибка. В этом случае потребуется предварительно удалить или перепровести связанные документы.

Что делать, если при удалении возникает ошибка "Нарушение ссылочной целостности"?

Ошибка означает, что запись регистра сведений используется в другом объекте (например, в документе или отчёте). Решения:

1. Найдите все документы, ссылающиеся на запись, через запрос по регистру СсылкаНаНас.

2. Удалите или перепроведите эти документы.

3. Если документы удалять нельзя, используйте метод ПометитьНаУдаление() вместо полного удаления.

4. В крайнем случае отключите проверку ссылочной целостности (не рекомендуется для рабочих баз!).

5. Способ 4: Прямое удаление через SQL (для опытных пользователей)

Для крупных баз с миллионами записей программные методы 1С могут работать слишком медленно. В этом случае ускорения можно добиться прямым SQL-запросом к базе данных. Этот способ требует:

  • 🔧 Доступа к серверу 1С:Предприятие или файловой базе.
  • 🛠️ Знаний структуры таблиц (например, префиксы _InfoRg для регистров).
  • 🔒 Административных прав на сервере SQL.

Алгоритм действий для MS SQL Server:

  1. Определите физическое имя таблицы регистра. Например, для регистра ЦеныНоменклатуры имя таблицы будет _InfoRg{ГУИД}. ГУИД можно найти в конфигураторе через свойство ПолноеИмя.
  2. Подключитесь к базе через SQL Server Management Studio.
  3. Выполните запрос на удаление. Пример для периодического регистра:
    DELETE FROM _InfoRg12345
    

    WHERE Period BETWEEN '2020-01-01' AND '2020-12-31'

    AND Ref1 = (SELECT _IDRRef FROM _Reference8 WHERE _Description = 'USD')

    где Ref1 — измерение «Валюта», а _Reference8 — таблица справочника валют.

Предупреждения при работе с SQL:

  • ⚠️ Всегда делайте резервную копию базы перед прямым удалением.
  • ⚠️ Удаление через SQL не проверяет ссылочную целостность — это может привести к ошибкам в .
  • ⚠️ После массового удаления выполните Тестирование и исправление базы в конфигураторе.
⚠️ Внимание: Структура таблиц может изменяться при обновлении платформы. Например, в версиях 8.3.20+ появились дополнительные служебные поля для регистров. Перед выполнением SQL-запросов сверяйте актуальную структуру через SELECT TOP 1 * FROM ИмяТаблицы.
Тип базыПрефикс таблиц регистровПример запроса
MS SQL_InfoRg{ГУИД}DELETE FROM _InfoRg12345 WHERE Period < '2023-01-01'
PostgreSQLinfo_rg{id}DELETE FROM info_rg12345 WHERE period < '2023-01-01'
Файловая (1Cv8.1CD)Не поддерживаетсяИспользуйте встроенный язык
💡

Прямое удаление через SQL — самый быстрый метод для крупных баз, но и самый опасный. Используйте его только если другие способы неэффективны, и вы уверены в структуре данных.

6. Способ 5: Очистка через внешние обработки (Инфостарт, GitHub)

Если вам нужно регулярно очищать регистры по сложным правилам, имеет смысл использовать готовые обработки от сообщества. Популярные решения:

  • 🔧 «Универсальная очистка регистров» (Инфостарт) — поддерживает сохранение шаблонов отборов, пакетное удаление, логирование.
  • 📊 «Анализ и очистка данных» — визуализирует связи между объектами перед удалением.
  • 🔄 «Перенос данных» (КД 2/3) — позволяет очищать регистры в рамках миграции между базами.

Пример использования обработки с Инфостарта:

  1. Скачайте обработку (например, ОчисткаРегистровСведений.epf).
  2. Откройте её в режиме 1С:Предприятие.
  3. Выберите регистр и настройте отбор (например, по дате и измерениям).
  4. Запустите предварительный просмотр записей, которые будут удалены.
  5. Подтвердите очистку.

Преимущества готовых обработок:

  • ✅ Поддержка сложных сценариев (например, «оставить только последнюю запись по каждому измерению»).
  • ✅ Логирование действий для отката изменений.
  • ✅ Интерфейс проще, чем написание кода с нуля.

Недостатки:

  • ❌ Не все обработки бесплатны (цена от 500 до 5000 рублей).
  • ❌ Требуется проверка кода на наличие вредоносных вставок (особенно для скачанных с непроверенных источников).

Перед использованием сторонних обработок:

  1. Проверьте отзывы и рейтинг на Инфостарте или GitHub.
  2. Протестируйте на копии базы.
  3. Изучите исходный код (если он открыт) на предмет потенциальных уязвимостей.

7. Особенности очистки периодических регистров

Периодические регистры сведений имеют специфику, которую важно учитывать при очистке:

  • 📅 Привязка к дате: Записи хранят историю изменений, поэтому удаление за прошлый период может повлиять на отчёты.
  • 🔄 Последовательность записей: В некоторых регистрах (например, ОстаткиТоваров) важна хронология — удаление промежуточных записей нарушит расчёты.
  • 🔒 Блокировки: Если период закрыт (например, в бухгалтерии), редактирование может быть запрещено.

Типичные ошибки при работе с периодическими регистрами:

ОшибкаПричинаРешение
Не удаляется запись за текущий деньВ текущий день считается незакрытымУдалите запись через день или используйте КонецДня() в отборе
После удаления нарушились отчётыУдалены записи, на которые ссылаются документыВосстановите данные из резервной копии или перепроведите документы
Медленная очисткаИндексы на таблице регистра фрагментированыВыполните реиндексацию таблицы через SQL

Для безопасной очистки периодических регистров:

  1. Всегда начинайте с тестового удаления на небольшом периоде.
  2. Используйте транзакции в коде, чтобы откатить изменения при ошибке:
    НачатьТранзакцию();
    

    Попытка

    ОчиститьРегистрСведений(...);

    ЗафиксироватьТранзакцию();

    Исключение

    ОтменитьТранзакцию();

    Сообщить(ОписаниеОшибки());

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

  3. Проверяйте зависимые регистры. Например, удаление из ЦеныНоменклатуры может повлиять на СебестоимостьТоваров.

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

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

  • ⏰ Запускать очистку в нерабочее время (ночью).
  • 📊 Вести лог выполненных операций.
  • 🔄 Автоматически архивировать данные перед удалением.

Пример создания регламентного задания в конфигураторе:

  1. Откройте конфигуратор и перейдите в Общие → Регламентные задания.
  2. Создайте новое задание с типом Выполнение кода.
  3. В поле Код вставьте процедуру очистки (см. Способ 3).
  4. Настройте расписание (например, Ежемесячно, 1 число в 3:00).
  5. Укажите пользователя, от имени которого будет выполняться задание (должен иметь права на редактирование регистра).

Код для регламентного задания с логированием:

Процедура ВыполнитьОчистку() Экспорт

Попытка

// Логируем начало

ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Информация, , , "Начало очистки");

Отбор = Новый Соответствие;

Отбор.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("840")); // Доллар США

Результат = ОчиститьРегистрСведений("КурсыВалют", НачалоГода(ТекущаяДата()) - 365, НачалоГода(ТекущаяДата()) - 1, Отбор);

Если Результат Тогда

ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Информация, , , "Успешно удалено записей");

Иначе

ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Ошибка, , , "Ошибка при очистке");

КонецЕсли;

Исключение

ЗаписьЖурналаРегламентныхЗаданий("Очистка регистра КурсыВалют", УровеньЖурнала.Ошибка, , ,

"Исключение: " + ОписаниеОшибки());

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

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

Для отслеживания результатов выполнения:

  1. Перейдите в Администрирование → Журнал регламентных заданий.
  2. Отфильтруйте записи по имени вашего задания.
  3. Проверьте статус (Выполнено или Ошибка) и комментарии.
⚠️ Внимание: Регламентные задания в файловом варианте выполняются только при открытой базе. Для серверного варианта настройте задание на кластере 1С:Предприятие.
💡

Автоматизация очистки экономит время, но требует тщательного тестирования. Всегда проверяйте результаты первого запуска вручную, даже если код отработал без ошибок.

FAQ: Частые вопросы по очистке регистров сведений

❓ Можно ли восстановить удалённые записи из регистра сведений?

Да, но только если:

  • У вас есть резервная копия базы до момента удаления. Восстановите её и экспортируйте нужные данные.
  • Включён механизм версионирования (например, в 1С:Документооборот).
  • Удаление выполнялось через ПометитьНаУдаление() — тогда записи можно вернуть программно.

Если данные удалены напрямую через SQL без резервной копии, восстановление невозможно.

❓ Почему после очистки регистра отчёты показывают неверные данные?

Это происходит из-за:

  • Нарушения ссылочной целостности — в отчёте используются данные из связанных регистров или документов, которые ссылались на удалённые записи.
  • Кэширования — обновите отчёт (F5) или перезапустите сеанс .
  • Неполной очистки — например, удалены цены, но остались остатки товаров по старым ценам.

Решение: проверьте цепочку связанных объектов и при необходимости восстановите данные.

❓ Как очистить регистр сведений, если на него стоят права?

Варианты обхода ограничений:

  1. Временно выдайте пользователю роль Администратор.
  2. Используйте внешнее соединение через COMConnector с правами администратора.
  3. Выполните очистку через SQL (если права настроены только на уровне , а не на уровне СУБД).
  4. Напишите обработку с повышенными правами:
    Если Не ПолныеПрава() Тогда
    

    Запрос = Новый Запрос("ВЫПОЛНИТЬ ПРИВИЛЕГИРОВАННОЕ ДЕЙСТВИЕ ...");

    КонецЕсли;

❓ Можно ли очистить регистр сведений без блокировки базы?

Да, но с оговорками:

  • Для небольших регистров (до 10 000 записей) блокировка будет кратковременной и незаметной для пользователей.
  • Для крупных регистров используйте пакетное удаление (по 1000–5000 записей за раз) с задержками между пакетами:
    Для Счетчик = 1 По 10 Цикл
    

    УдалитьПачкуЗаписей(1000);

    Пауза(1000); // Задержка 1 секунда

    КонецЦикла;

  • В клиент-серверном