В практике разработчика 1С часто встречается ситуация, когда один и тот же запрос к регистру бухгалтерии выдает разные результаты при изменении настроек периодичности. Например, при получении итогов за период сумма составляет 20 000, а при детализации до записи — 15 000. Рассмотрим подробнее, почему возникают такие «фантомные» обороты и как привести данные в порядок.
Проанализируем механику работы виртуальных таблиц. Когда мы обращаемся к РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт без указания периодичности или с периодичностью Период, платформа 1С:Предприятие в целях оптимизации обращается к таблицам итогов. Это предварительно рассчитанные агрегаты, которые хранят сальдо и обороты на начало каждого месяца.
Если же мы указываем периодичность Запись, система чаще всего обращается напрямую к таблице движений (физическим записям в базе данных). Таким образом, если в базе данных произошел сбой и «итоги разъехались» с реальными документами, мы получаем два разных числа. Документы (движения) показывают правду, а итоговые таблицы — устаревшие или поврежденные данные.
Посмотрим на пример запроса, который может возвращать некорректные данные из-за неоптимальных фильтров:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХозрасчетныйОборотыДтКт.СчетДт КАК СчетДт,
ХозрасчетныйОборотыДтКт.СчетКт КАК СчетКт,
ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , , , , , ) КАК ХозрасчетныйОборотыДтКт
ГДЕ
ХозрасчетныйОборотыДтКт.СчетДт В ИЕРАРХИИ(&СчетДт)
И ХозрасчетныйОборотыДтКт.СчетКт В ИЕРАРХИИ(&СчетКт)
И ХозрасчетныйОборотыДтКт.Организация = &Организация
Важное правило: никогда не накладывайте фильтры по измерениям (Счет, Организация, Субконто) в секции ГДЕ для виртуальных таблиц. Это заставляет систему сначала выбрать лишние данные из итогов, а потом фильтровать их. Выясним причину ошибки: при использовании В ИЕРАРХИИ в секции ГДЕ на «битых» итогах расчет может удвоить суммы. Перенесем условия в параметры виртуальной таблицы:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХозрасчетныйОборотыДтКт.СчетДт,
ХозрасчетныйОборотыДтКт.СчетКт,
СУММА(ХозрасчетныйОборотыДтКт.СуммаОборот) КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
&НачалоПериода,
&КонецПериода,
Запись,
СчетДт В ИЕРАРХИИ(&СчетДт),
,
СчетКт В ИЕРАРХИИ(&СчетКт),
Организация = &Организация,
) КАК ХозрасчетныйОборотыДтКт
СГРУППИРОВАТЬ ПО
ХозрасчетныйОборотыДтКт.СчетДт,
ХозрасчетныйОборотыДтКт.СчетКт
Вы могли заметить, что изменение времени конца периода всего на одну секунду (с 23:59:59 на 23:59:58) иногда меняет результат запроса. Это происходит потому, что тип данных Дата в 1С не всегда однозначно определяет включение документов, записанных в ту же секунду. Для решения этой проблемы проанализируем использование объекта Граница.
В коде на встроенном языке это выглядит так:
КонецПериодаГраница = Новый Граница(КонецДня(Объект.ДатаКон), ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонецПериода", КонецПериодаГраница);
Использование ВидГраницы.Включая гарантирует, что все проводки, включая те, что были созданы в последнюю секунду периода, попадут в выборку виртуальной таблицы.
Если запрос по периодичности Запись выдает верное значение (например, 15 000), а общие обороты показывают неверное (20 000), значит, таблицы итогов физически повреждены или не актуальны. Рассмотрим пошагово действия по исправлению:
chdbfl.exe (находится в папке bin платформы). Она проверяет физическую целостность файлов .1CD.Проанализируем ситуацию с выбором конкретных полей. В некоторых случаях при использовании ОборотыДтКт рекомендуется использовать поле СуммаОборотДт, если ваша задача — получить именно дебетовый оборот по счету в связке с конкретным кредитовым счетом. Также убедитесь, что в плане счетов нет дублей или ошибочно созданных предопределенных счетов, которые могут входить в одну и ту же иерархию, вызывая зацикливание или дублирование сумм.
Резюме: Если вы столкнулись с расхождением данных в регистре бухгалтерии, сначала исключите ошибки в параметрах запроса (используйте Граница и фильтры в параметрах виртуальной таблицы), а затем выполните полный пересчет итогов. В 90% случаев это полностью решает проблему «лишних» сумм.