Регистры бухгалтерии. Виртуальная таблица оборотов

28.07.20

Разработка - Механизмы типовых конфигураций

Виртуальная таблица оборотов регистра бухгалтерии. Принцип работы, особенности и кое-что еще.

Введение

В предыдущей статье по регистрам бухгалтерии "Регистры бухгалтерии. Настройки, субконто и движения с субконто" мы подробным образом рассмотрели работу настроек этого регистра, а также внутренности виртуальных таблиц "Субконто" и "Движения с субконто". Коснулись некоторых особенностей настроек и их влияние на хранение данных регистра на стороне базы данных.

Сегодня мы продолжим анализ работы регистра, но на этот раз рассмотрим только одну виртуальную таблицу "Обороты". Такая маленькая, и такая интересная!

Все данные для публикации получены с помощью инструментов:

Транслятор запросов 1С

Просмотр и анализ структуры базы данных (отчет на СКД)

Помощник работы с идентификаторами

Начнем с простых запросов, которые генерирует платформа 1С, и закончим на особенностях и вопросах производительности.

Небольшое отступление

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

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

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

  • Анализ состояния учета по налогу на прибыль
  • Продажи
  • Расшифровка платежей в бюджет
  • И еще много-много всего.

Думаю, что необходимость использования этой виртуальной таблицы очевидна. Перейдем к первому примеру и рассмотрим, что именно делает платформа 1С с этой виртуальной таблицей.

Простой пример

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

ВЫБРАТЬ
	ХозрасчетныйОбороты.Счет КАК Счет,
	ХозрасчетныйОбороты.СуммаОборот КАК СуммаОборот,
	ХозрасчетныйОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Обороты(, , , , , , , ) КАК ХозрасчетныйОбороты

Если Вы далаете такие запросы на рабочей базе, то стоит подумать над тем, чтобы от такого отказаться. Почему? Взгляните какой запрос мы имеем на стороне базы данных.

 
 Запрос к базе данных

Как мы видим, платформа получает данные из основной таблицы регистра для получения оборотов по указанным ресурсам. Алгоритм такой:

  • Получаем обороты из основной таблицы по дебету
  • Получаем обороты из основной таблицы по кредиту
  • Объединяем полученные данные в единую таблицу и группируем по счету

В принципе все работает логично. Но может появиться вопрос: почему платформа не использует данные итогов? Ведь оптимально было бы получить общие показатели из таблиц итогов, чем рассчитывать все заново по основной таблице. Ответ в этом случае прост - в запросе не установлен отбор по периоду. Чтобы платформа 1С начала использовать таблицы итогов нужно установить фильтр по периоду, как минимум по началу периода.

Например, если в базе установлен период рассчитанных итогов для регистра бухгалтерии с 01.01.2019 по 31.07.2020, то для начала использования итогов начало периода должно быть установлено больше или равным 01.01.2019. Есть нюанс: если поставить дату начала периода меньше даты рассчитанных итогов (но не более чем на 1 месяц), то платформа все равно будет использовать итоги, а для периода до минимальной даты рассчитанных итогов будет сделан запрос к основным таблицам регистра (точнее два запроса - для дебета и для кредита). Вот так стал выглядеть запрос с началом периода.

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

Чтобы пример был более полным, установим параметр "НачалоПериода" как 10.12.2018, т.е. меньше минимальной даты рассчитанных итогов, но не более чем на 1 месяц. Вот такой запрос будет сформирован к базе данных.

 
 Вот и появились итоги

В чем-то этот запрос похож на предыдущий пример, но значительные отличия все же присутствуют:

  • В первую очередь данные за тот период, в котором есть рассчитанные итоги, получаются именно из таблицы итогов. В нашем случаев используются итоги между счетами.
  • Там, где итоги недоступны платформа 1С собирает данные из основных таблиц регистра (период до расчета итогов и после максимальной даты рассчитанных итогов).

Ранее в одной из статей мы говорили о том, почему рассчитывать итоги очень важно. И снова на примере выше было показано, что если итоги не обслуживаются, то запросы к регистру бухгалтерии будут работать менее эффективно. Давайте перейдем к более сложному примеру.

А если добавить субконто

Настало время усложнить пример и добавить в запрос субконто, отбор по счету и измерению "Организация".

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

Намешали сразу почти все, что можно в этой виртуальной таблице, кроме кор. счета и аналитики с ресурсами по нему, т.к. об этом позже. Вот какой запрос, а точнее серию запросов, в этом случае сформирует платформа 1С.

 
 Длинный запрос

