Имя: Пароль:
1C
1С v8
Получить запросом периоды действия цены
0 Любопытная
 
24.06.14
17:33
Здравствуйте.
Имеется таблица значений: Номенклатура, ДатаНачалаПериода, ДатаОкончанияПериода. И еще имеется регистр сведений ЦеныНоменклатуры, независимый, с периодичностью в день. Необходимо получить периоды действия цены номенклатуры за заданный период.
Т.е. если период задан датами 01.06 - 30.06, а цена номенклатуры менялась 01.06 и 10.06, то в результате получится два периода 01.06-09.06 и 10.06-30.06.
Очень хочется получить эту таблицу сразу в запросе, но никак не могу понять, как это сделать.
Подкиньте идею, дорогие товарищи, будьте так любезны :)
1 dj_serega
 
24.06.14
17:37
регламентированный календарь заполнен?
2 Любопытная
 
24.06.14
17:39
(1) Допустим, что он есть и заполнен. А зачем он?
3 dj_serega
 
24.06.14
17:58
(2) Хотя да :))) не туда подумал...

ВЫБРАТЬ
    ЦеныПродуктов.Период,
    ЦеныПродуктов.Цена,
    ЦеныПродуктов.Продукт
ПОМЕСТИТЬ ВыборкаЦен
ИЗ
    РегистрСведений.ЦеныПродуктов КАК ЦеныПродуктов
ГДЕ
    ЦеныПродуктов.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И ЦеныПродуктов.Продукт = &Продукт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныПродуктовСрезПоследних.Период,
    ЦеныПродуктовСрезПоследних.Цена,
    ЦеныПродуктовСрезПоследних.Продукт
ИЗ
    РегистрСведений.ЦеныПродуктов.СрезПоследних(&НачалоПериода, Продукт = &Продукт) КАК ЦеныПродуктовСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныПродуктовСрезПервых.Период,
    ЦеныПродуктовСрезПервых.Цена,
    ЦеныПродуктовСрезПервых.Продукт
ИЗ
    РегистрСведений.ЦеныПродуктов.СрезПервых(&КонецПериода, Продукт = &Продукт) КАК ЦеныПродуктовСрезПервых
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВыборкаЦен.Период КАК Период,
    ВыборкаЦен.Цена,
    ВыборкаЦен.Продукт
ИЗ
    ВыборкаЦен КАК ВыборкаЦен

УПОРЯДОЧИТЬ ПО
    Период
4 Скай
 
24.06.14
18:03
(3) И где в твоем запросе конец периода действия?
Последнюю таблицу нужно соединить саму с собой по условию ВыборкаЦен1.Период<ВыборкаЦен2.Период, И взять минимум по второму периоду. Вроде так, на вскидку.
5 dj_serega
 
24.06.14
18:08
(4) Так конец периода это будет -1 секунда следующего периода :)
А такой запросец учили писать на курсах на спеца по платформе :)
6 Любопытная
 
24.06.14
18:10
(3)Что-то тут не так. Мне нужно в конечной таблице поиметь Начало период, конец периода, цена.
Я могу получить все цены за период вместе с их датами регистрации, мне надо потом первоначально заданный период разбить на кусочки, согласно датам регистрации цен, и вот эта часть у меня не получается.
Хотя может я вообще не в ту сторону думаю
7 Скай
 
24.06.14
18:11
(5) То, что у тебя все отсортировано по порядку - это прекрасно, но ТС конкретно пишет, что таблицу требуемого вида(Ном, НачалоПериода, КонецПериода) нужно получить в запросе.
8 Скай
 
24.06.14
18:11
(6) в (4) же все написано
9 Enders
 
24.06.14
18:15
(0)
А получить таблицу Типа: Период,Номенклатура,Цена
После чего сгруппировать по номенклатуре и цене
и рассчитать Минимум(период) и Максимум(Период), вариант?
Или у вас может быть заведен документ установки цен, а цена на товар не изменится?
10 Любопытная
 
24.06.14
18:16
(7) Это мне страшно хочется получить все в запросе и не городить огороды с постобработкой результата. Но, если не получится, значит буду разбирать потом руками в цикле.
(8) Написала (6) до того, как прочитала (4).

Всем спасибо, попробуем применить советы на практике :)
11 Любопытная
 
