Почему запрос к виртуальной таблице ОборотыДтКт выдает неверную сумму и как это исправить

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

В практике разработчика 1С часто встречается ситуация, когда один и тот же запрос к регистру бухгалтерии выдает разные результаты при изменении настроек периодичности. Например, при получении итогов за период сумма составляет 20 000, а при детализации до записи — 15 000. Рассмотрим подробнее, почему возникают такие «фантомные» обороты и как привести данные в порядок.

Разбираем причину расхождения: Итоги против Движений

Проанализируем механику работы виртуальных таблиц. Когда мы обращаемся к РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт без указания периодичности или с периодичностью Период, платформа 1С:Предприятие в целях оптимизации обращается к таблицам итогов. Это предварительно рассчитанные агрегаты, которые хранят сальдо и обороты на начало каждого месяца.

Если же мы указываем периодичность Запись, система чаще всего обращается напрямую к таблице движений (физическим записям в базе данных). Таким образом, если в базе данных произошел сбой и «итоги разъехались» с реальными документами, мы получаем два разных числа. Документы (движения) показывают правду, а итоговые таблицы — устаревшие или поврежденные данные.

Шаг 1: Оптимизация текста запроса

Посмотрим на пример запроса, который может возвращать некорректные данные из-за неоптимальных фильтров:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ХозрасчетныйОборотыДтКт.СчетДт КАК СчетДт,
    ХозрасчетныйОборотыДтКт.СчетКт КАК СчетКт,
    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, , , , , , ) КАК ХозрасчетныйОборотыДтКт
ГДЕ
    ХозрасчетныйОборотыДтКт.СчетДт В ИЕРАРХИИ(&СчетДт)
    И ХозрасчетныйОборотыДтКт.СчетКт В ИЕРАРХИИ(&СчетКт)
    И ХозрасчетныйОборотыДтКт.Организация = &Организация

Важное правило: никогда не накладывайте фильтры по измерениям (Счет, Организация, Субконто) в секции ГДЕ для виртуальных таблиц. Это заставляет систему сначала выбрать лишние данные из итогов, а потом фильтровать их. Выясним причину ошибки: при использовании В ИЕРАРХИИ в секции ГДЕ на «битых» итогах расчет может удвоить суммы. Перенесем условия в параметры виртуальной таблицы:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ХозрасчетныйОборотыДтКт.СчетДт,
    ХозрасчетныйОборотыДтКт.СчетКт,
    СУММА(ХозрасчетныйОборотыДтКт.СуммаОборот) КАК СуммаОборот
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
        &НачалоПериода, 
        &КонецПериода, 
        Запись, 
        СчетДт В ИЕРАРХИИ(&СчетДт), 
        , 
        СчетКт В ИЕРАРХИИ(&СчетКт), 
        Организация = &Организация, 
    ) КАК ХозрасчетныйОборотыДтКт
СГРУППИРОВАТЬ ПО
    ХозрасчетныйОборотыДтКт.СчетДт,
    ХозрасчетныйОборотыДтКт.СчетКт

Шаг 2: Использование объекта Граница

Вы могли заметить, что изменение времени конца периода всего на одну секунду (с 23:59:59 на 23:59:58) иногда меняет результат запроса. Это происходит потому, что тип данных Дата в 1С не всегда однозначно определяет включение документов, записанных в ту же секунду. Для решения этой проблемы проанализируем использование объекта Граница.

В коде на встроенном языке это выглядит так:


КонецПериодаГраница = Новый Граница(КонецДня(Объект.ДатаКон), ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонецПериода", КонецПериодаГраница);

Использование ВидГраницы.Включая гарантирует, что все проводки, включая те, что были созданы в последнюю секунду периода, попадут в выборку виртуальной таблицы.

Шаг 3: Исправление итогов и обслуживание базы

Если запрос по периодичности Запись выдает верное значение (например, 15 000), а общие обороты показывают неверное (20 000), значит, таблицы итогов физически повреждены или не актуальны. Рассмотрим пошагово действия по исправлению:

  1. Пересчет итогов: Это самая быстрая процедура. В режиме «1С:Предприятие» перейдите в «Все функции» (или «Функции для технического специалиста») — «Стандартные» — «Управление итогами». Установите период рассчитанных итогов на актуальную дату и выполните пересчет.
  2. Тестирование и исправление (ТиИ): В конфигураторе запустите «Администрирование» — «Тестирование и исправление». Обязательно выберите пункты «Пересчет итогов» и «Реиндексация таблиц информационной базы». Это устранит логические несоответствия между документами и регистрами.
  3. Утилита chdbfl.exe: Для файловых баз данных полезно запустить внешнюю утилиту chdbfl.exe (находится в папке bin платформы). Она проверяет физическую целостность файлов .1CD.

Дополнительные рекомендации

Проанализируем ситуацию с выбором конкретных полей. В некоторых случаях при использовании ОборотыДтКт рекомендуется использовать поле СуммаОборотДт, если ваша задача — получить именно дебетовый оборот по счету в связке с конкретным кредитовым счетом. Также убедитесь, что в плане счетов нет дублей или ошибочно созданных предопределенных счетов, которые могут входить в одну и ту же иерархию, вызывая зацикливание или дублирование сумм.

Резюме: Если вы столкнулись с расхождением данных в регистре бухгалтерии, сначала исключите ошибки в параметрах запроса (используйте Граница и фильтры в параметрах виртуальной таблицы), а затем выполните полный пересчет итогов. В 90% случаев это полностью решает проблему «лишних» сумм.

← На главную