Сервис доступа к данным 1С для внешних систем
Жёлтый мост
Код · Аналитику

Срез последних цен на дату каждого документа: цена продажи против прайса в УТ 11.5.27.70, КА 2.5.27.93 и КА 2.5.25.85

Для каждой строки реализации запрос находит цену прайса, действовавшую на дату именно этого документа, приводит обе цены к базовой единице и показывает отклонение. Пакет из шести запросов, сверенный со штатным срезом последних, и обработка для скачивания.

Управление торговлей 11.5.27.70Комплексная автоматизация 2.5.27.93Комплексная автоматизация 2.5.25.85

Задача

Продавали ли по прайсу. Руководитель отдела продаж хочет видеть строки реализаций, где цена отличается от цены прайса. Сравнивать нужно с ценой, которая действовала на дату документа, а не с сегодняшней: прайс за месяц мог смениться несколько раз.

Виртуальная таблица СрезПоследних отдает цены на одну дату. Вызывать ее для каждого документа в цикле долго, а в одном запросе на разные даты она не работает.

Решение

Строки реализаций за период кладутся во временную таблицу вместе с датой документа. Затем строки соединяются с регистром сведений ЦеныНоменклатуры по номенклатуре и виду цены с условием Период не позже даты документа, и для каждой строки берется наибольший период. Это и есть срез последних на дату конкретного документа. По найденному периоду из регистра читается сама цена.

Цена может быть задана на характеристику товара или на номенклатуру целиком с пустой характеристикой. Период ищется для обоих вариантов, действует цена на характеристику строки, если она есть, иначе общая.

Обе цены приводятся к базовой единице. Цена строки пересчитывается по данным самой строки: цена за упаковку, умноженная на число упаковок и деленная на количество. Цена прайса задана за упаковку из ресурса Упаковка: пустая упаковка или единица измерения товара означают базовую единицу, упаковка типа Упаковка делится на коэффициент из числителя и знаменателя.

Результат сверен со штатным срезом последних регистра по каждой проверенной строке: период и цена совпали во всех трех базах.

// Цена в каждой строке реализации против цены прайса, действовавшей на дату документа.
// Срез последних цен берется не на одну дату, а на дату каждого документа отдельно:
// виртуальная таблица СрезПоследних так не умеет, поэтому период цены ищется соединением.

// 1. Вид цены, заданный в отборе по наименованию. Если отбор пустой, таблица пустая,
//    и дальше берется вид цены из строки документа.
ВЫБРАТЬ ПЕРВЫЕ 1
	ВидыЦен.Ссылка КАК ВидЦены
ПОМЕСТИТЬ втВидЦеныИзОтбора
ИЗ
	Справочник.ВидыЦен КАК ВидыЦен
ГДЕ
	ВидыЦен.Наименование = &НаименованиеВидаЦены
	И &НаименованиеВидаЦены <> &ПустаяСтрока
	И НЕ ВидыЦен.ПометкаУдаления
;

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

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

// 4. Какая цена действует: на характеристику строки, если она задана, иначе общая.
ВЫБРАТЬ
	Строки.Документ КАК Документ,
	Строки.НомерСтроки КАК НомерСтроки,
	Строки.Номенклатура КАК Номенклатура,
	Строки.ВидЦены КАК ВидЦены,
	ВЫБОР
		КОГДА ПоХарактеристике.Период ЕСТЬ NULL
			ТОГДА ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		ИНАЧЕ Строки.Характеристика
	КОНЕЦ КАК ХарактеристикаЦены,
	ЕСТЬNULL(ПоХарактеристике.Период, Общая.Период) КАК ПериодЦены
ПОМЕСТИТЬ втДействующие
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК ПоХарактеристике
		ПО (ПоХарактеристике.Документ = Строки.Документ)
			И (ПоХарактеристике.НомерСтроки = Строки.НомерСтроки)
			И (ПоХарактеристике.ХарактеристикаЦены = Строки.Характеристика)
			И (Строки.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК Общая
		ПО (Общая.Документ = Строки.Документ)
			И (Общая.НомерСтроки = Строки.НомерСтроки)
			И (Общая.ХарактеристикаЦены = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 5. Запись регистра цен, действующая на дату документа, с ценой за базовую единицу.
//    Цена в регистре задана за упаковку из ресурса Упаковка. Пустая упаковка или сама
//    единица измерения товара означают базовую единицу. Упаковка типа "Упаковка"
//    пересчитывается через числитель и знаменатель. Другие единицы (вес, длина, штуки,
//    отличные от единицы товара) не пересчитываются: сравнение для них не выполняется.
ВЫБРАТЬ
	Действующие.Документ КАК Документ,
	Действующие.НомерСтроки КАК НомерСтроки,
	Цены.Валюта КАК Валюта,
	ВЫБОР
		КОГДА Цены.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка = Цены.Номенклатура.ЕдиницаИзмерения
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Упаковка)
				И Цены.Упаковка.Числитель <> 0
				И Цены.Упаковка.Знаменатель <> 0
			ТОГДА ВЫРАЗИТЬ(Цены.Цена * Цены.Упаковка.Знаменатель / Цены.Упаковка.Числитель КАК ЧИСЛО(15, 2))
		ИНАЧЕ NULL
	КОНЕЦ КАК ЦенаЗаЕдиницу
ПОМЕСТИТЬ втЦеныНаДату
ИЗ
	втДействующие КАК Действующие
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
		ПО (Цены.Период = Действующие.ПериодЦены)
			И (Цены.Номенклатура = Действующие.Номенклатура)
			И (Цены.Характеристика = Действующие.ХарактеристикаЦены)
			И (Цены.ВидЦены = Действующие.ВидЦены)
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 6. Цена в документе против цены прайса и отклонение. Сравнение выполняется, только
//    когда валюта и учет НДС в цене совпадают, иначе причина в колонке Примечание.
ВЫБРАТЬ
	Строки.Дата КАК Дата,
	Строки.Документ КАК Документ,
	Строки.Номенклатура КАК Номенклатура,
	Строки.Характеристика КАК Характеристика,
	Строки.ВидЦены КАК ВидЦены,
	Строки.ЦенаВДокументе КАК ЦенаВДокументе,
	Цены.ЦенаЗаЕдиницу КАК ЦенаПоПрайсу,
	Действующие.ПериодЦены КАК ДатаЦены,
	ВЫБОР
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА 0
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА 0
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА 0
		ИНАЧЕ Строки.ЦенаВДокументе - Цены.ЦенаЗаЕдиницу
	КОНЕЦ КАК Отклонение,
	ВЫБОР
		КОГДА Строки.ВидЦены = ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка)
			ТОГДА "в строке не указан вид цены, задайте его в отборе"
		КОГДА Действующие.ПериодЦены ЕСТЬ NULL
			ТОГДА "нет цены на дату документа"
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА "цена прайса задана в другой единице измерения, сравните вручную"
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА "валюта прайса и документа разная"
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА "НДС в цене учтен по-разному"
		ИНАЧЕ &ПустаяСтрока
	КОНЕЦ КАК Примечание
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втДействующие КАК Действующие
		ПО (Действующие.Документ = Строки.Документ)
			И (Действующие.НомерСтроки = Строки.НомерСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНаДату КАК Цены
		ПО (Цены.Документ = Строки.Документ)
			И (Цены.НомерСтроки = Строки.НомерСтроки)

УПОРЯДОЧИТЬ ПО
	Строки.Дата,
	Строки.Документ,
	Строки.НомерСтроки
// Цена в каждой строке реализации против цены прайса, действовавшей на дату документа.
// Срез последних цен берется не на одну дату, а на дату каждого документа отдельно:
// виртуальная таблица СрезПоследних так не умеет, поэтому период цены ищется соединением.

// 1. Вид цены, заданный в отборе по наименованию. Если отбор пустой, таблица пустая,
//    и дальше берется вид цены из строки документа.
ВЫБРАТЬ ПЕРВЫЕ 1
	ВидыЦен.Ссылка КАК ВидЦены
ПОМЕСТИТЬ втВидЦеныИзОтбора
ИЗ
	Справочник.ВидыЦен КАК ВидыЦен
ГДЕ
	ВидыЦен.Наименование = &НаименованиеВидаЦены
	И &НаименованиеВидаЦены <> &ПустаяСтрока
	И НЕ ВидыЦен.ПометкаУдаления
;

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

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

// 4. Какая цена действует: на характеристику строки, если она задана, иначе общая.
ВЫБРАТЬ
	Строки.Документ КАК Документ,
	Строки.НомерСтроки КАК НомерСтроки,
	Строки.Номенклатура КАК Номенклатура,
	Строки.ВидЦены КАК ВидЦены,
	ВЫБОР
		КОГДА ПоХарактеристике.Период ЕСТЬ NULL
			ТОГДА ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		ИНАЧЕ Строки.Характеристика
	КОНЕЦ КАК ХарактеристикаЦены,
	ЕСТЬNULL(ПоХарактеристике.Период, Общая.Период) КАК ПериодЦены
ПОМЕСТИТЬ втДействующие
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК ПоХарактеристике
		ПО (ПоХарактеристике.Документ = Строки.Документ)
			И (ПоХарактеристике.НомерСтроки = Строки.НомерСтроки)
			И (ПоХарактеристике.ХарактеристикаЦены = Строки.Характеристика)
			И (Строки.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК Общая
		ПО (Общая.Документ = Строки.Документ)
			И (Общая.НомерСтроки = Строки.НомерСтроки)
			И (Общая.ХарактеристикаЦены = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 5. Запись регистра цен, действующая на дату документа, с ценой за базовую единицу.
//    Цена в регистре задана за упаковку из ресурса Упаковка. Пустая упаковка или сама
//    единица измерения товара означают базовую единицу. Упаковка типа "Упаковка"
//    пересчитывается через числитель и знаменатель. Другие единицы (вес, длина, штуки,
//    отличные от единицы товара) не пересчитываются: сравнение для них не выполняется.
ВЫБРАТЬ
	Действующие.Документ КАК Документ,
	Действующие.НомерСтроки КАК НомерСтроки,
	Цены.Валюта КАК Валюта,
	ВЫБОР
		КОГДА Цены.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка = Цены.Номенклатура.ЕдиницаИзмерения
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Упаковка)
				И Цены.Упаковка.Числитель <> 0
				И Цены.Упаковка.Знаменатель <> 0
			ТОГДА ВЫРАЗИТЬ(Цены.Цена * Цены.Упаковка.Знаменатель / Цены.Упаковка.Числитель КАК ЧИСЛО(15, 2))
		ИНАЧЕ NULL
	КОНЕЦ КАК ЦенаЗаЕдиницу
ПОМЕСТИТЬ втЦеныНаДату
ИЗ
	втДействующие КАК Действующие
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
		ПО (Цены.Период = Действующие.ПериодЦены)
			И (Цены.Номенклатура = Действующие.Номенклатура)
			И (Цены.Характеристика = Действующие.ХарактеристикаЦены)
			И (Цены.ВидЦены = Действующие.ВидЦены)
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 6. Цена в документе против цены прайса и отклонение. Сравнение выполняется, только
//    когда валюта и учет НДС в цене совпадают, иначе причина в колонке Примечание.
ВЫБРАТЬ
	Строки.Дата КАК Дата,
	Строки.Документ КАК Документ,
	Строки.Номенклатура КАК Номенклатура,
	Строки.Характеристика КАК Характеристика,
	Строки.ВидЦены КАК ВидЦены,
	Строки.ЦенаВДокументе КАК ЦенаВДокументе,
	Цены.ЦенаЗаЕдиницу КАК ЦенаПоПрайсу,
	Действующие.ПериодЦены КАК ДатаЦены,
	ВЫБОР
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА 0
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА 0
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА 0
		ИНАЧЕ Строки.ЦенаВДокументе - Цены.ЦенаЗаЕдиницу
	КОНЕЦ КАК Отклонение,
	ВЫБОР
		КОГДА Строки.ВидЦены = ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка)
			ТОГДА "в строке не указан вид цены, задайте его в отборе"
		КОГДА Действующие.ПериодЦены ЕСТЬ NULL
			ТОГДА "нет цены на дату документа"
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА "цена прайса задана в другой единице измерения, сравните вручную"
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА "валюта прайса и документа разная"
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА "НДС в цене учтен по-разному"
		ИНАЧЕ &ПустаяСтрока
	КОНЕЦ КАК Примечание
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втДействующие КАК Действующие
		ПО (Действующие.Документ = Строки.Документ)
			И (Действующие.НомерСтроки = Строки.НомерСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНаДату КАК Цены
		ПО (Цены.Документ = Строки.Документ)
			И (Цены.НомерСтроки = Строки.НомерСтроки)

УПОРЯДОЧИТЬ ПО
	Строки.Дата,
	Строки.Документ,
	Строки.НомерСтроки
// Цена в каждой строке реализации против цены прайса, действовавшей на дату документа.
// Срез последних цен берется не на одну дату, а на дату каждого документа отдельно:
// виртуальная таблица СрезПоследних так не умеет, поэтому период цены ищется соединением.

// 1. Вид цены, заданный в отборе по наименованию. Если отбор пустой, таблица пустая,
//    и дальше берется вид цены из строки документа.
ВЫБРАТЬ ПЕРВЫЕ 1
	ВидыЦен.Ссылка КАК ВидЦены
ПОМЕСТИТЬ втВидЦеныИзОтбора
ИЗ
	Справочник.ВидыЦен КАК ВидыЦен
ГДЕ
	ВидыЦен.Наименование = &НаименованиеВидаЦены
	И &НаименованиеВидаЦены <> &ПустаяСтрока
	И НЕ ВидыЦен.ПометкаУдаления
;

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

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

// 4. Какая цена действует: на характеристику строки, если она задана, иначе общая.
ВЫБРАТЬ
	Строки.Документ КАК Документ,
	Строки.НомерСтроки КАК НомерСтроки,
	Строки.Номенклатура КАК Номенклатура,
	Строки.ВидЦены КАК ВидЦены,
	ВЫБОР
		КОГДА ПоХарактеристике.Период ЕСТЬ NULL
			ТОГДА ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		ИНАЧЕ Строки.Характеристика
	КОНЕЦ КАК ХарактеристикаЦены,
	ЕСТЬNULL(ПоХарактеристике.Период, Общая.Период) КАК ПериодЦены
ПОМЕСТИТЬ втДействующие
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК ПоХарактеристике
		ПО (ПоХарактеристике.Документ = Строки.Документ)
			И (ПоХарактеристике.НомерСтроки = Строки.НомерСтроки)
			И (ПоХарактеристике.ХарактеристикаЦены = Строки.Характеристика)
			И (Строки.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
		ЛЕВОЕ СОЕДИНЕНИЕ втПериоды КАК Общая
		ПО (Общая.Документ = Строки.Документ)
			И (Общая.НомерСтроки = Строки.НомерСтроки)
			И (Общая.ХарактеристикаЦены = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 5. Запись регистра цен, действующая на дату документа, с ценой за базовую единицу.
//    Цена в регистре задана за упаковку из ресурса Упаковка. Пустая упаковка или сама
//    единица измерения товара означают базовую единицу. Упаковка типа "Упаковка"
//    пересчитывается через числитель и знаменатель. Другие единицы (вес, длина, штуки,
//    отличные от единицы товара) не пересчитываются: сравнение для них не выполняется.
ВЫБРАТЬ
	Действующие.Документ КАК Документ,
	Действующие.НомерСтроки КАК НомерСтроки,
	Цены.Валюта КАК Валюта,
	ВЫБОР
		КОГДА Цены.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка = Цены.Номенклатура.ЕдиницаИзмерения
			ТОГДА Цены.Цена
		КОГДА Цены.Упаковка.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Упаковка)
				И Цены.Упаковка.Числитель <> 0
				И Цены.Упаковка.Знаменатель <> 0
			ТОГДА ВЫРАЗИТЬ(Цены.Цена * Цены.Упаковка.Знаменатель / Цены.Упаковка.Числитель КАК ЧИСЛО(15, 2))
		ИНАЧЕ NULL
	КОНЕЦ КАК ЦенаЗаЕдиницу
ПОМЕСТИТЬ втЦеныНаДату
ИЗ
	втДействующие КАК Действующие
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
		ПО (Цены.Период = Действующие.ПериодЦены)
			И (Цены.Номенклатура = Действующие.Номенклатура)
			И (Цены.Характеристика = Действующие.ХарактеристикаЦены)
			И (Цены.ВидЦены = Действующие.ВидЦены)
ИНДЕКСИРОВАТЬ ПО
	Документ,
	НомерСтроки
;

// 6. Цена в документе против цены прайса и отклонение. Сравнение выполняется, только
//    когда валюта и учет НДС в цене совпадают, иначе причина в колонке Примечание.
ВЫБРАТЬ
	Строки.Дата КАК Дата,
	Строки.Документ КАК Документ,
	Строки.Номенклатура КАК Номенклатура,
	Строки.Характеристика КАК Характеристика,
	Строки.ВидЦены КАК ВидЦены,
	Строки.ЦенаВДокументе КАК ЦенаВДокументе,
	Цены.ЦенаЗаЕдиницу КАК ЦенаПоПрайсу,
	Действующие.ПериодЦены КАК ДатаЦены,
	ВЫБОР
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА 0
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА 0
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА 0
		ИНАЧЕ Строки.ЦенаВДокументе - Цены.ЦенаЗаЕдиницу
	КОНЕЦ КАК Отклонение,
	ВЫБОР
		КОГДА Строки.ВидЦены = ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка)
			ТОГДА "в строке не указан вид цены, задайте его в отборе"
		КОГДА Действующие.ПериодЦены ЕСТЬ NULL
			ТОГДА "нет цены на дату документа"
		КОГДА Цены.ЦенаЗаЕдиницу ЕСТЬ NULL
			ТОГДА "цена прайса задана в другой единице измерения, сравните вручную"
		КОГДА Цены.Валюта <> Строки.ВалютаДокумента
			ТОГДА "валюта прайса и документа разная"
		КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС
			ТОГДА "НДС в цене учтен по-разному"
		ИНАЧЕ &ПустаяСтрока
	КОНЕЦ КАК Примечание
ИЗ
	втСтроки КАК Строки
		ЛЕВОЕ СОЕДИНЕНИЕ втДействующие КАК Действующие
		ПО (Действующие.Документ = Строки.Документ)
			И (Действующие.НомерСтроки = Строки.НомерСтроки)
		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНаДату КАК Цены
		ПО (Цены.Документ = Строки.Документ)
			И (Цены.НомерСтроки = Строки.НомерСтроки)

УПОРЯДОЧИТЬ ПО
	Строки.Дата,
	Строки.Документ,
	Строки.НомерСтроки

В Управлении торговлей вид цены обычно записан в строке реализации, поле отбора можно оставить пустым. Если в строке вида цены нет, такая строка помечена в колонке Примечание.

Обработка для Управление торговлей 11.5.27.70Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

В Комплексной автоматизации строки реализаций обычно без вида цены: укажите наименование вида цены в отборе обработки, иначе строки будут с пометкой "в строке не указан вид цены".

Обработка для Комплексная автоматизация 2.5.27.93Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

В релизе 2.5.25 текст запроса тот же, что в 2.5.27: регистр ЦеныНоменклатуры и табличная часть Товары реализации совпадают. Вид цены в строках реализаций обычно не заполнен, укажите его в отборе.

Обработка для Комплексная автоматизация 2.5.25.85Открыть через "Файл, Открыть", выбрать даты, нажать "Сформировать результат". Ничего не пишет в базу, работает от прав пользователя.
Скачать .epf

Что учесть

Как воспользоваться

  1. Выберите вкладку своей конфигурации над кодом: под каждой лежит запрос, выполненный именно в этой конфигурации.
  2. Скачайте обработку под ней и откройте в 1С через "Файл, Открыть". Форма покажет поля отбора, результат появится в той же форме таблицей.
  3. Нужно иначе: скопируйте запрос кнопкой над кодом и подставьте в консоль запросов или в свою обработку. Все параметры перечислены в тексте, значения по умолчанию видны в обработке.
  4. Хотите то же самое, но под свою базу и свои поля: подключите базу к мосту и попросите ИИ доработать этот запрос. Он увидит структуру вашей конфигурации и проверит результат на ваших данных.
Свои задачи таким же способом. Подключение занимает около пятнадцати минут: обработка из кабинета, ключ, готовый текст для ИИ. При регистрации даются три дня работы одной базы, карта не нужна.
Подключить свою базу Другие решения

Комментарии

Нашли ошибку в коде, знаете, как лучше, или запрос повел себя иначе в вашей конфигурации: напишите. Комментарии открываются после проверки, на вопросы отвечаем здесь же. Реклама и ссылки на посторонние сайты не проходят.