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