Сумма(КоличествоКонечныйОстаток) в итогах и детальных запиях

1. yku 376 16.09.11 16:03 Сейчас в теме
Как-то жил я и жил. И все вроде бы нормально было. Но вот задумался я над одним вопросом и понял, что ничегошеньки я не понимаю.

Вот есть запрос:
"ВЫБРАТЬ
|	ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
|	ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
|	ЗаказыПокупателейОстаткиИОбороты.Регистратор,
|	ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
|	ЗаказыПокупателейОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
|	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты(, , Регистратор, , ) КАК ЗаказыПокупателейОстаткиИОбороты
|ИТОГИ
|	СУММА(КоличествоКонечныйОстаток),
|	СУММА(КоличествоОборот)
|ПО
|	ЗаказПокупателя,
|	Номенклатура";
Показать

И есть в программе один заказ на 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с) "помечает" колонку "Регистратор", что это период, и конечный остаток нужно считать по-другому.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. IgorI 16.09.11 20:50 Сейчас в теме
Какие интересные вопросы тебя посещают по пятницам... :-)
Ты же сам понимаешь, что .ОстаткиИОбороты - это виртуальная таблица. Причем ты указал в параметрах виртуальной таблицы периодичность "Регистратор". Чего ж ты удивляешься, что КоличествоКонечныйОстаток он выводит по регистратору (с учетом этой периодичности)???

Тогда уж сразу задавай себе вопрос - А как устроены виртуальные таблицы регистров???
3. yku 376 16.09.11 21:50 Сейчас в теме
Я вот как раз себе такой вопрос и задаю. Хотя, скорее как подменить виртуальную таблицу своей, и указать так сделать чтобы по полю регистратор счиатал правильно конечные остатки.

Если ближе к делу, то есть УПП. Есть Заказы покупателей, Заказы на производство, Отчеты производства, Реализации.

В одном отчете нужно показать что было заказано (заказы покупателей), сколько из этого было заказано на рпоизводство (размещения заказов), сколько было произведено или зарезервировано на складе (заказы на производство, товары в резерве на складах), и сколько было отгружено (резервы, заказы покупателей).
Итоги по: Заказ покупателя, Номенклатура, Регистратор. Сумма(КоличествоКонОстатокЗаказыПокупателей), Сумма(КоличествоКонОстатокЗаказыНаПроизводство), Сумма(КоличествоКонОстатокРезервы).

И придумать ничего не могу, только как выбрать все регистраторы (ЗаказПокупателя, КорректировкаЗаказаПокупателя, ЗаказНаПроизводство, КорректировкаЗаказаНаПроизводство, ОтчетПроизводстваЗаСмену, РезервированиеТоваров (на складах и в Заказах на Производство), РеализацияТоваровУслуг) посчитать на их дату конечные остатки, и вывести в отчет, а группировки считать самому.
4. romansun 194 16.09.11 23:37 Сейчас в теме
(3)
я так понимаю, вопрос состоит в том, как обмануть 1С при расчете итогов по остаточной колонке?

(скажу заранее, обычно обратный вопрос возникает у тех, кто курит СКД - почему итоги считаются неправильно?? Так там это всё дело в ролях - снёс все галки в настройке поля и остатки просуммируются в лоб)


хы... )) интересная тема... попробовал у себя в консоли, убил некоторое время

получается забавно - я перескинул еще в одну ВТ

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

;
выбрать номенклатура, 
	регистратор,  //*********
	КоличествоНачальныйОстаток,  //***********
	КоличествоКонечныйОстаток
поместить таб1
из таб
;

выбрать *
из таб1
итоги 
	СУММА(КоличествоКонечныйОстаток)
по номенклатура

;уничтожить таб
;уничтожить таб1
Показать


так вот - некорректный остаток (т.е. сложенный в лоб) получается, только если заремарить какую-либо из строк в среднем запросе "//*********"

во всех остальных случаях 1С грамотно вычисляет, что это остаток по измерению, даже если это ВТ не "первого отжима"


итоги такие итоги :)
5. yku 376 22.09.11 17:16 Сейчас в теме
Разобрался!

Как обычно, всё оказалось очень просто. И это я уже использовал, но как-то не в этом ключе.

Так вот.
Пусть у нас есть произвольная (сформированная нами) таблица оборотов, с конечными остатками на каждую строку в этой таблице. Пусть колонки будут такие:
  • Заказ
  • Номенклатура
  • Период
  • Регистратор
  • КоличествоОборот
  • КоличествоКонечныйОстаток

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

Выбрать * Из ТаблицаОборотовИОстатков КАК ТЗ
Итоги 
Сумма(КоличествоОборот) КАК КоличествоОборот // Считает обороты
Сумма(КоличествоОборот) КАК КоличествоКонечныйОстаток // Считает кон остаток, но он равен Обороту!
По 
Заказ
Номенклатура


Ключевой момент:
Сумма(КоличествоОборот) КАК КоличествоКонечныйОстаток
Именно сумма по Обороту, а псевдоним - КонОстаток!
Это даёт нужный нам эффект: агрегатная функция "сумма" идет по ОБОРОТАМ, а в детальных записях выводится КоличествоКонечныйОстаток

Как-то раньше я об этом не задумывался.
С начальным остатком, конечно, немного сложнее получается, но решаемо.
И отвечая на свой вопрос, видимо при формировании виртуальных таблиц построитель помечает нужные колонки (конОстатки), то что сумму нужно считать не по ним, а по оборотам.

ПС. В данном примере используется запрос по всему периоду, без начальных остатков. С начальными остатками сложнее. Нужно ведь еще расчитать их на начало, и создать псевдоколонку "НачальныйОстатокПлюсОборот", которая будет включать начальный остаток на начало периода и оборот за этот период.

ПСС. Надо бы написать статью о формировании начальных и конечных остатков и их выводе в итоговых записях в "ручном" режиме.
6. need1cc 30.09.11 12:50 Сейчас в теме
Если ближе к делу, то есть УПП. Есть Заказы покупателей, Заказы на производство, Отчеты производства, Реализации.
7. yku 376 30.09.11 13:32 Сейчас в теме
need1cc пишет:
Если ближе к делу, то есть УПП. Есть Заказы покупателей, Заказы на производство, Отчеты производства, Реализации.

Это намек, типа а "при чем здесь это"?
8. пользователь 03.10.11 11:44
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот