Виртуальные таблицы регистра накопления в 1С 8.3

Выборка из регистра накопления

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

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

Если измерение Товар не проиндексировано, то будет выброшено исключение «Недопустимое значение параметра (параметр номер ‘3’)».

Если нужно выбрать записи только одного регистратора, то можно воспользоваться методом ВыбратьПоРегистратору, передав параметром ссылку на нужный документ:

Чаще всего для выборки используется запрос к таблице движений регистра:

Виртуальные таблицы регистра накопления

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

  • Остатки
  • Обороты
  • ОстаткиИОбороты

Все их можно увидеть через конструктор запроса:

Виртуальные таблицы регистра накопления

При этом у регистра накопления с видом Остатки есть все три виртуальные таблицы, а у регистра накопления с видом Обороты только одна, так как у оборотного регистра нет остатков.

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

Виртуальная таблица остатков

Алгоритм построения таблицы остатков

Виртуальная таблица остатков содержит в себе все измерения и остатки по всем ресурсам:

Виртуальная таблица остатков

Также для таблицы остатков можно указать параметры:

  • Период — остатки будут получены на эту дату.
  • Условие — фильтрация по измерениям регистра накопления. Можно объединять несколько условий, можно использовать реквизиты измерений.

В запросе параметры указываются в скобках после имени таблицы:

Алгоритм построения таблицы остатков:

  1. Определяется момент времени, который больше или равен параметру период и на который в таблице итогов есть рассчитанные остатки.
  2. Из таблицы итогов получаются остатки на этот момент времени.
  3. Если параметр период не равен моменту времени, полученному на первом шаге, то из таблицы движений получаются записи, находящиеся между параметром период и полученным моментом времени из первого шага. При этом для движений с типом Приход знак меняется на минус, а для движений с типом Расход знак меняется на плюс. Полученные записи таблицы движений объединяются с таблицей итогов из второго шага.
  4. Полученная таблица группируется по полям, которые были выбраны в запросе. Из таблицы удаляются те записи, где остаток по всем ресурсам равен нулю.

Например, таблица движений имеет следующий вид:

РегистраторВид движенияПериодСкладТоварКоличество
Приход №1Приход01.01.2021 09:00:00ОсновнойСтол10
Приход №1Приход01.01.2021 09:00:00ОсновнойШкаф1
Приход №2Приход10.01.2021 11:00:00РозничныйШкаф1
Приход №3Приход31.01.2021 23:59:59ОсновнойСтол7
Приход №4Приход31.01.2021 23:59:59ОсновнойСтол3
Приход №5Приход05.02.2021 12:30:00ОсновнойШкаф5
Расход №1Расход10.02.2021 10:00:00ОсновнойСтол2
Расход №2Расход15.02.2021 10:00:00ОсновнойШкаф7
Расход №3Расход20.02.2021 10:00:00ОсновнойСтол1
Приход №6Приход25.02.2021 10:00:00ОсновнойСтол1

Итоги рассчитаны за все периоды, соответственно таблица итогов выглядит так:

ПериодСкладТоварКоличество
01.02.2021ОсновнойСтол20
01.02.2021ОсновнойШкаф1
01.02.2021РозничныйШкаф1
01.03.2021ОсновнойСтол18
01.03.2021ОсновнойШкаф-1
01.03.2021РозничныйШкаф1
01.11.3999ОсновнойСтол18
01.11.3999ОсновнойШкаф-1
01.11.3999РозничныйШкаф1

Получим остатки на 1 февраля (параметр Период = 01.02.2021):

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

Теперь выполним тот же самый запрос, но параметр период установим равным 12.02.2021.

  1. На 12.02.2021 в таблице итогов нет остатков, ближайшая большая дата = 01.03.2021.
  1. Получаем остатки на 01.03.2021 из таблицы итогов
ПериодСкладТоварКоличество
01.03.2021ОсновнойСтол18
01.03.2021ОсновнойШкаф-1
01.03.2021РозничныйШкаф1
  1. Параметр Период и момент времени из первого шага не совпадают, поэтому дополнительно выбираются записи из таблицы движений в промежутке между 12.02.2021 и 01.03.2021. Расходные движения со знаком плюс, приходные со знаком минус. Полученная таблица будет объединена с таблицей остатков из второго шага:
ПериодСкладТоварКоличество
15.02.2021 10:00:00ОсновнойШкаф7
20.02.2021 10:00:00ОсновнойСтол1
25.02.2021 10:00:00ОсновнойСтол-1
  1. Так как в запросе выбрано только поле Товар, поэтому отбрасываются все лишние поля и выполняется группировка по полю Товар. Итоговый результат:
ТоварКоличество
Стол18
Шкаф7

