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