Приветствую Вас ГостьВторник, 14.05.2024, 17:54

Каталог статей


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

Различия между видом "Обороты" и "Остатки"

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

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

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

Регистры остатков:

Для регистра накопления остатков состав колонок таблицы движений (хранит данные о выполненных по регистру движениях) следующий:

  • Период – дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси.
  • Регистратор – ссылка на документ, которому подчинена данная запись.
  • НомерСтроки – уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор.
  • ВидДвижения – значение системного перечисления ВидДвиженияНакопления, обозначающее направление приращения указанных в записи ресурсов на итоги по этим ресурсам (Приход или Расход).
  • МоментВремени
  • Активность – тип Булево. Содержит признак влияния записи на итоги регистра.
  • <Измерение> – значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации.
  • <Ресурс> – значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации.
  • <Реквизит> – значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации

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

  • Период – дата, на которую актуально состояние хранимого в таблице итога.
  • <Измерение> – значение измерения – разреза учета хранимых итогов. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации.
  • <Ресурс> – значение итога ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации.
  • Разделитель – поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накопления, у которых установлено свойство Разрешить разделение итогов.

В таблице итогов регистра остатков период записи равен первому числу следующего месяца. Т.е. по операциям за май период итога равен 01.06, так как итог рассчитан на начало 1-го числа следующего месяца.

Оборотный регистр

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

  • Период – дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси.
  • Регистратор – ссылка на документ, которому подчинена данная запись.
  • НомерСтроки – уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор.
  • Активность – тип Булево. Содержит признак влияния записи на итоги регистра.
  • МоментВремени
  • <Измерение> – значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации.
  • <Ресурс> – значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации.
  • <Реквизит> – значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации.

Структура таблицы итогов оборотного регистра накопления тоже схожа:

  • Период – период (месяц), за который накоплен оборот итогов ресурсов.
  • <Измерение> – значение измерения – разреза учета хранимых итогов. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации, у которых установлено свойство Использование в итогах.
  • <Ресурс> – значение итога оборота ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации.
  • Разделитель – поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накопления, у которых установлено свойство Разрешить разделение итогов.

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

Режим разделения итогов

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

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

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

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

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

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

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

Программное управление методами менеджера регистра накопления: ПолучитьРежимРазделенияИтогов() и УстановитьРежимРазделенияИтогов()

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

Удаление движений:

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

Разрешить разделение итогов:

  • Истина (По умолчанию) - использование режима разделения итогов (см. выше).
  • Ложь - невозможность использования данного режима. - полезно для регистров не используемых в параллельной работе пользователей.

 

Расчет итогов

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

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

Проверить значение признака расчета итогов можно с помощью метода ПолучитьИспользованиеИтогов() менеджера регистра накопления

ПризнакИспользованияИтогов = РегистрыНакопления.ПартииТоваров.ПолучитьИспользованиеИтогов();

Отключение / включение расчета итогов может понадобиться при массовом вводе документов. В этом случае имеет смысл рассчитать итоги после ввода последнего документа, вместо того, чтобы рассчитывать их после ввода каждого:

// Отключить использование итогов регистра
РегистрыНакопления.ПартииТоваров.УстановитьИспользованиеИтогов(Ложь);
 
Для Каждого Элемент из МассивИнформации Цикл
 
    // Выполнить действия по загрузке документов (регистраторов)
    // и наборов записей регистра
    // ...
     
    // Записать загруженные наборы записей
    // ...
 
КонецЦикла;
 
// Включить использование итогов регистра
// (одновременно выполнится пересчет итогов)
РегистрыНакопления.ПартииТоваров.УстановитьИспользованиеИтогов(Истина);

Итоги рассчитываются только по записям у которых свойства Активность = Истина.

Текущие итоги рассчитываются на дату 01.11.3999 00:00:00.

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

Программный расчет итогов:

РегистрыНакопления.ТоварыНаСкладах.УстановитьПериодРассчитанныхИтогов(Дата(2022, 05, 31));

