Как правильно выбрать таблицу регистра накопления для получения оплат и регистратора

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

При работе с запросами в 1С начинающие (и даже опытные) разработчики часто сталкиваются с дилеммой: какую таблицу регистра накопления использовать для получения данных об оплатах. Выбор стоит между физической таблицей, виртуальной таблицей Обороты и самой мощной — ОстаткиИОбороты. Ситуация осложняется тем, что когда нам нужно увидеть документ, сделавший запись (поле Регистратор), поведение этих таблиц меняется.

В этой статье мы подробно разберем, в каких случаях стоит использовать ту или иную таблицу, как оптимизировать запрос и как правильно вытащить регистратор, не перегружая систему. Проанализируем ситуацию на примере поиска оплат во взаиморасчетах.

Различие между физическими и виртуальными таблицами

Для начала давайте выясним причину, по которой 1С предлагает нам несколько вариантов обращения к одному и тому же регистру. Физическая таблица — это то, как данные реально хранятся в базе данных SQL. Она содержит каждую запись (строку) каждого документа. Виртуальные таблицы — это инструмент платформы 1С, который позволяет получать уже агрегированные данные (суммы, итоги) на лету, используя заранее рассчитанные итоги.

Рассмотрим основные правила выбора:

  1. Виртуальная таблица «Обороты» — это «золотой стандарт» для получения сумм оплат. Она работает значительно быстрее физической таблицы, так как платформа обращается к таблице итогов оборотов, а не пересчитывает все записи с начала времен.
  2. Виртуальная таблица «Остатки и обороты» — наиболее универсальная, но и самая «тяжелая». Мы используем её только тогда, когда в одном отчете нужно сопоставить начальный долг, сумму оплаты за период и конечный остаток. Если вам нужны просто оплаты (факты движения денег), использовать её избыточно.
  3. Физическая таблица регистра — к ней мы обращаемся в исключительных случаях. Например, когда нужно получить значения реквизитов (не измерений), которые не входят в виртуальные таблицы, или когда нужно проанализировать специфические поля, такие как НомерСтроки.

Как получить документ-регистратор в виртуальных таблицах

Часто программисты сталкиваются с тем, что в виртуальной таблице Обороты поле Регистратор недоступно или пусто. Это происходит потому, что по умолчанию виртуальная таблица группирует данные за весь указанный период. Чтобы «развернуть» данные до конкретных документов, необходимо использовать параметр Периодичность.

Проанализируем, как это работает в конструкторе запроса. При выборе виртуальной таблицы РегистрНакопления.Взаиморасчеты.Обороты в параметрах таблицы (вторая закладка) есть поле «Периодичность». Если мы установим там значение Регистратор, система добавит в доступные поля не только измерения, но и сам документ, создавший движение.

Важный нюанс: при установке периодичности Регистратор скорость выполнения запроса замедляется и приближается к чтению физической таблицы. Это логично, так как системе приходится доставать каждую запись отдельно, а не брать общую сумму из итогов.

Пример запроса для получения оплат с регистратором:


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

Логика «Прихода» и «Расхода» в контексте оплат

При поиске оплат важно не перепутать направление движения. Это зависит от вида регистра накопления (Остатки или Обороты) и его структуры в конкретной конфигурации.

Рассмотрим стандартный регистр типа Остатки (например, «Взаиморасчеты с клиентами»):

Если же мы работаем с регистром типа Обороты (например, «ВыручкаИСебестоимостьПродаж»), то там нет понятий Приход/Расход, а есть просто Оборот по конкретному ресурсу (например, СуммаВыручки). Поэтому прежде чем писать запрос, обязательно посмотрим в метаданных тип регистра.

Оптимизация: когда данных слишком много

Если нам нужно найти именно оплаты, простого обращения к оборотам может быть недостаточно. В крупных системах (ERP, УТ 11) в один и тот же регистр могут писать разные документы: и платежки, и корректировки долга, и взаимозачеты. Все они технически являются «оборотами».

Чтобы отфильтровать именно платежные документы, мы можем пойти двумя путями:

Способ 1: Фильтр по типу регистратора в запросе. Мы можем использовать оператор ССЫЛКА, чтобы отобрать только нужные типы документов.


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

Способ 2: Использование уточняющих измерений. В современных конфигурациях часто присутствует измерение или реквизит ТипХозяйственнойОперации. Использование фильтра по этому полю в параметрах виртуальной таблицы — самый быстрый способ получить верные данные, так как фильтр отработает еще на этапе формирования таблицы системой.

Выясним причину: почему запрос может работать медленно?

Рассмотрим ситуацию: вы написали запрос к таблице ОстаткиИОбороты с периодичностью Регистратор за большой период. Система начинает «тормозить». Почему?

Дело в том, что ОстаткиИОбороты заставляет платформу рассчитывать остатки на каждую секунду, когда было движение по регистру. Если у вас тысячи документов в день, расчет превращается в огромную математическую задачу.

Рекомендация: если вам не нужны остатки на начало и конец (например, вы просто строите список оплат), никогда не используйте ОстаткиИОбороты. Используйте Обороты с периодичностью Регистратор. Разница в производительности может достигать десятков раз.

Подведем итог

Для решения задачи автора форума («посмотреть по регистру оплату и узнать регистратор») оптимальным алгоритмом будет:

  1. Использовать виртуальную таблицу Обороты.
  2. В параметрах виртуальной таблицы обязательно указать периодичность Регистратор.
  3. Если это регистр остатков, смотреть ресурс Расход (для оплат от клиентов).
  4. Накладывать фильтры (по контрагенту, организации) в параметрах виртуальной таблицы, а не в секции ГДЕ, для максимального ускорения запроса.

Соблюдение этих правил позволит вам писать эффективные и быстрые отчеты, которые не будут блокировать работу базы данных даже при больших объемах информации.

← На главную