Регистры бухгалтерии. Еще одна таблица оборотов ДТ / КТ

22.08.20

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

Виртуальная таблица оборотов ДТ / КТ регистра бухгалтерии. Особенности и применение.

Введение

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

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

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

  • Анализ состояния налогового учета по налогу на прибыль
  • Анализ состояния налогового учета по УСН
  • Валовая прибыль
  • Регистры БУ субъектов малого предпринимательства
  • И некоторые другие.

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

Первый взгляд

Начнем со сравнения таблиц "Обороты" и "ОборотыДтКт". Если смотреть на доступные поля и параметры, то можно выделить следующие различия:

  • В таблице "Обороты" доступны поля оборотов по ДТ и КТ для балансовых ресурсов. Для типового регистра это ресурс "Сумма". Если в таблице оборотов доступны как общая сумма оборотов, так и по ДТ и КТ, то для таблицы "ОборотыДтКт" доступен только общее поле "СуммаОборот".
  • Для небалансовых ресурсов отличие заключается в том, что в таблице "Обороты" для них кроме оборотов по ДТ и КТ присутствует общий оборот. В таблице "ОборотДтКт" общего оборота нет.

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

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

Проще показать на примере. Допустим, у нас есть вот такой запрос.

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

Сделав отбор, например, по счету 10.11.1 за 2019 год мы получили такой результат:

СчетДт КоличествоОборотДт СчетКт КоличествоОборотКт СуммаОборот
10.11.1 1 000 10.10 1 000 1 000 000

То есть количественный оборот как по ДТ, так и по КТ равен 1000. Оборот по сумме равен 1000000. Далее сделаем примерно такой же запрос, но к таблице "Обороты" с теми же значениями отборов:

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

Вот такой результат мы получили:

Счет СуммаОборотДт КоличествоОборотДт КорСчет СуммаОборотКт КоличествоОборотКт СуммаОборот КоличествоОборот
10.11.1 1 000 000 1000 10.10 200 000 50 800 000 9950
10.11.1     20.01 10 000 2000 -10 000 -2000
10.11.1     26 4 000 25 -4 000 -25
10.11.1     44.01 20 000 50 -20 000 -50

Мы получили обороты с другими корреспондирующими счетами (44.01, 26, 20.01), но сейчас они нас не интересуют. Просто знаем, что таблица "Обороты" позволила их получить. А вот таблица "ОборотыДтКт" их не показала. Почему? Да потому что в проводках эти счета находятся на стороне ДТ, а мы явно указали отбор по ДТ и они в этот отбор не входят. Таблица же оборотов не учитывает явную сторону проводки, а лишь собирает данные по указанному счету как с дебетовой стороны, так и с кредитовой и группирует показатели в общий результат.

Посмотрите на все сделанные корреспонденции счетов за тот же период с участием счета 10.11.1. На стороне дебета он есть только для проводки "ДТ 10.11.1 - КТ 10.10". Именно поэтому только обороты по этой корреспонденции счетов попали в результат, когда отбор по ДТ = "10.11.1" для таблицы "ОборотыДтКт".

  СчетДт   СчетКт
44.01 10.11.1
26 10.11.1
10.11.1 10.10
10.10 10.11.1
20.01 10.11.1

Это важное отличие таблицы "ОборотыДтКт" от обычной таблицы оборотов: мы можем явно указать сторону счета (или другой произвольной аналитики) в проводке для фильтра и оперировать результатами запроса к этой виртуальной таблице точно зная где образовался нужный показатель - по дебету или кредиту.

Если же мы сделаем в обычной таблице оборотов отбор по счету "10.10" (с которым корреспондировал 10.11.1) и оставим результат только для корреспонденции этих двух счетов, то увидим следующее:

Счет СуммаОборотДт КоличествоОборотДт КорСчет СуммаОборотКт КоличествоОборотКт СуммаОборот КоличествоОборот
10.10 200 000 50 10.11.1 1 000 000 1000 -800 000 -950

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