Индексы для таблиц:

  • Период + Регистратор + НомерСтроки;
  • Регистратор + НомерСтроки;
  • Измерение + Период + Регистратор + НомерСтроки, если для измерения Измерение свойство Индексировать установлено в значение Индексировать;
  • Реквизит + Период + Регистратор + НомерСтроки, если для реквизита Реквизит свойство Индексировать установлено в значение Индексировать.

Для таблиц итогов создается следующий индекс:

  • Период + Измерение1 + Измерение2 + … + ИзмерениеN + Разделитель – по всем измерениям регистра.
  • Измерение + Период, если для измерения Измерение свойство Индексировать установлено в значение Индексировать.

Получение данных регистров

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

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

Пример получения выборки с отбором по реквизиту.

Чтобы реквизит можно было включить в отбор  надо  у этого реквизита (в примере "Поставщик") установит свойство "Индексировать" = "Индексировать".

ОтборПоПоставщику = Новый Структура("Поставщик", ПоставщикОтбора);
ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах.Выбрать(НачалоИнтервала, КонецИнтервала, ОтборПоПоставщику);
Пока ВыборкаДвижений.Следующий() Цикл
    ...
КонецЦикла;

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

Если требуется получить записи, исключая граничные, необходимо использовать объект Граница - Новый Граница(НачалоИнтервала,ВидГраницы.Исключая)
 

Получение остатков

Остатки всегда получаются на начало периода! Если в качестве периода был передан конец дня (например 31.05.2022 23:59:59) и есть движение с таким же периодом, то это движение будет исключено, так как остаток определяется на начало 31.05.2022 23:59:59, т.е. все движения по 31.05.2022 23:59:58 включительно 

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

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

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

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

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

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

Описание с примерами здесь: https://its.1c.ru/db/pubapplied#content:130:hdoc

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

Особенности получения остатков при разных типах параметра Период. Для примера Период = 31.05.2022 23:59:59.

Дата.

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

Граница

Если вид границы равен "Включая", то в расчет итогов будут включены движения с периодом  31.05.2022 23:59:59. Если Вид границы равен "Исключая", то такие движения будут исключены.

Момент времени.

Момент времени - это дата + Ссылка. При указании момента времени в качестве параметра, исключаются движения самого документа (ссылка) 

Значение периода для получения корректных остатков

в отчетах:

  • ДобавитьКДате(КОНЕЦПЕРИОДА(&ПериодОтчета.ДатаОкончания, "ДЕНЬ"),"Секунда",1)
  • ДобавитьКДате(КОНЕЦПЕРИОДА(&ДатаОтчета, "ДЕНЬ"),"Секунда",1)

в обработках:

  • Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
  • КонецДня(ДатаОтчета) +1

в обработках по отношению к документу

включая движения документа 

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

Не включая движения документа

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

или просто СсылкаНаДокумент.МоментВремени()

Получение оборотов

Таблица оборотов строится с включением записей, соответствующих граничным периодам. То есть с начала секунды значения параметра НачалоПериода по конец секунды параметра КонецПериода. При получении оборотов за день (с 00:00:01 по 23:59:9), период движения 23:59:59 включается в обороты.

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

В таблице итогов оборотного регистра хранятся данные месячных оборотов.

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

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

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

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

Объектная модель чтения - Метод Обороты() используется только если у регистра накопления с включенным использованием итогов.

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

Дата.

Таблица оборотов строится с включением записей, соответствующих граничным периодам. Если есть движение в регистре датой  и параметр КонецПериода = 31.05.2022 23:59:59 , то движения с этим периодом будет включен.

Граница

Если вид границы равен "Исключая", то в обороты не будут включаться границы (дата или ссылка из момента времени). В остальных случаях движения внутри интервала будут включаться в обороты.

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

Момент времени.

Момент времени - это дата + Ссылка. При указании момента времени в качестве параметра, включаются движения самого документа (ссылка) 

