После проведения процедуры свертки информационной базы (например, в конфигурации «1С:Управление торговлей 10.3») нередко возникает неприятная ситуация: стандартные отчеты по взаиморасчетам формируют абсолютно корректные остатки, но в формах документов или справочников информационная надпись о текущем долге контрагента (а также печатные формы) выводит ошибочные или задвоенные суммы. При этом стандартная процедура пересчета через пункт меню «Операции → Управление итогами» в режиме «1С:Предприятие» не дает никакого эффекта.
Разберем подробно причины такого поведения платформы, проанализируем программный код типовых механизмов и рассмотрим проверенные способы устранения проблемы.
Рассмотрим, как формируется надпись долга на форме документа в типовых конфигурациях на обычных формах. При открытии формы или выборе договора вызывается типовая процедура формирования подсказки:
Процедура СформироватьНадписьДолга(ДоговорКонтрагента, Сделка, ЭлементФормыНадписьДолга,
СсылкаДокумент = Неопределено, МожноНеРассчитывать = Ложь) Экспорт
Если МожноНеРассчитывать Тогда
Если НЕ УправлениеДопПравамиПользователей.РассчитыватьДолгПриОткрытииФорм() Тогда
ЭлементФормыНадписьДолга.Заголовок = ПолучитьТекстДолга(ДоговорКонтрагента, Неопределено);
Возврат;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(ДоговорКонтрагента) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
СуммаДолга = УправлениеВзаиморасчетами.ТекущийДолг(ДоговорКонтрагента, Сделка, СсылкаДокумент);
ТекстДолга = ПолучитьТекстДолга(ДоговорКонтрагента, СуммаДолга);
Если СуммаДолга > 0 Тогда
ЭлементФормыНадписьДолга.ЦветТекста = ЦветаСтиля.ТекстПредупреждающейНадписи;
Иначе
ЭлементФормыНадписьДолга.ЦветТекста = ЦветаСтиля.ТекстИнформационнойНадписи;
КонецЕсли;
ЭлементФормыНадписьДолга.Заголовок = ТекстДолга;
Иначе
ЭлементФормыНадписьДолга.Заголовок = "";
КонецЕсли;
КонецПроцедуры
Заглянем внутрь функции УправлениеВзаиморасчетами.ТекущийДолг. Расчет остатка выполняется прямым обращением к виртуальной таблице остатков регистра накопления ВзаиморасчетыСКонтрагентами:
ТекущийДолг = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(
,
СтруктураОтбора,
"ДоговорКонтрагента",
"СуммаВзаиморасчетов"
).Итог("СуммаВзаиморасчетов");
Выясним, почему метод Остатки() возвращает неверное значение, в то время как отчет строится правильно. Причина кроется во внутреннем устройстве регистров накопления платформы 1С:
Корректировка записей регистров). При таком массовом перестроении записей таблица итогов может рассинхронизироваться с таблицей реальных движений, сохраняя «фантомные» записи или некорректные остатки по комбинациям измерений.Остатки() на встроенном языке всегда обращается напрямую к физической таблице итогов регистра, из-за чего и возвращает искаженные данные.Самый надежный и штатный способ восстановить согласованность данных — выполнить процедуру тестирования и исправления информационной базы.
Разберем по шагам порядок действий:
.dt или копия на уровне СУБД). Это обязательное условие перед любыми сервисными операциями.В ходе этой процедуры платформа полностью очищает физические таблицы агрегатов всех регистров накопления и бухгалтерии и последовательно заполняет их заново на основании таблицы реальных движений.
Если база данных имеет большой объем, а доступное время монопольного режима ограничено, полное тестирование и исправление может выполняться слишком долго. В таком случае пересчитаем таблицу итогов только для проблемного регистра ВзаиморасчетыСКонтрагентами с помощью встроенного языка.
Посмотрим на пример программного кода, который можно выполнить во внешней обработке в привилегированном режиме:
Попытка
// Выполняем полный пересчет физической таблицы итогов регистра
РегистрыНакопления.ВзаиморасчетыСКонтрагентами.ПересчитатьИтоги();
Сообщить("Пересчет итогов регистра ""Взаиморасчеты с контрагентами"" успешно завершен!");
Исключение
Сообщить("Ошибка при пересчете итогов: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Метод ПересчитатьИтоги() инициализирует полную перестройку агрегатов исключительно для указанного регистра накопления, что занимает значительно меньше времени, чем общее Тестирование и исправление базы.
Если нет возможности открыть Конфигуратор или запустить внешнюю обработку, можно принудительно очистить агрегаты за поздние периоды через стандартный интерфейс:
Такая манипуляция заставит платформу заново пересчитать итоги от установленной точки до актуального периода.
После выполнения свертки базы данных и пересчета итогов также рекомендуется:
Корректировка записей регистров не содержат пустых ссылок на договоры, организации или контрагентов. Пустые значения в измерениях могут приводить к тому, что отборы в коде и отчетах ведут себя по-разному.