Суммирование остатков в СКД. УТ 11.5

Клиент попросил в отчете «Ведомость по денежным средствам» выделить сумму перемещений отдельно. Сделал внешний отчет.

В наборе данных Наличные попробовал вот такой код:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ДенежныеСредства.Организация КАК Организация,
	ДенежныеСредства.Касса КАК МестоХраненияДенежныхСредств,
	ДенежныеСредства.Касса.ВалютаДенежныхСредств КАК Валюта,
	ЗНАЧЕНИЕ(Перечисление.ТипыДенежныхСредств.Наличные) КАК ТипДенежныхСредств,
	ВЫБОР
		КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
			ТОГДА NULL
		ИНАЧЕ ДенежныеСредства.Регистратор
	КОНЕЦ КАК Регистратор,
	ДенежныеСредства.ПериодСекунда КАК ПериодСекунда,
	ДенежныеСредства.ПериодДень КАК ПериодДень,
	ДенежныеСредства.ПериодНеделя КАК ПериодНеделя,
	ДенежныеСредства.ПериодДекада КАК ПериодДекада,
	ДенежныеСредства.ПериодМесяц КАК ПериодМесяц,
	ДенежныеСредства.ПериодКвартал КАК ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие КАК ПериодПолугодие,
	ДенежныеСредства.ПериодГод КАК ПериодГод,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаНачальныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрНачальныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглНачальныйОстаток
	КОНЕЦ КАК СуммаНачальныйОстаток,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаПриход
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрПриход
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглПриход
	КОНЕЦ * ВЫБОР
		КОГДА ДенежныеСредства.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
				ИЛИ ДенежныеСредства.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
			ТОГДА 0
		ИНАЧЕ 1
	КОНЕЦ КАК СуммаПриход,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаРасход
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрРасход
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглРасход
	КОНЕЦ * ВЫБОР
		КОГДА ДенежныеСредства.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
				ИЛИ ДенежныеСредства.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
			ТОГДА 0
		ИНАЧЕ 1
	КОНЕЦ КАК СуммаРасход,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаКонечныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрКонечныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглКонечныйОстаток
	КОНЕЦ КАК СуммаКонечныйОстаток
{ВЫБРАТЬ
	Организация.*,
	МестоХраненияДенежныхСредств.*,
	Валюта.*,
	Регистратор,
	ПериодСекунда,
	ПериодДень,
	ПериодНеделя,
	ПериодДекада,
	ПериодМесяц,
	ПериодКвартал,
	ПериодПолугодие,
	ПериодГод,
	СуммаНачальныйОстаток,
	СуммаПриход,
	СуммаРасход,
	СуммаКонечныйОстаток}
ИЗ
	РегистрНакопления.ДенежныеСредстваНаличные.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, {(Организация).*, (Касса).* КАК МестоХраненияДенежныхСредств}) КАК ДенежныеСредства
{ГДЕ
	ДенежныеСредства.Касса.ВалютаДенежныхСредств.* КАК Валюта,
	(ВЫБОР
			КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
				ТОГДА NULL
			ИНАЧЕ ДенежныеСредства.Регистратор
		КОНЕЦ) КАК Регистратор,
	ДенежныеСредства.ПериодСекунда,
	ДенежныеСредства.ПериодДень,
	ДенежныеСредства.ПериодНеделя,
	ДенежныеСредства.ПериодДекада,
	ДенежныеСредства.ПериодМесяц,
	ДенежныеСредства.ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие,
	ДенежныеСредства.ПериодГод}

Но, увы, начали суммироваться начальные и конечные остатки. Почитал, что это не лечится никакими настройками измерений, а они у меня такие:

Пришлось решать программным путем, переписал запрос так:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ДенежныеСредства.Организация КАК Организация,
	ДенежныеСредства.Касса КАК МестоХраненияДенежныхСредств,
	ДенежныеСредства.Касса.ВалютаДенежныхСредств КАК Валюта,
	ЗНАЧЕНИЕ(Перечисление.ТипыДенежныхСредств.Наличные) КАК ТипДенежныхСредств,
	ВЫБОР
		КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
			ТОГДА NULL
		ИНАЧЕ ДенежныеСредства.Регистратор
	КОНЕЦ КАК Регистратор,
	ДенежныеСредства.ПериодСекунда КАК ПериодСекунда,
	ДенежныеСредства.ПериодДень КАК ПериодДень,
	ДенежныеСредства.ПериодНеделя КАК ПериодНеделя,
	ДенежныеСредства.ПериодДекада КАК ПериодДекада,
	ДенежныеСредства.ПериодМесяц КАК ПериодМесяц,
	ДенежныеСредства.ПериодКвартал КАК ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие КАК ПериодПолугодие,
	ДенежныеСредства.ПериодГод КАК ПериодГод,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаНачальныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрНачальныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглНачальныйОстаток
	КОНЕЦ КАК СуммаНачальныйОстаток,
	Т.СуммаПриход КАК СуммаПриход,
	Т.СуммаРасход КАК СуммаРасход,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаКонечныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрКонечныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглКонечныйОстаток
	КОНЕЦ КАК СуммаКонечныйОстаток
{ВЫБРАТЬ
	Организация.*,
	МестоХраненияДенежныхСредств.*,
	Валюта.*,
	Регистратор,
	ПериодСекунда,
	ПериодДень,
	ПериодНеделя,
	ПериодДекада,
	ПериодМесяц,
	ПериодКвартал,
	ПериодПолугодие,
	ПериодГод,
	СуммаНачальныйОстаток,
	СуммаПриход,
	СуммаРасход,
	СуммаКонечныйОстаток}
ИЗ
	РегистрНакопления.ДенежныеСредстваНаличные.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, {(Организация).*, (Касса).* КАК МестоХраненияДенежныхСредств}) КАК ДенежныеСредства
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			Т.Организация КАК Организация,
			Т.Касса КАК Касса,
			Т.Регистратор КАК Регистратор,
			Т.ПериодСекунда КАК ПериодСекунда,
			Т.ПериодДень КАК ПериодДень,
			Т.ПериодНеделя КАК ПериодНеделя,
			Т.ПериодДекада КАК ПериодДекада,
			Т.ПериодМесяц КАК ПериодМесяц,
			Т.ПериодКвартал КАК ПериодКвартал,
			Т.ПериодПолугодие КАК ПериодПолугодие,
			Т.ПериодГод КАК ПериодГод,
			СУММА(ВЫБОР &ДанныеОтчета
					КОГДА 1
						ТОГДА Т.СуммаПриход
					КОГДА 2
						ТОГДА Т.СуммаУпрПриход
					КОГДА 3
						ТОГДА Т.СуммаРеглПриход
				КОНЕЦ * ВЫБОР
					КОГДА Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
							ИЛИ Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) КАК СуммаПриход,
			СУММА(ВЫБОР &ДанныеОтчета
					КОГДА 1
						ТОГДА Т.СуммаРасход
					КОГДА 2
						ТОГДА Т.СуммаУпрРасход
					КОГДА 3
						ТОГДА Т.СуммаРеглРасход
				КОНЕЦ * ВЫБОР
					КОГДА Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
							ИЛИ Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) КАК СуммаРасход
		ИЗ
			РегистрНакопления.ДенежныеСредстваНаличные.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, {(Организация).*, (Касса).* КАК МестоХраненияДенежныхСредств}) КАК Т
		
		СГРУППИРОВАТЬ ПО
			Т.Организация,
			Т.Касса,
			Т.Регистратор,
			Т.ПериодСекунда,
			Т.ПериодДень,
			Т.ПериодНеделя,
			Т.ПериодДекада,
			Т.ПериодМесяц,
			Т.ПериодКвартал,
			Т.ПериодПолугодие,
			Т.ПериодГод) КАК Т
		ПО ДенежныеСредства.Организация = Т.Организация
			И ДенежныеСредства.Касса = Т.Касса
			И (ВЫБОР
				КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
					ТОГДА ИСТИНА
				ИНАЧЕ ДенежныеСредства.Регистратор = Т.Регистратор
			КОНЕЦ)
			И ДенежныеСредства.ПериодСекунда = Т.ПериодСекунда
			И ДенежныеСредства.ПериодДень = Т.ПериодДень
			И ДенежныеСредства.ПериодНеделя = Т.ПериодНеделя
			И ДенежныеСредства.ПериодДекада = Т.ПериодДекада
			И ДенежныеСредства.ПериодМесяц = Т.ПериодМесяц
			И ДенежныеСредства.ПериодКвартал = Т.ПериодКвартал
			И ДенежныеСредства.ПериодПолугодие = Т.ПериодПолугодие
			И ДенежныеСредства.ПериодГод = Т.ПериодГод   И ЛОЖЬ
{ГДЕ
	ДенежныеСредства.Касса.ВалютаДенежныхСредств.* КАК Валюта,
	(ВЫБОР
			КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
				ТОГДА NULL
			ИНАЧЕ ДенежныеСредства.Регистратор
		КОНЕЦ) КАК Регистратор,
	ДенежныеСредства.ПериодСекунда,
	ДенежныеСредства.ПериодДень,
	ДенежныеСредства.ПериодНеделя,
	ДенежныеСредства.ПериодДекада,
	ДенежныеСредства.ПериодМесяц,
	ДенежныеСредства.ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие,
	ДенежныеСредства.ПериодГод}

Но так тоже не заработало — остатки опять суммировались. Даже если отключить соединение с таблицей через ЛОЖЬ.

Поэтом переписал так, чтобы обороты за период брались из присоединенной таблицы:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ДенежныеСредства.Организация КАК Организация,
	ДенежныеСредства.Касса КАК МестоХраненияДенежныхСредств,
	ДенежныеСредства.Касса.ВалютаДенежныхСредств КАК Валюта,
	ЗНАЧЕНИЕ(Перечисление.ТипыДенежныхСредств.Наличные) КАК ТипДенежныхСредств,
	ВЫБОР
		КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
			ТОГДА NULL
		ИНАЧЕ ДенежныеСредства.Регистратор
	КОНЕЦ КАК Регистратор,
	ДенежныеСредства.ПериодСекунда КАК ПериодСекунда,
	ДенежныеСредства.ПериодДень КАК ПериодДень,
	ДенежныеСредства.ПериодНеделя КАК ПериодНеделя,
	ДенежныеСредства.ПериодДекада КАК ПериодДекада,
	ДенежныеСредства.ПериодМесяц КАК ПериодМесяц,
	ДенежныеСредства.ПериодКвартал КАК ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие КАК ПериодПолугодие,
	ДенежныеСредства.ПериодГод КАК ПериодГод,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаНачальныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрНачальныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглНачальныйОстаток
	КОНЕЦ КАК СуммаНачальныйОстаток,
	Т.СуммаПриход КАК СуммаПриход,
	Т.СуммаРасход КАК СуммаРасход,
	ВЫБОР &ДанныеОтчета
		КОГДА 1
			ТОГДА ДенежныеСредства.СуммаКонечныйОстаток
		КОГДА 2
			ТОГДА ДенежныеСредства.СуммаУпрКонечныйОстаток
		КОГДА 3
			ТОГДА ДенежныеСредства.СуммаРеглКонечныйОстаток
	КОНЕЦ КАК СуммаКонечныйОстаток
{ВЫБРАТЬ
	Организация.*,
	МестоХраненияДенежныхСредств.*,
	Валюта.*,
	Регистратор,
	ПериодСекунда,
	ПериодДень,
	ПериодНеделя,
	ПериодДекада,
	ПериодМесяц,
	ПериодКвартал,
	ПериодПолугодие,
	ПериодГод,
	СуммаНачальныйОстаток,
	СуммаПриход,
	СуммаРасход,
	СуммаКонечныйОстаток}
