Имя: Пароль:
1C
 
Ускорить запрос
0 Momus
 
19.11.21
08:50
Выбрать
    Регистратор,
    Количество
Поместить Обороты
ИЗ
    РегистрНакопления.Регистр.Обороты(,,Регистратор) КАК Обороты
ГДЕ
    ВЫБОР
            КОГДА Обороты.Регистратор ССЫЛКА Документ.Документ1
                ТОГДА ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.Документ1).Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
            КОГДА Обороты.Регистратор ССЫЛКА Документ.Документ2
                ТОГДА ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.Документ2).Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ
;
////////////////////////////////////////////////////////////////////////////////
Выбрать    
    Документ1.Ссылка,
    Документ1Товары.Количество
ПОМЕСТИТЬ Документ1
ИЗ
    Документ.Документ1 КАК Документ1
    Левое Соединение Документ.Документ1.Товары КАК Документ1Товары
    ПО Документ1.Ссылка = Документ1Товары.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
Выбрать    
    Документ2.Ссылка,
    Документ2Товары.Количество
ПОМЕСТИТЬ Документ2
ИЗ
    Документ.Документ2 КАК Документ2
    Левое Соединение Документ.Документ2.Товары КАК Документ2Товары
    ПО Документ2.Ссылка = Документ2Товары.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
Выбрать    
    Регистратор,
    Количество
ИЗ
    Обороты
    
Объединить все

Выбрать    
    Ссылка,
    Количество
ИЗ
    Документ1
ГДЕ    
    НЕ Документ1.Ссылка В (Выбрать Регистратор ИЗ Обороты)

Объединить все

Выбрать    
    Ссылка,
    Количество
ИЗ
    Документ2
ГДЕ    
    НЕ Документ2.Ссылка В (Выбрать Регистратор ИЗ Обороты)


Тормозит в условии "НЕ Документ1(2).Ссылка В (Выбрать Регистратор ИЗ Обороты)"
1 piter3
 
19.11.21
08:52
а низзя левым по есть null?
2 Momus
 
19.11.21
08:55
(1) Можно, спасибо. Ускорение в 10 раз
3 Ёпрст
 
19.11.21
08:55
(0)
для начала, сюда воткнуть период
Обороты(,,Регистратор)
4 Ёпрст
 
19.11.21
08:56
в остальные запросы, аналогично, добавить отбор по дате
5 Ёпрст
 
19.11.21
08:57
И последнее, выкинуть все запросы ниже и вытащить количество из Обороты.
6 Momus
 
19.11.21
08:57
(3) период в оборотах не совпадает с периодом документов, а мне нужен отбор именно по документам
7 Momus
 
19.11.21
08:58
(5) пример условный. Часть документов отражается в регистре с задержкой в месяц, но если они все-таки там есть, то нужно брать из регистра данные
8 Галахад
 
гуру
19.11.21
08:58
А в чем глубокий смысл, получать часть документов из регистра, а часть непосредственно из документов?
9 Momus
 
19.11.21
08:59
(8) в (7)
10 Ёпрст
 
19.11.21
08:59
(6) та ну ? Регистратор же, дата регистратора всегда дате периода равна.

(8) он там потом ищет доки, которые обороты не толкают, таким вот извращенным способом
11 ДенисЧ
 
19.11.21
09:01
(10) "дата регистратора всегда дате периода равна."
Шта??
12 Momus
 
19.11.21
09:02
(10) Есть другой способ получить данные по документам, которые еще не отражены в регистре, но будут там где-то через месяц?
13 Momus
 
19.11.21
09:02
Сформировать отчет через месяц не предлагат
14 Галахад
 
гуру
19.11.21
09:05
Понятно.

Я за (1).
15 Momus
 
19.11.21
09:06
(4) отбор по дате для временных таблиц Документ1 и Документ2 есть, но в теме записал написать
16 DiFas
 
19.11.21
09:07
По-моему Обороты у вас без периода, т.е. выполняя запрос, у вас перебираются все записи регистра, а это время. Если база на ms sql, попробуйте использовать Profiler
17 Ёпрст
 
19.11.21
09:08
(11) травма с клюшек преследует :)
18 DiFas
 
19.11.21
09:08
19 Ёпрст
 
19.11.21
09:08
(12) перебирать все записи регистра с каждым месяцем будет всёё дольше и дольше
20 piter3
 
19.11.21
09:09
может это вообще вынести в виде рассылки и ночью уже.Хотя в (19) прав
21 Momus
 
19.11.21
09:11
(17) Конкретно в моем примере в период в регистре равен дате перехода собственности, который, как правило, наступает через месяц с даты реализации.
22 Ёпрст
 
19.11.21
09:13
(21) проще уж заиметь еще один регистр, типа товар в пути,куда запихать такие накладные, чем дергать регистр с начала времён.
23 Momus
 
19.11.21
09:15
(22) Для одного отчета я не буду заводить новый регистр. (1) уже значительно ускорило выполнение запроса, лучше подожду пару секунд
24 Momus
 
19.11.21
09:46
К тому же у меня затык не в первом запросе с оборотами. За год, для сравнения, запрос к оборотами выполняется четверть секунды, в то время как на "И Обороты.Регистратор Есть Null" 8 секунд
25 assasu
 
19.11.21
10:02
(0) я думаю запрос станет быстрее раз в 100 если избавиться от этого
ГДЕ
    ВЫБОР
            КОГДА Обороты.Регистратор ССЫЛКА Документ.Документ1
                ТОГДА ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.Документ1).Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
            КОГДА Обороты.Регистратор ССЫЛКА Документ.Документ2
                ТОГДА ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.Документ2).Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ
26 Momus
 
19.11.21
10:10
(25) Проблема была не здесь, можно считать, что (1) ее решила. Да и как избавить от такого условия, если мне нужно из регистра, период в котором не соответствует дате документа, получить движения по двум документам с отбором по дате этих двух документов?
27 Dmitrii
 
гуру
19.11.21
10:55
(0) Феерический бред.
Задача, описанная в (26) никакого отношения к запросу в (0) не имеет.
То что задача решена этим запросом (хотя я не понимаю как) - просто случайное совпадение. Ведь микроскопом тоже можно гвоздь в стену забить.

Причем бред с самого начала начинается, когда мы зачем-то обращаемся к виртуальной таблице, когда нам нужна таблица первичных движений регистра.
Потом простое условие фигачим через ВЫБОР КОГДА ТОГДА.
Вот это "из регистра, период в котором не соответствует дате документа" вообще не понятно где реализовано.
Во втором и третьем запросе пакета, где создаются ВТ Документ1 и Докмент2, какой-то бред из ненужных левых соединений.
А что пытались получить последним запросом, объединив результаты предыдущим безумных изысканий, - вообще загадка.
28 Casey1984
 
19.11.21
11:01
(27) так пример же условный (7) ;-)
29 Momus
 
19.11.21
11:06
(27) Ок. Задача: сформировать отчет, показывающий валовую прибыль предприятия с учетом товаров у пути. Задача решалась в ERP 2.4.13. Как предложили бы решить?
30 assasu
 
19.11.21
11:07
(25) можно ломать голову сейчас в отчете,а можно поломать голову над проектированием архитектуры регистра когда он создается. Ваш случай второй.
31 Momus
 
19.11.21
11:08
(29) уточнение: отбор по дате документа, а не периоду в регистре
32 Dmitrii
 
гуру
19.11.21
11:08
(28) И тем не менее. Реализация в (0) - полнейшая дичь. Даже для условного примера.
Я уж молу о том, что если возникает необходимость дополнять данные из регистров данными из документов, это косяк архитектуры. Можно было бы, например, создать свой какой-нибудь регистр куда писать такие данные (где период отражения не соответствует периоду документов).
33 Momus
 
19.11.21
11:10
(32) ну да, создать регистр для одного отчета. Всегда так делаю
34 Momus
 
19.11.21
11:13
Да и к чему это обсуждение про какие-то там новые регистры для одного отчета, если моя "дичь" решает задачу и за год теперь отчет формируется четверть секунды место 8. И, как ни странно, если отчет сформировать сейчас и через месяц, когда все движения уже будут в регистре, отчет покажет тот же результат
35 Timon1405
 
19.11.21
11:16
(32) такой регистр уже есть ДанныеПервичныхДокументов. всё уже придумано до нас
36 Kassern
 
19.11.21
11:17
(34) данные хоть проверили на корректность, ничего у вас не задублилось, мол в одном месяце сумму посчитали с учетом товара в пути, а потом в следующем месяце эту же сумму в валовой прибыли отразили к примеру.
37 Momus
 
19.11.21
11:19
(36) так моя дичь убирает дубли. В этом моменте и были тормоза, но (1) решило проблему
38 Dmitrii
 
гуру
19.11.21
11:30
(29) У меня нет под рукой ERP.
Формулируйте задачу в терминах системы. Причем конкретно. Потому что формулировки в (26),(29),(34) ничего общего с (0) не имеют.
Повторюсь. То что вы решили свою задачу запросом из (0) похоже на какую-то случайность.

(33) >> создать регистр для одного отчета.

Странная позиция.
Я может какую-то тайну открою, но в 1С регистры нужны именно для формирования отчетов. И не для чего более.
Поэтому если для отчета нужны какие-то данные, то ничего странного или противоестественного в создании регистра нет.
39 Momus
 
19.11.21
11:58
(38) (0) - это моя реализация задачи (29). В каких терминах? Возьмите регистр такой-то и посчитайте количество с суммой? Есть типовой отчет с прибылью предприятия, нужно к нему добавить продажи на экспорт с передачей права собственности не на дату этой самой передачи, а на дату реализации. Снова непонятно? Если мне скажут "возьмите регистр такой-то и посчитайте количество с суммой", то вопросы бы я не задавал. (29) перешла в (0) потому что я собрал обороты по регистру, дополнил реализациями с определенной хозяйственной операцией, причем если такая реализация уже отражена в регистре, то собранные мной данные по документам не включать во избежание дублей. Ваши комментарии больше похоже не демагогию без конкретных способов решений, кроме как создания нового регистра, который я естественно добавлять не буду. Если открыть модуль расчета себестоимость, то там и не такая "дичь" встречается, под которой я подразумеваю сбор данных не по регистрам, а по документам.
40 Momus
 
19.11.21
11:59
Да и зачем брать ERP, в УТ наверняка есть возможность продавать товары с передачей права собственности
41 Dmitrii
 
гуру
19.11.21
12:06
(39) Всё это красивое бла-бла-бла на языке пользователя.
Вы может в двух-трех предложения (больше и не надо) поставить задачу в терминах 1С?
Термины 1С это Документ, Регистратор, Регистр, Дата документа, Период записи регистра. А не дата передачи, дата реализации, экспорт, передача прав и т.п., которые понятны только человеку, работающему с конкретной конфой и конкретной прикладной проблематикой.
Названия самих регистров и документов значения не имеют, т.к. у меня нет под рукой ни ERP, ни УТ. Вполне нормально, как в (0), использовать Документ1, Документ2, Регистр1. Нужны лишь описания регистра (остатков, оборотов).
Мне постановка от Вас нужна только лишь потому, что все предыдущие Ваши описания задачи идут вразрез с тем запросом, что в (0) написан.
42 Dmitrii
 
гуру
19.11.21
12:06
(40) >> в УТ наверняка есть возможность продавать товары с передачей права собственности.

Понятия не имею.
43 Kassern
 
19.11.21
12:14
(42) я вам помогу, дано:
Регистр с выручкой - оборотный.
Документ1, Документ2 - по которым нужно получить общую сумму. В них у ТС отражаются товары в пути
ТС хочет:
И регистра с выручкой вычесть эти документы, если они участвуют и посчитать обороты без них
Далее полученные обороты объединить с 2 документами и их суммами.
На выходе получить таблицу с продажами, где суммы по Документ1, Документ2 будут попадать по дате формирования, а не когда, они реально пришли покупателю.
44 Kassern
 
19.11.21
12:16
(43) надеюсь я правильно понял ТС
45 Momus
 
19.11.21
12:20
(44) Если Документ1 и Документ2 делают движения в Регистре, то брать данные из регистра, если нет, то брать из самих документов. Т.е. я данные регистра дополняют данными документов. Поскольку дата перехода права собственности не совпадает с датой документа (в регистре период - дата перехода собственности), данные нужно получить исходя из даты самих документов, а не даты их движений.
46 FIXXXL
 
19.11.21
12:36
посмотри обзазцы
в типовых
если хочешь документ - бери сырую таблицу
не грузи платформу :)
47 Momus
 
19.11.21
12:37
(46) "если хочешь документ - бери сырую таблицу" - не понял
48 Dmitrii
 
гуру
19.11.21
12:46
(47) Я уже писал об этом. Не надо брать виртуальную таблицу Обороты, если тебе нужны данные по регистраторам (документам).
49 Momus
 
19.11.21
12:56
(48) но мне нужны данные по регистру. Я дополняю данные регистра данными документов. Но во избежание дублей проверяю делают ли ссылки из дополненных данных по документам в регистре.
50 Timon1405
 
19.11.21
13:01
(48) имеет ввиду что виртуальная таблица оборотов не содержит в себе регистратора и раз уж вы собрались точно брать данные по регистраторам, то используйте физтаблицу. Обороты(,,Регистратор) - просто обёртка над подзапросом к физтаблице(ам) движений и оборотов и таблица оборотов в данном случае не будет использоваться.
51 Timon1405
 
19.11.21
13:02
(50)* поправлюсь, не виртуальная, а физ таблица оборотов не содержит регистратора
52 Dmitrii
 
гуру
19.11.21
15:39
Что-то типа такого должно быть.
НачалоПериода и ОкончаниеПериода - параметры начала и окончания периода, за который собирается отчет.
Получаем регистраторы, записи по которым надо будет исключить из оборотов, т.к. они попали уже в отчет за прошлый период (дата документа раньше начала периода отчета, а период записи регистра внутри периода отчета). Кладём в ВТ ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод.
Получаем данные по тем документам, данными из которых надо будет дополнять обороты регистра (Дата документа входит в отчетный период, но записей регистра к документу нет или период записи регистра к документу находится позже даты окончания периода отчета). Кладём в ВТ ДополняющиеДокументы. В этой ВТ уже сразу посчитаны суммы по реквизиту Количество табличной части Товары. Даже при избыточности это проще и быстрее сделать сразу, чем потом снова обращаться к таблицам документов ещё раз.
В итоговом запросе пакета объединяем данные из регистра за нужный период, очищенные от исключаемых документов (ГДЕ ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод.Регистратор ЕСТЬ NULL), с данными из ВТ ДополняющиеДокументы, связанные с регистром (связь нужна только из-за требования в (45) - "если документы делают движения в Регистре, то брать данные из регистра, если нет, то брать из самих документов").

Если бы знать более точно требования к отчету, то запрос можно было бы значительно упростить.
Например, если не нужны данные о регистраторах в итоговой таблице, а нужна только посчитанная сумма, то запрос превращается в обычное объединение с группировкой по суммам, где одни суммы прибавляются, а другие вычитаются (берутся с минусом).
Так же, если отказаться от требования из (45) к дополняющим записям - брать данные из регистра, если есть записи в регистре и из документа, если в регистре записей нет, было бы проще. Можно было бы брать для дополнения данные только из документов. Но тут надо ещё знать все нюансы с валютным учетом - если вдруг суммы в документах в валюте сделки, а ресурсы регистра в валюте регучета или упручета, то получается, что мы складываем ужей с ежами (например, доллары с рублями).


ВЫБРАТЬ РАЗЛИЧНЫЕ
Регистр.Регистратор КАК Регистратор
ПОМЕСТИТЬ ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод
ИЗ
РегистрНакопления.Регистр КАК Регистр
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Документ1 КАК Документ1
  ПО Регистр.Регистратор = Документ1.Ссылка
   И (Регистр.Период МЕЖДУ &НачалоПериода И &ОкончаниеПериода)
   И (Регистр.Активность)
   И (Документ1.Проведен)
   И (Документ1.Дата < &НачалоПериода)
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
Регистр.Регистратор
ИЗ
РегистрНакопления.Регистр КАК Регистр
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Документ2 КАК Документ2
  ПО Регистр.Регистратор = Документ2.Ссылка
   И (Регистр.Период МЕЖДУ &НачалоПериода И &ОкончаниеПериода)
   И (Регистр.Активность)
   И (Документ2.Проведен)
   И (Документ2.Дата < &НачалоПериода)
ИНДЕКСИРОВАТЬ ПО
Регистратор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Товары.Ссылка КАК Регистратор,
СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ДополняющиеДокументы
ИЗ
Документ.Документ1.Товары КАК Товары
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
   Документ1.Ссылка КАК Ссылка
  ИЗ
   Документ.Документ1 КАК Документ1
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Регистр КАК Регистр
    ПО Документ1.Ссылка = Регистр.Регистратор
     И (Регистр.Активность)
     И (Регистр.Период > &НачалоПериода)
  ГДЕ
   Документ1.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
   И Документ1.Проведен
   И (Регистр.Регистратор ЕСТЬ NULL
     ИЛИ Регистр.Период > &ОкончаниеПериода)) КАК ДополняющиеДокументы
  ПО Товары.Ссылка = ДополняющиеДокументы.Ссылка