24.06.14
18:18
(9) цены в регистр пишутся напрямую в регистр. Предположим, что они не повторяются, т.е. каждая запись несет в себе изменения.
Это не рабочая работа, это я учусь просто) Наткнулась на такую вот задачу, думала сделаю легко, а вот не получилось. Пришлось просить о помощи :)
Спасибо за внимание и участие :)
12 Скай
 
24.06.14
18:20
(9) И что даст твой запрос, если одна и та же цена была установлена на два разных периода? Оно сольет все в один?
13 Enders
 
24.06.14
18:22
(12) Да в один, по-этому я и уточнил.
14 Скай
 
24.06.14
18:23
(13) Ну так это не ситуация, когда есть установка цен, но цена не изменилась. Ситуацию
1 июня - 10 р
5 июня - 5 р
10 июня - 10 р
тоже не корректно обработает
15 Enders
 
24.06.14
18:28
(14) Туплю, не до конца продумал мысль)
Ну тогда как ты в (4) писал, соединить саму с собой по периоду и взять минимум. Просто я бы саму итоговую таблицу немного по другому получал. Хотя суть та же, согласен)
16 dj_serega
 
24.06.14
18:35
(4) Это имел ввиду?

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВыборкаЦен.Период КАК Период,
    МИНИМУМ(ДОБАВИТЬКДАТЕ(ВыборкаЦен1.Период, СЕКУНДА, -1)) КАК КонецПериода,
    МАКСИМУМ(ВыборкаЦен.Цена) КАК Цена
ИЗ
    ВыборкаЦен КАК ВыборкаЦен
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыборкаЦен КАК ВыборкаЦен1
        ПО ВыборкаЦен.Период < ВыборкаЦен1.Период

СГРУППИРОВАТЬ ПО
    ВыборкаЦен.Период

УПОРЯДОЧИТЬ ПО
    Период
17 Любопытная
 
24.06.14
18:39
(4) Это конечно замечательно, но по условиям задачи у меня  не одна номенклатура и один период, а целая таблица с номенклатурами и периодами. В таком варианте СрезПервых и СрезПоследних использовать не получится, если только не добавить условия, что все периоды в ТЗ укладываются в один определенный период (к примеру месяц) и изначально брать изменения за месяц. В таком случае, все равно придется обрабатывать после запроса.
Выходит, мое желание собрать все в запросе невыполнимо :( Печаль
18 Любопытная
 
24.06.14
18:41
ДА и вообще - поствила в параметрах период 15.06-30.06, а получила две записи регистра 01.06 и 23.06, т.е. те даты, в которые действительно менялась цена, к моим параметрам это не имеет никакого отношения :(
19 Enders
 
24.06.14
18:41
(17) Почему?) Выполнима
У тебя может быть как-то так
Ном1 01.05.2014 31.05.2014
Ном2 15.05.2014 15.06.2014?
20 Скай
 
24.06.14
18:42
Все выполнимо :)
21 Enders
 
24.06.14
18:43
(17) у тебя уже есть готовая ТЗ которую ты хочешь скормить запрос? Или эта ТЗ уже рассчитана в запросе и тебе требуется его дописать?
22 Любопытная
 
24.06.14
18:44
(19) Давайте считать, что в таблице может быть несколько записей по одной номенклатуре с разными периодами. Периоды по одной номенклатуре между собой не пересекаются, но укладываются в один месяц.
(21) Есть готовая ТЗ, которую я скармливаю в запрос.
23 Любопытная
 
24.06.14
18:47
(20) Наверное. Но пока я не познала это Дао, для меня это что-то из области фантастики.
24 Скай
 
24.06.14
18:51
(23) Ключевой момент - это связь таблицы самой с собой по условию больше/меньше, с последующим получением максимального или минимального периода. Запросы как правило тяжелые получаются.
25 Любопытная
 
24.06.14
18:51
(19) Может быть так:
Ном1 01.06.2014 10.06.2014
Ном1 15.06.2014 25.06.2014
Ном2 01.06.2014 30.06.2014

На Ном1 цены устанавливались 25.05 - 100; 23.06 - 200;
На Ном2 цены устанавливались 01.06 - 300; 10.06 - 150;

