8.х Скоростной запрос

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

  1. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Подскажите как можно сделать запрос который бы выполнялся максимально быстро, задача
    Вывести документы и суммы документа за определенный период из регистра остатки на складах :angry:
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    На мой взгляд использовать как можно меньше таблиц, и выполнять запрос на стороне сервера.
  3. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Вот запросик:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТоварыНаСкладах.Период,
    |	ТоварыНаСкладах.Регистратор,
    |	ТоварыНаСкладах.Регистратор.СуммаДокумента
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    |ГДЕ
    |	ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаКонец
    |
    |СГРУППИРОВАТЬ ПО
    |	ТоварыНаСкладах.Период,
    |	ТоварыНаСкладах.Регистратор,
    |	ТоварыНаСкладах.Регистратор.СуммаДокумента";
    
    Запрос.УстановитьПараметр("ДатаКонец", КонецДня(ДатаКонец));
    Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
    
    Результат = Запрос.Выполнить();
    
  4. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    А извините забыл надо выводить сумму документа в указном типе цен, те к примеру
    есть оприходование товара 01.01.2011 документ сделан в ценах закупа 10000руб, а в ценах розничных 15000 именно на 01.01.2011, а допустим на 03.01.2011 уже 17000
    Нужно выводить цены именно на дату документа те цены на 03.01.2011 нас не интересует
  5. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    alexburn - думаю быстрее использовать виртуальную таблицу и параметры задавать в ней.

    Dmitrij - от вас полное описание задачи, что нужно? Ибо не у каждого регистратора РН есть такой реквизит, как сумма документа.
  6. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    Боюсь что скоростного уже не получится, так как цены нужно будет вытаскивать из другого регистра.
  7. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    я понимаю, но максимально возможно быстрый главное чтоб правильно работал
  8. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
  9. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.760
    Симпатии:
    509
    Баллы:
    204
    shurikvz, по всей видимости связано:)))))
  10. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    связано, но в той теме я предложил свой вариант запроса, может у кого то есть более простой вариант
  11. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    Dmitrij на инфостарте почитайте статью "Получение курса валюты по списку дат". возможно вам подойдёт
  12. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Посмотрел, уже ближе к истине, но допустим цена на 01.01.11 -10 на 02.01.11-20
    Код:
    "ВЫБРАТЬ
    |	ЦеныНоменклатурыСрезПоследних.Период КАК ПериодНачало,
    |	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    |ПОМЕСТИТЬ Цены
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатурыСрезПоследних
    |ГДЕ
    |	ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
    |
    |СГРУППИРОВАТЬ ПО
    |	ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |	ЦеныНоменклатурыСрезПоследних.Период,
    |	ЦеныНоменклатурыСрезПоследних.Цена
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток * ЕСТЬNULL(Цены.Цена, 0)) КАК НачОст,
    |	СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * ЕСТЬNULL(Цены.Цена, 0)) КАК КонОст,
    |	СУММА(ВЫБОР
    |			КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход > 0
    |				ТОГДА (ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) * Цены.Цена
    |			ИНАЧЕ 0
    |		КОНЕЦ) КАК Приход,
    |	СУММА(ВЫБОР
    |			КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход - ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход > 0
    |				ТОГДА (ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход - ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход) * Цены.Цена
    |			ИНАЧЕ 0
    |		КОНЕЦ) КАК Расход,
    |	ТоварыНаСкладахОстаткиИОбороты.Период КАК ДатаДок,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор.Номер КАК НомерДок,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Док,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор.СуммаДокумента КАК СуммаДокумента
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, Регистратор, , Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
    |		ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
    |		ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = Цены.Номенклатура
    |			И ТоварыНаСкладахОстаткиИОбороты.Период >= Цены.ПериодНачало
    |
    |СГРУППИРОВАТЬ ПО
    |	ТоварыНаСкладахОстаткиИОбороты.Период,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор.Номер,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    |	ТоварыНаСкладахОстаткиИОбороты.Регистратор.СуммаДокумента
    |
    |УПОРЯДОЧИТЬ ПО
    |	ДатаДок";
    
    
    результат будет 30
    Подскажите почему все цены складываются
  13. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    вы забыли про характеристики и ограничения таблицы в пакете Цены по периоду
  14. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Как поставить ограничения
  15. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Код:
    ВЫБРАТЬ
    |	ЦеныНоменклатурыСрезПоследних.Период КАК ПериодНачало,
    |	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    |ПОМЕСТИТЬ Цены
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
    |
    |СГРУППИРОВАТЬ ПО
    |	ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |	ЦеныНоменклатурыСрезПоследних.Период,
    |	ЦеныНоменклатурыСрезПоследних.Цена
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВложенныйЗапрос.ДатаДок,
    |	ВложенныйЗапрос.Док,
    |	ВложенныйЗапрос.НачОст,
    |	ВложенныйЗапрос.КонОст,
    |	ВложенныйЗапрос.Приход,
    |	ВложенныйЗапрос.Расход,
    |	ВложенныйЗапрос.НомерДок,
    |	ВложенныйЗапрос.СуммаДокумента
    |ИЗ
    |	(ВЫБРАТЬ
    |		ТоварыНаСкладахОстаткиИОбороты.Период КАК ДатаДок,
    |		ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Док,
    |		ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток * ЕСТЬNULL(Цены.Цена, 0) КАК НачОст,
    |		ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * ЕСТЬNULL(Цены.Цена, 0) КАК КонОст,
    |		ВЫБОР
    |			КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход > 0
    |				ТОГДА (ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) * Цены.Цена
    |			ИНАЧЕ 0
    |		КОНЕЦ КАК Приход,
    |		ВЫБОР
    |			КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход - ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход > 0
    |				ТОГДА (ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход - ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход) * Цены.Цена
    |			ИНАЧЕ 0
    |		КОНЕЦ КАК Расход,
    |		ТоварыНаСкладахОстаткиИОбороты.Регистратор.Номер КАК НомерДок,
    |		ТоварыНаСкладахОстаткиИОбороты.Регистратор.СуммаДокумента КАК СуммаДокумента
    |	ИЗ
    |		РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, Регистратор, , Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
    |			ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
    |			ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = Цены.Номенклатура
    |				И ТоварыНаСкладахОстаткиИОбороты.Период >= Цены.ПериодНачало) КАК ВложенныйЗапрос 
    
    Поправил запрос, я думаю истина где то рядом, но не работает так как надо, подскажите что подправить
  16. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Эти запросы никогда не будут быстрыми, а еще могут, вдобавок, вызвать ошибку 256 таблиц под MS SQL
    Проблема в этих строках:
    Код:
    "ТоварыНаСкладахОстаткиИОбороты.Регистратор.Номер КАК НомерДок,"
    
    и им подобным. Этими строками мы создаем неявное левое соединение со всеми таблица, которые могут быть регистраторами.

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