СГРУППИРОВАТЬ ПО
Товары.Ссылка
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Товары.Ссылка,
СУММА(Товары.Количество)
ИЗ
Документ.Документ1.Товары КАК Товары
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
   Документ2.Ссылка КАК Ссылка
  ИЗ
   Документ.Документ2 КАК Документ2
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Регистр КАК Регистр
    ПО Документ2.Ссылка = Регистр.Регистратор
     И (Регистр.Активность)
     И (Регистр.Период > &НачалоПериода)
  ГДЕ
   Документ2.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
   И Документ2.Проведен
   И (Регистр.Регистратор ЕСТЬ NULL
     ИЛИ Регистр.Период > &ОкончаниеПериода)) КАК ДополняющиеДокументы
  ПО Товары.Ссылка = ДополняющиеДокументы.Ссылка
СГРУППИРОВАТЬ ПО
Товары.Ссылка
ИНДЕКСИРОВАТЬ ПО
Регистратор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Регистр.Регистратор,
СУММА(Регистр.Количество) КАК Количество
ИЗ
РегистрНакопления.Регистр КАК Регистр
  ЛЕВОЕ СОЕДИНЕНИЕ ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод КАК ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод
  ПО Регистр.Регистратор = ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод.Регистратор
ГДЕ
ИсключаемыеДокументыУжеУчтенныеВОтчетеЗаПрошлыйПериод.Регистратор ЕСТЬ NULL
И Регистр.Активность = &Активность
И Регистр.Период МЕЖДУ &НачалоПериода И &ОкончаниеПериода
СГРУППИРОВАТЬ ПО
Регистр.Регистратор
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДополняющиеДокументы.Регистратор,
ЕСТЬNULL(РегистрОбороты.КоличествоОборот, ДополняющиеДокументы.Количество)
ИЗ
ДополняющиеДокументы КАК ДополняющиеДокументы
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Регистр.Обороты(&ОкончаниеПериода, , Регистратор, ) КАК РегистрОбороты
  ПО ДополняющиеДокументы.Регистратор = РегистрОбороты.Регистратор


В тексте могут быть ошибки.
Возможно, что-то упустил.
53 Momus
 
19.11.21
16:37
(52) проверил у себя. Где-то есть ошибка не стал ее искать. Но если смотреть на чисто на время выполнения, то последний запрос нужно оптимизировать, т.к. он занимает половину всего времени выполнения. До него моя схема проигрывает 0.01 секунду, с ним выигрывает 0.03. Спасибо за пример
54 Dmitrii
 
гуру
19.11.21
17:08
(53) В зависимости от конкретики запрос можно очень сильно оптимизировать. Я об этом в (52) написал.
Этот тот случай, когда нюансы важны. Нужны ли в итоговом запросе регистраторы (документы) - если нет, то всё очень сильно упрощается и значительно ускоряется.

Я потому и предложил создать свой дополнительный оборотный регистр для решения этой задачи.
Он был бы привязан только к нужным тебе двум документам и делал бы движения по товарам, находящимся в пути. В пути оборот "+100", после перехода права собственности оборот "-100". Если отправка и переход права собственности оказались в одном периоде, то +100-100=0 - никакого влияния на прибыль. Если отправлено было до отчетного периода, а переход права в отчетном периоде, то -100 (уменьшаем прибыль на 100, т.к. она была учтена в прошлом периоде). Если отправлено в отчетном периоде, а переход права собственности произошел после (за границей периода), то +100 (увеличиваем прибыль на 100 по товару, который ещё в пути).
Тогда вся твоя задача сводилась бы к банальному объединению данных из основного регистра с данными из этого твоего дополнительного. Без всяких головняков с типами и видами документов, сравнением дат документов с периодами записей регистров и т.п. И проведение по этому регистру безусловное и довольно простое.
55 ptiz
 
19.11.21
17:29
(0) За такое можно и канделябром:
Выбрать    
    Документ1.Ссылка,
    Документ1Товары.Количество
ПОМЕСТИТЬ Документ1
ИЗ
    Документ.Документ1 КАК Документ1
    Левое Соединение Документ.Документ1.Товары КАК Документ1Товары
    ПО Документ1.Ссылка = Документ1Товары.Ссылка

Что будет, когда таблица разрастется? Тебе же не все документы нужны. Сразу в этом запросе отсекай лишнее, делай соединение с проверкой на Null
Не говоря о том, что у тебя в поле Количество будет NULL в случае пустой таб.части.
Ошибка? Это не ошибка, это системная функция.