Срез на даты за период. Шаблон запроса

Публикация № 1118145

Разработка - Практика программирования

Один запрос, который довольно часто пригождался.

Введение

Довольно часто возникает задача в запросе получить актуальное значение ресурса на каждую дату выбранного периода.

Вот несколько таких случаев:

  • Курс валюты на дату каждого документа за выбранный период
  • Цену товара на дату реализации по всем реализациям за период
  • Должность сотрудника на каждую дату периода

 

Традиционный подход


Наиболее интуитивный и часто применяемый способ следующий:

/// первый запрос - выбирает все даты документов

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

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

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

/// третий запрос - выбирает из нашего регистра актуальные значения ресурсов на каждую дату документа
ВЫБРАТЬ
	ВТ_ДатыНачалаДействия.ДатаДокумента,
	Цены.Номенклатура,
	Цены.Цена
	
ПОМЕСТИТЬ 
	ВТ_ЗначенияРесурсов
ИЗ 
	РегистрСведений.ЦеныНоменклатуры КАК Цены
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыНачалаДействия КАК ВТ_ДатыНачалаДействия
    	ПО ВТ_ДатыНачалаДействия.Период = Цены.Период
    	И ВТ_ДатыНачалаДействия.Номенклатура = Цены.Номенклатура
ГДЕ
	Цены.ТипЦены = &ТипЦены // не забываем еще раз указать тот же отбор
;

/// четвертый запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
	Товары.Ссылка КАК Документ,
	Товары.Номенклатура,
	ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ 
	Документ.Реализация.Товары КАК Товары
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
    	ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
    	И НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) = ВТ_ЗначенияРесурсов.ДатаДокумента


Более продвинутые программисты могут объединить третий и четвертый шаг, что сократит количество временных таблиц. Но в примере оставим четыре шага ради большей наглядности

Также данный запрос может отличаться от автора к автору. Кто-то поймет, что это просто пример и уловит суть, но кто-то бросится в комментариях поправлять, оптимизировать и описывать свой опыт написания подобных запросов. 

Но последовательность шагов обычно такая, как в этом типовом примере.

Я и сам по началу долгое время использовал именно такую схему.

Но данная схема неудобна по следующим причинам:

  1. Таблица, из которой мы выбираем даты документов - используется дважды. Если у нас не примитивный случай, а документы нужно брать, скажем, нескольких видов (через конструкцию ОБЪЕДИНИТЬ ВСЕ). То наш запрос вырастает в двух местах
  2. Но основное неудобство в том, что между основной таблицей (в нашем случае тч Товары) и регистром сведений (в нашем случае Цены номенклатуры) возникает связность в двух местах. То есть сначала мы должны будем написать самый последний запрос, чтобы понять какие даты нам нужны (в рабочем запросе это может оказаться не так просто сделать, как в приведенном примере). Потом повторить эту логику в первом запросе.

Когда пишешь сложный запрос, в котором срез на даты делается по нескольким регистрам (например, цены, валюты), в котором есть еще куча отборов и внутренних соединений, а также объединений, то данную схему использовать крайне неудобно.

Приведу пример. Когда-то в одной из конфигураций заказчика был непериодический регистр связи складов и подразделений. На этот регистр было завязано огромное количество отчетов. И вот однажды заказчик захотел сделать этот регистр связей складов и подразделений периодическим. Пройтись по всем отчетам, написанных разными разработчиками в разные годы и разобраться, как собрать таблицу дат в каждом из случаев - это была очень неприятная и трудоемкая работа. Плюс, конечно, запросы с этим регистром были не только в отчетах.

 

Подход со слабой связностью 

Уже несколько лет для решения подобных задач, я использую другой подход - интервальный.

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

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

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

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

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

/// третий запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
	Товары.Ссылка КАК Документ,
	Товары.Номенклатура,
	ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ 
	Документ.Реализация.Товары КАК Товары
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
    	ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
    	И Товары.Ссылка.Дата МЕЖДУ ВТ_ЗначенияРесурсов.НачалоПериода И ВТ_ЗначенияРесурсов.КонецПериода

Плюсы интервального способа:

  1. Первые два шага довольно простые и не связаны с бизнес логикой основного запроса.
  2. Можно использовать данный запрос как шаблон, что значительно экономит время при разработке. 

В итоге вся бизнес логика у нас перенеслась на последний запрос (то есть собралась в одно место). Это большой плюс при модификациях основного запроса.

Ну и конечно, в зависимости от задачи можно накладывать дополнительные отборы в первом шаге, чтобы оптимизировать работу запроса.

 

Заключение

Само собой у обоих способов могут быть ограничения в применении в каждом конкретном случае в зависимости от задачи. Но в моей практике я почти не использую первый способ, т.к. в подавляющем большинстве случаев применим второй способ.

Я выложил данный шаблон запроса главным образом для себя, т.к. довольно часто он пригождается. Но будет неплохо, если кто-нибудь сочтет его подходящим для себя.

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. alex-l19041 8 05.09.19 10:20 Сейчас в теме
любопытно... в самом первом запросе

 И Период <= &КонецПериода


а чуть далее

ЕСТЬNULL(ДОБАВИТЬКДАТЕ(МИНИМУМ(КонецПериода.Период), СЕКУНДА, -1), ДАТАВРЕМЯ(3000, 1, 1))


почему ДАТАВРЕМЯ(3000, 1, 1) , а не &КонецПериода ?
4. json 2582 05.09.19 10:32 Сейчас в теме
(1) согласен, это неточность.
Вечером подправлю
2. soft_wind 05.09.19 10:23 Сейчас в теме
давно уже подобную задачу решают одним запросом (без всяких временных таблиц) с двумя левыми соединениями
5. json 2582 05.09.19 10:35 Сейчас в теме
(2) ты давай-ка приведи пример.
А то может ты что-нибудь путаешь или не учитываешь.
10. soft_wind 05.09.19 11:25 Сейчас в теме
(5) вот простенький пример, легко масштабируется на более сложные условия
//эмуляция РС.Цены
Выбрать ДатаВремя(2019,1,1) как Период, "Тов1" как Номенклатура, 110 как Цена Поместить РегЦены
Объединить все Выбрать ДатаВремя(2019,1,5), "Тов1", 150 
Объединить все Выбрать ДатаВремя(2019,1,9), "Тов1", 190 
Объединить все Выбрать ДатаВремя(2019,1,1), "Тов2", 210 
Объединить все Выбрать ДатаВремя(2019,1,9), "Тов2", 290 
;

//эмуляция документа
Выбрать ДатаВремя(2019,1,6) как Дата, "Тов1" как Номенклатура Поместить Док
Объединить все Выбрать ДатаВремя(2019,1,6), "Тов2"
Объединить все Выбрать ДатаВремя(2019,1,6), "Тов3"
;

выбрать 
	Док.*,
	ЕстьNull(Рег1.Цена,0) как Цена, 
	Рег1.Период //для анализа
из 
	Док

левое соединение РегЦены Рег1	
	по Док.Номенклатура = Рег1.Номенклатура 
	и Док.Дата >= Рег1.Период 

левое соединение РегЦены Рег2	
	по Док.Номенклатура = Рег2.Номенклатура 
	и Док.Дата >= Рег2.Период 
	и Рег2.Период > Рег1.Период 
где
	Рег2.Период есть Null	

Показать


получаем такой результат
Дата Номенклатура Цена Период
06.01.2019 0:00:00 Тов1 150 05.01.2019 0:00:00
06.01.2019 0:00:00 Тов2 210 01.01.2019 0:00:00
06.01.2019 0:00:00 Тов3 0

по Тов1 цена взялась от 05,01,2019
а по Тов2 от 01,01,2019
asupsam; json; +2 Ответить
12. json 2582 05.09.19 11:37 Сейчас в теме
(10) уже обсудили этот вариант в комментариях чуть ранее.

Больше ничего не добавлю.

Но приятно, что есть разработчики, которые готовы поддержать свои комментарии кодом, а не просто ради того чтобы покритиковать да сумничать
3. catena 103 05.09.19 10:28 Сейчас в теме
Подобные задачи гуглятся по запросу "срез последних на каждую дату". Хорошо бы автору добавить подобное упоминание, иначе способ бесславно утонет.
6. json 2582 05.09.19 10:36 Сейчас в теме
(3) спасибо. Добавлю в текст
7. cool99 05.09.19 10:41 Сейчас в теме
Не вникал в смысл задачи, но срез на дату чего-либо по периоду делается простым 1 запросом без всяких ВТ.
типа
выбрать
ТаблицаОбъекта.Ссылка,
Т1.Период,
Т1.Срез1,
....
Т1.СрезХ,
Т1.Ресурс /// искомое значение
ИЗ ТАблицаОбъекта
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодичностьЧегоТо КАК Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодичностьЧегоТо КАК Т2
ПО Т1.Срез1 = Т2.Срез1 И....И Т1.СрезХ = Т2.СрезХ
ПО ТаблицаОбъекта.Дата >= Т1.Период И ТаблицаОбъектов.Ссылка В (&Ссылки)
СГРУППИРОВАТЬ ПО
ТаблицаОбъекта.Ссылка,
Т1.Период,
Т1.Срез1,
....
Т1.СрезХ,
Т1.Ресурс /// искомое значение!!!

ИМЕЮЩИЕ Т1.Период = Масимум(Т2.Период)

З.Ы. Мог где-то ошибиться, это общий вид запроса. думаю смысл его понятен.
8. json 2582 05.09.19 10:51 Сейчас в теме
(7) ну вот ты и задвоил записи в основном запросе. Теперь представь, что в основной таблице очень много записей, которых теперь может стать на один- два порядка больше ( если формировать, скажем, за месяц). И возможно, что в основном запросе ещё куча показателей, требующих соединения с другими таблицами, при расчете которых ты теперь уже не можешь использовать функцию СУММА ()

Гораздо выгоднее с точки зрения производительности накладывать группировку только на таблицу с периодичностью, чем группировать запрос с кучей соединений.
А с точки зрения удобства работы с основным запросом, не выгодно делать соединения, задваивающие в нем записи без необходимости

Тета-соединение - довольно затратная операция, и накладывать его обычно лучше отдельно
9. cool99 05.09.19 11:20 Сейчас в теме
(8)
1. Для разовых операций это не критично, если жесткач, то можно установить порции
2. Для неразовых также можно устанавливать порции. В реальных задачах пользователю что нужно обрабатывать полностью всю таблицу объектов? Он же п.3
3. в 99% случаев есть отбор с х-количеством документов/ссылок и т.д. объем которых редко превышает 40 (динамический список например) или ТЧ документа ну несколько тыс строк

З.Ы. Нада ориентироваться конкретной задачей, нельзя пытаться натянуть любой метод решения на глобус, нет ничего универсального. Например списание партий в запросе - там тоже происходит мерж джоин со своей временной сложностью
11. json 2582 05.09.19 11:30 Сейчас в теме
(9) мы с тобой рассмотрели два подхода к решению одной задачи в общем случае.

Можно, конечно, продолжать накидывать аргументы в защиту каждого, но пользы от этого я не вижу.

Вывод такой: оба варианта можно использовать. Каждый выбирает тот, который удобнее и применим в конкретной задаче
15. cool99 05.09.19 13:40 Сейчас в теме
(11) Ну имхо 1 запрос более читаем, все сделали в одном месте и сразу. Кроме того, есть преимущество в том, что не нужно создавать индексы во ВТ, а используются физические индексы самих таблиц и как раз то при большом количестве записей будет выигрыш. Вообще всегда нужно использовать именно их
16. json 2582 05.09.19 14:11 Сейчас в теме
(15) услышал твои аргументы.
Привожу свои:
1. Не согласен, что вариант с двумя левыми соединениями и группировкой более читаемый. Считаю, что в моем варианте первые два запроса - служебные и не требуют чтения и погружения. Зато основной запрос становится более читаемым, гибким и быстрым.
2. У меня как то была задача, чтобы в отчёте пересчитать сумму из валюты документа в валюту, выбранную пользователем. Так вот, моим вариантом эта задача решилась просто, нужно было лишь дважды присоединить таблицу с интервалами. С твоим способом пришлось бы цеплять тета-соединение дважды.
3. Но мой способ не подойдёт для динамического списка, например.

Правильный вывод: знаем все подходы, применяем - наиболее подходящий в каждой конкретной задаче
17. cool99 05.09.19 15:56 Сейчас в теме
(16) Ну по поводу читаемости, как на скуле пишу, так флиент юзаю в ентити фреймворк (которые многие терпеть не могут, предпочитая декларативный тип), что руками и в консоли в 1С - не вижу особой разницы в читаемости нескольких соединений. Тут спорить смысла нет, так как на вкус и цвет фломастеры разные :)

Для динамического списка есть еще такая фишка как коррелируемый запрос, когда делается соединение с нужной таблицей в подзапросе типа 1 В (выбрать 1 из НужнойТаблицы где Поле1 = ВнешнийЗапрос.Поле1) и получаем сразу нужный срез. Т.е. можно написать тоже самое, что делает EXIST в tsql. Кстати на скуль это так и переносится, если глянуть профайлер. Идеально для получения всяких статусов и прочего непосредственно в запросе ДС, а не при при получении данных. Если ты полностью фиксируешь измерения, то там index seek и работает это шустро. Не раз применял такое при оптимизации всяких костылей.
13. premierex 05.09.19 13:26 Сейчас в теме
(0)
НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДАТА)

Не знал, что у функции НАЧАЛОПЕРИОДА() есть такой параметр "ДАТА". У меня запрос сразу выдаёт ошибку: Неверные параметры ... <<?>>ДАТА...
14. json 2582 05.09.19 13:34 Сейчас в теме
(13) опечатка. Вечером поправлю. Правильно ДЕНЬ, а не ДАТА
18. Pim 168 05.09.19 21:16 Сейчас в теме
А как учитывает ваш запрос периодичность по позиции регистратора? Правильно он отработает, если любимый пользователь введёт два документа с одинаковой датой?
19. json 2582 05.09.19 21:39 Сейчас в теме
(18) чисто гипотетически если такая необходимость будет, то можно доработать запрос.
Но пока не могу придумать пример, где бы такое могло потребоваться в реальной задаче.
20. Pim 168 05.09.19 22:10 Сейчас в теме
(19). Уважаемый, я вам только подготовил картинки по вашему комментарию, а вы его изменили. ;-)
Гипотетически - не гипотетически, а такие варианты возможны, и их надо предусматривать. Поэтому хотелось бы увидеть ваш вариант. Мой -- очень громоздкий получается.
21. json 2582 05.09.19 22:14 Сейчас в теме
(20) да я изменил свой комментарий, потому что понял, что был не прав ))
Попробую набросать и выложить, посмотрим, что получится (и получится ли)
22. zqzq 19 06.09.19 08:46 Сейчас в теме
Есть ещё вариант с помощью коррелирующего подзапроса (производительность нужно проверять, но запрос достаточно красивый):

ВЫБРАТЬ
    Продажи.Период,
    Продажи.Контрагент,
    Продажи.Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    Продажи.СтоимостьОборот КАК Стоимость,
    ЦеныНоменклатуры.Цена
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
            И (ЦеныНоменклатуры.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    Цены.Период
                ИЗ
                    РегистрСведений.ЦеныНоменклатуры КАК Цены
                ГДЕ
                    Цены.Период <= Продажи.Период
                    И Цены.Номенклатура = Продажи.Номенклатура
                    И Цены.ТипЦен = &ТипЦен
                УПОРЯДОЧИТЬ ПО
                    Цены.Период УБЫВ))
Показать
Terve!R; stas1976; json; shard; triviumfan; +5 Ответить
23. triviumfan 14 06.09.19 11:21 Сейчас в теме
(22) Я такой использую в отчете "выручка и с/с продаж", производительность устраивает.
24. imh9305 10 06.09.19 11:26 Сейчас в теме
меня зарубили на одном собеседовании за то, что я на бумажке не смог написать данный запрос, а попросил сесть за комп.
25. triviumfan 14 06.09.19 12:07 Сейчас в теме
(24) обычно там требуют не срез на каждую дату, а срез на дату :)
26. imh9305 10 06.09.19 13:20 Сейчас в теме
(25)у меня требовали срез на каждую дату)
27. shard 251 06.09.19 16:07 Сейчас в теме
а почему не рассматривается вариант для курсов валют
ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка КАК Ссылка,
	РеализацияТоваровУслуг.Дата КАК Дата,
	КурсыВалют.Курс КАК Курс
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			КурсыВалют.Период КАК Период,
			КурсыВалют.Курс КАК Курс
		ИЗ
			РегистрСведений.КурсыВалют КАК КурсыВалют
		ГДЕ
			КурсыВалют.Период МЕЖДУ НАЧАЛОПЕРИОДА(&дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&дата2, ДЕНЬ)
			И КурсыВалют.Валюта = &Валюта) КАК КурсыВалют
		ПО (НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, ДЕНЬ) = КурсыВалют.Период)
ГДЕ
	РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&дата2, ДЕНЬ)
Показать

В случае цен конечно такой вариант не прокатит =)
28. json 2582 06.09.19 16:16 Сейчас в теме
(27) потому что в теме фигурирует "срез последних". В твоем запросе нет среза.

И так к сведению, есть валюты, для которых курс изменяется не каждый день. Самый банальный пример такой валюты - это рубль, у которого курс = 1 и задан один раз. Но есть и другие более экзотические валюты
29. Dach 292 06.09.19 17:32 Сейчас в теме
Слабая связанность, тета-соединение - прекрасные варианты.

Но все это перестает работать, когда в регистре цен овер 100 млн строк...

И тогда на сцену выходит тот самый Ваш первый вариант (где 3й и 4й пакет сделаны 1м пакетом).

Потому как на таких объемах данных уже играет роль способность сервера БД в целом переварить такую выборку, а также дисковая подсистема и особенно tempdb
30. json 2582 06.09.19 18:01 Сейчас в теме
31. Dach 292 06.09.19 22:21 Сейчас в теме
(30) так и не надо. Я все это проверял на как раз таких данных, и не раз
32. json 2582 06.09.19 23:20 Сейчас в теме
(31) если бы ты был известным экспертом в области производительности, то я бы тебе конечно поверил.
Но ты заявляешь, насколько я понимаю, что для любой задачи с любыми данными какой-то один способ лучше. Это подозрительно.

Я очень сильно сомневаюсь, что ты проверял каждый из перечисленных здесь способов.
Все что у тебя есть это твои предположения, которые ты не подтвердил цифрами.

Если бы ты хотя бы привел пример, то можно было бы уже предметно подискутировать. Тогда я бы с тобой согласился бы или нет.

Но мне не известно что ты там и на каких данных проверял.
Хотя бы привел пример, что за такой периодический регистр сведений со 100 млн. записей ? Что вы в нем такого храните? И что за задачи ты там решал где "проверял на как раз таких данных, и не раз"?

На практике бывает так, что когда у тебя есть трудности с производительностью, то пробуешь все более менее подходящие способы. И очень часто самым лучшим оказывается не тот, на который ты думал вначале.

Так что благодарю за ценные замечания. Твоя информация оказалась весьма полезной и содержательной.
33. Dach 292 07.09.19 11:50 Сейчас в теме
(32) во-первых, не ты, а Вы. Мы с Вами водку на брудершафт не пили. Элементарная вежливость, нет? Во-вторых, если Вы бд видели таблиц со 100 млн записей, это не значит, что их нет. Продажи, множество типов цен, множество позиций товара, цены меняются каждый день, вот и ответ. И да, я проверял работу тета-соединения для получения среза цен на каждую дату. И первый запрос (первый подход, точнее) выиграл у него по скорости в 2.5 раза. И я всего лишь поделился реальным опытом. Доказывать что-то лично Вам желания нет (с учётом Вашей неадекватной реакции на вполне спокойный комментарий). Хотя изначально хотел сделать скриншоты из консоли. Общение общением, хамить то зачем?
34. json 2582 08.09.19 09:28 Сейчас в теме
(33)
Насчет ты-вы. Я считаю нормальным, когда коллеги общаются на ты, это обычно упрощает коммуникацию. Когда ко мне обращаются на ты, для меня это норма и я в ответ тоже перехожу на ты. Очень редки случаи, когда кто-то говорит шаблонную фразу, что "мы с тобой что-то не делали". Обычно это говорит о том, что человек не настроен на конструктивное общение. Но это уже не моя проблема.

Насчет хамства. Давай-ка процетируй какие именно слова из моих комментариев ты посчитал хамством.

Насчет твоих выводов.
В комментарии 29 ты упомянул три способа, а в комментарии 33 ты пишешь, что сравнивал только два из них. То есть как я и написал в комментарии 32, ты не проверял ВСЕ способы. Но при этом ты уже сделал вывод о производительности.
Почитай комментарий 8, где я как раз и писал, что вариант с двумя соединениями к периодическому регистру (который ты называешь тета-соединение), является менее производительным. Что собственно и совпадает с приведенными тобой примерами.
Но каких-то оснований для того, чтобы сделать вывод о производительности варианта с интервалами, я в твоих комментариях не увидел, хотя ты сделал такой вывод в комментарии 29. Поэтому я изначально постарался избежать бесполезной дискуссии в комментарии 30.

Насчет приводимых тобой примеров и доказательств.
К сожалению, твои комментарии содержат очень мало конкретных убедительных аргументов.
Аргументы типа "Я все это проверял", "изначально хотел сделать скриншоты" и т.д. в таком духе - это не аргументы.

Насчет 100 млн. записей.
Я видел регистры накопления и с миллиардом записей. Но регистр цен на 100 млн. записей - трудно представить. По моей оценке это 10 лет нужно устанавливать цены на 5000 позиций по 5 видам цен ЕЖЕДНЕВНО.
Я себе с трудом могу представить отрасль, в которой было бы 5000 АКТИВНЫХ позиций номенклатуры на которую ЕЖЕДНЕВНО меняют цены.
Собственно это и выглядит неправдоподобно.
А судя по твоему комментарию 29, в варианте с интервалами вроде как нужно выгружать эти 100 млн. записей во временную таблицу. Или тогда я не понимаю, почему этот аргумент приводится к этому способу в комментарии 29.

