В процессе доработки конфигураций 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) и сбоев при проведении документов:
.dt. Если база работает в режиме восстановления Full, контролируем свободное место на диске: реструктуризация крупного регистра может вызвать лавинообразный рост файла журнала транзакций (.ldf).
Движение = Движения.СвободныеОстатки.Добавить();
// Следующая строка после удаления измерения вызовет критическую ошибку:
Движение.Организация = Выборка.Организация;
Поле объекта не обнаружено (Организация). Удаляем явные присвоения и выборку поля из текстов запросов.Все функции (или Функции для технического специалиста) — Стандартные — Управление итогами. Находим нужный регистр накопления и нажимаем Пересчитать.Проанализируем альтернативный сценарий, предложенный в обсуждении. Если данные по организации в движениях регистра все же требуются пользователям (например, для построения специализированных отчетов по движениям или аудита), но не должны дробить остатки на складе, измерение можно перенести в Реквизиты регистра:
Реквизиты регистра накопления хранятся исключительно в таблице движений и не включаются в ключ таблицы итогов. Это полностью исключает расщепление остатков и зависание фиктивных положительных и отрицательных количеств.