Таким образом, для получения оборотов по счету самым эффективным способом является использование виртуальной таблицы "Обороты" без получения данных по кор. счету (об этом мы говорили в предыдущей статье). Если получать корр. аналитику через эту таблицу, то не будут использоваться итоги и запрос может быть тяжелее, чем ожидается. Без корр. аналитики платформа 1С попытается максимально использовать данные таблиц итогов.

Таблица же "ОборотыДтКт" подходит для более специфичных задач, когда необходимо получать обороты с конкретными фильтрами по счету, аналитике или ресурсам с указанием явной стороны проводки - ДТ или КТ. Таблица является самой тяжелой среди всех виртуальных таблиц регистра бухгалтерии, т.к. она никогда не использует рассчитанные итоги, но об этом мы еще поговорим далее. Поэтому если есть возможность использовать обычную таблицу оборотов - делайте именно так. Если нет, то с осторожностью и рациональным подходом, используйте таблицу оборотов ДТ / КТ.

Есть, конечно, еще виртуальные таблицы "Остатки" и "ОстаткиИОбороты", но о них речь пойдет в будущих публикациях. Сейчас лишь отмечу, что в некоторых случаях можно использовать и эти таблицы вместо оборотов по ДТ / КТ, но этот случай выходит за рамки публикации.

Спускаемся глубже

Настало время рассмотреть какие запросы формирует платформа 1С при работе с виртуальной таблицей оборотов ДТ / КТ.

Простой запрос

Начнем с простого примера - получим обороты для счетов со стороны дебета по сумме и количеству. Чисто для эксперимента не будем указывать никаких параметров виртуальной таблицы или других условий.

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

Один небольшой запрос на языке запросов 1С, но большой SQL-запрос на стороне базы данных (на самом деле еще не очень большой).

SELECT
    T1.AccountDtRRef, -- СчетДт
    T1.Fld790Turnover_, -- СуммаОборотДт
    T1.Fld792TurnoverDt_ -- КоличествоОборотДт
FROM (
    SELECT
        T2._AccountDtRRef AS AccountDtRRef, -- СчетДт
        CAST(SUM(T2._Fld790) AS NUMERIC(21, 2)) AS Fld790Turnover_, -- Сумма
        CAST(SUM(T2._Fld792Dt) AS NUMERIC(21, 3)) AS Fld792TurnoverDt_ -- КоличествоДт
    FROM dbo._AccRg786 T2 -- РегистрБухгалтерии.Хозрасчетный.Основная
    WHERE ((T2._Fld774 = @P1)) -- Разделитель данных
        AND (T2._Active) = 0x01 -- Активность
    GROUP BY T2._AccountDtRRef -- Счет
    -- Хотя бы один из ресурсов должен быть НЕ равен 0
    HAVING (CAST(SUM(T2._Fld790) AS NUMERIC(21, 2))) <> 0.0 
        OR (CAST(SUM(T2._Fld792Dt) AS NUMERIC(21, 3))) <> 0.0
    ) T1

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

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

Добавим немного параметров

Совсем немного изменим запрос, добавив отбор по периоду, счету ДТ и виду субконто. Для порядка еще и по организации сделаем отбор.

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

И снова один маленький запрос на языке запросов 1С, и уже несколько SQL-запросов на стороне базы данных.

 
 Запрос на получение информации о счете в параметре виртуальной таблицы
 
 Большой запрос на получение данных из регистра

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

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

Все это дополняется условиями на основную таблицу по счету ДТ, организации и также периоду. Ну и конечно же присутствуют отборы по разделителям данных, куда уж без них :)

На финальном этапе результат группируется по измерениям регистра и субконто, а после отсекаются записи без заполненной аналитики по ресурсам.

Получим все

Рассмотрим кратко еще один пример. Тот же самый запрос, но уже добавлены условия по стороне кредита: счет КТ, вид субконто:

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

Как уже упоминалось ранее, в этом случае платформа сгенерирует два запроса для получения информации по счетам: один для ДТ, другой для КТ.

 
 Получение информации по счетам

Когда настройки счетов получены начинается самое интересное - длинный запрос получения данных.

 
 Еще один длинный запрос

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

Немного о производительности