Насчет неадекватной реакции
Цитирую: "с учётом Вашей неадекватной реакции на вполне спокойный комментарий".
Не понял в чем проявилась неадекватность? Всего навсего задал вопросы для уточнения и не более того.
Тут на ИС очень много разработчиков, которые считают себя спецами. Но когда начинаешь задавать конкретные вопросы, то объяснить не могут.
Я понимаю, что ты не тролль и отношусь к тебе с уважением. Но если ты хочешь покритиковать (в данном случае ты покритиковал производительность приведенного в статье метода), то будь добр приведи убедительные аргументы и технические подробности, иначе может возникнуть недопонимание
35. Dach 292 08.09.19 13:19 Сейчас в теме
(34) 10 тыс позиций, 100 и более типов цен. По сути, для каждого клиента делается свой тип цен. Это спорно с точки зрения архитектуры решения, но мне лично досталось вот в таком виде, приходится жить с этим. 3 измерения в регистре: товар, тип, спецусловия. Цены меняются каждый день! Ежедневный прирост строк в таблице рс - 1 млн! Цены ставят как руками, так и из файлов загружают. А в некоторых региональных базах и более. Запросы к ценам у нас - самое узкое место в системе. И есть ряд хитрых архитектурных решений, призванных облегчить эти запросы (в 2 словах не описать, тянет не отдельную публикацию). В том числе каждые несколько месяцев средствами бд формируется срез последних (содержит 1.5-2 млн уникальных строк), движения этого среза крепятся к регистратору с пустой тч. Все цены до регистратора - удаляются. Если этого не делать - таблица регистра просто становится неперевариваемой. Мы пробовали разные способы - и отдельные итоги для среза последних и да, тета-соединение в запросе. Будет полчаса лишних на работе - покажу Вам замеры. Кроме того, при интерактивном подборе товаров в заказы, менеджеры всегда хотят видеть актуальные цены, для этого есть механизм кэширования по ключам аналитики, где каждый ключ - Товар+НаборАналитик+ТипЦены. Так что, коллега, ситуации бывают всякие. Слабую связанность ещё не проверял толком, но так как там есть большая выборка плюс срез, потом их джойн - думаю, что проиграет первому подходу. А первый подход хорош тем, что попадает в кластерный индекс регистра.
Оставьте свое сообщение

См. также

Программная работа с настройками СКД

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    5808    ids79    26       

Голосование за доклады на INFOSTART MEETUP Kazan - до 25 февраля. Промо

Выбирайте и голосуйте за самые интересные доклады! Лучшие из лучших попадут в окончательную программу казанского митапа. Оставить свой голос можно до 25 февраля 2020 года.

[СКД] Программное создание схемы компоновки данных

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    7643    John_d    21       

30 задач. Странных и не очень

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    9469    YPermitin    72       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Агрегатные функции СКД, о которых мало кто знает

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    25245    ids79    50       

Сдача регламентированной отчетности из программ 1С Промо

Сдача регламентированной отчетности из программ "1С" во все контролирующие органы без выгрузок и загрузок в другие программы. Для групп компаний действуют специальные предложения.

от 1500 руб.

Три костыля. Сказ про фокусы в коде

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    16281    YPermitin    78       

Отслеживание выполнения фонового задания

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    18510    ids79    16       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    34197    ids79    36       

Фоновое выполнение кода в 1С - это просто

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    18627    avalakh    21       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    27796    ids79    10       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    19916    ids79    27       

Регистры сведений. За кулисами

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    15045    YPermitin    12       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

"Меньше копипаста!", или как Вася универсальную процедуру писал

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    12187    SeiOkami    49       

Создание отчетов с помощью СКД - основные понятия и элементы

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    32165    ids79    17       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Производительность и оптимизация (HighLoad)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    17053    dmurk    144       

Регистры накопления. Структура хранения в базе данных

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    27585    YPermitin    30       

Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо

На курсе вы получите практические навыки решения задач производительности 1С, в том числе характерных для высоконагруженных информационных систем (более 1000 пользователей). Подготовка к экзамену – только одна из составляющих курса. 70% слушателей приходят за знаниями, которые позволят расти и зарабатывать, делать сложные задачи на крупных проектах.

16450 рублей

Выполнение внешней обработки в фоновом задании

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    17474    Eret1k    23       

Выгрузка документа по условию

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    9400    m-rv    2       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, обеспечивающих обмен данными между различными прикладными 1С-решениями и взаимодействие с другими информационными системами. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”.

5500 рублей

Как прикрутить ГУИД к регистру сведений

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    12542    m-rv    16       

О расширениях замолвите слово...

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    23660    ellavs    125       

​​​​​​​CorelDRAW Graphics Suite 2019 Промо

CorelDRAW – пакет профессиональных инструментов для редактирования фотографий, разработки дизайна, создания макетов страниц и векторных иллюстраций

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    18706    ellavs    83       

Трюки с внешними источниками данных

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    20608    YPermitin    53