В итоге надо получить таблицу
Ном1 01.06 10.06 100
Ном1 15.06 22.06 100
Ном1 23.06 25.06 200
Ном2 01.06 09.06 300
Ном2 10.06 30.06 150
26 Любопытная
 
24.06.14
18:52
(24) Что значит Тяжелые - долго выполняются или для понимания сложные?
27 Жан Пердежон
 
24.06.14
19:00
(26) ничего нет там тяжелого, просто садишься и пишешь запрос
28 Скай
 
24.06.14
19:06
(26) Для выполнения на больших таблицах
29 Enders
 
24.06.14
19:08
(22) Ну в таком случае я б делал как-то так:
1. рассчитать период с

Выбрать
Минимум(ПериодС)
Из
&Тз как ТЗ

2. рассчитать период по

Выбрать
Максимум(периодПо)
Из
&Тз как ТЗ.

Пункты 1 и 2 использовать как параметры для запроса
3. Перевел бы вашу таблицу в вид
Период Номенклатура Товар
Можно получить Запросом к производственному календарю


    Выбрать
ТЗ.Номенклатура,
ТЗ.ПериодС,
ТЗ.ПериодПо
Поместить Таб
Из
&Тз как ТЗ
;
Выбрать
Календарь.Период,
Таб.номенклатура
Поместить ДатыТовары
Из
РегистрСведений.ПроизводственныйКалендарь(или как он там) как Календарь
Внутреннее соединение Таб как Таб
По Календарь.Период >=Таб.ПериодС
и Календарь.Период<=Таб.ПериодПо
;
Выбрать
ЦеныТоваровНаНачало.Период,
ЦеныТоваровНаНачало.Номенклатура,
ЦеныТоваровНаНачало.Цена
Поместить ЦеныЗаПериод
Из
регистрСведений.ЦеныТоваров.СрезПоследних(КонецПериода(&НачалоПериода,День),Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар)) как ЦеныТоваровНаНачало
//НачалоПериода и КонецПериода это даты рассчитанные в 1,2
Объединить Всё
Выбрать
ЦеныТоваровЗаПериод.Период,
ЦеныТоваровЗаПериод.Номенклатура,
ЦеныТоваровЗаПериод.Цена
Из
регистрСведений.ЦеныТоваров как ЦеныТоваровЗаПериод
Где
Период Между НачалоПериода(ДобавитьКДате(&НачалоПериода,День,1),День) И КонецПериода(&КонецПериода)
И
Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар)
;
ВЫбрать
ДатыТовар.Период,
ДатыТовар.Номенклатура,
Минимум(ЦеныЗаПериод.Период) как ПериодЦен
Поместить АктуальныеДатыЦен
Из
ДатыТовар
ЛевоеСоединение ЦеныЗаПериод
По ДатыТовар.Период>=ЦеныЗаПериод.Период
И ДатыТовар.Номенклатура = ЦеныЗаПериод.Номенклатура
Сгруппировать ПО
ДатыТовар.Период,
ДатыТовар.Номенклатура
;
выбрать
АктуальныеДатыЦен.Период,
АктуальныеДатыЦен.Номенклатура,
актуальныеДатыЦен.ПериодЦен,
Максимум(ЦеныЗаПериод.Цена) как Цена //Вдруг в 1 день 2 цены
Поместить Итог
Из
АктуальныеДатыЦен
Левое Соединение ЦеныЗаПериод
По АктуальныеДатыЦен.ПериодЦен=ЦеныЗаПериод.период
И АктуальныеДатыЦен.Номенклатура = ЦеныЗаПериод.Номенклатура
Сгруппировать По
АктуальныеДатыЦен.Период,
АктуальныеДатыЦен.Номенклатура,
актуальныеДатыЦен.ПериодЦен
;
Выбрать
Итог.Номенклутара,
Итог.Цена,
Минимум(Итог.Период) как ПериодС,
Максимум(Итог1.Период)как ПериодПо
Из Итог
Левое Соединение Итог как Итог1
По Итог.Номенклатура = Итог1.Номенклатура
И Итог.Период<Итог1.Период
И Итог.ПериодЦен <>Итог1.ПериодЦен
Сгруппировать По
Итог.Номенклатура,
Итог.Цена


Кажется в конце не додумал, но проверить не могу)
Или вообще бред написал)
30 Enders
 
24.06.14
19:08
Блин, ещё и в теги не влезло)
31 Любопытная
 
24.06.14
19:42
(29) Т.е. что у нас получается:
1.Получаем первую и последнюю даты из всех периодов ТЗ, будем использовать их для ограничения по периодам.
2.Для каждой номенклатуры из ТЗ получаем запись с каждой датой из периода (используем для этого производственный календарь)
3.Получаем актуальные цены на каждую дату из таблицы п.2
4.Как-то собираем периоды обратно в кучу, соединяя для этого таблицу с самой собой.

В итоге, как мне кажется, данные за весь месяц по каждой номенклатуре. От этого уже можно будет отталкиваться, выкидывая лишние периоды.
Вроде умозрительно так, но делать сейчас уже не возьмусь - лучше с утра на свежую голову перед работой.
(30) Спасибо большое.
Всем остальным, принявшим участие в обсуждении, тоже спасибо :) Как приятно, что в мире так много умных и в тоже время добрых и отзывчивых людей :)
32 Enders
 
25.06.14
14:07
(31) Суть вы уловили правильно ;)
Если несложно, отпишитесь о результатах. Просто интересно:)
33 Любопытная
 
25.06.14
17:47
(32) Ничего толкового не вышло. Жаль. Сейчас об этом думать не хочу, соберу циклами все, что надо для дальнейшего решения задачи, с запросом как-нибудь в следующей жизни повоюю
34 shuhard
 
25.06.14
17:49
(33) слабак женского полу вероятно слабачка
35 samozvanec
 
25.06.14
18:05
(0) вот чето такое делал когда-то давно, но не помню точно, что и как. вроде надо соединить таблицу цен с таблицей периодов 4 раза - 2 раза по период регистрации больше даты начала, 2 раза меньше даты окончания, при этом по очереди брать даты - в первый раз вместо начала период регистрации, во второй - вместо конца. и потом как то это дело группировать и отбирать. попробуй)
36 samozvanec
 
25.06.14
18:08
(35) не, не так...
37 Любопытная
 
25.06.14
18:15
(34) Что дальше?
38 Enders
 
25.06.14
18:19
(33) А в чем проблема?
Итоговую таблицу вы получили?
Проблема в соединении самой к себе или в чем?
39 Любопытная
 
25.06.14
18:21
(38) Ерунду получила в итоговой таблице. Просто натурально ерунду. Запрос не сохранила, запостить не удастся)
Ну да, я слабак, признаю. Ну и ладно)
40 Wobland
 
25.06.14
18:22
ВЫБРАТЬ
    Документ1ТабличнаяЧасть1.Номенклатура,
    Документ1ТабличнаяЧасть1.ДатаС,
    Документ1ТабличнаяЧасть1.ДатаПо
ПОМЕСТИТЬ ТЧ
ИЗ
    Документ.Документ1.ТабличнаяЧасть1 КАК Документ1ТабличнаяЧасть1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.Период
ПОМЕСТИТЬ ЦеныНаНачало
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            &ДатаС,
            Номенклатура В
                (ВЫБРАТЬ
                    ТЧ.Номенклатура
                ИЗ
                    ТЧ)) КАК ЦеныНоменклатурыСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена,
    ЦеныНоменклатуры.Период
ПОМЕСТИТЬ ИзмененияЦен
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.Период МЕЖДУ &ДатаС И &ДатаПо
    И ЦеныНоменклатуры.Номенклатура В
            (ВЫБРАТЬ
                ТЧ.Номенклатура
            ИЗ
                ТЧ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИзмененияЦен.Период,
    ИзмененияЦен.Номенклатура,
    ИзмененияЦен.Цена
ПОМЕСТИТЬ ИтоговыеЦены
ИЗ
    ИзмененияЦен КАК ИзмененияЦен

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныНаНачало.Период,
    ЦеныНаНачало.Номенклатура,
    ЦеныНаНачало.Цена
ИЗ
    ЦеныНаНачало КАК ЦеныНаНачало
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТЧ.Номенклатура,
    ТЧ.ДатаС,
    ТЧ.ДатаПо,
    ИтоговыеЦены.Период,
    ИтоговыеЦены.Цена
ИЗ
    ТЧ КАК ТЧ
        ЛЕВОЕ СОЕДИНЕНИЕ ИтоговыеЦены КАК ИтоговыеЦены
        ПО ТЧ.Номенклатура = ИтоговыеЦены.Номенклатура
41 Wobland
 
25.06.14
18:22
(40) смущает то, что подтягиваются прошлые цены
42 Wobland
 
25.06.14
18:22
(41) ну.. не из периода ТЧ документа
43 Enders
 
25.06.14
18:32
(40) Ещё раз присоединить цены
Только по условию что период второй таблицы больше периода первой таблицы цен.
Потом сгруппировать и получим:
Период первой таблицы это ДатаС, если она меньше чем датаДокумента - берём дату документа.
а период второй таблицы это датаПо, если его нет, то берём дату из документа.
Мб как, то так?)
44 Wobland
 
