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

Какой запрос строится не sql когда мы обращаемся к таблице остатков

  • автор:

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

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

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

Регистр накопления оборотов

Для наглядности откроем конструктор запросов и посмотрим какие таблицы доступны для регистра ТоварыОбороты. Это таблица самого регистра — ТоварыОбороты, которая существует физически в базе данных, и одна виртуальная таблица — ТоварыОбороты.Обороты

Со стандартной таблицей все понятно. Рассмотрим подробнее виртуальную.

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

Эта таблица позволяет получать оброты ресурсов в разрезе измерений. В нашем случае у нас два измерения: Склад и Товар. И один ресурс — Количество
Пусть в нашем регистре есть следующие записи

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

Соответственно запрос будет выглядеть следующим образом:

Результат выполнения запроса выглядить вот так:

Склад Товар КоличествоОборот
Центральный Ручка 3
Офис Ручка 7
Центральный Карандаш 21
Офис Карандаш 4

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

и в результате у нас останется только две строки

Товар КоличествоОборот
Ручка 10
Карандаш 25

Но как правило за все время существования регистра обороты получать не требуется. В основном они нужны за какой-то конкретный период: месяц, квартал, год и т.д. Плюс еще обычно нужны отборы по измерениям (Товар, Склад). Это достигается использованием параметров виртуальной таблицы. Заполнять параметры удобно из конструктора. По кнопке Параметры виртуальной таблицы открывается диалоговое окно в котором можно прописать все что нам нужно:

После этого наш исходный запрос примет следующий вид

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

Делать так категорически нельзя. Это отрицательно скажется на производительности и на вашей оценке при сдаче экзамена 1С:Специалист.

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

После этого наблюдаем, что в полях таблицы появилось поле Период.

Добавив и его в выбранные поля, получим вот такой текст запроса:

Период Склад Товар КоличествоОборот
01.06.2017 0:00:00 Центральный Ручка 3
01.06.2017 0:00:00 Центральный Карандаш -5
01.06.2017 0:00:00 Офис Карандаш 4
01.05.2017 0:00:00 Офис Ручка 7
01.05.2017 0:00:00 Центральный Карандаш 26

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

Регистр накопления остатков

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

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

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

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

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

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

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

Рассмотрим небольшой пример. Имеем следующие записи регистра:

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

А после его выполнения получим вот такой результат

Склад Товар КоличествоОстаток
Центральный Ручка 3
Центральный Карандаш 21
Офис Ручка 7
Офис Карандаш 4

Виртуальная таблица ОстаткиИОбороты

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

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

Виртуальные таблицы 1с.

Виртуальные таблицы 1с используются в запросах.

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

Виртуальные таблицы 1с

Таблицы регистров 1с

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

Рассмотрим основные виды виртуальных таблиц для различных регистров 1с:

  • СрезПоследних. Метаданные: периодические регистры сведений. Безусловно, данная таблица позволяет получить последние актуальные данные на указанную дату, такие данные называются срезом последних. Возможно получить срез как в целом по регистру, так и по одному, либо нескольким измерениям;
  • СрезПервых. Метаданные: периодические регистры сведений. Бесспорно, данная таблицы позволяет получить первые актуальные данные появившееся в регистре в указанную дату, либо после нее, такие данные называются срезом первых. Возможно получить срез как в целом по регистру, так и по одному, либо нескольким измерениям;

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

  • Остатки. Метаданные: регистры бухгалтерии, регистры накопления с видом регистра остатки. Безусловно, данная таблица позволяет получить остатки по ресурсам регистра на указанную дату. Возможно получать остатки как в целом по регистру, так и в разрезе определенных измерений, для регистров бухгалтерии в измерения также включаются счет и субконто относящиеся к данному счету;
  • Обороты. Метаданные: регистры бухгалтерии, регистры накопления. Бесспорно, данная таблица позволяет получить обороты по ресурсам регистра за указанный период. Возможно получать обороты как в целом по регистру, так и в разрезе определенных измерений, для регистров бухгалтерии в измерения также включаются счет, субконто, кор. счет, кор. субконто;
  • ОстаткиИОбороты. Метаданные: регистры бухгалтерии, регистры накопления с видом регистра остатки. Несомненно, данная таблица позволяет получать остатки по ресурсам на начало и конец указанного периода и обороты по ресурсам за указанный период. Возможно получать остатки и обороты как в целом по регистру, так и в разрезе определенных измерений, для регистров бухгалтерии в измерения также включаются счет и субконто относящиеся к данному счету;
  • ОборотыДтКт. Метаданные: регистры бухгалтерии. Впрочем, данная таблица позволяет получить обороты по ресурсам регистра за указанный период. Возможно получать обороты как в целом по регистру, так и в разрезе определенных измерений, в измерения также включаются дебетовая и кредитовая части проводки: счет дебета, счет кредита, субконто дебета, субконто кредита и т.д.;
  • ДвиженияССубконто. Метаданные: регистры бухгалтерии. Бесспорно, данная таблица позволяет получить записи регистра бухгалтерии вместе со значениями субконто.