Получение остатков и оборотов в одной таблице

Особенности получения данных из таблицы ОстаткиИОбороты:

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

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

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

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

Особенности получения итогов

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

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

Получение итогов по регистратору или номеру строки

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

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

Аналогично итоги по номеру строки можно получать только внутри группировки по периоду и регистратору.

Получение итогов остатков в комбинации с другими полями

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

Пример:

Запрос:

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

Результат запроса

Номенклатура Период Склад КоличествоНачальныйОстаток КоличествоКонечныйОстаток Разница Произведение
Пульт PW     1 15 14 98
Пульт PW 01.05.2010 00:00:00   1 1 0 1
Пульт PW 01.05.2010 00:00:00 Главный 1 1 0 1
Пульт PW 13.05.2010 00:00:00   1 8 7 8
Пульт PW 13.05.2010 00:00:00 Главный 1 8 7 8
Пульт PW 17.05.2010 00:00:00   8 11 3 0
Пульт PW 17.05.2010 00:00:00 Розничный 0 3 3 0
Пульт PW 31.05.2010 00:00:00   11 15 4 89
Пульт PW 31.05.2010 00:00:00 Главный 8 8 0 64
Пульт PW 31.05.2010 00:00:00 Розничный 3 3 0 9
Пульт PW 31.05.2010 00:00:00 Фили-2 0 4 4 0
Пульт PW 31.05.2010 00:00:00 Фили-2 4 4 0 16

 

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

Использование соединений с таблицей остатков и оборотов

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

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

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

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

Для обеспечения максимальной скорости выполнения запросов важно правильно применять условия отборов.

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

Например отбор по конкретной номенклатуре

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

Можно в отборах использовать значения полей, подчиненных измерениям.  Необходимо учитывать, что подобные операции «разыменования» реализуются за счет неявных дополнительных соединений с соответствующими таблицами. 

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

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

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ втНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЗакупочнаяЦена > &ПороговаяЦена

ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

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

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

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

Поэтому изначально, описывая данные регистра как объекта конфигурации, можно указать индексирование измерения Склад. Тогда система сможет использовать данные не только индекса Период + Регистратор + НомерСтроки, но и индекса Склад + Период + Регистратор + НомерСтроки.

Когда имеет смысл отключать текущие итоги.

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

Отключить расчет текущих итогов: УстановитьИспользованиеТекущихИтогов(Ложь).

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

Определить используется ли расчет текущих итогов можно с помощью метода ПолучитьИспользованиеТекущихИтогов()

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


Примеры использования:

// Пример: выполнить полный пересчет итогов регистра "ОстаткиМатериалов".
    РегистрыНакопления.ОстаткиМатериалов.ПересчитатьИтоги();
    
// Пример: рассчитать итоги регистра "ОстаткиМатериалов" на указанную дату.

   РегистрыНакопления["ОстаткиМатериалов"].УстановитьПериодРассчитанныхИтогов(УказаннаяДата);    

// Пример: Получить признак использования текущих итогов "ОстаткиМатериалов".
    РегистрыНакопления.ОстаткиМатериалов.ПолучитьИспользованиеТекущихИтогов();

// Пример: Выключить/Включить использования текущих итогов "ОстаткиМатериалов".
    РегистрыНакопления.ОстаткиМатериалов.УстановитьИспользованиеТекущихИтогов(Истина/Ложь);

 // Пример: активизировать требуемую строку списка регистра накопления.

    // РегистрНакопленияКлючЗаписи.<имя>. Представляет собой набор значений, однозначно идентифицирующих запись регистра. Объект используется в тех случаях, когда необходимо сослаться на определенную запись.
    // Например, он выступает в качестве значения свойства ТекущаяСтрока табличного поля, отображающего список записей регистра.
    СтруктураКлючевыхПолей = Новый Структура;
    СтруктураКлючевыхПолей.Вставить("Регистратор", Документы.ПриходнаяНакладная.НайтиПоНомеру("0000002"));
    СтруктураКлючевыхПолей.Вставить("НомерСтроки", 2);
    КлючЗаписи = РегистрыНакопления.ОстаткиМатериалов.СоздатьКлючЗаписи(СтруктураКлючевыхПолей);    

// Пример: выбрать все записи регистра "ОстаткиМатериалов" за текущий месяц.

    Выборка = РегистрыНакопления.ОстаткиМатериалов.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

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

ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах.ВыбратьПоРегистратору(РегистраторСсылка);
Пока ВыборкаДвижений.Следующий() Цикл 
    // Выполнить действие с очередным движением
    //... 
КонецЦикла;

// Пример: получить движения документа.

    НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
    Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
    Движения.Отбор.Регистратор.Значение = НужныйДокумент;
    Движения.Прочитать(); // пока не прочитан, набор записей пуст
    Для Каждого ОчередноеДвижение Из Движения Цикл
        // Алгоритм обработки движений
    КонецЦикла;

// Пример: Добавить запись в методе ОбработкаПроведения().

    Движения.ОстаткиМатериалов.Записывать = Истина; 
    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл        

        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;
        Движение.Склад = Склад;
        Движение.Количество = ТекСтрокаМатериалы.Количество;

    КонецЦикла;

 

// Пример: Добавить запись не в методе проведения

    Набор = РегистрыНакопления.Остатки.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Значение =  Документ; //Обязательно надо задать отбор.
    Запись = Набор.ДобавитьПриход(); // Можно использовать метод Добавить(), но тогда надо определить вид движения: Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
    Запись.Номенклатура = Номенклатура; 
    Запись.Период = ТекущаяДата();
    Запись.Количество=200;
    Набор.Записать();

//Пример: Снять активность 

    Документ = РеквизитФормыВЗначение("Объект");
        
    // Перебрать наборы записей по регистрам
    Для Каждого НаборЗаписей Из Документ.Движения Цикл
      
        // Прочитать движения по регистру
        НаборЗаписей.Прочитать();
           // Снять активность
        НаборЗаписей.УстановитьАктивность(Ложь);
           //Записать набор записей
        НаборЗаписей.Записать();
      
    КонецЦикла;

//Пример: Очистить движения документа

    Документ = РеквизитФормыВЗначение("Объект");
        
    // Перебрать наборы записей по регистрам
    Для Каждого НаборЗаписей Из Документ.Движения Цикл
        
        // Очистить набор записей движений по регистру
        НаборЗаписей.Очистить(); // Если набор записей не прочитан, то очистку можно пропустить, так как до прочтения набор пустой и его запись очистит движения
        //Записать набор записей
        НаборЗаписей.Записать();
    
    КонецЦикла;

//Пример: Записать документ в форме

&НаКлиенте
Процедура ПровестиНеоперативно(Команда)
    
    ПровестиНеоперативноНаСервере();
    
КонецПроцедуры
    
&НаСервере
Процедура ПровестиНеоперативноНаСервере();    
        
       // Установить в форме использование режима неоперативного проведения
       ИспользоватьРежимПроведения  = ИспользованиеРежимаПроведения.Неоперативный;
       // Выполнить проведение в форме
   Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
    
КонецПроцедуры

 

//Пример: Получение остатков объектным способом (без сложных отборов)

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

Отбор = Новый Структура("Номенклатура", ТоварОтбора);
ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(МоментВремени, Отбор, "Склад", "Количество");

Для Каждого СтрокаТаблицы Из ТаблицаОстатков Цикл
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "Склад " + СтрокаТаблицы.Склад + ": Остаток " + СтрокаТаблицы.Количество;
    Сообщение.Сообщить(); 
КонецЦикла;

 

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

Для редактирования записей в регистре накопления с помощью формы набора записей, у формы должен быть основной реквизит типа РегистрНакопленияНаборЗаписей.<Название регистра>

