Имя: Пароль:
1C
 
Как обойти ограничение фреш в запросе динамического списка?
0 Гений 1С
 
гуру
16.02.23
11:31
Есть динамический список, в нем я меняю запрос (в конце):


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


Фреш отклонил, прислал замечание:

Расширение не должно приводить к чрезмерной нагрузке на компоненты сервиса или клиентское приложение.
В расширении используется соединение с подзапросом. Не рекомендуется использовать соединения с подзапросами. Поместите результат подзапроса во временную таблицу и проиндексируйте поля по которым будут соединения.
Подробнее с причинами неоптимальной работы запросов и их оптимизацией можно ознакомиться здесь https://its.1c.ru/db/v8std#browse:13:-1:26:28

Можно конечно сделать доп. поле и в него прописывать этот заказ при записи расходной. Но может есть другие решения?
1 Kassern
 
16.02.23
11:34
(0) Вам даже по русски написали, что нужно сделать, вы ж гений - действуйте.
2 Kassern
 
16.02.23
11:34
ВЫБРАТЬ
            Т.Ссылка КАК Ссылка,
            МАКСИМУМ(НАЧАЛОПЕРИОДА(Т.Заказ.Дата, ДЕНЬ)) КАК ДатаЗаказа
        ИЗ
            Документ.РасходнаяНакладная.Запасы КАК Т
Вот это что по вашему?
3 Гений 1С
 
гуру
16.02.23
12:06
(2) максимальная дата заказа. Какие временные таблицы в запросе динамического списка, окститесь. мне проще реквизит в расходную добавить и при записи его проставлять.
4 TormozIT
 
гуру
16.02.23
12:10
А В 1С:Аналитика просят наоборот - не делать временных таблиц и делать соединения с подзапросами =)
http://devtool1c.ucoz.ru/forum/3-2247-1
5 Donkey_hot
 
16.02.23
12:13
6 H A D G E H O G s
 
16.02.23
12:18
Ну хоть Фреш будет попинывать лупоглазых.
(0) Радуйся, Г1С, просвещайся.
7 H A D G E H O G s
 
16.02.23
12:20
(1) Так то Г1С прав, нельзя в ВТ ОсновнуюТаблицу помещать, а это ОСНОВНАЯ причина, по которой хотелось ВТ в ДинСписке.
8 H A D G E H O G s
 
16.02.23
12:20
(7) Но 1С захерили идею.
9 H A D G E H O G s
 
16.02.23
12:22
И теперь у Г1С 2 пути, гыгыгы.
1) Реализовать коррелированный подзапрос и доказать 1С, что он - совсем не то, что обычный подзапрос и не просаживает производительность.
2) Просить реализацию ВТ для основных таблиц динсписка.
10 Гений 1С
 
гуру
16.02.23
12:46
(9) отнюдь. я просто добавил реквизит Заказ и проставляю его в реализации перед записью:



&После("ПередЗаписью")
Процедура мл_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    //Осипов - оставляем один заказ из табличной части
    ЭтотОбъект.дор_Заказ = Неопределено;
    Для Каждого Строка ИЗ ЭтотОбъект.Запасы Цикл
        Если ЗначениеЗаполнено(Строка.Заказ) Тогда
            ЭтотОбъект.дор_Заказ = Строка.Заказ;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры



Бороться с идиотизмом не входит в мои планы.
11 Гений 1С
 
гуру
16.02.23
12:47
но уаще то я впечатлен, это где-то 6-е обновление доработки и разглядели таки этом момент, ай молодцы. ;-)
12 H A D G E H O G s
 
16.02.23
13:21
(10) Я не сомневался.
13 H A D G E H O G s
 
16.02.23
13:22
(10) Че там насчет ОбменДанными.Загрузка ?
Я бы на месте модераторов 1С настроил бы робота на ключевое слово "Осипов"
14 mistеr
 
16.02.23
13:26
(7) Но тогда список перестает быть динамическим, не так ли? :)
15 H A D G E H O G s
 
16.02.23
13:28
(14) С чего бы?
16 mistеr
 
16.02.23
13:41
(15) Потому что исчезает понятие основной таблицы и пейджинга.
17 H A D G E H O G s
 
16.02.23
14:39
(16) Никуда не исчезает.
Просто выбираем по 45 строк не в результатзапроса, а во временную таблицу. И дальше уже с этими 45 строками ВТ можно делать что угодно - засовывать в параметры ВТ Остатки, СрезПоследних, и.т.д.
18 Kassern
 
16.02.23
14:53
(7) "нельзя в ВТ ОсновнуюТаблицу помещать" - а где ТС это делает?
ему сказали, что нефиг делать подзапрос в дин списке. Мол оберните во временную таблицу, а потом уже ее цепляйте к основной.
20 H A D G E H O G s
 
16.02.23
15:06
21 mistеr
 
16.02.23
15:14
(17) Так не прокатит. В ВТ можно напихать чего угодно, да еще с учетом составных типов. Нет гарантии, что по ней можно будет нормально пейджиться. Нет гарантии наличия нужных индексов.

То, что ты хочешь, в принципе имеет право на жизнь. Но если делать по уму, то нужно дать хук при открытии ДС. Туда передается менеджер ВТ, ты заполняешь ВТ нужными данными, дальше используешь в основном запросе.
22 Kassern
 
16.02.23
15:18
(21) "дать хук при открытии ДС" - так вроде есть такой "хук". Мы же можем передать параметры в дин список при создании на сервере и все корректно отработает.
23 mistеr
 
16.02.23
15:25
(22) Параметры можно, ВТ нельзя. ВТ, которая будет заполняться один раз, а не при каждом листании.
24 Kassern
 
16.02.23
15:28
(23) Я в курсе, что ВТ нельзя). Прост "при создании на сервере" 1 раз и отработает. По идее, ничего не мешало, дать возможность впихнуть ВТ. Хотя, может ДС создается еще раньше, хз.
25 H A D G E H O G s
 
16.02.23
15:37
Вот это жесть. Удачи вам, че.
26 H A D G E H O G s
 
16.02.23
15:40
Иногда, когда я встречаю воот такое (21), я думаю - а правильно про 1С ников говорят
27 mistеr
 
16.02.23
15:43
(25) "Удачи" в каком смысле? Типа, разрешаешь закоммитить в 8.3.24? :)
28 H A D G E H O G s
 
16.02.23
15:45
(27) Типа, ты не пытаешься вкурить в смысл.

Чем отличается вывод 45 строк из многомиллионной таблицы на экран от того же вывода во временную таблицу?
29 H A D G E H O G s
 
16.02.23
15:45
(27) Че ты там пейджить собрался то?
30 mistеr
 
16.02.23
15:47
(28) Ну видимо да, не вкурил. Можешь попытаться еще раз, другими словами.
31 H A D G E H O G s
 
16.02.23
15:54
Но я понимаю, почему 1С это не делают - лениво. Потому что муторно.
Ибо, когда мы работаем с выводом на экран - мы всегда получим на выходе именно эти 45 строк. И из последней строки мы получим ключевые поля, чтобы получить следующую порцию данных, по условию - больше этих полей. Классический порционный запрос (на самом деле, там есть хитрости, которые смотрят, в начале вы таблицы мотаете или в середине или в конце).

Но как только мы помещаем результат в ВТ - все становится сложнее. Мы можем урезать результат ВНУТРЕННИМ соединением и на выходе получить не 45 строк, а 2. И 1С должна это учитывать и допилить цикличное продолжение выполнения запроса, пока на выходе не будет 45 строк или не кончится таблица.

+ 1С должна получать последнюю запись ключевых поля Основной таблицы. Тут она должна сказать Пользователю- программисту 1С - давай пробрасывать через ПакетыЗапросов ключевые поля, либо сама неявно их должна пробрасывать, добавляя в пакетыЗапросов поля основной таблицы, либо Перед помещением ОсновнойТаблицы в ВТ впилить промежуточный запрос, выбирающий эти Ключевые поля.
32 Конструктор1С
 
16.02.23
16:00
(10) ты сам родитель идиотизма и говнокода
33 H A D G E H O G s
 
16.02.23
16:01
Что я предлагаю:

ВЫБРАТЬ ПЕРВЫЕ 45
ОхеренноБольшаяТаблицаТоваров.Ссылка
Из
Справочник.ОхеренноБольшаяТаблицаТоваров как ОхеренноБольшаяТаблицаТоваров
Поместить ВТСовсемНебольшаяТаблица
ГДЕ ОхеренноБольшаяТаблица.Ссылка>&ПредыдущаяСсылка;

ВЫБРАТЬ
Остатки.Товар,
Остатки.Количество
Из
РегистрНакопления.Остатки(&ВчерашнийДень, Остатки.Товар В (Выбрать ВТСовсемНебольшаяТаблица.Ссылка Из ВТСовсемНебольшаяТаблица))
Поместить ВТОстатки;

ВЫБРАТЬ
ВТСовсемНебольшаяТаблица.Ссылка,
isnull(ВТОстатки.Количество,0)
и ЛевоеСоединение
34 Kassern
 
16.02.23
16:05
(33) Так ведь динамический список сам на уровне платформы обходить определенный кусок таблицы и отображает его нам динамически.
Вы хотите сами рулить логикой отображения дин списка, или я вас не так понял?
35 H A D G E H O G s
 
16.02.23
16:07
(34) Я логику описал, что должно происходить
36 mistеr
 
16.02.23
16:10
(33) Теперь я кажется понял
37 H A D G E H O G s
 
16.02.23
16:17
(36) Это хорошо. Странно, что это сходу никто вкурить не может.
38 Гений 1С
 
гуру
16.02.23
16:41
(37) Мы тупые 1сники, размышлять о системных вещах не желаем. Нас аудит послал в сад, мы нашли дырку в заборе и обошли. ггг
39 Гений 1С
 
гуру
16.02.23
19:06
(13) чорд. Ты был прав. они отклонили из-за этого. Поэтому за Фреш надо брать в 3 раза дороже.
40 ДедМорроз
 
16.02.23
19:17
Просто,в нормальных sql это запрос с открытым курсором,когда вылетает порция данных в буфер,а потом мы из этого буфера подтягиваем,и запрос продолжает выполняться.

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

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

На самом деле,у 1с разбиение на страницы немного по-другому - выполняется весь запрос и его результат пихается в кеш,а уже из последнего выводятся порции.
Выполнять запрос еще раз нельзя,так как или мы должны открыть транзакцию и сделать версию состояния таблицы на момент запуска или мы получим не совсем консистентные данные.
41 H A D G E H O G s
 
16.02.23
20:46
(40) Бред сивой кобылы. От начала и до конца. Ну, как обычно.
Основная теорема систематики: Новые системы плодят новые проблемы.