Часто приходится решать задачку отображения наличия и состояния подчиненных документов в списке Счетов или Заказов. И мое решение очень не оптимально в плане кода, потому что с увеличением количества документов в списке начинаются тормоза, список не просто медленно , а жутко медленно открывается и навигация по нему становится мучительным занятием для пользователя
Это первая проблема . А вторая , которая ,возможно, первую усугубляет, это то, что приходится использовать картинки для отображения трех различных состояний флажка : 1- подчиненного документа нет, 2- подчиненный документ есть, но не проведен, 3- подчиненный документ есть и проведен.
В общем привилегированном модуле выполняется запрос на наличие подчиненных документов, дабы дать возможность видеть список пользователям с ограниченными правами:
Запрос = новый запрос;
Запрос.Текст = \"ВЫБРАТЬ
| СУММА(ВнутрЗапрос.Сумма) КАК Сумма,
| СУММА(ЕСТЬ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\"));
Запрос.УстановитьПараметр(\"Счет\", планыСчетов.Хозрасчетный.РасчетыСОтечественнымиПокупателями);
Запрос.УстановитьПараметр(\"КорСчет\", планыСчетов.Хозрасчетный.ТекущиеСчетаВНациональнойВалюте);
Возврат Запрос.Выполнить();
В итоге в форме списка получаем такую картинку:
Может у кого-то есть более красивое решение этой задачи, повышающее быстродействие системы? Или может кто-то подскажет как оптимизировать мой код?
Живет на форуме
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0
Вместо ПриВыводеСтроки следует использовать ПриПолученииДанных. Тогда запрос будет выполняться не по 1-5 раз на каждую видимую строчку при каждом чихе. Один запрос будет выполняться на пакет из 1-100 строк сразу. Пример
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
РомПривелигированный.СчитатьПКО_РКО_ПоЗаказу(ОформленияСтрок);
КонецПроцедурыПроцедура СчитатьПКО_РКО_ПоЗаказу(ОформленияСтрок)Экспорт
МассивСсылок = Новый Массив;
ДляКаждого ОформлениеСтроки Из ОформленияСтрок Цикл
МассивСсылок.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
КонецЦикла;
Если МассивСсылок.Количество()<1ТогдаВозврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка,
| ПриходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов * ПриходныйКассовыйОрдерРасшифровкаПлатежа.КурсВзаиморасчетов КАК СуммаПКО,
| 0 КАК СуммаРКО,
| ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата КАК Период
|ИЗ
| Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПриходныйКассовыйОрдерРасшифровкаПлатежа
|ГДЕ
| ПриходныйКассовыйОрдерРасшифровкаПлатежа.Сделка В(&Заказы)
| И ПриходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РасходныйКассовыйОрдерРасшифровкаПлатежа.Сделка,
| 0,
| РасходныйКассовыйОрдерРасшифровкаПлатежа.СуммаВзаиморасчетов * РасходныйКассовыйОрдерРасшифровкаПлатежа.КурсВзаиморасчетов,
| РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Дата
|ИЗ
| Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
|ГДЕ
| РасходныйКассовыйОрдерРасшифровкаПлатежа.Сделка В(&Заказы)
| И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Проведен";
запрос.УстановитьПараметр("Заказы",МассивСсылок);
тз = Запрос.Выполнить().Выгрузить();
Длякаждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДатаПКО = "";
СуммаПКО = 0;
ДатаРКО = "";
СуммаРКО = 0;
строки = тз.НайтиСтроки(Новый Структура("Сделка",ОформлениеСтроки.ДанныеСтроки.Ссылка));
Длякаждого строка из Строки ЦиклЕсли Строка.СуммаПКО<>0Тогда//Если строка.ТипДокумента="ПКО" Тогда
ДатаПКО = ДатаПКО + ?(СокРЛ(ДатаПКО)="","",";") +Формат(строка.Период,"ДФ=dd.MM.yy");
СуммаПКО = СуммаПКО + Строка.СуммаПКО;
КонецЕсли;
Если Строка.СуммаРКО<>0Тогда//ИначеЕсли строка.ТипДокумента="РКО" Тогда
ДатаРКО = ДатаРКО +?(СокРЛ(ДатаРКО)="","",";") + Формат(строка.Период,"ДФ=dd.MM.yy");
СуммаРКО = СуммаРКО+Строка.СуммаРКО;
КонецЕсли;
КонецЦикла;
ОформлениеСтроки.Ячейки.ДатаПКО.Текст=ДатаПКО;
ОформлениеСтроки.Ячейки.ДатаПКО.ОтображатьТекст=Истина;
ОформлениеСтроки.Ячейки.СуммаПКО.Текст=?(СуммаПКО=0,"",Формат(СуммаПКО,"ЧЦ=19; ЧДЦ=2"));
ОформлениеСтроки.Ячейки.СуммаПКО.ОтображатьТекст=Истина;
ОформлениеСтроки.Ячейки.ДатаРКО.Текст=ДатаРКО;
ОформлениеСтроки.Ячейки.ДатаРКО.ОтображатьТекст=Истина;
ОформлениеСтроки.Ячейки.СуммаРКО.Текст=?(СуммаРКО=0,"",Формат(СуммаРКО,"ЧЦ=19; ЧДЦ=2"));;
ОформлениеСтроки.Ячейки.СуммаРКО.ОтображатьТекст=Истина;
КонецЦикла;
КонецПроцедуры
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!