При сравнении отчетов в двух внешне одинаковых базах разработчики и бухгалтеры иногда сталкиваются с аномальным поведением: один и тот же документ формирует проводки с идентичным набором субконто, однако в карточке счета или оборотно-сальдовой ведомости (ОСВ) аналитика выглядит смещенной на уровень вниз или обороты перестают сворачиваться (схлапываться).
Программная проверка субконто при этом может показывать, что пустых значений на первом уровне нет, а настройки отчетов совпадают полностью. Разберем по шагам причину возникновения этой проблемы и рассмотрим способы отлова и исправления некорректных данных.
Проанализируем механику работы регистра бухгалтерии в платформе 1С. Виртуальные таблицы итогов сворачивают движения по счетам только в том случае, если структура и типы всех измерений и реквизитов проводки строго соответствуют настройкам Плана счетов.
Главная причина смещения аналитики заключается в появлении значения NULL в измерениях или реквизитах проводки (например, в поле ВалютаДт или ВалютаКт) вместо правильной пустой ссылки или наоборот. Если в старых проводках записано значение NULL по валюте счета, платформа перестает некорректно схлапывать записи. Из-за этого при формировании виртуальных таблиц отчета происходит сдвиг иерархии субконто или разворачивание сальдо.
Выясним, как такие некорректные значения попадают в регистраторы:
ОбменДанными.Загрузка = Истина: При переносе данных через правила Конвертации Данных, XDTO или прямого обмена платформенные проверки логической целостности отключаются. В результат в поле ВалютаДт может записаться NULL вместо стандартной пустой ссылки.Посмотрим, как отловить некорректные записи с помощью запроса. Обращаться необходимо напрямую к физической таблице РегистрБухгалтерии.Хозрасчетный, а не к виртуальным таблицам остатков и оборотов.
Проанализируем пример запроса, который находит проводки со значением NULL в поле ВалютаДт:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.Регистратор КАК Регистратор,
| Хозрасчетный.НомерСтроки КАК НомерСтроки,
| Хозрасчетный.СчетДт КАК СчетДт,
| Хозрасчетный.ВалютаДт КАК ВалютаДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.ВалютаДт ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
Если запрос возвращает строки, значит в базе присутствуют записи с нарушенной целостностью типов, которые препятствуют правильной работе отчетов.
Рассмотрим основные варианты восстановления правильной структуры проводок.
1. Программная перезапись наборами записей (без перепроведения документов)
Самый безопасный и эффективный способ исправления движений в закрытых периодах — перезаписать набор записей регистра с флагом ОбменДанными.Загрузка = Ложь. При стандартной записи платформа 1С автоматически приводит типы пустых значений к корректному виду в соответствии с текущим Планом счетов.
Разберем пример кода для перезаписи движений регистратора:
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
// Включаем стандартный режим записи для срабатывания платформенных проверок
НаборЗаписей.ОбменДанными.Загрузка = Ложь;
НаборЗаписей.Записать();
2. Перепроведение документов
Если период открыт для редактирования, массовое перепроведение документов-регистраторов заново формирует проводки. В процессе перепроведения платформа установит верные типы данных в реквизитах и измерениях проводок.
3. Реструктуризация таблиц информационной базы
В случаях, когда некорректные типы зафиксированы в таблицах итогов, помогает процедура реструктуризации. Для этого в конфигураторе выберем пункт меню Администрирование -> Тестирование и исправление, где установим флаг Реструктуризация таблиц информационной базы.