25.06.14
18:37
ступил.
ГДЕ
    ЦеныНоменклатурыСрезПоследних.Период  МЕЖДУ &ДатаС И &ДатаПо
это в срезе последних цен. вроде всё как надо
45 Wobland
 
25.06.14
18:38
цены на крайнюю дату в ТЧ ещё докрутить...
46 Enders
 
25.06.14
18:42
(44) А ты срез то берёшь на ДатуС какой период между?Оо
47 Wobland
 
25.06.14
18:47
(46) чтоб выкинуть цены, установленные в пятом году и не менявшиеся с тех пор. там же ещё измерение ТипЦены, я его тут не учитывал. да и вообще могу быть неправ ;)
48 Enders
 
25.06.14
18:54
(47) а зачем их выкидывать? они ж до сих пор актуальные, просто не будут влиять на итоговый период. Может как в (43)?)
Да и не совсем понятно, ты берёшь срез последних
на 01.06.2014 00:00:00
и тут же ставишь условие на период между 01.06.2014 и 01.07.2014? или я тут не допонял?)
49 Wobland
 
25.06.14
19:00
перегрелся я слегка. достаточно было фильтровать по типу цены (ну регистр у меня такой ;) и никаких где
50 Wobland
 
25.06.14
19:01
кстати, первым делом тупо скопипастил (29) - не взлетело
51 Enders
 
26.06.14
12:02
Вроде работает:
началоПериода и КонецПериода это пункт 1,2 из (29)

ВЫБРАТЬ
    &Ном1 КАК Номенклатура,
    &С1 КАК ПериодС,
    &По1 КАК ПериодПо
ПОМЕСТИТЬ ТЗ1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &Ном2,
    &С2,
    &По2
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена
ПОМЕСТИТЬ ЦеныНаНачало
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ),
            Номенклатура В
                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
                        ТЗ1.Номенклатура
                    ИЗ
                        ТЗ1)
                И т_Склад = &Склад
                И ТипЦен = &Тип) КАК ЦеныНоменклатурыСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Период,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
ПОМЕСТИТЬ ЦеныЗаПериод
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.Период МЕЖДУ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 1), ДЕНЬ) И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
    И ЦеныНоменклатуры.Номенклатура В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                ТЗ1.Номенклатура
            ИЗ
                ТЗ1)
    И ЦеныНоменклатуры.т_Склад = &Склад
    И ЦеныНоменклатуры.ТипЦен = &Тип
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНаНачало.Период,
    ЦеныНаНачало.Номенклатура,
    ЦеныНаНачало.Цена
ПОМЕСТИТЬ ИтогЦены
ИЗ
    ЦеныНаНачало КАК ЦеныНаНачало

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныЗаПериод.Период,
    ЦеныЗаПериод.Номенклатура,
    ЦеныЗаПериод.Цена
ИЗ
    ЦеныЗаПериод КАК ЦеныЗаПериод
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ЦеныНаНачало
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ЦеныЗаПериод
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТЗ1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДатыТовары.ДатаКалендаря,
    ДатыТовары.Номенклатура,
    ДатыТовары.ПериодС,
    ДатыТовары.ПериодПо,
    МАКСИМУМ(ЕСТЬNULL(ИтогЦены.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))) КАК ПериодЦен
ПОМЕСТИТЬ АктуальныеДатыЦен
ИЗ
    ДатыТовары КАК ДатыТовары
        ЛЕВОЕ СОЕДИНЕНИЕ ИтогЦены КАК ИтогЦены
        ПО ДатыТовары.ДатаКалендаря >= ИтогЦены.Период
            И ДатыТовары.Номенклатура = ИтогЦены.Номенклатура

