Как исправить и удалить пустые записи в регистре накопления 1С?

Программист IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам проверенные способы ее решения.

Причины возникновения пустых записей

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

  1. Повреждение структуры файла файловой базы данных (.1cd): При внезапном прерывании процесса свертки в файле базы образуются разорванные страницы или «потерянные» строки в физической таблице регистра накопления.
  2. Рассинхронизация основной таблицы движений и таблицы итогов: Таблица итогов содержит нулевые значения без соответствующих записей в основной таблице, из-за чего пересчет итогов завершается с ошибкой.
  3. Разрыв связи с регистратором: В результате перегрузки движений без документов-регистраторов или при их физическом удалении ссылка на регистратор становится «битой» (Объект не найден) либо `NULL`.

Способ 1. Поиск и очистка битых записей через запрос и набор записей

Простое условие в стандартном отборе набора записей по пустому регистратору может не сработать. Для поиска битых ссылок построим запрос к основной таблице регистра (не к таблицам остатков или оборотов) с проверкой на NULL или проверкой допустимых типов регистраторов.

Проанализируем пример запроса для поиска битых движений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТаблицаРегистра.Период КАК Период,
    |	ТаблицаРегистра.Регистратор КАК Регистратор
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах КАК ТаблицаРегистра
    |ГДЕ
    |	ТаблицаРегистра.Регистратор.Ссылка ЕСТЬ NULL";

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

Пока Выборка.Следующий() Цикл
    // Очистка набора записей по найденному регистратору
    Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
    Набор.Записать(); // Запись пустого набора удаляет движения
КонецЦикла;

Если ссылки на регистратор имеют вид битого GUID, можно программно восстановить временно фиктивный документ с соответствующим GUID вызовом метода УстановитьСсылкуНового(), очистить движения стандартным способом через набор записей, а затем пометить и удалить созданный документ.

Способ 2. Выгрузка данных, пересоздание структуры и загрузка обратно

Если стандартные запросы 1С не видят битые строки, но платформа спотыкается о них при пересчете итогов, выполним пересоздание структуры регистра через промежуточный файл.

Разберем алгоритм по шагам:

  1. Создание резервной копии: Все действия выполняем строго на копии информационной базы.
  2. Выгрузка движений: Используем обработку «Выгрузка и загрузка данных XML» для выгрузки всех корректных записей проблемного регистра накопления в файл.
  3. Очистка структуры: В режиме Конфигуратора снимаем данный регистр с проведения у всех документов-регистраторов (или временно удаляем регистраторы из списка состава регистра). Применяем изменения структуры базы данных (F7). Поврежденная физическая таблица регистра при этом полностью очищается.
  4. Восстановление структуры: Возвращаем обратно документы-регистраторы в состав регистра накопления и снова обновляем конфигурацию БД.
  5. Загрузка данных: Загружаем сохраненные корректные движения из XML-файла обратно в базу.

Способ 3. Физическая проверка и реструктуризация таблиц

Для файлового варианта базы данных (.1cd) эффективно помогают штатные утилиты физического исправления файла:

  1. Завершим все сеансы пользователей и запустим утилиту chdbfl.exe (находится в папке bin установленной платформы 1С).
  2. Включим флаг «Исправлять обнаруженные ошибки» и запустим проверку. Утилита удаляет битые и «потерянные» страницы файла базы данных на физическом уровне.
  3. Зайдем в Конфигуратор и запустим процедуру «Тестирование и исправление», выбрав пункт «Реструктуризация таблиц информационной базы» (флаг пересчета итогов на этом шаге можно снять). При реструктуризации платформа пересоздает физические таблицы и переносит в них только валидные данные.

Способ 4. Временное отключение и переформирование итогов

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


// Отключаем использование итогов по регистру
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Ложь);

// Включаем использование итогов обратно - платформа перестроит их с нуля
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);

Также можно воспользоваться стандартной обработкой «Управление итогами» (доступной через меню «Функции для специалиста»). Сместим начальную границу рассчитанных итогов на максимально раннюю дату (например, 01.01.1980 г.), применим изменения, после чего вернем границу расчета на текущий период.

Способ 5. Очистка физической таблицы на уровне SQL

Если база работает в клиент-серверном режиме (MS SQL Server / PostgreSQL), исправление физически битых записей выполним напрямую в СУБД:

  1. С помощью функции ПолучитьСтруктуруХраненияБазыДанных() определим имя физической таблицы движения регистра (например, _AccumReg1234).
  2. Через Management Studio или pgAdmin выполним запрос на удаление записей, у которых отсутствуют соответствия или реквизиты заполнены некорректно.
  3. После выполнения очистки запустим пересчет итогов в режиме Конфигуратора 1С.
← На главную