При открытии формы набора записей у формы должен быть установлен параметр "Отбор" по регистратору

       // Получить ссылку на текущий документ
       ТекущийДокумент = Элементы.Список.ТекущаяСтрока;

    // Открыть форму набора записей с отбором по регистратору
    ЗначениеОтбора = Новый Структура("Регистратор", ТекущийДокумент);
    ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);
    ОткрытьФорму("РегистрНакопления.ТоварыНаСкладах.Форма.ФормаНабораЗаписей", ПараметрыФормы)


Агрегаты

Агрегаты предназначены для ускорения получения данных из оборотных регистров накопления.

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

Особенности использования:

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

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

Алгоритм работы:

1. Определим в конфигураторе минимум один агрегат. Добавить агрегат можно на вкладке Данные (кнопка "Агрегаты") ил через контекстное меню по регистру ("Открыть агрегаты")

2. Рассчитаем оптимальные агрегаты для регистра. Это можно сделать через интерфейс в клиенте (Все функции / Стандартные / Управление итогами / Полные возможности / Агрегаты / Оптимальные…)  или с помощью метода ОпределитьОптимальныеАгрегаты(); При расчете из интерфейса формируется файл XML с списком агрегатов.

СписокОптимальныхАгрегатов = РегистрыНакопления.ПродажиАгрегаты.ОпределитьОптимальныеАгрегаты();
    
    Для Каждого Агрегат Из СписокОптимальныхАгрегатов.Агрегаты Цикл
        
        СписокИзмерений = "";
        Для Каждого Измерение Из Агрегат.Измерения Цикл
            СписокИзмерений = СписокИзмерений + Измерение + ", ";
        КонецЦикла;

             Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "Измерения: " + СписокИзмерений +
                          ", Использование: " + Строка(Агрегат.Использование) +
                          ", Периодичность: "+ Агрегат.Периодичность +
                          ", Начало периода: " + Строка(Агрегат.НачалоПериода) +
                          ", Конец периода: " + Строка(Агрегат.КонецПериода) +
                          ", Размер: " + Строка(Агрегат.Размер);
        Сообщение.Сообщить();      
    КонецЦикла;

3. В конфигураторе, в диалоге редактирования агрегатов регистра загрузить список агрегатов из файла командой "Открыть оптимальные агрегаты". Если определяли программно, то надо настраивать вручную.

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

4. Обновить конфигурацию с новым списком агрегатов. После обновления надо включить для регистра режим использования агрегатов. Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции / Стандартные / Управление итогами / Полные возможности / Агрегаты / Режим / Включить режим агрегатов). Из встроенного языка можно установить режим агрегатов методом менеджера регистра накопления УстановитьРежимАгрегатов().

5. Выполнить перестроение агрегатов. Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции / Стандартные / Управление итогами / Полные возможности / Агрегаты / Перестроить…) или программно с помощью метода менеджера регистра накопления ПерестроитьИспользованиеАгрегатов(). 

Операцию перестроения нужно производить регулярно.

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

6. Выполнить обновление агрегатов (в отличие от таблицы итогов, агрегаты автоматически не заполняются данными). Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции / Стандартные / Управление итогами / Полные возможности / Агрегаты / Обновить…). или программно с помощью метода менеджера регистра накопления ОбновитьАгрегаты(). При обновлении агрегатов происходит перенос данных из таблиц движений, которые были произведены после предыдущего обновления агрегатов, в таблицы агрегатов, которые в данный момент используются платформой.

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

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

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

9. Определить, требуется ли изменение списка агрегатов для регистра. Если нет, то следует продолжить работу, перейдя на шаг 5. Если список агрегатов нужно изменить, то надо загрузить новый список агрегатов (пункт 3).

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

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

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

По умолчанию для агрегата свойство "Использование" равно "Авто". Если есть агрегат, который используется важным отчетом, но отчет используется редко, то для такого агрегата надо поставить использование = "Всегда", чтобы при определении оптимального списка агрегатов, этот агрегат не пропал в силу своего редкого использования.

Категория: Регистры | Добавил: leshic (01.02.2022)
Просмотров: 2003 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0