Сумма(КоличествоКонечныйОстаток) в итогах и детальных запиях
Как-то жил я и жил. И все вроде бы нормально было. Но вот задумался я над одним вопросом и понял, что ничегошеньки я не понимаю.
Вот есть запрос:
И есть в программе один заказ на 200 шт. Есть реализация на 100 штук. Всё.
Выводится он красиво:
__________________Кон ост____Оборот
Заказ1________________100_______100
--Номенклатура1_______100_______100
----Заказ1____________200_______200
----Реализация1_______100______-100
Но как он понимает что Сумма(КонечныйОстаток) по номенклатуре нужно считать как последний по регистратору(то бишь, по периоду),а не как сумма конечных остатков.
Причем, если сделать так:
Т.е. с помещением во временную таблицу отрабатывает тоже хорошо. А вот если выгрузить в тз, а потом загрузить во временную,
то получим совершенно другое (что действительно является Сумма(КонечныйОстаток)):
__________________Кон ост____Оборот
Заказ1________________300_______100
--Номенклатура1_______300_______100
----Заказ1____________200_______200
----Реализация1_______100______-100
Так вот вопрос. Есть ли способ, при использовании ТЗ указать что Регистратор - это период, и конечный Остаток надо считать по не как Сумма(КонечныйОстаток), а как при использовании виртуальной таблицы. И как она(1с) "помечает" колонку "Регистратор", что это период, и конечный остаток нужно считать по-другому.
Вот есть запрос:
"ВЫБРАТЬ
| ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ЗаказыПокупателейОстаткиИОбороты.Регистратор,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты(, , Регистратор, , ) КАК ЗаказыПокупателейОстаткиИОбороты
|ИТОГИ
| СУММА(КоличествоКонечныйОстаток),
| СУММА(КоличествоОборот)
|ПО
| ЗаказПокупателя,
| Номенклатура";
ПоказатьИ есть в программе один заказ на 200 шт. Есть реализация на 100 штук. Всё.
Выводится он красиво:
__________________Кон ост____Оборот
Заказ1________________100_______100
--Номенклатура1_______100_______100
----Заказ1____________200_______200
----Реализация1_______100______-100
Но как он понимает что Сумма(КонечныйОстаток) по номенклатуре нужно считать как последний по регистратору(то бишь, по периоду),а не как сумма конечных остатков.
Причем, если сделать так:
"ВЫБРАТЬ
| ЗаказыОборотыИОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыОборотыИОстатки.Номенклатура КАК Номенклатура,
| ЗаказыОборотыИОстатки.Регистратор,
| ЗаказыОборотыИОстатки.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыОборотыИОстатки.КоличествоОборот КАК КоличествоОборот
|ПОМЕСТИТЬ ЗаказыОборотыИОстатки
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты(, , Регистратор, , ) КАК ЗаказыОборотыИОстатки
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ЗаказыПокупателейОстаткиИОбороты.Регистратор,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| ЗаказыОборотыИОстатки КАК ЗаказыПокупателейОстаткиИОбороты
|ИТОГИ
| СУММА(КоличествоКонечныйОстаток),
| СУММА(КоличествоОборот)
|ПО
| ЗаказПокупателя,
| Номенклатура";
ПоказатьТ.е. с помещением во временную таблицу отрабатывает тоже хорошо. А вот если выгрузить в тз, а потом загрузить во временную,
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ЗаказыПокупателейОстаткиИОбороты.Регистратор,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты(, , Регистратор, , ) КАК ЗаказыПокупателейОстаткиИОбороты";
ТЗ = Запрос.Выполнить().Выгрузить();
ЗапросИтоговый = Новый Запрос;
ЗапросИтоговый.УстановитьПараметр("ТЗ", ТЗ);
ЗапросИтоговый.Текст =
"ВЫБРАТЬ
| ЗаказыОборотыИОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыОборотыИОстатки.Номенклатура КАК Номенклатура,
| ЗаказыОборотыИОстатки.Регистратор,
| ЗаказыОборотыИОстатки.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыОборотыИОстатки.КоличествоОборот КАК КоличествоОборот
|ПОМЕСТИТЬ ЗаказыОборотыИОстатки
|ИЗ
| &ТЗ КАК ЗаказыОборотыИОстатки
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ЗаказыПокупателейОстаткиИОбороты.Регистратор,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ЗаказыПокупателейОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| ЗаказыОборотыИОстатки КАК ЗаказыПокупателейОстаткиИОбороты
|ИТОГИ
| СУММА(КоличествоКонечныйОстаток),
| СУММА(КоличествоОборот)
|ПО
| ЗаказПокупателя,
| Номенклатура";
Показатьто получим совершенно другое (что действительно является Сумма(КонечныйОстаток)):
__________________Кон ост____Оборот
Заказ1________________300_______100
--Номенклатура1_______300_______100
----Заказ1____________200_______200
----Реализация1_______100______-100
Так вот вопрос. Есть ли способ, при использовании ТЗ указать что Регистратор - это период, и конечный Остаток надо считать по не как Сумма(КонечныйОстаток), а как при использовании виртуальной таблицы. И как она(1с) "помечает" колонку "Регистратор", что это период, и конечный остаток нужно считать по-другому.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Какие интересные вопросы тебя посещают по пятницам... :-)
Ты же сам понимаешь, что .ОстаткиИОбороты - это виртуальная таблица. Причем ты указал в параметрах виртуальной таблицы периодичность "Регистратор". Чего ж ты удивляешься, что КоличествоКонечныйОстаток он выводит по регистратору (с учетом этой периодичности)???
Тогда уж сразу задавай себе вопрос - А как устроены виртуальные таблицы регистров???
Ты же сам понимаешь, что .ОстаткиИОбороты - это виртуальная таблица. Причем ты указал в параметрах виртуальной таблицы периодичность "Регистратор". Чего ж ты удивляешься, что КоличествоКонечныйОстаток он выводит по регистратору (с учетом этой периодичности)???
Тогда уж сразу задавай себе вопрос - А как устроены виртуальные таблицы регистров???
Я вот как раз себе такой вопрос и задаю. Хотя, скорее как подменить виртуальную таблицу своей, и указать так сделать чтобы по полю регистратор счиатал правильно конечные остатки.
Если ближе к делу, то есть УПП. Есть Заказы покупателей, Заказы на производство, Отчеты производства, Реализации.
В одном отчете нужно показать что было заказано (заказы покупателей), сколько из этого было заказано на рпоизводство (размещения заказов), сколько было произведено или зарезервировано на складе (заказы на производство, товары в резерве на складах), и сколько было отгружено (резервы, заказы покупателей).
Итоги по: Заказ покупателя, Номенклатура, Регистратор. Сумма(КоличествоКонОстатокЗаказыПокупателей), Сумма(КоличествоКонОстатокЗаказыНаПроизводство), Сумма(КоличествоКонОстатокРезервы).
И придумать ничего не могу, только как выбрать все регистраторы (ЗаказПокупателя, КорректировкаЗаказаПокупателя, ЗаказНаПроизводство, КорректировкаЗаказаНаПроизводство, ОтчетПроизводстваЗаСмену, РезервированиеТоваров (на складах и в Заказах на Производство), РеализацияТоваровУслуг) посчитать на их дату конечные остатки, и вывести в отчет, а группировки считать самому.
Если ближе к делу, то есть УПП. Есть Заказы покупателей, Заказы на производство, Отчеты производства, Реализации.
В одном отчете нужно показать что было заказано (заказы покупателей), сколько из этого было заказано на рпоизводство (размещения заказов), сколько было произведено или зарезервировано на складе (заказы на производство, товары в резерве на складах), и сколько было отгружено (резервы, заказы покупателей).
Итоги по: Заказ покупателя, Номенклатура, Регистратор. Сумма(КоличествоКонОстатокЗаказыПокупателей), Сумма(КоличествоКонОстатокЗаказыНаПроизводство), Сумма(КоличествоКонОстатокРезервы).
И придумать ничего не могу, только как выбрать все регистраторы (ЗаказПокупателя, КорректировкаЗаказаПокупателя, ЗаказНаПроизводство, КорректировкаЗаказаНаПроизводство, ОтчетПроизводстваЗаСмену, РезервированиеТоваров (на складах и в Заказах на Производство), РеализацияТоваровУслуг) посчитать на их дату конечные остатки, и вывести в отчет, а группировки считать самому.
(3)
я так понимаю, вопрос состоит в том, как обмануть 1С при расчете итогов по остаточной колонке?
(скажу заранее, обычно обратный вопрос возникает у тех, кто курит СКД - почему итоги считаются неправильно?? Так там это всё дело в ролях - снёс все галки в настройке поля и остатки просуммируются в лоб)
хы... )) интересная тема... попробовал у себя в консоли, убил некоторое время
получается забавно - я перескинул еще в одну ВТ
так вот - некорректный остаток (т.е. сложенный в лоб) получается, только если заремарить какую-либо из строк в среднем запросе "//*********"
во всех остальных случаях 1С грамотно вычисляет, что это остаток по измерению, даже если это ВТ не "первого отжима"
итоги такие итоги :)
я так понимаю, вопрос состоит в том, как обмануть 1С при расчете итогов по остаточной колонке?
(скажу заранее, обычно обратный вопрос возникает у тех, кто курит СКД - почему итоги считаются неправильно?? Так там это всё дело в ролях - снёс все галки в настройке поля и остатки просуммируются в лоб)
хы... )) интересная тема... попробовал у себя в консоли, убил некоторое время
получается забавно - я перескинул еще в одну ВТ
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
регистратор,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
поместить таб
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
где номенклатура.наименование = "Клема 4х2,5мм WAGO"
;
выбрать номенклатура,
регистратор, //*********
КоличествоНачальныйОстаток, //***********
КоличествоКонечныйОстаток
поместить таб1
из таб
;
выбрать *
из таб1
итоги
СУММА(КоличествоКонечныйОстаток)
по номенклатура
;уничтожить таб
;уничтожить таб1
Показатьтак вот - некорректный остаток (т.е. сложенный в лоб) получается, только если заремарить какую-либо из строк в среднем запросе "//*********"
во всех остальных случаях 1С грамотно вычисляет, что это остаток по измерению, даже если это ВТ не "первого отжима"
итоги такие итоги :)
Разобрался!
Как обычно, всё оказалось очень просто. И это я уже использовал, но как-то не в этом ключе.
Так вот.
Пусть у нас есть произвольная (сформированная нами) таблица оборотов, с конечными остатками на каждую строку в этой таблице. Пусть колонки будут такие:
Правильный запрос будет такой:
Ключевой момент:
Сумма(КоличествоОборот) КАК КоличествоКонечныйОстаток
Именно сумма по Обороту, а псевдоним - КонОстаток!
Это даёт нужный нам эффект: агрегатная функция "сумма" идет по ОБОРОТАМ, а в детальных записях выводится КоличествоКонечныйОстаток
Как-то раньше я об этом не задумывался.
С начальным остатком, конечно, немного сложнее получается, но решаемо.
И отвечая на свой вопрос, видимо при формировании виртуальных таблиц построитель помечает нужные колонки (конОстатки), то что сумму нужно считать не по ним, а по оборотам.
ПС. В данном примере используется запрос по всему периоду, без начальных остатков. С начальными остатками сложнее. Нужно ведь еще расчитать их на начало, и создать псевдоколонку "НачальныйОстатокПлюсОборот", которая будет включать начальный остаток на начало периода и оборот за этот период.
ПСС. Надо бы написать статью о формировании начальных и конечных остатков и их выводе в итоговых записях в "ручном" режиме.
Как обычно, всё оказалось очень просто. И это я уже использовал, но как-то не в этом ключе.
Так вот.
Пусть у нас есть произвольная (сформированная нами) таблица оборотов, с конечными остатками на каждую строку в этой таблице. Пусть колонки будут такие:
- Заказ
- Номенклатура
- Период
- Регистратор
- КоличествоОборот
- КоличествоКонечныйОстаток
Правильный запрос будет такой:
Выбрать * Из ТаблицаОборотовИОстатков КАК ТЗ
Итоги
Сумма(КоличествоОборот) КАК КоличествоОборот // Считает обороты
Сумма(КоличествоОборот) КАК КоличествоКонечныйОстаток // Считает кон остаток, но он равен Обороту!
По
Заказ
Номенклатура
Ключевой момент:
Сумма(КоличествоОборот) КАК КоличествоКонечныйОстаток
Именно сумма по Обороту, а псевдоним - КонОстаток!
Это даёт нужный нам эффект: агрегатная функция "сумма" идет по ОБОРОТАМ, а в детальных записях выводится КоличествоКонечныйОстаток
Как-то раньше я об этом не задумывался.
С начальным остатком, конечно, немного сложнее получается, но решаемо.
И отвечая на свой вопрос, видимо при формировании виртуальных таблиц построитель помечает нужные колонки (конОстатки), то что сумму нужно считать не по ним, а по оборотам.
ПС. В данном примере используется запрос по всему периоду, без начальных остатков. С начальными остатками сложнее. Нужно ведь еще расчитать их на начало, и создать псевдоколонку "НачальныйОстатокПлюсОборот", которая будет включать начальный остаток на начало периода и оборот за этот период.
ПСС. Надо бы написать статью о формировании начальных и конечных остатков и их выводе в итоговых записях в "ручном" режиме.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот