Дорабатываю средний чек в отчете по продажам для Розницы 3.0

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

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

СГРУППИРОВАТЬ ПО
	Продажи.Регистратор,
	ВЫБОР
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах
			ТОГДА "Касса"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ЧекККМ
			ТОГДА "Касса"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ЧекККМВозврат
			ТОГДА "Возврат покупателю"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.РасходнаяНакладная
				И Продажи.Регистратор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРасходнаяНакладная.ПродажаПокупателю)
			ТОГДА "Реализация"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.РасходнаяНакладная
				И Продажи.Регистратор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРасходнаяНакладная.ВозвратПоставщику)
			ТОГДА "Возврат поставщику"
		ИНАЧЕ "Прочее"
	КОНЕЦ

Я попробовал победить эту проблему и мой сон разума породил вот такое чудовище:

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

Но все же я взял себя в руки и написал более лаконичный запрос:

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

СГРУППИРОВАТЬ ПО
	Продажи.Регистратор,
	ВЫБОР
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах
			ТОГДА "Касса"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ЧекККМ
			ТОГДА "Касса"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.ЧекККМВозврат
			ТОГДА "Возврат покупателю"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.РасходнаяНакладная
				И Продажи.Регистратор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРасходнаяНакладная.ПродажаПокупателю)
			ТОГДА "Реализация"
		КОГДА Продажи.Регистратор ССЫЛКА Документ.РасходнаяНакладная
				И Продажи.Регистратор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРасходнаяНакладная.ВозвратПоставщику)
			ТОГДА "Возврат поставщику"
		ИНАЧЕ "Прочее"
	КОНЕЦ

Суть в том, что вместо единицы для подсчета количества документов для документа «Отчет о розничных продажах» я подставляю количество чеков по этому документу.

Интересно, что в поле «Кассовая смена» в чеке находится не документ «Кассовая смена», а «Отчет о розничных продажах». Впрочем, те, кто работал с 1С, в цирке не смеются, так что примем как данность.

Результат стал правильным — проверил по количеству чеков.

UPD: аналогичный отчет дорабатывал и в УТ 11.4.13.46, там есть нюанс, нужно использовать соединение вида (потому что в ОРП есть ссылка на кассовую смену):

КоличествоЧековПродажи.Документ = Продажи.Регистратор.КассоваяСмена
КоличествоЧековВозврата.Документ = Продажи.Регистратор.КассоваяСмена

Среда: Розница 3.0.3.147. Объем: 1час.

fixin

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

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

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

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