[РЕШЕНО] Вытащить предыдущую цену

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Leks, 10 янв 2017.

  1. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    Приветствую! Пытаюсь в табличную часть обработки ПечатьЦенников вытащить ещё одну цену - предыдущую. Подскажите пожалуйста, куда смотреть. Спасибо.
  2. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Смотреть в монитор, руки держать на клавиатуре. Такой ответ сойдёт? Вы из пытаюсь что сделали, кроме того что пост тут составили? Как вы это делаете? Что у вас не получается? Что вы вообще подразумеваете под словом пытаюсь? Ждём вразумительного развёрнутого вопроса.
  3. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    на данном этапе я нашёл обработку ПечатьЦенников. В макете есть ссылка на источник <Цена>. Пока застрял здесь. Не пойму откуда она берёться...
  4. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Ок, уже не плохо, а вы вообще имеете представление как заполняются макеты? Думаю стоит посмотреть в эту сторону, там либо параметр "Цена" заполняется напрямую, либо через параметр макета заполнить
    ПараметрыМакетаТабличногоДокумента
    Заполнить(<Объект>)
  5. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    На данный момент разобрался вот с чем. Есть такая последовательность процедур

    Код:
    Процедура ПриОткрытии()
    
    Перем ЗаполнитьЦены;
    
    Перем НастройкиПостроителя;
    
    Валюта = Справочники.Валюты.НайтиПоКоду("980");
    //Организация = Справочники.Организации.НайтиПоКоду("000000001");
    ПечатьУзкихЦенников = Ложь;
    ОрганизацияПриИзменении(ЭлементыФормы.Организация);
    Если Не Константы.ИспользоватьХарактеристикиНоменклатуры.Получить() Тогда
    Колонка  = ЭлементыФормы.Товары.Колонки.ХарактеристикаНоменклатуры;
    Колонка.Видимость  = Ложь;
    Колонка.ИзменятьВидимость = Ложь;
    КонецЕсли;
    
    СтруктураНастроек = ВосстановитьЗначение("Обработка.ПечатьЦенников.Настройки");
    Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
    //СтруктураНастроек.Свойство("Организация", Организация);
    СтруктураНастроек.Свойство("ТипЦен", ТипЦен);
    СтруктураНастроек.Свойство("Валюта", Валюта);
    СтруктураНастроек.Свойство("ТолькоИмеющиесяВНаличии", ТолькоИмеющиесяВНаличии);
    СтруктураНастроек.Свойство("НастройкиПостроителя", НастройкиПостроителя);
    КонецЕсли;
    //Организация = Справочники.Организации.ПустаяСсылка();
    ЗаполнитьПостроительОтчета();
    
    Если НастройкиПостроителя <> Неопределено Тогда
    ПостроительОтчета.УстановитьНастройки(НастройкиПостроителя);
    КонецЕсли;
    
    Если ТипЗнч(Параметр) = Тип("Структура") Тогда
    Параметр.Свойство("ЗаполнитьЦены", ЗаполнитьЦены);
    
    Если ЗаполнитьЦены = Истина Тогда
    Если ПроверитьПараметрыЗаполненияЦен() Тогда
    ПерезаполнитьЦены();
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    КонецПроцедуры // ПриОткрытии()

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

    Ну и собственно вывод в таблицу.
    Код:
    Процедура ПерезаполнитьЦены() Экспорт
    
     СтруктураЗначений = Новый Структура;
     СтруктураЗначений.Вставить("НовыйТипЦен", ТипЦен);
    
     ЗапросПоЦенам = Ценообразование.СформироватьЗапросПоЦенам(СтруктураЗначений,
      Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры,
      Товары.ВыгрузитьКолонку("Номенклатура"),
      РабочаяДата,
      Неопределено).Выгрузить();
     ЗапросПоЦенам.Индексы.Добавить("Номенклатура");
    
     ПустаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
     ТипЦенРассчитывается = ТипЦен.Рассчитывается;
    
     СтруктураКурса = МодульВалютногоУчета.ПолучитьКурсВалюты(Валюта, РабочаяДата);
     Курс = СтруктураКурса.Курс;
     Кратность = СтруктураКурса.Кратность;
    
     Для Каждого СтрокаТовара Из Товары Цикл
     ХарактеристикаНоменклатуры = СтрокаТовара.ХарактеристикаНоменклатуры;
    
     СтруктураПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);
    
     СтрокиЦен = ЗапросПоЦенам.НайтиСтроки(СтруктураПоиска);
    
     СтрокаБезХарактеристики = Неопределено;
     СтрокаСХарактеристикой = Неопределено;
    
     Для Каждого СтрокаЦен Из СтрокиЦен Цикл
     Если СтрокаЦен.ХарактеристикаНоменклатуры = ПустаяХарактеристика Тогда
     СтрокаБезХарактеристики = СтрокаЦен;
     ИначеЕсли СтрокаЦен.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры Тогда
     СтрокаСХарактеристикой = СтрокаЦен;
     КонецЕсли;
     КонецЦикла;
    
     Если СтрокаСХарактеристикой <> Неопределено Тогда
     НайденнаяСтрока = СтрокаСХарактеристикой;
     ИначеЕсли СтрокаБезХарактеристики <> Неопределено Тогда
     НайденнаяСтрока = СтрокаБезХарактеристики;
     Иначе
     НайденнаяСтрока = Неопределено;
     КонецЕсли;
    
     Если (НайденнаяСтрока <> Неопределено) И (НайденнаяСтрока.Цена <> 0) Тогда
     Цена = НайденнаяСтрока.Цена * (1 + ?(ТипЦенРассчитывается, НайденнаяСтрока.ПроцентСкидкиНаценки / 100, 0));
     Цена = Ценообразование.ОкруглитьЦену(Цена, ТипЦен.ПорядокОкругления, ТипЦен.ОкруглятьВБольшуюСторону);
     Цена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(Цена, НайденнаяСтрока.ВалютаЦены, Валюта, Курс, Кратность);
    
     СтрокаТовара.ЕдиницаИзмерения = НайденнаяСтрока.ЕдиницаИзмеренияЦены;
     Иначе
     Цена = 0;
     КонецЕсли;
    
     СтрокаТовара.Цена = Цена;
     КонецЦикла;
    
    КонецПроцедуры // ПерезаполнитьЦены()
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    Может все-таки проще делать срез на определенную дату ?
  7. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Alex, я хотел к этому подвести, но скорее всего у человека уровень совсем не тот, и тут нужно будет не срез последних делать, вернее не только.
    Если ему нужна предыдущая цена, то как я вижу нужно будет вязать две таблицы. Первая это срез последних чтобы узнать период последней цены, а потом ей связывать опять же со срезом последних накладывая на первую в связи условием что период меньше, но пока тоже не уверен.
  8. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    Да, у человека уровень не тот. Как мне это видится на примере запроса из дбф: нужно взять две последних цены из таблицы отсортированной по дате цены. Последняя цена - это актуальная, предпоследняя - предыдущая.
  9. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Такой запрос вы сможете сделать только к конкретной позиции, если у вас список позиций то будет тяжело если возможно
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    Можно еще немного схитрить, выбрать две записи из регистра и упроядочить по дате, далее брать нужное значение (с учетом последней записи), но сами видите, это тоже немного заморочено. Хотя можно написать функцию, которая все это обрабатывает и возвращает предпоследнюю запись - дату среза (хотя тоже есть над чем подумать)
  11. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Тут согласен, но я описал нюанс, если будет массив товаров то так не получится, необходимо будет для каждого товара в цикле вопрос выполнять.
    alexburn нравится это.
  12. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.143
    Симпатии:
    553
    Баллы:
    204
    О том и речь, что для разных товаров может быть разная дата установки цен. Как вариант делать функцию, которая будет возвращать предпоследнюю цену с отбором по каждой позиции.
  13. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.276
    Симпатии:
    839
    Баллы:
    204
    Решаемо :)
    Делаешь нумерацию строк таблицы с ценами, выбираешь по 2 строки каждой комбинации с обратным упорядочиванием по периоду.
  14. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    Вадим может я и не прав, но насколько я сталкивался выбор Первые работает на всю выборку а не на комбинации и выберет просто две первые записи, это я про вариант если несколько номенклатур
  15. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    Чтобы не вносить изменений в оригинальный код, это должна быть отдельная процедура которая будет заполнять столбец в таблице, из которой уже будут браться данные в ценник. Пока изучаю отдельный вариант выборки предпоследней цены.
  16. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.276
    Симпатии:
    839
    Баллы:
    204
    Александр, я не говорил про ВЫБРАТЬ ПЕРВЫЕ :)
    Выбрать по 2 строки возможно, используя левое соединение/группировку + ИМЕЮЩИЕ
  17. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    http://infostart.ru/public/185506/ Вот на инфостарте нашёл то, что надо, но опыта у меня не хватает чтобы слепить это во что-то работающее, да и примеры там упрощены Прошу у вас помощи.
    Цитирую:
    У новичков часто возникает вопрос как получить предыдущую цену или как получить предпоследнее значение из регистра сведений.

    В данной публикации я на примере опишу как это можно сделать


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

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

    P.P.S Также приложил отчет для 8.2, протестировано на 8.2 УФ, в обычном режиме нужно будет выбрать вид цен через кнопку настройки.
  18. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    Скачал обработку "Консоль запросов". Покачто разобрался с запросом:
    Код:
    ВЫБРАТЬ ПЕРВЫЕ 2
        ЦеныНоменклатуры.Номенклатура.Код КАК НоменклатураКод,
        ЦеныНоменклатуры.Номенклатура.Наименование КАК НоменклатураНаименование,
        ЦеныНоменклатуры.Цена,
        ЦеныНоменклатуры.ТипЦен.Наименование
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
        ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная"
    
    УПОРЯДОЧИТЬ ПО
        НоменклатураКод,
        НоменклатураНаименование,
        ЦеныНоменклатуры.Период УБЫВ
    Но почему-то запрос считает пару секунд.
  19. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.125
    Симпатии:
    83
    Баллы:
    54
    А сколько он должен считать? у у вас сортирует, по коду , наименованию и дате все цены с типом Розничная и выбирает первые две записи
  20. TopicStarter Overlay
    Leks
    Offline

    Leks Новичок в 1С

    Регистрация:
    10 янв 2017
    Сообщения:
    18
    Симпатии:
    1
    Баллы:
    4
    да, забыл указать конкретную позицию. Почему-то решил что сначала идёт выборка 2х первых записей из номенклатуры.

Поделиться этой страницей