Конструктор запросов 1с позволяет работать с виртуальными таблицами регистров. Для проверки текста запроса можно применять консоль запросов. Если у регистра есть виртуальные таблицы, то они будут находится в разделе База данных на вкладке Таблицы и поля после основной таблицы регистра.

Виртуальные таблицы 1с

Конструктор запросов 1с

Виртуальные таблицы регистров сведений 1с

Регистры сведений 1с могут иметь только две виртуальные таблицы:

СрезПервых

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

СрезПоследних

Данная таблица позволяет получить последние актуальные данные на указанную дату, такие данные называются срезом последних

Виртуальные таблицы 1с

Виртуальные таблицы регистра сведений 1с

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

Во-первых нажимаем на кнопку “Параметры виртуальной таблицы”

Виртуальные таблицы 1с

Параметры виртуальной таблицы

Во-вторых задаем параметры:

таблицы в регистре сведений

Окно задания параметров виртуальной таблицы

Код запроса будет выглядеть так:

Данный запрос выдаст курс одной валюты (&Валюта) на определенную дату(&Период).

В заключении приведем еще два фрагмента кода для регистра сведений.

Во-первых получение всех курсов валют на заданную дату:

Во-вторых нахождение цены назначаемой в Справочнике ВидыЦен на заданную дату. В Справочнике ВидыЦен указываются названия цен, например Оптовая.

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

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

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

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

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

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

