При работе с регистрами накопления в системе 1С:Предприятие 8 разработчики часто сталкиваются с ситуацией, когда простой запрос к виртуальной таблице ОстаткиИОбороты возвращает неожиданные данные. Типичный пример: мы указываем период за текущий месяц, ожидая увидеть несколько десятков документов, но в результат попадают записи десятилетней давности. Рассмотрим подробнее, почему это происходит, и как правильно настроить параметры виртуальной таблицы, чтобы отчет работал корректно.
Разберем ситуацию на примере стандартного запроса к регистру ВзаиморасчетыСПодотчетнымиЛицами в конфигурации «Управление торговлей 10.3». Программист использует следующий код:
ВЫБРАТЬ *
ИЗ РегистрНакопления.ВзаиморасчетыСПодотчетнымиЛицами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , )
КАК ВзаиморасчетыСПодотчетнымиЛицамиОстаткиИОбороты
Несмотря на то, что параметры &ДатаНач и &ДатаКон установлены на текущий месяц, в выборку попадают регистраторы за 2010 год. Выясним причину такого поведения системы. Основная сложность заключается в том, как платформа 1С формирует виртуальную таблицу на уровне SQL-запроса.
Когда мы запрашиваем остатки совместно с оборотами и указываем периодичность Регистратор, системе необходимо вычислить входящий остаток на начало периода. Если по конкретному подотчетному лицу висит незакрытый долг или аванс с 2010 года, этот «старый» документ является источником текущего остатка. Система пытается сопоставить остаток с конкретным регистратором, который его образовал, и выводит его в результат, чтобы обеспечить непрерывность цепочки движений.
Для решения задачи нам необходимо проанализировать структуру параметров этой таблицы. Всего их пять:
ГДЕ, но внутри виртуальной таблицы).Именно четвертый параметр — МетодДополнения — играет ключевую роль в нашей проблеме. Посмотрим на два возможных значения этого параметра:
1. ДвиженияИГраницыПериода (по умолчанию): Если этот параметр не указан, система использует логику дополнения записями на границах периода. Если на начало &ДатаНач есть ненулевой остаток, 1С добавит в результат строку с этим остатком. Если этот остаток «тянется» из прошлого, в поле Регистратор может появиться тот самый документ из 2010 года.
2. Движения: В этом режиме система выводит только те записи, по которым в указанном интервале были реальные физические движения в регистре. Все «фантомные» записи, необходимые только для отображения входящих остатков по старым долгам, будут отсечены.
Чтобы в запросе отображались только те документы, которые действительно совершали движения в текущем месяце, нам нужно явно указать метод дополнения. Исправим наш запрос следующим образом:
ВЫБРАТЬ *
ИЗ РегистрНакопления.ВзаиморасчетыСПодотчетнымиЛицами.ОстаткиИОбороты(
&ДатаНач,
&ДатаКон,
Регистратор,
ДВИЖЕНИЯ,
) КАК ВзаиморасчетыСПодотчетнымиЛицамиОстаткиИОбороты
Проанализируем ситуацию после изменений. Теперь, если документ был создан в 2010 году и в текущем периоде (например, в мае 2024 года) он не менял сумму взаиморасчетов, он не попадет в выборку. Это именно то поведение, которое ожидал автор темы.
Важно понимать, что появление старых документов — это не ошибка программы, а особенность работы с незакрытыми остатками. В управленческом учете (особенно в «Управлении торговлей 10») часто возникают ситуации, когда авансы подотчетных лиц не закрываются годами. Для бухгалтера или аналитика может быть важно видеть, какой именно старый документ «держит» остаток на начало месяца. Если же программисту нужен просто список текущих операций, использование ДВИЖЕНИЯ является обязательным стандартом разработки.
Также стоит обратить внимание на периодичность. Рассмотрим пример: если мы выберем периодичность Период (или День), но не укажем метод дополнения, мы можем получить пустые строки с остатками на каждый день, даже если движений не было. Использование Регистратор в сочетании с ДВИЖЕНИЯ — самый надежный способ получить детализированный список оборотов за период без лишнего «мусора» из прошлого.
Посмотрим на ситуацию с технической стороны производительности. Виртуальные таблицы работают быстро только тогда, когда в базе данных рассчитаны итоги регистра. В старых базах (как в случае с УТ 10, где данные хранятся с 2010 года) итоги могут быть не рассчитаны на текущую дату.
Если итоги не актуальны, то при выполнении запроса 1С вынуждена пересчитывать остатки «на лету», сканируя всю физическую таблицу движений начиная с самой первой записи в истории базы. Это приводит к следующим проблемам:
Рекомендация: Всегда проверяйте актуальность итогов через «Операции — Управление итогами». Для корректной работы виртуальной таблицы ОстаткиИОбороты итоги должны быть рассчитаны по месяц, предшествующий текущему, как минимум.
Подводя итог, сформулируем основные правила работы с параметрами виртуальных таблиц:
Регистратор в качестве периодичности и ДВИЖЕНИЯ в качестве метода дополнения.ДвиженияИГраницыПериода), но будьте готовы фильтровать результат или программно обрабатывать записи без оборотов.ГДЕ. Это позволит SQL-серверу отобрать только нужные данные сразу, не перебирая весь регистр целиком.Регистратор, помните, что поля НачальныйОстаток и КонечныйОстаток будут рассчитаны на момент до и после каждого конкретного документа внутри периода.Соблюдение этих правил позволит вам создавать быстрые и точные отчеты, избегая «фантомных» записей из прошлых лет.