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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе доработки конфигураций 1С (в частности, на базе 1С:Управление торговлей 11, 1С:Комплексная автоматизация или 1С:ERP) нередко возникают ситуации, когда нештатно добавленное измерение регистра накопления приводит к рассогласованию данных. Типичный пример — добавление измерения Организация в регистр остатков СвободныеОстатки. Поскольку складской учет доступности в типовой архитектуре намеренно обезличен относительно юридических лиц, типовые документы прихода пишут пустую организацию, а кастомные реализации — конкретное юридическое лицо. В результате остатки расщепляются на две параллельные ветки (например, +3 и −3), вызывая ошибки контроля остатков.

Разберем детально, как ведет себя платформа 1С и СУБД MS SQL при удалении измерения, нужно ли выполнять тестирование и исправление (ТиИ) и какие шаги необходимо предпринять в коде и структуре базы данных.

Что происходит на уровне СУБД при удалении измерения

Для понимания последствий удаления измерения проанализируем внутреннее устройство регистра накопления с поддержкой остатков на уровне SQL-сервера:

1. Таблица движений (префикс _AccumRg). Первичный ключ этой таблицы формируется из полей регистратора (Recorder) и номера строки (LineNo). Сами измерения не входят в первичный ключ таблицы движений. Поэтому при удалении измерения риск появления ошибки дублирования записей (нарушения уникальности первичного ключа) в таблице движений отсутствует. Физически платформа выполняет команду модификации таблицы (ALTER TABLE ... DROP COLUMN или пересоздание таблицы через временную), удаляя колонку измерения. Все строки остаются привязанными к своим документам.

2. Таблица итогов (префикс _AccumRgT). Первичный ключ таблицы итогов состоит из периода расчета и набора всех измерений регистра. При обновлении конфигурации базы данных платформа производит реструктуризацию таблицы итогов. Она агрегирует данные по оставшимся измерениям. Если склад, номенклатура и характеристика у записей с пустой и заполненной организацией совпадали, разнонаправленные движения (+3 и −3) математически сложатся, и результирующий остаток автоматически выйдет в ноль. «Хвосты» схлопнутся без необходимости ручной корректировки.

Нужно ли запускать реструктуризацию и пересчет итогов через ТиИ

Выясним причину частых заблуждений относительно операций в меню «Тестирование и исправление»:

Реструктуризация таблиц информационной базы: Повторно запускать эту процедуру в ТиИ после применения изменений в конфигураторе технически бессмысленно. Платформа 1С уже выполнила полную физическую реструктуризацию таблиц регистра на стороне SQL Server в момент нажатия кнопки Обновить конфигурацию базы данных (F7). Повторный запуск лишь создаст многочасовую бесполезную нагрузку на дисковую подсистему.

Пересчет итогов: Эту операцию выполнить рекомендуется. Хотя платформа пересчитывает итоги при реструктуризации, ручной запуск пересчета итогов (через стандартную обработку Управление итогами или через пункт «Пересчет итогов» в ТиИ) гарантирует полную консистентность агрегатов и срезов на границе рассчитанных итогов.

Пошаговый регламент удаления измерения

Рассмотрим последовательность действий, исключающую возникновение ошибок времени выполнения (Runtime Error) и сбоев при проведении документов:

  1. Создание резервной копии базы данных. Перед любыми структурными изменениями обязательно создаем бэкап средствами MS SQL Server или выгрузкой в файл .dt. Если база работает в режиме восстановления Full, контролируем свободное место на диске: реструктуризация крупного регистра может вызвать лавинообразный рост файла журнала транзакций (.ldf).
  2. Глобальный поиск ссылок на удаляемое поле. В конфигураторе выполняем «Поиск ссылок на объект» для удаляемого измерения, а также глобальный поиск по его имени по всей конфигурации и расширениям. Нам необходимо выявить:
    1. Модули проведения документов (где заполняется набор записей).
    2. Тексты запросов в отчетах, динамических списках и процедурах проведения.
    3. Настройки прав на уровне записей (RLS), если в условиях использовалось это поле.
  3. Корректировка программного кода. Синхронно с удалением метаданных вычищаем все обращения к удаляемому измерению. Если в коде документа оставить строку вида:
    
    Движение = Движения.СвободныеОстатки.Добавить();
    // Следующая строка после удаления измерения вызовет критическую ошибку:
    Движение.Организация = Выборка.Организация;
    
    то при первой же попытке перепроведения документа система упадет с ошибкой Поле объекта не обнаружено (Организация). Удаляем явные присвоения и выборку поля из текстов запросов.
  4. Удаление измерения в дереве метаданных. Удаляем лишнее измерение из состава регистра накопления в конфигураторе.
  5. Применение изменений. Выполняем обновление конфигурации базы данных (клавиша F7) в монопольном режиме.
  6. Пересчет итогов регистра. В режиме «1С:Предприятие» переходим в меню Все функции (или Функции для технического специалиста) — Стандартные — Управление итогами. Находим нужный регистр накопления и нажимаем Пересчитать.

Альтернативное решение: перенос измерения в реквизиты

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

  1. Создаем в регистре реквизит с тем же типом данных.
  2. С помощью внешней обработки переносим значения из измерения в реквизит по всем существующим наборам записей без перепроведения документов.
  3. Перенаправляем алгоритмы записи в модулях проведения на заполнение нового реквизита.
  4. Удаляем старое измерение.

Реквизиты регистра накопления хранятся исключительно в таблице движений и не включаются в ключ таблицы итогов. Это полностью исключает расщепление остатков и зависание фиктивных положительных и отрицательных количеств.

← На главную