Теперь вообще не будем указывать параметр Период в запросе:

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

ПериодСкладТоварКоличество
01.11.3999ОсновнойСтол18
01.11.3999ОсновнойШкаф-1
01.11.3999РозничныйШкаф1

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

ТоварКоличество
Стол18

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

Если бы в нашем примере не было рассчитанных остатков за февраль 2021, то при получении остатков на втором шаге на 12.02.2021 были бы получены текущие итоги на 01.11.3999. Если нет текущих итогов (отключены для регистра), то был бы взят остаток на 01.02.2021, а на третьем шаге при получении записей из таблицы движений для прихода бы использовался знак плюс, для расхода — минус.

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

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

Граница

В качестве параметра Период можно передать:

  • дату
  • момент времени
  • границу
  • пустую дату, Неопределено или вообще не заполнять параметр

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

Если передать дату, то будут получены остатки с учетом времени, но без учета движений за эту дату. То есть если параметром указать дату 31.01.2021 23:59:59, то будут получены следующие остатки:

СкладТоварКоличество
ОсновнойСтол10
ОсновнойШкаф1
РозничныйШкаф1

Если параметром передать момент времени, то будут получены остатки на указанный момент времени, но исключая движения ссылки из момента времени. Например, если передавать параметром момент времени 31.01.2021 23:59:59 + Приход №4, то остатки будут выглядеть так:

СкладТоварКоличество
ОсновнойСтол17
ОсновнойШкаф1
РозничныйШкаф1

Если нужно получить остатки с учетом движений ссылки, то нужно передать параметром границу. Граница — это программный объект, который включает в себя дату и вид границы: включать граничное значение в интервал или нет:

Полученная таблица остатков:

СкладТоварКоличество
ОсновнойСтол20
ОсновнойШкаф1
РозничныйШкаф1

Также можно создавать границу из даты:

Метод Остатки

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

Виртуальная таблица оборотов

Поля и параметры таблицы оборотов

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

Виртуальная таблица оборотов

Таблица оборотов для регистра вида Остатки дополнительно содержит оборот только для записей с видом накопления Приход и оборот только для записей с видом накопления Расход:

Виртуальная таблица оборотов

У таблицы оборотов есть четыре параметра:

  • Начало периода
  • Конец периода
  • Периодичность
  • Условие

Условие — то же самое, что и для таблицы остатков. По измерениям и реквизитам измерений.

Начало и конец периода ограничивают выборку оборотов. Если они не указаны, то берутся все обороты. Если указаны, то только обороты за этот период.

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

  • Период
  • Запись
  • Регистратор
  • Секунда
  • Минута
  • Час
  • День
  • Неделя
  • Декада
  • Месяц
  • Квартал
  • Полугодие
  • Год
  • Авто

Если выбрать Период — то дополнительного разреза по периоду не будет. Данная периодичность используется по умолчанию, если параметр не заполнен.

Если выбрать Авто, то станут доступны дополнительные поля-периоды:

Периодичность таблицы оборотов

Можно выбрать сразу несколько полей периодов в запросе. Каждое поле содержит начальное значение периода. Например Период записи = 24.02.2021 10:30:00, тогда

  • ПериодЧас = 24.02.2021 10:30:00
  • ПериодДень = 24.02.2021 00:00:00
  • ПериодМесяц = 01.02.2021 00:00:00
  • и т.д.

Любое другое значение параметра добавляет в виртуальную таблицу поле Период, которое равно начальному значению выбранного параметра. Однако если выбрать значение параметра Регистратор, то будет добавлено и поле Период и поле Регистратор. А если выбрать параметр = Запись, то будет три поля: Период, Регистратор, НомерСтроки. Так происходит, потому что Регистратор и НомерСтроки являются уточнением периода. Даже если в запросе выбрать только поля Регистратор или НомерСтроки, в запросе для формирования виртуальной таблицы будет присутствовать поле Период.

В запросе параметры указываются в скобках после имени таблицы:

Алгоритм построения таблицы оборотов для оборотного регистра накопления:

  1. Получение необходимых данных:
  • Если в период входит только целое количество месяцев, то используется только таблица итогов.
  • Если отбор по периоду не указан, то тоже используется только таблица итогов.
  • Если в периоде есть как целые месяцы, так и не целые, то для целых месяцев используется таблица итогов, для не целых — таблица движений.
  • Если в периоде нет целых месяцев, то используется только таблица движений.
  • Если параметр Периодичность не равен Месяц, то используется только таблица движений.
  1. Группировка полученных записей по выбранным полям таблицы и параметра Периодичность.

Например, в таблице движений есть следующие записи:

