Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация кода в форме списка документа
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
AlenaS
Часто приходится решать задачку отображения наличия и состояния подчиненных документов в списке Счетов или Заказов.
И мое решение очень не оптимально в плане кода, потому что с увеличением количества документов в списке начинаются тормоза, список не просто медленно , а жутко медленно открывается и навигация по нему становится мучительным занятием для пользователя smile.gif

Это первая проблема . А вторая , которая ,возможно, первую усугубляет, это то, что приходится использовать картинки для отображения трех различных состояний флажка : 1- подчиненного документа нет, 2- подчиненный документ есть, но не проведен, 3- подчиненный документ есть и проведен.

необходимо зарегистрироваться для просмотра ссылки

Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Вставить содержимое обработчика.
    Ссылка = ДанныеСтроки.Ссылка;
    Если Ссылка = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    //
    рез = Привелегированный.ОбработатьЗаказ(ССылка);
    Если не рез.Пустой() Тогда
        Выборка = рез.Выбрать();
        Выборка.Следующий();
        ОформлениеСтроки.Ячейки.Оплата.УстановитьТекст(Формат(Выборка.сумма, \"ЧДЦ=2\"));
        
        ЯчейкаРН = ОформлениеСтроки.Ячейки.РН;
        ОбработатьЯчейку(ОформлениеСтроки.Ячейки.РН,Выборка.СуммаРН, Выборка.ПроведенРН);
        ОбработатьЯчейку(ОформлениеСтроки.Ячейки.НН,Выборка.СуммаНН, Выборка.ПроведенНН);
        ОбработатьЯчейку(ОформлениеСтроки.Ячейки.ПВ,Выборка.ПВ, Выборка.ПроведенПВ);
        ОбработатьЯчейку(ОформлениеСтроки.Ячейки.ПМ,Выборка.ПМ, Выборка.ПроведенПМ);
        
        Если Выборка.ПС <> null и  Выборка.ПС > 0 тогда
             ОформлениеСтроки.Ячейки.ПС.ЗначениеФлажка = истина;
             ОформлениеСтроки.Ячейки.ПС.ОтображатьФлажок = истина;
        КонецЕсли;    
    КонецЕсли;    
КонецПроцедуры

Процедура ОбработатьЯчейку(Ячейка,РезВыборки, РезВыборкиПроведен)
    Ячейка.ОтображатьКартинку = ложь;
    
    Если РезВыборки <> null и РезВыборки > 0 тогда
         Ячейка.ОтображатьКартинку = Истина;
         Ячейка.ИндексКартинки = 0;
         Если РезВыборкиПроведен тогда
               Ячейка.ИндексКартинки = 1;
         КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры


В общем привилегированном модуле выполняется запрос на наличие подчиненных документов, дабы дать возможность видеть список пользователям с ограниченными правами:
        Запрос = новый запрос;
        Запрос.Текст = \"ВЫБРАТЬ
                       |    СУММА(ВнутрЗапрос.Сумма) КАК Сумма,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.СуммаРН, 0)) КАК СуммаРН,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.СуммаНН, 0)) КАК СуммаНН,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.Пс, 0)) КАК ПС,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПроведенРН, 0)) КАК ПроведенРН,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПроведенНН, 0)) КАК ПроведенНН,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПроведенПВ, 0)) КАК ПроведенПВ,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПроведенПС, 0)) КАК ПроведенПС,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПМ, 0)) КАК ПМ,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПроведенПМ, 0)) КАК ПроведенПМ,
                       |    СУММА(ЕСТЬNULL(ВнутрЗапрос.ПВ, 0)) КАК ПВ
                       |ИЗ
                       |    (ВЫБРАТЬ
                       |        ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт, 0) КАК Сумма,
                       |        0 КАК СуммаРН,
                       |        0 КАК СуммаНН,
                       |        0 КАК ПВ,
                       |        0 КАК Пс,
                       |        NULL КАК ПМ,
                       |        NULL КАК ПроведенРН,
                       |        NULL КАК ПроведенНН,
                       |        NULL КАК ПроведенПВ,
                       |        NULL КАК ПроведенПС,
                       |        NULL КАК ПроведенПМ
                       |    ИЗ
                       |        РегистрБухгалтерии.Хозрасчетный.Обороты(, , , Счет = &Счет, , Субконто3 = &ссылка, корСчет = &корСчет, ) КАК ХозрасчетныйОбороты
                       |    ГДЕ
                       |        ХозрасчетныйОбороты.СуммаОборотКт > 0
                       |    
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |    
                       |    ВЫБРАТЬ
                       |        0,
                       |        СУММА(РеализацияТоваровУслуг.СуммаДокумента),
                       |        0,
                       |        0,
                       |        0,
                       |        NULL,
                       |        ВЫБОР
                       |            КОГДА РеализацияТоваровУслуг.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        NULL
                       |    ИЗ
                       |        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                       |    ГДЕ
                       |        (РеализацияТоваровУслуг.Сделка = &Ссылка
                       |                ИЛИ РеализацияТоваровУслуг.ДокументОснование = &Ссылка)
                       |    
                       |    СГРУППИРОВАТЬ ПО
                       |        ВЫБОР
                       |            КОГДА РеализацияТоваровУслуг.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ
                       |    
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |    
                       |    ВЫБРАТЬ
                       |        0,
                       |        0,
                       |        СУММА(НалоговаяНакладная.СуммаДокумента),
                       |        0,
                       |        0,
                       |        NULL,
                       |        NULL,
                       |        ВЫБОР
                       |            КОГДА НалоговаяНакладная.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ,
                       |        NULL,
                       |        NULL,
                       |        NULL
                       |    ИЗ
                       |        Документ.НалоговаяНакладная КАК НалоговаяНакладная
                       |    ГДЕ
                       |        (НалоговаяНакладная.ДокументОснование = &Ссылка
                       |                ИЛИ НалоговаяНакладная.Сделка = &Ссылка)
                       |    
                       |    СГРУППИРОВАТЬ ПО
                       |        ВЫБОР
                       |            КОГДА НалоговаяНакладная.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ
                       |    
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |    
                       |    ВЫБРАТЬ
                       |        0,
                       |        0,
                       |        0,
                       |        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПеремещениеТоваров.Ссылка),
                       |        0,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        ВЫБОР
                       |            КОГДА ПеремещениеТоваров.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ,
                       |        NULL,
                       |        NULL
                       |    ИЗ
                       |        Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
                       |    ГДЕ
                       |        ПеремещениеТоваров.ДокументОснование = &Ссылка
                       |        И ПеремещениеТоваров.СкладПолучатель = &СкладВ
                       |    
                       |    СГРУППИРОВАТЬ ПО
                       |        ВЫБОР
                       |            КОГДА ПеремещениеТоваров.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ
                       |    
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |    
                       |    ВЫБРАТЬ
                       |        0,
                       |        0,
                       |        0,
                       |        0,
                       |        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СкладскаяНакладная.Ссылка),
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        ВЫБОР
                       |            КОГДА СкладскаяНакладная.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ,
                       |        NULL
                       |    ИЗ
                       |        Документ.СкладскаяНакладная КАК СкладскаяНакладная
                       |    ГДЕ
                       |        СкладскаяНакладная.ДокументОснование = &Ссылка
                       |    
                       |    СГРУППИРОВАТЬ ПО
                       |        ВЫБОР
                       |            КОГДА СкладскаяНакладная.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ
                       |    
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |    
                       |    ВЫБРАТЬ
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПеремещениеТоваров.Ссылка),
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        NULL,
                       |        ВЫБОР
                       |            КОГДА ПеремещениеТоваров.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ
                       |    ИЗ
                       |        Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
                       |    ГДЕ
                       |        ПеремещениеТоваров.ДокументОснование = &Ссылка
                       |        И ПеремещениеТоваров.СкладПолучатель = &СкладПМ
                       |    
                       |    СГРУППИРОВАТЬ ПО
                       |        ВЫБОР
                       |            КОГДА ПеремещениеТоваров.Проведен
                       |                ТОГДА 1
                       |            ИНАЧЕ 0
                       |        КОНЕЦ) КАК ВнутрЗапрос\";
                        
                      
                               
        Запрос.УстановитьПараметр(\"ссылка\", ссылка);
        Запрос.УстановитьПараметр(\"складВ\", Справочники.Склады.НайтиПоКоду(\"000000003\"));
        Запрос.УстановитьПараметр(\"складПМ\", Справочники.Склады.НайтиПоКоду(\"000000002\"));
        Запрос.УстановитьПараметр(\"Счет\", планыСчетов.Хозрасчетный.РасчетыСОтечественнымиПокупателями);
        Запрос.УстановитьПараметр(\"КорСчет\", планыСчетов.Хозрасчетный.ТекущиеСчетаВНациональнойВалюте);
        
        Возврат Запрос.Выполнить();


В итоге в форме списка получаем такую картинку:



Может у кого-то есть более красивое решение этой задачи, повышающее быстродействие системы? Или может кто-то подскажет как оптимизировать мой код?
Vofka
Цитата(AlenaS @ 25.07.12, 8:35) необходимо зарегистрироваться для просмотра ссылки
Может у кого-то есть более красивое решение этой задачи, повышающее быстродействие системы? Или может кто-то подскажет как оптимизировать мой код?

В типовых конфигурациях есть такая штука, которая называется структура подчиненности. Посмотрите туда.
Ardi
Вместо ПриВыводеСтроки следует использовать ПриПолученииДанных.
Тогда запрос будет выполняться не по 1-5 раз на каждую видимую строчку при каждом чихе. Один запрос будет выполняться на пакет из 1-100 строк сразу.
Пример
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
        РомПривелигированный.СчитатьПКО_РКО_ПоЗаказу(ОформленияСтрок);
КонецПроцедуры

Процедура СчитатьПКО_РКО_ПоЗаказу(ОформленияСтрок) Экспорт
    МассивСсылок = Новый Массив;
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        МассивСсылок.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
    КонецЦикла;
    Если МассивСсылок.Количество()<1 Тогда
        Возврат;
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка,
                   |    ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов * ПриходныйКассовыйОрдерРасшифровкаПлатежа.КурсВзаиморасчетов КАК СуммаПКО,
                   |    0 КАК СуммаРКО,
                   |    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата КАК Период
                   |ИЗ
                   |    Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПриходныйКассовыйОрдерРасшифровкаПлатежа
                   |ГДЕ
                   |    ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка В(&Заказы)
                   |    И ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Проведен
                   |
                   |ОБЪЕДИНИТЬ ВСЕ
                   |
                   |ВЫБРАТЬ
                   |    РасходныйКассовыйОрдерРасшифровкаПлатежа.Сделка,
                   |    0,
                   |    РасходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов * РасходныйКассовыйОрдерРасшифровкаПлатежа.КурсВзаиморасчетов,
                   |    РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата
                   |ИЗ
                   |    Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
                   |ГДЕ
                   |    РасходныйКассовыйОрдерРасшифровкаПлатежа.Сделка В(&Заказы)
                   |    И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Проведен";
    запрос.УстановитьПараметр("Заказы",МассивСсылок);
    тз = Запрос.Выполнить().Выгрузить();
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ДатаПКО = "";
        СуммаПКО = 0;
        ДатаРКО = "";
        СуммаРКО = 0;
        строки = тз.НайтиСтроки(Новый Структура("Сделка",ОформлениеСтроки.ДанныеСтроки.Ссылка));
        Для каждого строка из Строки Цикл
            Если Строка.СуммаПКО<>0 Тогда
                //Если строка.ТипДокумента="ПКО" Тогда        
                ДатаПКО =  ДатаПКО + ?(СокРЛ(ДатаПКО)="","",";") +Формат(строка.Период,"ДФ=dd.MM.yy");
                СуммаПКО = СуммаПКО + Строка.СуммаПКО;
            КонецЕсли;
            Если Строка.СуммаРКО<>0 Тогда
                //ИначеЕсли строка.ТипДокумента="РКО" Тогда
                ДатаРКО =  ДатаРКО +?(СокРЛ(ДатаРКО)="","",";") + Формат(строка.Период,"ДФ=dd.MM.yy");
                СуммаРКО = СуммаРКО+Строка.СуммаРКО;
            КонецЕсли;  
        КонецЦикла;
        ОформлениеСтроки.Ячейки.ДатаПКО.Текст=ДатаПКО;
        ОформлениеСтроки.Ячейки.ДатаПКО.ОтображатьТекст=Истина;
        ОформлениеСтроки.Ячейки.СуммаПКО.Текст=?(СуммаПКО=0,"",Формат(СуммаПКО,"ЧЦ=19; ЧДЦ=2"));
        ОформлениеСтроки.Ячейки.СуммаПКО.ОтображатьТекст=Истина;
        
        ОформлениеСтроки.Ячейки.ДатаРКО.Текст=ДатаРКО;
        ОформлениеСтроки.Ячейки.ДатаРКО.ОтображатьТекст=Истина;
        ОформлениеСтроки.Ячейки.СуммаРКО.Текст=?(СуммаРКО=0,"",Формат(СуммаРКО,"ЧЦ=19; ЧДЦ=2"));;
        ОформлениеСтроки.Ячейки.СуммаРКО.ОтображатьТекст=Истина;
    КонецЦикла;  
КонецПроцедуры
AlenaS
Цитата(Vofka @ 25.07.12, 9:02) необходимо зарегистрироваться для просмотра ссылки
В типовых конфигурациях есть такая штука, которая называется структура подчиненности. Посмотрите туда.


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

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

Да, база файловая. Возможно в SQL - варианте что-то будет по другому. Но пока мне нужно это именно для файлового варианта.

Никак не научусь пользоваться этим форумом . :-(

Смешались два ответа на разные сообщения

Вот этот ответ
Цитата(AlenaS @ 26.07.12, 13:34) необходимо зарегистрироваться для просмотра ссылки
Я пробовала такой вариант, но почему-то при больших списках быстродействие увеличивалость не настолько, чтобы это быо сильно ощутимо.

Да, база файловая. Возможно в SQL - варианте что-то будет по другому. Но пока мне нужно это именно для файлового варианта.


к этому сообщению

Цитата(Ardi @ 26.07.12, 13:34) необходимо зарегистрироваться для просмотра ссылки
Вместо ПриВыводеСтроки следует использовать ПриПолученииДанных ....


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