Ранее уже упоминалось, что таблица оборотов по ДТ / КТ является одной из самых тяжелых среди всех виртуальных таблиц регистра бухгалтерии. Основная причина - то что эта таблица не использует итоги и всегда получает данные из основных таблиц регистра (основной таблицы и значений субконто).

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

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

 
 Используемые штатные индексы

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

 
 План запроса для получения данных из основной таблицы регистра

Сначала выполняется получение записей с отбором по счету ДТ (индекс _AccRg786_3) и счету КТ (индекс _AccRg786_4) отдельными операциями. Результаты объединяются через вложенные циклы. Далее результат фильтруется по периоду (индекс _AccRg786_1).

Но и это еще не все. После выполняется получение данных в таблице значений субконто.

 
 План запроса получения данных значений субконто

 
 Используемые штатные индексы

Так как таблица значений субконто соединяется дважды, то СУБД дважды выполняет операцию получения записей. Что логично :) Используется для этого индекс по периоду, который позволяет максимально эффективно присоединить к основной таблице записи по периоду, регистратору, виду субконто и виду корреспонденции. Эффективность этой части запроса будет зависеть от того на сколько эффективно отработало получение данных из основной таблицы до этого. Если отбор по основной таблице вернул большой объем данных, то высока вероятность, что СУБД проигнорирует индексы и ей будет проще получить значения субконто простым сканированием таблиц.

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

Конечно, план запроса не всегда будет таким и все зависит от объема данных, состояния индексов и статистик и, разумеется, СУБД. Но смысл, думаю, должен быть понятен.

Идем дальше

Регистр бухгалтерии - не простой как в реализации, так и в использовании. Не зря в типовых конфигурациях развивается идея делать отложенное проведение по нему, чтобы не увеличивать нагрузку при оперативной работе. Но выхода нет. Какие задачи - такой и регистр!

Платформа 1С - это место компромиссов и регистр бухгалтерии - один из них.

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

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

Всем хорошего дня!

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

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

 
 Другие разработки (8 штук, бесплатные и за $m)

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

См. также

Ценовая власть. Выносим из цикла схему СКД

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

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

1 стартмани

11.04.2024    499    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

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

Какому-либо элементу списка сопоставляется числовое значение, зависящее от других значений, причем эта зависимость изменяется от элемента к элементу. Так, в справочнике "Валюты" курс какой-либо валюты может быть задан формулой (или даже запросом) от значения другой валюты. А в справочнике "Виды цен" формула определяет расчет цены для товарной позиции, т.е. элементов справочника "Номенклатура", у которых в карточке указан этот вид цены. А в 1С:ERP, например, этот механизм используется в ресурсной спецификации.

10 стартмани

11.04.2024    385    tango    5    

3

Ценовая власть. Второй сезон

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

В первом сезоне мы рассмотрели (с точки зрения программиста) внутренний механизм, помещающий цены в регистр "Цены". Из этого регистра цена попадает в исходящие УПД (в продажи). Но эта цена (в прайс-листе) дифференцирована (ценообразована) в разрезах свойств самой номенклатуры. Но стратегия ценообразования, ценовая власть - это в первую очередь о работе с ценами для клиента. И тут вступает в дело второй акт марлезонского, Скидки (наценки) и кешбек.

08.04.2024    638    tango    0    

2

Ценовая власть (УТ 11.5) - 2

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

В прошлый раз специальной обработкой мы выбрали объекты УТ 1.5, группируя по подсистемам. Оказалось, что состав подсистем не вполне корректно отображает функциональную структуру, но зато мы нашли процедуру, которая, вроде бы, должна содержать в себе всё, что нас интересует. Обновление цен должно ведь следовать выбранной стратегии ценообразования, верно? Иначе что она обновляет...

06.04.2024    446    tango    1    

1

Ценовая власть или Управление ценообразованием (УТ 11.5)

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

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    534    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

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

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2607    YA_418728146    11    

43

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1150    8    2ncom    6    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

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

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4972    mrXoxot    11    

100
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sergvagner2018 13.08.20 22:45 Сейчас в теме
(0) продолжаю читать. Материал интересный.

Спасибо!
YPermitin; +1
Оставьте свое сообщение