ИЗ
	РегистрНакопления.ДенежныеСредстваНаличные.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, {(Организация).*, (Касса).* КАК МестоХраненияДенежныхСредств}) КАК ДенежныеСредства
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			Т.Организация КАК Организация,
			Т.Касса КАК Касса,
			СУММА(ВЫБОР &ДанныеОтчета
					КОГДА 1
						ТОГДА Т.СуммаПриход
					КОГДА 2
						ТОГДА Т.СуммаУпрПриход
					КОГДА 3
						ТОГДА Т.СуммаРеглПриход
				КОНЕЦ * ВЫБОР
					КОГДА Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
							ИЛИ Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) КАК СуммаПриход,
			СУММА(ВЫБОР &ДанныеОтчета
					КОГДА 1
						ТОГДА Т.СуммаРасход
					КОГДА 2
						ТОГДА Т.СуммаУпрРасход
					КОГДА 3
						ТОГДА Т.СуммаРеглРасход
				КОНЕЦ * ВЫБОР
					КОГДА Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзДругойКассы)
							ИЛИ Т.Регистратор.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВДругуюКассу)
						ТОГДА 0
					ИНАЧЕ 1
				КОНЕЦ) КАК СуммаРасход
		ИЗ
			РегистрНакопления.ДенежныеСредстваНаличные.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, {(Организация).*, (Касса).* КАК МестоХраненияДенежныхСредств}) КАК Т
		
		СГРУППИРОВАТЬ ПО
			Т.Организация,
			Т.Касса) КАК Т
		ПО ДенежныеСредства.Организация = Т.Организация
			И ДенежныеСредства.Касса = Т.Касса
{ГДЕ
	ДенежныеСредства.Касса.ВалютаДенежныхСредств.* КАК Валюта,
	(ВЫБОР
			КОГДА ДенежныеСредства.Регистратор = НЕОПРЕДЕЛЕНО
				ТОГДА NULL
			ИНАЧЕ ДенежныеСредства.Регистратор
		КОНЕЦ) КАК Регистратор,
	ДенежныеСредства.ПериодСекунда,
	ДенежныеСредства.ПериодДень,
	ДенежныеСредства.ПериодНеделя,
	ДенежныеСредства.ПериодДекада,
	ДенежныеСредства.ПериодМесяц,
	ДенежныеСредства.ПериодКвартал,
	ДенежныеСредства.ПериодПолугодие,
	ДенежныеСредства.ПериодГод}

Выглядело так:

Правда, так некорректно работало при расшифровках по периоду, но на это уже не было бюджета.

Думаю, можно было проверять в основной таблице, если Регистратор = Неопределено, то брать данные из присоединенной таблице, а если Регистратор есть, то рассчитывать так, как в первом варианте — прямо в таблице. Или соединять по регистратору, только если регистратор не заполнен.

В общем, намучался я с этим отчетом, проще было два за это время написать — по регистратору и без. Хотя расшифровка по секундам и дням тоже, понятно, работать не будет, наверное. В платформе есть косяк, увы, при обращению к регистратору и если регистратор не выводится в отчет, остатки суммируются несмотря на все настройки.

Среда: 11.4.13.46 Объем: 2.5 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 8

  1. rzd:

    Автор вообще понимает как устроена таблица ОстаткиИОбороты и в каких именно случаях поле регистратор не заполнено при обращении к нему?

    • ага. а ты понимаешь, в чем проблема?

      • rzd:

        и в каких именно случаях поле регистратор не заполнено?

        • зависит от разворота по регистратору (Авто)
          Если Авто — это развертка без регистратора, то в ОборотыИОстатки когда это строка остатков, то Неопределено, иначе NULL

          • rzd:

            Да. Я про Авто — как же без регистратора, если сам обращаешься
            Т.Регистратор.ХозяйственнаяОперация

          • вот о том и речь, что такие конструкции в рамках парадигмы СКД невозможны почему-то.

  2. rzd:

    вот о том и речь, что такие конструкции в рамках парадигмы СКД невозможны почему-то.

    Какие такие?

    • Вот отчет типовой в группировке по типу денежных средств:
      Тип ДС
      Нач.Ост. Приход Расход Кон.Ост.

      Допустим, по наличным средствам я хочу из прихода и расхода исключить перемещения и выделить их в отдельный Тип ДС:
      Наличные
      Нач.Ост. Приход без перемещений, Расход без перемещений, Кон.Ост.
      Перемещения
      0 Приход по перемещениям, Расход по перемещения, 0
      Для определения перемещений мне нужно анализировать регистратор. А если я в условиях внутри оборотов использую регистратор, остатки автоматом получаются по регистратору, а не в целом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *