При составлении запросов к виртуальным таблицам Обороты или ОстаткиИОбороты регистров накопления разработчики нередко сталкиваются с ситуацией: в параметрах виртуальной таблицы указана периодичность Период, однако в списке доступных полей поле Период отсутствует. Попытка вручную прописать Таблица.Период в секции ВЫБРАТЬ приводит к ошибке «Поле не найдено». Разберем причину такого поведения платформы 1С:Предприятие и рассмотрим правильные варианты настройки периодичности в зависимости от решаемой задачи.
Выясним причину, почему так происходит. В языке запросов 1С параметр виртуальной таблицы Периодичность со значением Период (Period) задан по умолчанию. Это значение означает расчет итоговых оборотов и остатков за весь указанный интервал времени целиком, без какого-либо разворота или группировки по временным срезам. Поскольку данные агрегируются в одну общую строку для каждой комбинации измерений, выходное поле времени не имеет физического смысла и платформой не формируется.
Рассмотрим подробнее доступные варианты решения проблемы в зависимости от того, какой результат требуется получить в отчете или обработке.
Если требуется получить остатки и обороты, сгруппированные по дням, месяцам или другим интервалам, укажем требуемую периодичность в четвертом параметре виртуальной таблицы. В этом случае в таблице появится поле Период, содержащее дату начала соответствующего интервала.
Секунда, Минута, Час, День, Неделя, Декада, Месяц, Квартал, Полугодие или Год.Посмотрим на пример текста запроса с детализацией по месяцам:
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Период КАК ПериодМесяц,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК Приход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК Расход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК ТоварыНаСкладахОстаткиИОбороты
Разберем ситуацию, когда требуется увидеть дату каждого первичного документа или конкретной строки движения:
Регистратор: виртуальная таблица предоставляет поля Период (дата документа) и Регистратор (ссылка на документ). Разворот до строк движения не выполняется.Запись: виртуальная таблица предоставляет поля Период, Регистратор и НомерСтроки. Это позволяет получить точную дату и время каждой строки регистра.Посмотрим на пример запроса с детализацией до регистратора:
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Период КАК ПериодДокумента,
ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Регистратор,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК Оборот
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
Если отчет разрабатывается на базе СКД, наиболее универсальным решением является установка периодичности Авто. В этом режиме СКД самостоятельно добавляет в схему набор предопределенных полей: ПериодСекунда, ПериодДень, ПериодНеделя, ПериодМесяц и другие. Платформа оптимизирует итоговый SQL-запрос и подставляет только ту периодичность, которую пользователь реально выбрал в структуре отчета.
Пример вызова виртуальной таблицы для схемы компоновки данных:
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК ПериодДень,
ТоварыНаСкладахОстаткиИОбороты.ПериодМесяц КАК ПериодМесяц,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
Если в задаче не требуется рассчитывать начальные и конечные остатки на каждую дату, а нужны только движения за период с точными датами, эффективнее обращаться к реальной таблице РегистрНакопления.ИмяРегистра. В реальной таблице поле Период присутствует всегда, а сам запрос выполняется быстрее, так как СУБД не тратит ресурсы на вычисление итогов виртуальной таблицы.
Проанализируем важные технические нюансы работы с периодичностью:
ДвиженияИГраницыПериода) работают только для интервалов от Секунда до Год, а также для режима Авто. Для значений Период, Запись и Регистратор метод дополнения не применяется.Запись в таблице ОстаткиИОбороты является ресурсоемкой, так как платформе приходится вычислять остатки на момент каждой отдельной записи. При работе с большими объемами данных рекомендуется использовать периодичность День, Месяц или ограничиться таблицей Обороты.