ПериодРегистраторКонтрагентСумма
01.02.2021Расход №1ИП Иванов500
02.05.2021Расход №2ИП Петров700
10.06.2021Расход №3ИП Петров1000
15.06.2021Расход №4ИП Иванов2000
25.06.2021Расход №5ИП Иванов2000
20.09.2021Расход №6ИП Иванов5000

Тогда таблица итогов выглядит так:

ПериодКонтрагентСумма
01.02.2021ИП Иванов500
01.05.2021ИП Петров700
01.06.2021ИП Петров1000
01.06.2021ИП Иванов4000
01.09.2021ИП Иванов5000

Если выполнить следующий запрос:

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

КонтрагентСумма
ИП Иванов9500
ИП Петров1700

Если выполнить такой запрос, передав параметрами:

  • НачалоПериода = 01.05.21
  • КонецПериода = 30.06.21

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

ПериодКонтрагентСумма
01.05.2021ИП Петров700
01.06.2021ИП Иванов4000
01.06.2021ИП Петров1000

Если поменять параметры на:

  • НачалоПериода = 01.05.21,
  • КонецПериода = 20.06.21

То данные за май будут получены из таблицы итогов, а данные за июнь из таблицы движений:

ПериодКонтрагентСумма
01.05.2021ИП Петров700
01.06.2021ИП Иванов2000
01.06.2021ИП Петров1000

Если поменять периодичность на День:

То все данные будут получены только из таблицы движений, при этом в колонке Период будет не начало месяца, а начало дня:

ПериодКонтрагентСумма
02.05.2021ИП Петров700
15.06.2021ИП Иванов2000
10.06.2021ИП Петров1000

Если поставить Периодичность = Авто, то можно выбрать как ПериодМесяц, так и ПериодДень:

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

ПериодМесяцПериодДеньКонтрагентСумма
01.05.202102.05.2021ИП Петров700
01.06.202115.06.2021ИП Иванов2000
01.06.202110.06.2021ИП Петров1000

Алгоритм построения таблицы оборотов для остаточного регистра накопления:

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

Также в таблице оборотов для каждого ресурса присутствует три поля: Оборот, Приход и Расход. Приход — это сумма всех записей с типом приход. Расход — сумма всех записей с типом расход. Оборот = Приход — Расход.

Например, есть таблица движений регистра:

РегистраторВид движенияПериодСкладТоварКоличество
Приход №1Приход01.01.2021 09:00:00ОсновнойСтол10
Приход №1Приход01.01.2021 09:00:00ОсновнойШкаф1
Приход №2Приход10.01.2021 11:00:00РозничныйШкаф1
Приход №3Приход31.01.2021 23:59:59ОсновнойСтол7
Приход №4Приход31.01.2021 23:59:59ОсновнойСтол3
Приход №5Приход05.02.2021 12:30:00ОсновнойШкаф5
Расход №1Расход10.02.2021 10:00:00ОсновнойСтол2
Расход №2Расход15.02.2021 10:00:00ОсновнойШкаф7
Расход №3Расход20.02.2021 10:00:00ОсновнойСтол1
Приход №6Приход25.02.2021 10:00:00ОсновнойСтол1

Если выполнить следующий запрос с параметрами:

  • НачалоПериода = 01.02.2021
  • КонецПериода = 28.02.2021

То будет получена следующая таблица:

ТоварКоличествоОборотКоличествоПриходКоличествоРасход
Шкаф-257
Стол-213

Параметры НачалоПериода и КонецПериода

Если не заполнять параметры НачалоПериода и КонецПериода или передать туда пустую дату или Неопределено, то будут получены все обороты из регистра.

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

Если передать параметром Момент времени, то будут получены движения с учетом переданной ссылки, включая движения самой ссылки.

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

Метод Обороты

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

Виртуальная таблица остатков и оборотов

Состав полей и параметры

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

  • Начальный остаток
  • Конечный остаток
  • Оборот
  • Приход
  • Расход
Виртуальная таблица остатков и оборотов

Параметры таблицы остатки и обороты:

  • Начало периода
  • Конец периода
  • Периодичность
  • Метод дополнения
  • Условие

Параметры Начало периода, Конец периода, Периодичность и Условие совпадают с аналогичными параметрами для виртуальной таблицы оборотов. А также параметр Начало периода совпадает с параметром Период для виртуальной таблицы остатков.

Можно сказать, что таблица Остатки и обороты это соединение таблицы Остатки и таблицы Обороты.

Алгоритм построения таблицы остатков и оборотов

  1. Получение остатков на начало периода (аналогично таблице остатков).
  2. Получение оборотов с учетом периодичности (аналогично таблице оборотов для регистра накопления остатков).
  3. Объединение полученных таблиц с учетом параметра Метод дополнения (будет рассмотрен позже).
  4. Расчет конечного остатка, как Начальный остаток + Оборот.

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

