[РЕШЕНО] Эффективно получить данные из Рег. сведений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Robix, 22 июл 2014.

  1. TopicStarter Overlay
    Robix
    Offline

    Robix Опытный в 1С

    Регистрация:
    1 апр 2012
    Сообщения:
    107
    Симпатии:
    1
    Баллы:
    29
    Здравствуйте. Имеется запрос, который возвращает выгрузку по номенклатуре.
    Для каждого товара имеется два типа цен, которые после проведения документа по установке цен
    номенклатуры попадают в рег. сведений "ЦеныНоменклатуры"
    Мне нужно при обходе номенклатуры получать значения этих двух типов цен.
    Как видите я два раза обращаюсь к регистру сведений за каждым типом цен.

    Вопрос: Есть ли более оптимальный и быстрый вариант, чтобы приминительно к данному случаю получать из регистров цены ? Или этот способ единственно самый эффектиный?

    Код:
        КарточкиТЗ = Запрос.Выполнить().Выгрузить();
    
       
        Для Каждого Линия из КарточкиТЗ Цикл
           
            Карточка =  Линия.Карточка; //Карточка = Номенклатура.Ссылка       
            ЦенаНаКассе = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Цена на кассе");
            ЦенаДляБухгалтерии = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Цена для бухгалтерии");
           
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", Карточка); 
            Отбор.Вставить("ТипЦен", ЦенаНаКассе);
            
            //Первая цена
            РезультатЦенаНаКассе = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(),Отбор);
           
           
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", Карточка);
            Отбор.Вставить("ТипЦен", ЦенаДляБухгалтерии);
            //Вторая цена
            РезультатЦенаДляБухгалтерии = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(),Отбор);
           
           
        КонецЦикла;    
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    В условие передавать массив ваших типов цен. И лучше делать через запрос.
  3. LordMaverick
    Offline

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

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    а СрезПоследних не проще использовать? (в шапке ошибочное название регистра)
    upload_2014-7-22_21-36-19.png
  4. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    можно срез последних с отбором и соединить его с таблицей данных, но лучше (по производительности) - развернуть виртуальную таблицу среза последних в обычные вложенные запросы и сделать соединение во внутреннем запросе
  5. TopicStarter Overlay
    Robix
    Offline

    Robix Опытный в 1С

    Регистрация:
    1 апр 2012
    Сообщения:
    107
    Симпатии:
    1
    Баллы:
    29
    Ok. Буду пробовать. nickpugachev, а можете написать такой запрос какой вы имели ввиду, если не сложно, т.к. я еще не очень в запросах.
    p.s.
    Я выполняю это в БП 3.0. Там два типа цен создано и в документе установка цен номенклатуры сформированы движения в регистре сведений
    ЦеныНоменклатуры
  6. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    Код:
    ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        Номенклатура.Наименование,
        Номенклатура.Артикул
    ПОМЕСТИТЬ ТаблицаНоменклатуры
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПериодыСреза.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.Цена,
        ЦеныНоменклатуры.Валюта
    ПОМЕСТИТЬ ТаблицаЦен1
    ИЗ
        (ВЫБРАТЬ
            ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
        ИЗ
            ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                ПО (ЦеныНоменклатуры.ТипЦен = &ТипЦен1)
                    И ТаблицаНоменклатуры.Номенклатура = ЦеныНоменклатуры.Номенклатура
                    И (ЦеныНоменклатуры.Период <= &ПериодСреза)
                    И (ЦеныНоменклатуры.Активность)
       
        СГРУППИРОВАТЬ ПО
            ТаблицаНоменклатуры.Номенклатура) КАК ПериодыСреза
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО (ЦеныНоменклатуры.ТипЦен = &ТипЦен1)
                И ПериодыСреза.Номенклатура = ЦеныНоменклатуры.Номенклатура
                И ПериодыСреза.Период = ЦеныНоменклатуры.Период
    
    ИНДЕКСИРОВАТЬ ПО
        Номенклатура
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПериодыСреза.Номенклатура КАК Номенклатура,
        ЦеныНоменклатуры.Цена,
        ЦеныНоменклатуры.Валюта
    ПОМЕСТИТЬ ТаблицаЦен2
    ИЗ
        (ВЫБРАТЬ
            ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
        ИЗ
            ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                ПО (ЦеныНоменклатуры.ТипЦен = &ТипЦен2)
                    И ТаблицаНоменклатуры.Номенклатура = ЦеныНоменклатуры.Номенклатура
                    И (ЦеныНоменклатуры.Период <= &ПериодСреза)
                    И (ЦеныНоменклатуры.Активность)
       
        СГРУППИРОВАТЬ ПО
            ТаблицаНоменклатуры.Номенклатура) КАК ПериодыСреза
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО (ЦеныНоменклатуры.ТипЦен = &ТипЦен2)
                И ПериодыСреза.Номенклатура = ЦеныНоменклатуры.Номенклатура
                И ПериодыСреза.Период = ЦеныНоменклатуры.Период
    
    ИНДЕКСИРОВАТЬ ПО
        Номенклатура
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ТаблицаНоменклатуры.Номенклатура,
        ТаблицаНоменклатуры.Наименование,
        ТаблицаНоменклатуры.Артикул,
        ТаблицаЦен1.Цена КАК Цена1,
        ТаблицаЦен1.Валюта КАК ВалютаЦены1,
        ТаблицаЦен2.Цена КАК Цена2,
        ТаблицаЦен2.Валюта КАК ВалютаЦены2
    ИЗ
        ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
            ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЦен1 КАК ТаблицаЦен1
            ПО ТаблицаНоменклатуры.Номенклатура = ТаблицаЦен1.Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЦен2 КАК ТаблицаЦен2
            ПО ТаблицаНоменклатуры.Номенклатура = ТаблицаЦен2.Номенклатура
    
    первый запрос формирует временную таблицу с данными номенклатуры, которая вам нужна, второй и третий - соответствующие временные таблицы под ваши типы цен, чтобы обе цены можно было в одну строку итогового запроса получить (если этого не нужно, а достаточно по одной строке результата на каждый тип цен - то оставляется один запрос, а в условии соединения ставится ЦеныНоменклатуры.ТипЦен В (&ТипыЦен)
    четветрый запрос - соединяет первые три

    при таком соединении мы во-первых избегаем излишнего отбора во вложенном запросе, во-вторых, в случае с 8.3 попадаем в кластерный индекс, а в случае с 8.2 - в индекс по измерениям
    Robix нравится это.
  7. TopicStarter Overlay
    Robix
    Offline

    Robix Опытный в 1С

    Регистрация:
    1 апр 2012
    Сообщения:
    107
    Симпатии:
    1
    Баллы:
    29
    Большое спасибо. Буду пробовать.

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