СГРУППИРОВАТЬ ПО
    ДатыТовары.ДатаКалендаря,
    ДатыТовары.Номенклатура,
    ДатыТовары.ПериодС,
    ДатыТовары.ПериодПо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АктуальныеДатыЦен.ДатаКалендаря,
    АктуальныеДатыЦен.Номенклатура,
    АктуальныеДатыЦен.ПериодС,
    АктуальныеДатыЦен.ПериодПо,
    АктуальныеДатыЦен.ПериодЦен,
    МАКСИМУМ(ИтогЦены.Цена) КАК Цена
ПОМЕСТИТЬ Итог
ИЗ
    АктуальныеДатыЦен КАК АктуальныеДатыЦен
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИтогЦены КАК ИтогЦены
        ПО АктуальныеДатыЦен.ПериодЦен = ИтогЦены.Период
            И АктуальныеДатыЦен.Номенклатура = ИтогЦены.Номенклатура

СГРУППИРОВАТЬ ПО
    АктуальныеДатыЦен.ДатаКалендаря,
    АктуальныеДатыЦен.Номенклатура,
    АктуальныеДатыЦен.ПериодС,
    АктуальныеДатыЦен.ПериодПо,
    АктуальныеДатыЦен.ПериодЦен
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ИтогЦены
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ДатыТовары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Итог.ДатаКалендаря,
    Итог.Номенклатура,
    Итог.ПериодС,
    Итог.ПериодПо,
    Итог.ПериодЦен,
    Итог.Цена,
    МИНИМУМ(ЕСТЬNULL(АктуальныеДатыЦен.ПериодЦен, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))) КАК ПериодСледЦен
ПОМЕСТИТЬ ПоследняяТаблица
ИЗ
    Итог КАК Итог
        ЛЕВОЕ СОЕДИНЕНИЕ АктуальныеДатыЦен КАК АктуальныеДатыЦен
        ПО Итог.ПериодЦен < АктуальныеДатыЦен.ПериодЦен
            И Итог.Номенклатура = АктуальныеДатыЦен.Номенклатура

СГРУППИРОВАТЬ ПО
    Итог.ДатаКалендаря,
    Итог.Номенклатура,
    Итог.ПериодС,
    Итог.ПериодПо,
    Итог.ПериодЦен,
    Итог.Цена
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Итог
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ АктуальныеДатыЦен
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоследняяТаблица.ДатаКалендаря) КАК ДатаКалендаря,
    ПоследняяТаблица.Номенклатура КАК Номенклатура,
    ПоследняяТаблица.ПериодС,
    ПоследняяТаблица.ПериодПо,
    ВЫБОР
        КОГДА ПоследняяТаблица.ПериодЦен < ПоследняяТаблица.ПериодС
            ТОГДА ПоследняяТаблица.ПериодС
        ИНАЧЕ ПоследняяТаблица.ПериодЦен
    КОНЕЦ КАК НовыеПериодС,
    ПоследняяТаблица.Цена,
    ВЫБОР
        КОГДА ПоследняяТаблица.ПериодСледЦен = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА ПоследняяТаблица.ПериодПо
        ИНАЧЕ ПоследняяТаблица.ПериодСледЦен
    КОНЕЦ КАК НовыйПериодПо
ИЗ
    ПоследняяТаблица КАК ПоследняяТаблица

СГРУППИРОВАТЬ ПО
    ПоследняяТаблица.Номенклатура,
    ПоследняяТаблица.ПериодС,
    ПоследняяТаблица.ПериодПо,
    ВЫБОР
        КОГДА ПоследняяТаблица.ПериодЦен < ПоследняяТаблица.ПериодС
            ТОГДА ПоследняяТаблица.ПериодС
        ИНАЧЕ ПоследняяТаблица.ПериодЦен
    КОНЕЦ,
    ПоследняяТаблица.Цена,
    ВЫБОР
        КОГДА ПоследняяТаблица.ПериодСледЦен = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА ПоследняяТаблица.ПериодПо
        ИНАЧЕ ПоследняяТаблица.ПериодСледЦен
    КОНЕЦ

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    НовыеПериодС
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс