Срез последних цен на дату каждого документа: цена продажи против прайса в УТ 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 ТОГДА "цена прайса задана в другой единице измерения, сравните вручную" КОГДА Цены.Валюта <> Строки.ВалютаДокумента ТОГДА "валюта прайса и документа разная" КОГДА Строки.ВидЦены.ЦенаВключаетНДС <> Строки.ЦенаДокументаСНДС ТОГДА "НДС в цене учтен по-разному" ИНАЧЕ &ПустаяСтрока КОНЕЦ КАК Примечание ИЗ втСтроки КАК Строки ЛЕВОЕ СОЕДИНЕНИЕ втДействующие КАК Действующие ПО (Действующие.Документ = Строки.Документ) И (Действующие.НомерСтроки = Строки.НомерСтроки) ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНаДату КАК Цены ПО (Цены.Документ = Строки.Документ) И (Цены.НомерСтроки = Строки.НомерСтроки) УПОРЯДОЧИТЬ ПО Строки.Дата, Строки.Документ, Строки.НомерСтроки
В Управлении торговлей вид цены обычно записан в строке реализации, поле отбора можно оставить пустым. Если в строке вида цены нет, такая строка помечена в колонке Примечание.
В Комплексной автоматизации строки реализаций обычно без вида цены: укажите наименование вида цены в отборе обработки, иначе строки будут с пометкой "в строке не указан вид цены".
В релизе 2.5.25 текст запроса тот же, что в 2.5.27: регистр ЦеныНоменклатуры и табличная часть Товары реализации совпадают. Вид цены в строках реализаций обычно не заполнен, укажите его в отборе.
Что учесть
- Вид цены задается в отборе по наименованию. Если поле пустое, берется вид цены из строки документа. В Комплексной автоматизации строки реализаций часто без вида цены, там его стоит указать.
- Сравнение выполняется, только когда валюта прайса совпадает с валютой документа и НДС в цене учтен одинаково в документе и в виде цены. Иначе отклонение равно нулю, а причина написана в колонке Примечание.
- Цены в весовых, объемных и прочих единицах, отличных от единицы товара, не пересчитываются: такие строки помечены, их проще сверить вручную.
- Сравнивается цена из колонки Цена строки документа. Скидки по строке в нее не входят.
- Используется регистр ЦеныНоменклатуры. Если в базе включен регистр ЦеныНоменклатуры25, у него другие имена измерений (ХарактеристикаЦО, УпаковкаЦО): текст запроса нужно адаптировать.
Как воспользоваться
- Выберите вкладку своей конфигурации над кодом: под каждой лежит запрос, выполненный именно в этой конфигурации.
- Скачайте обработку под ней и откройте в 1С через "Файл, Открыть". Форма покажет поля отбора, результат появится в той же форме таблицей.
- Нужно иначе: скопируйте запрос кнопкой над кодом и подставьте в консоль запросов или в свою обработку. Все параметры перечислены в тексте, значения по умолчанию видны в обработке.
- Хотите то же самое, но под свою базу и свои поля: подключите базу к мосту и попросите ИИ доработать этот запрос. Он увидит структуру вашей конфигурации и проверит результат на ваших данных.
Комментарии
Нашли ошибку в коде, знаете, как лучше, или запрос повел себя иначе в вашей конфигурации: напишите. Комментарии открываются после проверки, на вопросы отвечаем здесь же. Реклама и ссылки на посторонние сайты не проходят.