Запрос стал больше и сложнее, но на самом деле ничего сверхъестественного тут нет:

  • Сначала платформа подготавливает информацию по счету, который используется в отборах и по виду субконто.
  • Затем начинается основной запрос, в котором:
    • Получаем данные оборотов из таблицы итогов по 2 субконто. Почему именно по этой таблице? Да потому что во всех отборах нашего примера устанавливался счет 51, у которого 2 субконто (банковский счет и статья ДДС). Для получаемых значений также устанавливается фильтр по счету и субконто, а также по организации. Отбор по периоду устанавливается в промежутке от 01.01.2019 (начала периода рассчитанных итогов) до 28.02.2020 включительно.
    • Т.к. изначально отбор ставился с 10.12.2018, то платформа делает дополнительных два запроса (по дебету и кредиту) к основным таблицам регистра в период с 10.12.2018 по 31.12.2018, т.к. получить обороты из таблиц итогов за этот период нельзя.
    • Дополнительно делаются аналогичные два запроса (по дебету и по кредиту) за 01.03.2020, т.к. именно эта дата установлена как конец периода отбора. Т.к. итоги рассчитываются в разрезе месяца, то получить данные оборотов за один день с их помощью не получится. Именно поэтому и был еще раз сгенерирован запрос к основным таблицам регистра.
    • После все полученные данные группируются и возвращаются как результат.

В самом запросе дал исчерпывающие комментарии, внимательно посмотрите на него, чтобы лучше разобраться.

Данные кор. счета

Немного изменим пример, добавив кор. счет с аналитикой и обороты по количеству (т.к. это не балансовый ресурс) по нему.

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

Сгенерированный платформой 1С запрос очень похож на тот, что было в предыдущем примере, но логика получения данных значительно изменилась.

 
 Запрос уже не тот

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

Будьте осторожны с получением данных оборотов по корреспондирующим счетам и их аналитике.

Особая периодичность

В качестве последнего примера рассмотрим тот же запрос, но с небольшой модификацией - установим параметр виртуальной таблицы "Периодичность" в "Неделя" и посмотрим что будет.

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

Сформированный SQL-запрос, который в этот раз я оставлю без комментариев, показывает, что и в этом случае таблицы итогов не были задействованы. Подобное поведение характерно и для регистра накопления, которое мы рассматривали в предыдущей статье. Заключается оно в том, что если периодичность установлена меньше месяца, то итоги никаким образом не помогут в получении данных, ведь они рассчитаны в разрезе месяца.

В примере выше уже была ситуация, когда для получения данных за один день платформа формировала SQL-запросы к основным таблицам регистра. Тут схожая ситуация.

 
 И снова без итогов

Использовать периодичность нужно очень осторожно, т.к. некорректное ее указание может значительно снизить производительность информационной системы.

Производительность запросов

Мы рассмотрели несколько примеров работы виртуальной таблицы "Обороты" регистра бухгалтерии. В контексте производительности напрашиваются такие выводы:

  1. Для максимальной производительности запросов к виртуальной таблице оборотов необходимо использовать итоги регистра. То есть они должны быть рассчитаны и обслуживаться ежемесячно, сдвигая дату рассчитанных итогов. Об этом мы говорили ранее.
  2. Даже если итоги в базе рассчитаны и обслуживаются, необходимо придерживаться некоторых правил написания запросов к таблице оборотов, когда это возможно в контексте поставленной задачи:
    • Периодичность не должна быть меньше месяца, иначе данные будут запрашиваться из основных таблиц регистра и итоги будут игнорироваться.
    • Обязательно нужно указывать период, за который выполняется получение данных оборотов, иначе все данные будут получаться из основных таблиц регистра. Да, если не указать период в таблице оборотов - итоги не будут использоваться. Но Вы же так не делаете, верно?
    • Использование корреспондирующих полей (кор. счет или измерения, а также ресурсы) также приводит к отключению использования итогов. Будьте осторожны.
  3. При работе с оборотами продумайте максимально возможные условия отборов, как минимум по периоду и основным измерениям регистра, счетам и субконто (виду и значениям). Это позволит избежать большинства проблем производительности при использовании этой виртуальной таблицы.
  4. Для максимальной производительности отборы должны быть максимально селективными. Если Вы получаете обороты за пару лет с указанием отбора только по счету, то потенциальный объем получаемых данных может быть очень большой. В этом случае СУБД может проигнорировать индексы, т.к. ей проще эти данные получить сканированием таблиц.

Таким образом, использовать виртуальную таблицу оборотов регистра бухгалтерии можно и нужно, но стоит учитывать ее особенности работы.

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

Следующий раунд

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

Регистры бухгалтерии достаточно сложные и "тяжелые" как с точки зрения хранения данных, так и в части использования в разработке. Именно поэтому нужно использовать их для учетных задач, но никак не для оперативного учета. Представьте что было бы, если бы чеки ККМ формировали проводки при проведении :) Прощай розница! :)))

Все данные для публикации получены с помощью инструментов:

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

До скорых встреч!

Другие ссылки

Авторские разработки

 
 Другие разработки

регистр бухгалтерии внутреннее устройство виртуальная таблица обороты

См. также

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    1851    PROSTO-1C    0    

18

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    1888    Vidz    0    

11

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1162    olja-ljaaa    0    

3

Механизмы типовых конфигураций Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Проблемы при создании ресурсной спецификации. Связь настроек спецификации и настроек структуры заказа в ЕРП 2.5.

06.05.2024    1272    It-digit    1    

2

Механизмы типовых конфигураций Ценообразование, анализ цен Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Россия Абонемент ($m)

Продолжение темы вынесения кусков повторно-используемого кода в запрос. В прошлый раз мы сделали это с вычислением пользовательских формул. Здесь замахнулись на формулы, задаваемые пользователем запросами.

1 стартмани

11.04.2024    1113    tango    5    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artkor 286 28.07.20 13:04 Сейчас в теме
Спасибо за статью! В случае,когда итоги за нужные "года" посчитаны: порядок отбора субконто влияет на исполнение запроса?
Организация = &Организация
			И Субконто1 = &Субконто1

В данном примере когда &ВидСубконто 1-й по счету (контрагенты например) - это хорошо, но если 2-й сверху (Договоры) отбор по индексу уже использоваться не будет и получится скан?
YPermitin; +1 Ответить
3. пользователь 28.07.20 15:42
(1) если посмотреть на индекс таблицы итогов по субконто, то увидим такое:

ОбластьДанныхОсновныеДанные
Счет
Период
Организация
Значение (вид значения)
Значение (тип ссылки)
Значение
Значение (вид значения)
Значение (тип ссылки)
Значение
Валюта
Подразделение
Разделитель


Значение 1 - это первое субконто
Значение 2 - второе субконто

Ну и, соответственно, чтобы индекс эффективно использовался необходимо накладывать отбор на первое субконто и на второе. Если установить фильтр только по 2, то индекс будет использоваться только по первым полям:

ОбластьДанныхОсновныеДанные
Счет
Период
Организация

Если такой фильтр селективный (например, если пирод небольшой), то все ОК. Если же данных много, то будет скан индекса.

Это в общих чертах.

То есть да, отбор по 1 субконто может быть важным для использования индекса.
2. Yashazz 4794 28.07.20 14:10 Сейчас в теме
Вот хорошие статьи, ну зачем их замусоривать всякими дурацкими картинками да шутками-прибаутками? Ну ладно, модераторам теперь похрен, хотя раньше за такое элементарно не пропускали публикацию, но зачем в принципе? Что это за клоунада в серьёзном вопросе?..
timeforlive; YPermitin; +2 3 Ответить
4. пользователь 28.07.20 15:42
(2) я же не книгу пишу :)

Не могу серьезно все описывать. Да и это будет как сухая инструкция.
Понимаю, не всем такой стиль нравится. Но всем угодить нельзя.
Merkalov; LeXXeR; Summer_13; Cерый; Dovbenko_V_A; +5 Ответить
5. improg 711 30.07.20 10:44 Сейчас в теме
(0) Спасибо за статью, есть вопрос по поводу инструмента "Транслятор запросов 1С в SQL" в чем его преимущество над типовой консолью запросов с ИТС? На мой взгляд тоже самое .
Прикрепленные файлы:
7. пользователь 30.07.20 10:55
(6) Тем, что это не консоль запросов :))))

Это инструмент, который позволят средствами SQL Server отловить выполняемые запросы к базе как из запросов 1С, так и произвольного алгоритма 1С. Все сделано с помощью Extended Events. Может использовать на высоконагруженном окружении без риска все уронить.

Консоль собирает все через ТЖ со всеми вытекающими и только для запросов. То есть что делает платформа выполняя конкретный программный код не узнать.

Странный вопрос если честно, вообще не связанные по назначению инструменты.
8. improg 711 30.07.20 11:00 Сейчас в теме
(7) ну почему же не связанные и тот и другой дают одинаковый результат, я как понял ваш меньше влияет на производительность?
9. пользователь 30.07.20 11:12
(8) транслятор отлавливает все запросы, которые генерирует платформа 1С (служебные и обычные) и делает это как для запросов на языке 1С, так и для кода встроенного языка. И да, с минимальным влиянием на производительность.

В консоли вы можете получить только план выполнения конкретного запроса на языке 1С. ТЖ при это может создать некоторые проблемы.

Разные инструменты, разные задачи. Не надо путать)
10. improg 711 30.07.20 14:08 Сейчас в теме
11. Walker.pro 8 10.10.22 12:05 Сейчас в теме
Какая практическая польза от того, что мы видим сформированные SQL-запросы? Как разработчик может это использовать на практике?
Оставьте свое сообщение