Параметры регистра накопления остатки

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

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

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

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

  • НачалоПериода. Параметр в котором хранится дата начала периода, за который будут браться обороты;
  • КонецПериода. Параметр в котором хранится дата окончания периода, за который будут браться обороты;
  • Периодичность. Определяет группировку по периоду в виртуальной таблице. Если, например, указана периодичность Месяц, то данные в таблице будут сгруппированы по всем измерениям и месяцу, в полях таблицы появится поле Период, в котором будет хранится первый день месяца, в котором было сделано движение регистра. Если оставить поле Периодичность пустым, то периода в полях виртуальной таблицы не будет. Помимо периодичности связанной с временными промежутками есть еще несколько ее типов:
    • Запись. Данные будут выбираться по отдельным записям регистра, точно также как в полной таблице. Притом, в полях появляются Период и Регистратор (документ который сделал данное движение);
    • Регистратор. Данные будут сгруппированы по документу сделавшему движения в регистре. Данная группировка удобна как раз тогда, когда вам необходимо иметь разрез по документам. Притом, В полях появляются Период и Регистратор;
    • Период. Данные группируются по измерениям регистра за весь период оборота;
    • Авто. Данные группируются до секунды, в полях появляются Регистратор, ПериодСекунда, …. ПериодГод.

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

    Подробно программирование на 1с изучается на курсе “Азы программирование 1с“

    Использование виртуальных таблиц 1С в запросах

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

    2. Структура регистров.

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

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

    Расчет таблицы итогов будет зависеть от вида регистра 1С, структура имеет следующий вид:

    3. Доступ к виртуальным таблицам 1С.

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

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

    Если обратится к базе данных посредством 1С конструктора запроса, то таблицы будут выглядеть следующим образом.

    При написании запроса следует ориентироваться на использование виртуальных таблиц 1Срассчитываемых на основе итогов. В этом случае запрос будет наиболее оптимальным.

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

    4. Параметры виртуальной таблицы 1С остатков.

    Период – Дата, либо момент времени на который необходимо получить остатки.

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

    Остатки рассчитываются на начало секунды!

    Если к примеру мы укажем дату остатков 20.01.2019 12:00:00 то движения за период 20.01.2019 12:00:00 учтены не будут, и остаток будет равен 8.

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

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

    Он представляет собой поле Дата+Ссылка

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

    Допустим, что 20.01.2019 12:00:00 был проведен еще один документ, таблица движений примет следующий вид:

    На временной оси два последних документа будут расположены следующим образом

    При расчете остатков на МоментВремени документа, движения этого документа не учитываются !

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

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

    Получение Границы , включая движения документа:

    МоментПолученияОстатков = Новый Граница ( МоментВремени (), ВидГраницы . Включая );

    Условие – параметр позволяющий произвести отбор данных по измерениям регистра.

    В нашем примере у регистра остатков только одно измерение «Номенклатура».

    Условия можно описывать как простой конструкцией, например

    Так и при помощи подзапроса

    Номенклатура В (ВЫБРАТЬ

    ВтНоменклатура КАК ВтНоменклатура)

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

    Если все же подзапрос необходим, то необходимо соблюдать следующие условия:

    · в подзапросе только одна таблица, нет соединений с другими таблицами.

    · если в подзапросе таблица табличной части (например, Документ.Накладная.СписокТоваров), то не должно быть обращения к реквизитам таблицы-шапки (Накладная.Проведен).

    · если в подзапросе таблица, у которой могут быть табличные части (например, Документ.Накладная), то не должно быть обращений к табличным частям (например, ГДЕ Документ.Накладная.СписокТоваров.Номенклатура = «1»).

    · если в подзапросе временная таблица, то не должно быть условий (раздела ГДЕ).

    · если в подзапросе постоянная таблица, то условие (раздел ГДЕ) может быть допустимо, только если условие выполняется для 80% (или более) случаев, отсутствие условия означает выполнение для 100% случаев

    · если в подзапросе постоянная таблица, то в ограничениях доступа к данным (RLS) не должно содержатся подзапросов и соединений (допускаются только простые условия вида «ГДЕ Реквизит = Значение», «ГДЕ Истина»).

    5. Основные параметры таблицы Оборотов.

    Как видим в качестве периода здесь два параметра, это НачалоПериода и КонецПериода.

    Обороты в отличие от остатков можно получить только за определенный период. К примеру, если нам требуется узнать остаток товаров, то мы говорим : «Сколько товаров осталось на сегодня на 12:00? а вчера на 18:00». В случае оборотов вопрос строится так: «Сколько товаров было продано за сегодня? А за этот месяц?».

    НачалоПериода – в случае если указывается дата, то берется начало секунды; если параметр не указан, то берется начало секунды периода первого движения.

    КонецПериода – в случае если указывается дата, то берется конец секунды; если параметр не указан, то берется конец секунды периода последнего движения.

    Если оба основных параметра таблицы указать одинаковыми, то период будет равен 1 секунде.

    В случае если в качестве параметра НачалоПериода или КонецПериода, берется МоментВремени документа, то движения самого документа будут входить в выбираемый период!

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

    Следующим параметром таблицы оборотов является Периодичность таблицы.

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

    Рассмотрим использование данного параметра на примере следующей таблицы движений:

    Выберем данные из таблицы оборотов, в качестве периодичности выберем месяц.

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

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

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

    Если в качестве периодичности выбрать авто то возможно привести данные к нескольким периодам:

    Параметр условие аналогичен условию в виртуальной таблице остатков.

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

    Для регистра с видом остатки это таблица остатки, для оборотного обороты.

    Далее необходимо максимально точно описать условия виртуальных таблиц.

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

    Виртуальная таблица «Остатки» регистра накопления и избыточные блокировки

    Есть регистр накопления остатков «РасчетыПоПриобретениюВВалютеОрганизации» со следующей структурой:

    1. Организация, типа справочник «Организации»
    2. Контрагент, типа справочник «Контрагенты»
    3. ДоговорКонтрагента, типа справочник «ДоговорыКонтрагентов»
    4. Сделка, типа документ «Счет на оплату поставщику»
    5. Счет оплаты, типа ПланыСчетов.Хозрасчетный
    6. ДокументРасчетовСКонтрагентом, типа документ поступления и оплаты…
    1. СуммаВзаиморасчетов
    2. СуммаРегл

    Есть запрос по остатками этого регистра:

    ЕСТЬNULL(СУММА(РасчетыПоПриобретениюВВалютеОрганизацииОстатки.СуммаВзаиморасчетовОстаток), 0) КАК СуммаВзаиморасчетовОстаток

    И Сделка = &Сделка

    И СчетОплаты = &СчетОплаты

    И ДокументРасчетовСКонтрагентом = &ДокументРасчетовСКонтрагентом) КАК РасчетыПоПриобретениюВВалютеОрганизацииОстатки

    Отборы по Организации и Контрагенту не устанавливаются, так как они однозначно определяются договором (справочник «ДоговорыКонтрагентов» подчинен справочнику «Контрагенты» и в нем есть реквизит «Организация»).

    В отборе по периоду виртуальной таблицы используется момент времени – это документ с датой «01.11.2011 00:00:00»

    Поймаем запрос в профайлере:

    exec sp_executesql N’SELECT

    ISNULL(CAST(CAST(SUM(T1.Fld22268Balance_) AS NUMERIC(38, 8)) AS NUMERIC(38, 8)),0.0)

    CAST(SUM(T2.Fld22268Balance_) AS NUMERIC(38, 8)) AS Fld22268Balance_

    ISNULL(CAST(CAST(SUM(T3._Fld22268) AS NUMERIC(33, 8)) AS NUMERIC(27, 2)),0.0) AS Fld22268Balance_

    FROM _AccumRgT22270 T3

    WHERE T3._Period = @P1

    AND (((((T3._Fld22262RRef = @P2) AND (T3._Fld27856_TYPE = @P3)) AND (T3._Fld22264RRef = @P4)) AND (T3._Fld23634_TYPE = @P5 AND T3._Fld23634_RTRef = @P6 AND T3._Fld23634_RRRef = @P7)))

    CAST(ISNULL(CAST(CAST(SUM(CASE WHEN T4._RecordKind = 0.0 THEN -T4._Fld22268 ELSE T4._Fld22268 END) AS NUMERIC(27, 8)) AS NUMERIC(21, 2)),0.0) AS NUMERIC(27, 2)) AS Fld22268Balance_

    FROM _AccumRg22261 T4

    WHERE (T4._Period > @P8 OR T4._Period = @P8 AND (T4._RecorderTRef > @P9 OR T4._RecorderTRef = @P9 AND T4._RecorderRRef >= @P10))

    AND T4._Period < @P1

    AND T4._Active = @P11

    AND (((((T4._Fld22262RRef = @P2) AND (T4._Fld27856_TYPE = @P3)) AND (T4._Fld22264RRef = @P4)) AND (T4._Fld23634_TYPE = @P5 AND T4._Fld23634_RTRef = @P6 AND T4._Fld23634_RRRef = @P7)))

    @P1 datetime, @P2 varbinary(16), @P3 varbinary(1), @P4 varbinary(16),

    @P5 varbinary(1), @P6 varbinary(4), @P7 varbinary(16), @P8 datetime,

    @P9 varbinary(4), @P10 varbinary(16), @P11 varbinary(1)’,

    , 0xB5B202BFAC10409211E033900477750B, 0x01, 0x8596608F1DCF9AE642B3C7529403EE34,

    0x08, 0x00000111, 0xB1B202BFAC10409211E117376ABAD6C1, ,

    0x00000170, 0x8D0F02BFAC10409211E1219D93CB1649, 0x01

    Видим, что виртуальная таблица «Остатки» преобразовалась в агрегатный («SUM(T1.Fld22268Balance_)») запрос с вложенным объединением («UNION ALL») двух запросов.

    Разберем первый запрос в объединении:

    Первый запрос выполняется к таблице итогов регистра («FROM _AccumRgT22270 T3»). Данные в таблице итогов хранятся по каждому месяцу (поле «_Period») в разрезе всех измерений и ресурсов. В секции «WHERE» устанавливается отбор по месяцу итогов («WHERE T3._Period = @P1») и всем измерениям, указанным в параметрах отбора виртуальной таблицы. Обратим внимание, что параметр «@P1» равен , то есть 01.12.2011 00:00:00 (используется смещение дат 2000), а запрос Мы выполняем на 01.11.2011 00:00:00… То есть итоги выбираются по состоянию на следующий месяц…

    Разберем второй запрос в объединении:

    Второй запрос выполняется к таблице движений регистра («FROM _AccumRg22261 T4»).

    В секции «WHERE» устанавливается отбор по моменту времени («WHERE (T4._Period > @P8 OR T4._Period = @P8 AND (T4._RecorderTRef > @P9 OR T4._RecorderTRef = @P9 AND T4._RecorderRRef >= @P10))»).

    Вспомним что момент времени это «период плюс ссылка». Ссылка – это тип ссылки («_RecorderTRef») и собственно сама ссылка («_RecorderRRef»). Отбор по моменту времени выполняется по условию «Больше или равно». Момент времени, используемый как отбор по периоду виртуальной таблицы, задается параметрами @P8, @P9, @P10.

    Дальше через «И» в секции «WHERE» задается условие «AND T4._Period < @P1», где @P1 равен – это период на который Мы выбирали итоги из таблицы итогов в первом запросе объединения.

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

    В секции «SELECT» происходит накопления ресурса в зависимости от вида движения («SUM(CASE WHEN T4._RecordKind = 0.0 THEN -T4._Fld22268 ELSE T4._Fld22268 END)»): Если вид движения приход («_RecordKind = 0.0»), то ресурс берется с отрицательным знаком, иначе с положительным.

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

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

    Зачем все это знать…

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

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

    Естественное требование к системе – возможность одновременного проведения пользователями документов по разным контрагентам или договорам. Но, если система настроена неправильно, то это требование выполняться не будет…

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

    Если запрос не использует индекс для отбора строк или использует малоселективный индекс (индекс, которому соответствует большое количество строк таблицы), то запрос будет выполняться медленно и блокировать всю (или почти всю) таблицу для записи…

    Для выполнения нашего требования запрос должен использовать индекс и первые поля этого индекса должны использоваться в отборе запроса. В нашем случае, это поле — измерение ДоговорКонтрагента.

    Для таблицы итогов регистра накопления платформа создает кластерный индекс с включением в него периода итогов и всех измерений в том порядке как они заданы в конфигураторе, не зависимо от того установлено ли для измерения свойство «Индексировать» или нет… Из этого следует, что если Мы переставим «ДоговорКонтрагента» в списке измерений на первое место, то получим нужный нам индекс… Кстати не используемые в отборах запросов измерения (Организация и Контрагент) лучше передвинуть в самый конец списка, тогда могут сработать такие поля индекса как «Сделка», «СчетОплаты» и «ДокументРасчетовСКонтрагентом».

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

    Если для измерения установлено свойство «Индексировать», то платформа создаст дополнительный индекс, включив в него это измерение, период, регистратор и номер строки. Из этого следует, что установив у измерения «ДоговорКонтрагента» свойство «Индексировать», Мы получим требуемый нам индекс…

    Таким образом структура регистра изменилась на следующую:

    1. ДоговорКонтрагента, типа справочник «ДоговорыКонтрагентов» (ИНДЕКСИРУЕТСЯ)
    2. Сделка, типа документ «Счет на оплату поставщику»
    3. Счет оплаты, типа ПланыСчетов.Хозрасчетный
    4. ДокументРасчетовСКонтрагентом, типа документ поступления и оплаты…
    5. Организация, типа справочник «Организации»
    6. Контрагент, типа справочник «Контрагенты»
    1. СуммаВзаиморасчетов
    2. СуммаРегл

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *