Работа с виртуальными таблицами в 1С — это основа разработки эффективных отчетов. Однако начинающие (и даже опытные) разработчики часто сталкиваются с ситуацией, когда запрос к таблице ОстаткиИОбороты выдает странные результаты. Типичный пример: без детализации остаток нулевой, но стоит добавить в поля Регистратор и установить периодичность Авто, как в отчете начинают «гулять» минуса по начальным остаткам. Проанализируем, почему так происходит и как правильно интерпретировать эти данные.
Рассмотрим подробнее, что означает параметр Авто в виртуальной таблице ОстаткиИОбороты. Многие ошибочно полагают, что это универсальный режим, который сам «поймет», какая детализация нужна. На самом деле, этот режим был разработан специально для Системы компоновки данных (СКД). Когда запрос выполняется в контексте СКД, система анализирует выбранные поля и сама подставляет нужную периодичность (день, месяц, запись).
Если же мы используем Авто в обычном запросе (через Новый Запрос в коде), платформа ведет себя следующим образом:
Регистратор, периодичность фактически превращается в Запись.НачальныйОстаток (состояние до проведения документа) и КонечныйОстаток (состояние после).Выясним причину, по которой без регистратора остаток нулевой, а с ним — отрицательный. Представим ситуацию на складе: на утро товара 0 штук. В 10:00 мы продаем 1 штуку (уходим в минус), а в 15:00 нам поступает 1 штука от поставщика. Итоговый остаток на конец дня — 0.
Если мы выполним запрос без периодичности или без регистратора, виртуальная таблица просто «схлопнет» обороты за период: 0 (нач) - 1 (расход) + 1 (приход) = 0 (кон). Мы увидим красивый ноль.
Однако, добавив Регистратор и периодичность Авто, мы развернем хронологическую цепочку:
В этом случае начальный остаток по второй строке (документу поступления) будет равен -1. Это абсолютно корректное поведение системы: она показывает состояние регистра в конкретной точке времени. Минуса в строках с регистраторами — это индикатор того, что в какой-то момент времени (внутри дня или из-за нарушения последовательности) по регистру образовалось отрицательное сальдо.
Проанализируем ситуацию, когда в отчете видны строки с «пустым» значением в колонке Регистратор и отрицательными суммами. В языке запросов 1С при использовании ОстаткиИОбороты результат часто группируется. Если вы используете конструкцию СГРУППИРОВАТЬ ПО, как в примере ниже:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
ХозрасчетныйОстаткиИОбороты.Регистратор КАК Регистратор,
СУММА(ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&Нач, &Кон, Авто, , Счет = &Счет, , ) КАК ХозрасчетныйОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Счет,
ХозрасчетныйОстаткиИОбороты.Регистратор
Важно понимать: виртуальная таблица возвращает детальные записи по регистраторам. Строка, где регистратор не заполнен, но есть суммы — это зачастую результат суммирования или итог, который выводит система (или который получается из-за особенностей группировки). Если вы видите начальный остаток «-19» в итоговой строке по регистратору, это означает, что сумма всех промежуточных начальных остатков по всем документам дала такое число. Внимание: суммирование начальных остатков по регистраторам не имеет физического смысла! Это математическая сумма состояний «до» каждого документа.
Для того чтобы получить корректную картину движений в обычном запросе, придерживайтесь следующих правил:
Авто в обычном запросе лучше использовать Запись или явно указывать ПериодСекунда в списке полей. Это обеспечит правильную сортировку и понимание времени транзакций.ОстаткиИОбороты уже является сгруппированной. Дополнительная инструкция СГРУППИРОВАТЬ ПО к этой таблице (особенно по полям ресурсов) часто приводит к логическим ошибкам в расчете остатков.Если после всех исправлений запроса вы видите отрицательный остаток там, где его физически не может быть (например, приход точно был раньше), стоит проверить состояние базы данных. Рассмотрим два шага проверки:
В 1С остатки хранятся в специальных таблицах итогов. Если расчет итогов «разъехался» с реальными движениями, виртуальная таблица может выдавать неверные начальные остатки. Рекомендуется выполнить операцию «Пересчет итогов» через Конфигуратор (Тестирование и исправление) или через обработку «Управление итогами» в пользовательском режиме.
Часто документы проводят «задним числом». Если реализация была проведена вчера, а поступление этого товара — сегодня, но вчерашним временем, то в момент проведения реализации система «не видела» товара и могла позволить уйти в минус. Посмотрите на границу последовательности и убедитесь, что все документы перепроведены в правильном хронологическом порядке.
Подводя итог, можно сказать: отрицательные начальные остатки при детализации до регистратора — это не ошибка запроса, а отражение промежуточных состояний системы. Чтобы избавиться от них, нужно либо корректировать учет (время проведения документов), либо пересматривать необходимость такой детальной выборки в одном отчете без использования механизмов СКД.