Например, есть следующая таблица движений регистра накопления:

РегистраторВид движенияПериодСкладТоварКоличество
Приход №1Приход01.01.2021 09:00:00ОсновнойСтол10
Приход №1Приход01.01.2021 09:00:00ОсновнойШкаф1
Приход №2Приход10.01.2021 11:00:00РозничныйШкаф1
Приход №3Приход31.01.2021 23:59:59ОсновнойСтол7
Приход №4Приход31.01.2021 23:59:59ОсновнойСтол3
Приход №5Приход05.02.2021 12:30:00ОсновнойШкаф5
Расход №1Расход10.02.2021 10:00:00ОсновнойСтол2
Расход №2Расход15.02.2021 10:00:00ОсновнойШкаф7
Расход №3Расход20.02.2021 10:00:00ОсновнойСтол1
Приход №6Приход25.02.2021 10:00:00ОсновнойСтол1

Выполним следующий запрос:

  1. Так как не указан параметр Начало периода, то начальный остаток равен нулю
  2. Из таблицы движений было получены обороты за весь период (напомню, у регистра накопления вида Остатки нет таблицы итогов, где хранятся обороты)
  3. Полученные таблицы были объединены и сгруппированы по измерению Товар
  4. Конечный остаток был рассчитан как Начальный остаток + Оборот

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

ТоварНачОстПриходРасходОборотКонОст
Шкаф07700
Стол02131818

Теперь укажем параметры:

  • НачалоПериода = 01.02.2021
  • КонецПериода = 11.02.2021

  1. На 1 февраля из таблицы итогов был получен начальный остаток.
  2. Из таблицы движений были получены обороты за период с 01.02.2021 по 11.02.2021
  3. Обе таблицы были объединены и сгруппированы
  4. Был рассчитан конечный остаток

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

ТоварНачОстПриходРасходОборотКонОст
Шкаф25057
Стол2002-218

Метод дополнения

Укажем в параметрах Периодичность = День и добавим в запрос поле Период:

ПериодТоварНачОстПриходРасходОборотКонОст
01.02.2021Шкаф20007
05.02.2021Шкаф25057
11.02.2021Шкаф70007
01.02.2021Стол2000020
10.02.2021Стол2002-218
11.02.2021Стол1800018

2 и 4 строки — это те же самые строки, что и в предыдущем запросе, это те строки, когда были движения по регистру.

1 и 3 строки — это остатки по шкафу на начало периода (на 01.02.2021) и на конец периода (на 11.02.2021). 4 и 6 строки — то же самое, только для стола. Эти строки попали в результат запроса, потому что по умолчанию параметр Метод дополнения равен ДвиженияИГраницыПериода. Это значит, что помимо строк с движениями за период, также будут строки с остатками на начало и конец периода. Даже если по какому-то товару не было движений за этот период, но есть остатки.

Если указать параметр Метод дополнения = Движения:

То строк с граничными остатками не будет:

ПериодТоварНачОстПриходРасходОборотКонОст
05.02.2021Шкаф25057
10.02.2021Стол2002-218

Расчет итогов для полей остатков

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

Расчет итогов для полей остатков

Если для таблицы указать Периодичность = День и для наглядности добавить поле Период в запрос, то Оборот, Приход и Расход также будут просуммированы. А для начального и конечного остатка будет применен другой алгоритм:

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

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

Если в запросе выбрать только одно поле с остатком, то в запросе, который будет сформирован для СУБД все равно будут оба поля остатков.

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

Расчет итогов для полей остатков

Параметры НачалоПериода и КонецПериода

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

  • НачалоПериода = 31.01.2021 23:59:59
  • КонецПериода = 31.01.2021 23:59:59

И выполним такой запрос:

Параметры НачалоПериода и КонецПериода

На примере стола видно, что начальный остаток был получен без учета движений за 31.01.2021 23:59:59. А конечный остаток с учетом этих движений.

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

Активность

У регистра накопления есть поле Активность, тип булево. По умолчанию данное поле равно Истина. Активность определяет будет ли запись использоваться для формирования виртуальных таблиц.

Активность можно изменить только программно с помощью метода УстановитьАктивность:

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

Если в метод УстановитьАктивность передать параметром Истина, то активность снова будет включена:

Активность можно изменить только у всего набора записей одного регистратора. Если при записи в наборе не будет совпадать активность, то будет выброшено исключение «Запись не верна! Не совпадает активность записей».


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Здесь может быть Ваша реклама
Понравилась статья? Поделиться с друзьями:
Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok