1с параметры виртуальной таблицы остатки и обороты
Для периодических регистров сведений доступны две виртуальные таблицы СрезПоследних и СрезПервых. Виртуальные таблицы облегчают жизнь разработчику, так как:
Срез последних
Предназначена для получения наиболее поздних записей регистра сведений на указанную дату (включительно) (см. рисунок 1).
Рисунок 1. Примерная схема среза последних |
Включает только активные записи. По каждой комбинации измерений будет найдена наиболее поздняя запись, но не более поздняя, чем указанная дата. В режиме совместимости Версия8_3_17 и ниже включает записи независимо от признака активности (да да, с версии 8.3.18 исправили некорректное поведение системы). Является наиболее востребованной виртуальной таблицей, так как задачи получения среза последних встречаются довольно часто.
- - тип: Произвольный. Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений, как они заданы в конфигураторе.
- - тип: Произвольный. Набор таких полей и их наименования определяются набором общих реквизитов, не являющихся разделителями (РазделениеДанных = НеИспользовать), или разделителей с ИспользованиеРазделяемыхДанных = НезависимоИСовместно, в которых участвует данный регистр сведений.
- - тип: Произвольный. Набор полей содержит значения реквизитов регистра. Имена полей соответствуют именам реквизитов, как они заданы в конфигураторе.
- - тип: Произвольный. Набор полей содержит значения ресурсов регистра. Имена полей соответствуют именам ресурсов, как они заданы в конфигураторе.
- Активность - тип: Булево. Содержит признак активности записи и влияния на получение первых и последних записей. Имеет смысл только для регистров, записываемых регистратором.
- НомерСтроки - тип: Число. Содержит номер строки, определяемый как порядковый номер записи в наборе записей. Имеет смысл только для регистров, записываемых регистратором.
- Период - тип: Дата. Содержит период, к которому относится запись регистра. Имеет смысл только для периодических регистров.
- Регистратор - тип: ДокументСсылка.. Содержит ссылку на документ-регистратор движения. Имеет смысл только для регистров, записываемых регистратором.
Параметры
- Период (необязательный) - тип: Дата, МоментВремени, Граница. Указывается дата, момент времени или граница, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние записи, без ограничения по дате.
- Условие (необязательный) - конструкция языка запросов. Указывается условие на языке запросов. Условие может оперировать полями регистра сведений. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние. То есть условие будет применяться к исходным записям, а не к уже отобранным. Если параметр не задан, анализируются все активные записи регистра.
Срез первых
Предназначена для получения наиболее ранних записей регистра сведений на указанную дату (включительно) (см. рисунок 2).
Рисунок 2. Примерная схема среза первых |
Включает только активные записи. По каждой комбинации измерений будет найдена наиболее ранняя запись, но не более ранняя, чем указанная дата.
- - тип: Произвольный. Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений, как они заданы в конфигураторе.
- - тип: Произвольный. Набор таких полей и их наименования определяются набором общих реквизитов, не являющихся разделителями (РазделениеДанных = НеИспользовать), или разделителей с ИспользованиеРазделяемыхДанных = НезависимоИСовместно, в которых участвует данный регистр сведений.
- - тип: Произвольный. Набор полей содержит значения реквизитов регистра. Имена полей соответствуют именам реквизитов, как они заданы в конфигураторе.
- - тип: Произвольный. Набор полей содержит значения ресурсов регистра. Имена полей соответствуют именам ресурсов, как они заданы в конфигураторе.
- Активность - тип: Булево. Содержит признак активности записи и влияния на получение первых и последних записей. Имеет смысл только для регистров, записываемых регистратором.
- НомерСтроки - тип: Число. Содержит номер строки, определяемый как порядковый номер записи в наборе записей. Имеет смысл только для регистров, записываемых регистратором.
- Период - тип: Дата. Содержит период, к которому относится запись регистра. Имеет смысл только для периодических регистров.
- Регистратор - тип: ДокументСсылка.. Содержит ссылку на документ-регистратор движения. Имеет смысл только для регистров, записываемых регистратором.
Параметры
- Период (необязательный) - тип: Дата, МоментВремени, Граница. Указывается дата, момент времени или граница, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее ранние записи, без ограничения по дате.
- Условие (необязательный) - конструкция языка запросов. Указывается условие на языке запросов. Условие может оперировать полями регистра сведений. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее ранние. То есть условие будет применяться к исходным записям, а не к уже отобранным. Если параметр не задан, анализируются все активные записи регистра.
Материал для статьи взят со справки платформы 1С и приведен к удобочитаемому виду.
В нескольких статьях представлены основные сведения о внутреннем устройстве регистров накопления, о SQL-запросах платформы при работе с ними и их изменение в зависимости от настроек регистра. Подробно описана работа платформы с разными типами регистров (остатков и накопления), а также принцип действия агрегатов.
Материалы созданы во времена платформы 8.2, поэтому некоторые моменты могут быть уже не актуальными, но основные принципы работы остались неизменными.
Больше года назад сайт был закрыт. Некоторые из его материалов будут реанимированы на Инфостарт.
Конкретно в этой статье речь идет о виртуальных таблицах "Остатки" и "Остатки и обороты" регистров накопления в базе данных. Все примеры из публикации Вы можете найти на GitHub.
Предисловие
В предыдущих статьях мы говорили о структуре хранения регистров накопления в базе данных, а также о работе платформы с виртуальной таблицей "Обороты" этих регистров в зависимости от настроек хранения итогов. Все эксперименты проводились на тестовой конфигурации, содержащей два регистра накопления видов "Остатки" и "Обороты" (подробнее см. в предыдущих статьях).
Сегодня в статье рассмотрим действия платформы при работе с виртуальными таблицами "Остатки" и "Остатки и обороты" регистра накопления с видом "Остатки".
Общие сведения
Регистр накопления с видом "Остатки" позволяет разработчику использовать дополнительно к виртуальной таблице "Обороты" регистра еще и таблицу "Остатки".
Данная виртуальная таблица содержит меньше доступных параметров и предназначена для получения остатков по значениям измерений регистра на определенную дату.
Особенностью использования этой виртуальной таблицы является получение остатков на дату с использованием таблицы итоговых остатков (см. описание хранения регистров накопления вида "Остатки" в базе данных).
Поэтому, если использование итогов отключено для регистра, работа с этой таблицей станет невозможной.
Теперь рассмотрим формируемые платформой SQL-запросы к базе данных для получения остатков через названную виртуальную таблицу. Проанализируем изменение запроса для включенных/отключенных текущих итогов.
За кулисами
Выполним в нашей тестовой базе следующий запрос на языке платформы:
Для регистра "ОстаткиНоменклатуры" установим дату рассчитанных итогов на конец февраля (28.02.2013). Первый запрос выполним с включенными текущими итогами регистра накопления.
Первым делом платформа обратится к настройкам регистра накопления. Этот запрос был рассмотрен в предыдущей статье. Перейдем непосредственно к SQL-запросу платформы при использовании виртуальной таблицы "Остатки".
Получим следующий SQL-запрос платформы:
Обратите внимание на параметр "Период", переданный в виртуальную таблицу. Напомню, в нашем случае включены текущие итоги. Поскольку граница рассчитанных итогов регистра установлена на 28.02.2013, платформа не может получить итоги по остаткам на предыдущий месяц, а использовать последние рассчитанные итоги на конец февраля 2013 года и затем корректировать остаток в соответствии с движениями за последующие 3 месяца было бы не оптимально.
Поэтому программа получает текущие остатки (остатки на текущую дату, которые хранятся с периодом 01.11.5999 00:00:00) и корректирует их в соответствии с движениями в период с значения параметра "Период" вирт. таблицы и по дату текущий остатков. Если мы отключим текущие итоги, то тот же запрос на языке платформы будет преобразован в следующий SQL-запрос, имеющий незначительные изменения:
То есть, если параметр "Период" виртуальной таблицы больше периода последних рассчитанных итогов, то тогда платформа получает текущие остатки и корректирует их по движениям в диапазоне с [ПараметрПериодВиртуальнойТаблицы] по [ПериодТекущихИтогов]. В случае, если для регистра отключены текущие итоги, то платформа получает последние рассчитанные итоги и корректирует их по движениям с периода этих итогов по период, установленный в параметрах виртуальной таблицы.
Прежде чем перейти к выводам, отмечу, что во всех вариантах SQL-запроса при наложении условия на период получаемых движений, условие верхней границы диапазона всегда представляет собой:
т.е. условие всегда "МЕНЬШЕ". Если период движения равен дате, установленной в верхнем диапазоне, то эти движения не будут учитываться при получении остатков. Вот она та самая особенность виртуальной таблицы остатков, из-за которой не учитывается последняя секунда в параметрах виртуальной таблицы.
Делаем выводы
Подведем небольшой итог. На следующей схеме представлены действия платформы для получения остатков при различных настройках регистра накопления и параметра периода виртуальной таблицы "Остатки".
При любом случае использования виртуальной таблицы "Остатки", платформа 1С:Предприятие 8 получает данные по итогам остатков и корректирует их по записям движений.
Некоторые действия платформа могла бы выполнять более оптимально. Например, при использовании текущих остатков для регистра выбирать получать ли текущие остатки или последние рассчитанные итоги по периоду виртуальной таблицы. Выбор бы осуществлялся по принципу "что ближе".
В любом случае, механизм итогов для регистров вида "Остатки" позволяет выполнять запросы для получения остатков оптимальнее, нежели использовать только записи таблицы движений.
Все эксперименты проводил на платформе 1С:Предприятие 8.2.17.169.
Далее рассмотрим самую "тяжелую" виртуальную таблицу регистров накопления "ОстаткиИОбороты".
"Тяжелая" таблица
Среди всех виртуальных таблиц, таблица "Остатки и обороты" является самой "тяжелой" для формирования. Разработчики должны это хорошо понимать и использовать ее с осторожностью. Далее Вы увидите почему.
Выполним следующий запрос на языке запросов платформы:
Параметрам запроса присвоим следующие значения:
Такие параметры как "Периодичность" и "МетодДополнения" мы оставили без заполнения. Сначала платформа выполнить запрос для получения настроек регистра накопления. Его мы подробно рассмотрели в статье по виртуальной таблице "Обороты", поэтому сейчас останавливаться на нем не будем.
При таких настройках платформа сформирует следующий SQL-запрос для рассматриваемой виртуальной таблицы:
Прокомментировал основные моменты в запросе. Общая схема работы запроса такая:
- Получаем обороты регистра по таблице движений за установленный период.
- Получаем остатки на значение даты параметра "Начало периода".
- Объединяем предыдущие два результата, при этом поле "НачальныйОстаток" - это остаток по данным таблицы остатков, а "КонечныйОстаток" вычисляется как : "НачальныйОстаток" + "Оборот"
- Полученные данные группируются по выбранным в запросе измерениям и проверяются на наличие хотя бы одного заполненного ресурса (не равного 0).
Отсюда мы можем сделать вывод, что если с помощью этой виртуальной таблицы мы получаем данные за большой период, то запрос может получать достаточно большие порции записей движений. В результате формирование отчетов (или другие механизмы в конфигурации) будет работать очень медленно.
Сам SQL-запрос может изменяться в зависимости от значений параметров виртуальной таблицы. Например, если мы добавим периодичность, то в запрос будет добавлено дополнительное поле "Период", по которому результат будет группироваться. При установке параметра "МетодДополнения" в запрос будут попадать границы периода, если установлено значение "ДвиженияИГраницыПериода" (именно с таким значением параметра мы анализировали SQL-запрос), иначе в результате запроса будут только движения.
Что дальше
В этой и предыдущих статьях мы рассмотрели SQL-запросы платформы при работе с виртуальными таблицами регистров накопления. Представленная информация должна помочь в выборе виртуальных таблиц при разработке, а также в написании оптимальных запросов к базе данных на языке платформы.
В следующих статьях рассмотрим работу агрегатов, а также некоторые особенности работы индексов регистров накопления и многое другое.
Как известно при чтении данных платформа 1С обращается к таблицам базы данных. Но для регистров платформа 1С на основе реальных таблиц умеет формировать виртуальные таблицы, которые физически в базе данных не храняться. Это позволяет разработчику вместо того, чтобы делать сложный запрос к реальной таблице, сразу получить данные из виртуальной простейшим запросом. А также исключает возможные ошибки. Поэтому использовать виртуальные таблицы нужно всегда, когда есть такая возможность. Особенно при сдаче экзамена 1С:Специалист. Рассмотрим разные типы регистров и посмотрим какие виртуальные таблицы предоставляет платформа для каждого типа регистров.
Регистры сведений
Платформа формирует виртуальные таблицы только для периодических регистров сведений. Доступны следиющие их типы
Регистры накопления
Для регистров накопления набор предоставляемых виртуальных таблиц также зависит от вида регистра. Как известно есть два вида регистров накопления: Остатки и Обороты
Регистр накопления остатков
Доступны следующие виртуальные таблицы
Регистр накопления оборотов
Доступна только одна виртуальная таблица
Регистры расчета
Здесь также в зависимости от настроек доступны следующие виртуальные таблицы
- ДанныеГрафика
- ФактическийПериодДействия
- База
Здесь на самом деле может быть несколько виртуальных таблиц в зависимости от настроек планов видов расчета и количества регистров расчета входящих в тот или иной план видов расчета.
Допустим, что у нас есть два плана видов расчета: Начисления и Удержания. И для Удержаний в качестве базового плана видов расчета указан ПВР Начисления
В свою очередь есть три регистра расчета: Начисления, НачисленияДополнительные и Удержания. И регистры Начисления и НачисленияДополнительные включены в план видов расчета Начисления, а регистр Удержания соответственно в план видов расчета Удержания.
Регистры бухгалтерии
Самым большим набором виртуальных таблиц обладают регистры бухгалтерии
Но скорость обращения к регистрам бухгалтерии самая низкая. Поэтому если есть возможность получить те же остатки или обороты с использованием регистров накопления, то их и надо использовать.
Прикладные объекты в рабочей конфигурации программы 1С получили название «Регистры накопления». Они используются для накопления актуальной информации об итоговом наличии и промежуточном движении имущества, денежных средств и т.п. активов. Регистры накопления формируются данными, которые вводит пользователь в программу документами системы. Основная задача регистров – предоставление данных для отчётных форм.
Вид, тип, структура
Все данные хранятся в узлах системы. Оси системы представляют собой измерения регистра, а сами совокупные данные в узлах – это ресурсы конкретного регистра. Визуально регистр накопления – таблица, количество колонок которой соответствует сумме его измерений. Кроме параметров измерений и ресурсов регистр накоплений характеризуется набором реквизитов. Они позволяют подключать данные дополнительной информации. Сами реквизиты не оказывают влияния на значение ресурса, но могут быть частью анализа движения регистра.
Основные типы Регистров накопления в программе 1С:
- Регистры остатков
- Регистры оборотов
Методом встроенного языка 1С можно сформировать Остатки, выборка будет сделана на указанную временную позицию. Можно фильтровать данные в разрезе значений измерений. Можно получить Остатки в разрезе других указанных измерений. Обороты и регистры оборотов предназначены, чтобы хранить информацию, для которой само понятие «Остатки» лишено смысловой нагрузки.
Три категории полей Регистра накопления:
Период – это Измерение, также как и Регистратор и параметр «Номер строки». Но эти же величины могут служить и категорией Реквизиты, так как способны дать характеристику определённой записи. Такой параметр, как «Вид движения», будет всегда Реквизитом, так как способен только присваивать характеристику записи.
Остатки и Обороты: регистры накопления и виртуальные таблицы
Составные части Регистра накопления Остатков:
Информация в таблицы движения вводится пользователем вручную или генерируется в процессе проведения определённых документов в системе, возможна специальная обработка для заполнения таблиц движения.
Структура таблиц движения:
Период ?Регистратор ? Номер строки ? Вид движения ? ‹Измерения› ? ‹Ресурсы› ? ‹Реквизиты›
Итоговые таблицы содержат остатки в аналитике измерений с периодом месяц, с данными на начало периода.
Структура таблицы итогов:
Период ? ‹Измерения› ?‹Ресурсы›
Остатки в виртуальной таблице используют всегда таблицы итогов, реже таблицы движений.
Стратегия расчёта остатков:
- Проводится отбор ближайшего большего или равного момента, на который Остатки рассчитаны.
- Закрепляются имеющиеся Остатки из таблицы итогов.
- При несовпадении моментов времени, Остатки досчитываются по таблицам движений к данным таблицы итогов.
Обороты формируют виртуальную таблицу только из данных таблиц движений. Если нужны Обороты, то будут обрабатываться все данные о движении, независимо от наличия данных в итоговых таблицах.
Если задача получить виртуальную таблицу остатков и оборотов, то соответственно рассчитываться будут и Остатки, и Обороты. Способ работы такой таблицы зависит от наличия или отсутствия указаний о периодичности данных. Без указания периодичности расчёт проводится в формате единого запроса. Внутри запроса содержатся подзапросы 1С. Один из подзапросов отвечает за расчёт остатков на начало периода, второй вычисляет данные по оборотам за период, результаты объединяются и представляют собой единый результат. Если периодичность указана, расчёт ведётся следующим образом: сначала получают остатки на начало периода, затем вычисляют обороты с указанной периодичностью, только потом объединяются итоговые данные всех запросов.
Регистры Оборотов и Остатков, отличия
Обороты накапливаются в регистре оборотов, в регистре остатков содержатся только итоговые данные. По оборотному регистру нельзя узнать остатки, для его выражения есть только один формат виртуальной таблицы. Структура таблиц сама по себе схожа. Обороты хранятся с периодичностью месяц. Итоги формируются на каждую дату, когда было движение. Таблица оборотов использует информацию и из таблиц итогов, и из таблиц движений.
Для периодических регистров сведений доступны две виртуальные таблицы СрезПоследних и СрезПервых. Виртуальные таблицы облегчают жизнь разработчику, так как:
Срез последних
Предназначена для получения наиболее поздних записей регистра сведений на указанную дату (включительно) (см. рисунок 1).
Рисунок 1. Примерная схема среза последних |
Включает только активные записи. По каждой комбинации измерений будет найдена наиболее поздняя запись, но не более поздняя, чем указанная дата. В режиме совместимости Версия8_3_17 и ниже включает записи независимо от признака активности (да да, с версии 8.3.18 исправили некорректное поведение системы). Является наиболее востребованной виртуальной таблицей, так как задачи получения среза последних встречаются довольно часто.
- - тип: Произвольный. Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений, как они заданы в конфигураторе.
- - тип: Произвольный. Набор таких полей и их наименования определяются набором общих реквизитов, не являющихся разделителями (РазделениеДанных = НеИспользовать), или разделителей с ИспользованиеРазделяемыхДанных = НезависимоИСовместно, в которых участвует данный регистр сведений.
- - тип: Произвольный. Набор полей содержит значения реквизитов регистра. Имена полей соответствуют именам реквизитов, как они заданы в конфигураторе.
- - тип: Произвольный. Набор полей содержит значения ресурсов регистра. Имена полей соответствуют именам ресурсов, как они заданы в конфигураторе.
- Активность - тип: Булево. Содержит признак активности записи и влияния на получение первых и последних записей. Имеет смысл только для регистров, записываемых регистратором.
- НомерСтроки - тип: Число. Содержит номер строки, определяемый как порядковый номер записи в наборе записей. Имеет смысл только для регистров, записываемых регистратором.
- Период - тип: Дата. Содержит период, к которому относится запись регистра. Имеет смысл только для периодических регистров.
- Регистратор - тип: ДокументСсылка.. Содержит ссылку на документ-регистратор движения. Имеет смысл только для регистров, записываемых регистратором.
Параметры
- Период (необязательный) - тип: Дата, МоментВремени, Граница. Указывается дата, момент времени или граница, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние записи, без ограничения по дате.
- Условие (необязательный) - конструкция языка запросов. Указывается условие на языке запросов. Условие может оперировать полями регистра сведений. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние. То есть условие будет применяться к исходным записям, а не к уже отобранным. Если параметр не задан, анализируются все активные записи регистра.
Срез первых
Предназначена для получения наиболее ранних записей регистра сведений на указанную дату (включительно) (см. рисунок 2).
Рисунок 2. Примерная схема среза первых |
Включает только активные записи. По каждой комбинации измерений будет найдена наиболее ранняя запись, но не более ранняя, чем указанная дата.
- - тип: Произвольный. Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений, как они заданы в конфигураторе.
- - тип: Произвольный. Набор таких полей и их наименования определяются набором общих реквизитов, не являющихся разделителями (РазделениеДанных = НеИспользовать), или разделителей с ИспользованиеРазделяемыхДанных = НезависимоИСовместно, в которых участвует данный регистр сведений.
- - тип: Произвольный. Набор полей содержит значения реквизитов регистра. Имена полей соответствуют именам реквизитов, как они заданы в конфигураторе.
- - тип: Произвольный. Набор полей содержит значения ресурсов регистра. Имена полей соответствуют именам ресурсов, как они заданы в конфигураторе.
- Активность - тип: Булево. Содержит признак активности записи и влияния на получение первых и последних записей. Имеет смысл только для регистров, записываемых регистратором.
- НомерСтроки - тип: Число. Содержит номер строки, определяемый как порядковый номер записи в наборе записей. Имеет смысл только для регистров, записываемых регистратором.
- Период - тип: Дата. Содержит период, к которому относится запись регистра. Имеет смысл только для периодических регистров.
- Регистратор - тип: ДокументСсылка.. Содержит ссылку на документ-регистратор движения. Имеет смысл только для регистров, записываемых регистратором.
Параметры
- Период (необязательный) - тип: Дата, МоментВремени, Граница. Указывается дата, момент времени или граница, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее ранние записи, без ограничения по дате.
- Условие (необязательный) - конструкция языка запросов. Указывается условие на языке запросов. Условие может оперировать полями регистра сведений. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее ранние. То есть условие будет применяться к исходным записям, а не к уже отобранным. Если параметр не задан, анализируются все активные записи регистра.
Материал для статьи взят со справки платформы 1С и приведен к удобочитаемому виду.
Читайте также: