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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При составлении запросов к виртуальным таблицам Обороты или ОстаткиИОбороты регистров накопления разработчики нередко сталкиваются с ситуацией: в параметрах виртуальной таблицы указана периодичность Период, однако в списке доступных полей поле Период отсутствует. Попытка вручную прописать Таблица.Период в секции ВЫБРАТЬ приводит к ошибке «Поле не найдено». Разберем причину такого поведения платформы 1С:Предприятие и рассмотрим правильные варианты настройки периодичности в зависимости от решаемой задачи.

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

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

Способ 1. Группировка по стандартным календарным интервалам

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

  1. Откроем конструктор запроса или перейдем к тексту запроса.
  2. Укажем необходимое значение периодичности: Секунда, Минута, Час, День, Неделя, Декада, Месяц, Квартал, Полугодие или Год.

Посмотрим на пример текста запроса с детализацией по месяцам:


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

Способ 2. Получение данных в разрезе документов-регистраторов или записей

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

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

Посмотрим на пример запроса с детализацией до регистратора:


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

Способ 3. Использование режима «Авто» в Системе компоновки данных (СКД)

Если отчет разрабатывается на базе СКД, наиболее универсальным решением является установка периодичности Авто. В этом режиме СКД самостоятельно добавляет в схему набор предопределенных полей: ПериодСекунда, ПериодДень, ПериодНеделя, ПериодМесяц и другие. Платформа оптимизирует итоговый SQL-запрос и подставляет только ту периодичность, которую пользователь реально выбрал в структуре отчета.

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


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

Способ 4. Обращение к реальной таблице регистра

Если в задаче не требуется рассчитывать начальные и конечные остатки на каждую дату, а нужны только движения за период с точными датами, эффективнее обращаться к реальной таблице РегистрНакопления.ИмяРегистра. В реальной таблице поле Период присутствует всегда, а сам запрос выполняется быстрее, так как СУБД не тратит ресурсы на вычисление итогов виртуальной таблицы.

Ограничения и рекомендации по производительности

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

  1. Метод дополнения периодов: механизмы дополнения (например, ДвиженияИГраницыПериода) работают только для интервалов от Секунда до Год, а также для режима Авто. Для значений Период, Запись и Регистратор метод дополнения не применяется.
  2. Нагрузка на СУБД: периодичность Запись в таблице ОстаткиИОбороты является ресурсоемкой, так как платформе приходится вычислять остатки на момент каждой отдельной записи. При работе с большими объемами данных рекомендуется использовать периодичность День, Месяц или ограничиться таблицей Обороты.
← На главную