Здравствуйте, недавно программирую, подскажите как оптимизировать, какие варинты можно применить для ускорения работы вывода данных
Процедура ЖурналДокументовСписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Вставить содержимое обработчика.
//Если Элемент.
// Вставить содержимое обработчика.
ш=3;
ВыбраннаяСтрока.ПолучитьФорму("ФормаВ2").Открыть();
СтандартнаяОбработка=Ложь;
КонецПроцедуры
Функция ОбновлениеСтрок(ДанныеИзСикнп)
//
Если ДанныеИзСикнп.Количество() = 0
Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого СтрокаВагоны1 Из ДанныеИзСикнп Цикл
//
Если СтрокаВагоны1.dWeight > СтрокаВагоны1.ГрузоподъемностьВЦСикнП ИЛИ СтрокаВагоны1.Vсогр20CСикнП < СтрокаВагоны1.sMaxVolTanker
ИЛИ СтрокаВагоны1.Vсогр20CСикнП < СтрокаВагоны1.dVolume И СтрокаВагоны1.РХ = Справочники.Рх.ПустаяСсылка()
Тогда
//
Возврат Истина;
//
КонецЕсли;
//
КонецЦикла;
Возврат Ложь;
//
КонецФункции
Функция ОбновлениеЦветаТупик (ДанныеИзСикнп,Строка)
//
Структура = Новый Структура;
Структура.Вставить("ГрузоподъемностьВЦСикнП",0);
ЭлемСРх = ДанныеИзСикнп.НайтиСтроки(Структура);
//Для Каждого СтрокаСикнП ИЗ ДанныеИзСикнп Цикл
Если ДанныеИзСикнп.Количество() - ЭлемСРх.Количество() > 0 Тогда
//
Строка.Ячейки.НомерТупика.ЦветФона = Новый Цвет(255, 160, 122);
Иначе
Строка.Ячейки.НомерТупика.ЦветФона = Новый Цвет(206, 252, 194);
//
КонецЕсли;
Если ДанныеИзСикнп.Количество() = 0 Тогда
Строка.Ячейки.НомерТупика.ЦветФона = Новый Цвет(240, 250, 155);
КонецЕсли;
//КонецЦикла;
//
КонецФункции
Процедура ЖурналДокументовСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
//////
Если ОбновлениеСтрок(ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп)
Тогда
ОформлениеСтроки.Ячейки.ПогруженныйНП.ЦветФона = WebЦвета.Розовый;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("dWeight", 0);
СтруктураРх = Новый Структура;
СтруктураРх.Вставить("ГрузоподъемностьВЦСикнП", 0);
ЭлемСРх = ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп.НайтиСтроки(СтруктураРх);
НайденныеПустыеЭлементы = ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп.НайтиСтроки(СтруктураРх);
НайденныеПустыеЭлементы = ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп.НайтиСтроки(Структура);
Если НайденныеПустыеЭлементы.Количество() - ЭлемСРх.Количество() > 0 Тогда
//
ОформлениеСтроки.Ячейки.НомерТупика.ЦветФона = Новый Цвет(255, 160, 122);
Иначе
ОформлениеСтроки.Ячейки.НомерТупика.ЦветФона = Новый Цвет(206, 252, 194);
//
КонецЕсли;
Если ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп.Количество() = 0 Тогда
ОформлениеСтроки.Ячейки.НомерТупика.ЦветФона = Новый Цвет(240, 250, 155);
КонецЕсли;
Для Каждого СтрокаВагоны Из ОформлениеСтроки.ДанныеСтроки.Ссылка.Вагоны Цикл
//////////
Если СтрокаВагоны.ФактическаяСтепеньНаполненияКотла > СтрокаВагоны.ПредельнаяСтепеньНаполненияКотла И СтрокаВагоны.РХ = Справочники.Рх.ПустаяСсылка()
Тогда
ОформлениеСтроки.Ячейки.Номер.ЦветФона = WebЦвета.Красный;
Прервать;
Иначе
ОформлениеСтроки.Ячейки.Номер.ЦветФона = WebЦвета.Роса;
КонецЕсли;
/////////
КонецЦикла;
///////////////
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Вывод таблицы значений в Excel
- Вопросы разработки, анализа производительности и оптимизации приложений 1С под управлением СУБД ORACLE
- СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты
- Highload-оптимизация 1С: теория и практика на примере консолидированной отчетности группы "Магнит" и розничной аптечной сети "Магнит"
- Чрезмерная оптимизация кода. Проблемы производительности
Найденные решения
пример моего кода ...ПриПолученииДанных(Элемент, ОформленияСтрок)
ЦветИнкассация = Новый Цвет(230,250,250);
ЦветДоставка = Новый Цвет(230,255,235);
ЦветВархиве = Новый Цвет(218,215,205);
ЦветДругая = WebЦвета.Персиковый;
Соответствие = Новый Соответствие;
СсылкиМассив = Новый Массив;
Для каждого ТекСтрока из ОформленияСтрок Цикл //По старому неверно работает
Если Не ТекСтрока.ДанныеСтроки.ЭтоГруппа Тогда // ТекСтрока.ДанныеСтроки.Ссылка.ЭтоГруппа Почему имеено так было ??
СсылкиМассив.Добавить(ТекСтрока.ДанныеСтроки.Ссылка);
//Соответствие.Вставить(ТекСтрока.ДанныеСтроки.Ссылка,ТекСтрока);
КонецЕсли;
КонецЦикла;
// из запроса найдем действующие точки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеТочекОбслуживанияСрезПоследних.ТочкаОбслуживания,
| СостояниеТочекОбслуживанияСрезПоследних.РабочаяТочка,
| СостояниеТочекОбслуживанияСрезПоследних.Услуга
|ИЗ
| РегистрСведений.СостояниеТочекОбслуживания.СрезПоследних(&НаДату, ) КАК СостояниеТочекОбслуживанияСрезПоследних
|ГДЕ
| СостояниеТочекОбслуживанияСрезПоследних.ТочкаОбслуживания В(&МассивТочек)";
Запрос.УстановитьПараметр("МассивТочек",СсылкиМассив);
Запрос.УстановитьПараметр("НаДату",ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать(); // Запрос.Выполнить().Выгрузить()
запросАдрес = Новый Запрос;
запросАдрес.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Поле4,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Поле5,
| КонтактнаяИнформация.Поле6 КАК Поле6,
| КонтактнаяИнформация.Поле7,
| КонтактнаяИнформация.Поле8,
| КонтактнаяИнформация.Поле9,
| КонтактнаяИнформация.Поле10,
| КонтактнаяИнформация.Поле4 + "" "" + КонтактнаяИнформация.Поле5 + "" "" + КонтактнаяИнформация.Поле6 + "" "" + КонтактнаяИнформация.Поле7 + "" "" + КонтактнаяИнформация.Поле8 + "" "" + КонтактнаяИнформация.Поле9 + "" "" + КонтактнаяИнформация.Поле10 КАК НаселённыйПункт
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект В (&Объект)
| И КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресТочкиОбслуживания)";
запросАдрес.УстановитьПараметр("Объект", СсылкиМассив);
ВыборкаАдреса = запросАдрес.Выполнить().Выбрать();
запросТелефон = Новый Запрос;
запросТелефон.Текст = "ВЫБРАТЬ
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект В( &Объект)
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
запросТелефон.УстановитьПараметр("Объект", СсылкиМассив);
запросТелефон.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
запросТелефон.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("000001002"));
ВыборкаТелефон = запросТелефон.Выполнить().Выбрать();
ЗапросМаршруты = Новый Запрос;
ЗапросМаршруты.Текст = "ВЫБРАТЬ
| Заезды.Ссылка КАК Заезд,
| Заезды.Владелец,
| Заезды.МаршрутСуббота,
| Заезды.МаршрутВоскресенье,
| Заезды.Маршрут,
| Заезды.ДниЗаездов.Наименование
|ИЗ
| Справочник.Заезды КАК Заезды
|ГДЕ
| Заезды.Владелец В(&Владелец)
| И НЕ Заезды.ПометкаУдаления
| И Заезды.Действует";
ЗапросМаршруты.УстановитьПараметр("Владелец",СсылкиМассив);
ВыборкаМаршруты = ЗапросМаршруты.Выполнить().Выбрать();
// Раскрашиваем строки с рабочими тосками обслуживания
// Пока Выборка.Следующий() Цикл
Для каждого ТекСтрока из ОформленияСтрок Цикл
Если (не ТекСтрока.ДанныеСтроки.ЭтоГруппа) ТОгда
ПОКА Выборка.НайтиСледующий(Новый Структура("ТочкаОбслуживания", ТекСтрока.ДанныеСтроки.Ссылка)) ЦИКЛ //Тогда
Если Выборка.РабочаяТочка Тогда
Если ТекСтрока.Ячейки.Доставка.Значение = Неопределено ТОгда
Доставка = ТекСтрока.ДанныеСтроки.Ссылка.Доставка;
иначе
Доставка = ТекСтрока.ДанныеСтроки.Доставка ;
КонецЕсли;
Если Доставка Тогда
ТекСтрока.ЦветФона = ЦветДоставка;
Иначе
ТекСтрока.ЦветФона = ЦветИнкассация;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//КонецЕсли;
Выборка.Сбросить();
Если Не ТекСтрока.ДанныеСтроки.Актуальность Тогда
ТекСтрока.ЦветФона = ЦветВархиве;
КонецЕсли;
Если ТекСтрока.Ячейки.Подразделение.Значение = ОсновноеПодразделение Тогда
ИначеЕсли ЗначениеЗаполнено(ОсновноеПодразделение)И Прав(СокрЛП(ОсновноеПодразделение.Код),3) ="001" тогда
ИначеЕсли Не ЗначениеЗаполнено(ОсновноеПодразделение) Тогда
иначе
ТекСтрока.Ячейки.Картинка.ЦветФона = ЦветДругая;
ТекСтрока.Ячейки.Подразделение.ЦветФона = ЦветДругая;
КонецЕсли;
/// А Д Р Е С А
Если ВыборкаАдреса.НайтиСледующий(Новый Структура("Объект", ТекСтрока.ДанныеСтроки.Ссылка)) Тогда
ТекСтрока.ячейки.Адрес.Значение = СокрЛП(ВыборкаАдреса.НаселённыйПункт);// АдресТО;
ВыборкаАдреса.Сбросить();
КонецЕсли;
Если ВыборкаТелефон.НайтиСледующий(Новый Структура("Объект", ТекСтрока.ДанныеСтроки.Ссылка)) Тогда
ТекСтрока.ячейки.Телефон.Значение = СокрЛП(ВыборкаТелефон.Представление);// АдресТО;
ВыборкаТелефон.Сбросить();
КонецЕсли;
МаршрутыПоДням = ""; т=0;
Пока ВыборкаМаршруты.НайтиСледующий(Новый Структура("Владелец", ТекСтрока.ДанныеСтроки.Ссылка)) Цикл
МаршрутыПоДням = МаршрутыПоДням+?(т=0,ОбработатьМаршрутыЗаезда(ВыборкаМаршруты),"/"+ОбработатьМаршрутыЗаезда(ВыборкаМаршруты));
т=1;
КонецЦикла;
ТекСтрока.ячейки.Маршруты.Значение = МаршрутыПоДням;// АдресТО;
ВыборкаМаршруты.Сбросить();
КонецЕсли;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1) СтрокаВагоны1.РХ = Справочники.Рх.ПустаяСсылка() !!!! возможно
2) ниже ... цикл при выводе строки. Это жесть. !! Нужно копать в сторону "ПриПолученииДанных"
3) этот кусок не используется дальше.
2) ниже ... цикл при выводе строки. Это жесть. !! Нужно копать в сторону "ПриПолученииДанных"
Для Каждого СтрокаВагоны Из ОформлениеСтроки.ДанныеСтроки.Ссылка.Вагоны Цикл
//////////
Если СтрокаВагоны.ФактическаяСтепеньНаполненияКотла > СтрокаВагоны.ПредельнаяСтепеньНаполненияКотла И СтрокаВагоны.РХ = Справочники.Рх.ПустаяСсылка()
Тогда
ОформлениеСтроки.Ячейки.Номер.ЦветФона = WebЦвета.Красный;
Прервать;
Иначе
ОформлениеСтроки.Ячейки.Номер.ЦветФона = WebЦвета.Роса;
КонецЕсли;
/////////
КонецЦикла;
Показать3) этот кусок не используется дальше.
Структура = Новый Структура;
Структура.Вставить("dWeight", 0);
СтруктураРх = Новый Структура;
СтруктураРх.Вставить("ГрузоподъемностьВЦСикнП", 0);
ЭлемСРх = ОформлениеСтроки.ДанныеСтроки.Ссылка.ДанныеИзСикнп.НайтиСтроки(СтруктураРх);
пример моего кода ...ПриПолученииДанных(Элемент, ОформленияСтрок)
ЦветИнкассация = Новый Цвет(230,250,250);
ЦветДоставка = Новый Цвет(230,255,235);
ЦветВархиве = Новый Цвет(218,215,205);
ЦветДругая = WebЦвета.Персиковый;
Соответствие = Новый Соответствие;
СсылкиМассив = Новый Массив;
Для каждого ТекСтрока из ОформленияСтрок Цикл //По старому неверно работает
Если Не ТекСтрока.ДанныеСтроки.ЭтоГруппа Тогда // ТекСтрока.ДанныеСтроки.Ссылка.ЭтоГруппа Почему имеено так было ??
СсылкиМассив.Добавить(ТекСтрока.ДанныеСтроки.Ссылка);
//Соответствие.Вставить(ТекСтрока.ДанныеСтроки.Ссылка,ТекСтрока);
КонецЕсли;
КонецЦикла;
// из запроса найдем действующие точки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеТочекОбслуживанияСрезПоследних.ТочкаОбслуживания,
| СостояниеТочекОбслуживанияСрезПоследних.РабочаяТочка,
| СостояниеТочекОбслуживанияСрезПоследних.Услуга
|ИЗ
| РегистрСведений.СостояниеТочекОбслуживания.СрезПоследних(&НаДату, ) КАК СостояниеТочекОбслуживанияСрезПоследних
|ГДЕ
| СостояниеТочекОбслуживанияСрезПоследних.ТочкаОбслуживания В(&МассивТочек)";
Запрос.УстановитьПараметр("МассивТочек",СсылкиМассив);
Запрос.УстановитьПараметр("НаДату",ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать(); // Запрос.Выполнить().Выгрузить()
запросАдрес = Новый Запрос;
запросАдрес.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Поле4,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Поле5,
| КонтактнаяИнформация.Поле6 КАК Поле6,
| КонтактнаяИнформация.Поле7,
| КонтактнаяИнформация.Поле8,
| КонтактнаяИнформация.Поле9,
| КонтактнаяИнформация.Поле10,
| КонтактнаяИнформация.Поле4 + "" "" + КонтактнаяИнформация.Поле5 + "" "" + КонтактнаяИнформация.Поле6 + "" "" + КонтактнаяИнформация.Поле7 + "" "" + КонтактнаяИнформация.Поле8 + "" "" + КонтактнаяИнформация.Поле9 + "" "" + КонтактнаяИнформация.Поле10 КАК НаселённыйПункт
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект В (&Объект)
| И КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресТочкиОбслуживания)";
запросАдрес.УстановитьПараметр("Объект", СсылкиМассив);
ВыборкаАдреса = запросАдрес.Выполнить().Выбрать();
запросТелефон = Новый Запрос;
запросТелефон.Текст = "ВЫБРАТЬ
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект В( &Объект)
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
запросТелефон.УстановитьПараметр("Объект", СсылкиМассив);
запросТелефон.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
запросТелефон.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("000001002"));
ВыборкаТелефон = запросТелефон.Выполнить().Выбрать();
ЗапросМаршруты = Новый Запрос;
ЗапросМаршруты.Текст = "ВЫБРАТЬ
| Заезды.Ссылка КАК Заезд,
| Заезды.Владелец,
| Заезды.МаршрутСуббота,
| Заезды.МаршрутВоскресенье,
| Заезды.Маршрут,
| Заезды.ДниЗаездов.Наименование
|ИЗ
| Справочник.Заезды КАК Заезды
|ГДЕ
| Заезды.Владелец В(&Владелец)
| И НЕ Заезды.ПометкаУдаления
| И Заезды.Действует";
ЗапросМаршруты.УстановитьПараметр("Владелец",СсылкиМассив);
ВыборкаМаршруты = ЗапросМаршруты.Выполнить().Выбрать();
// Раскрашиваем строки с рабочими тосками обслуживания
// Пока Выборка.Следующий() Цикл
Для каждого ТекСтрока из ОформленияСтрок Цикл
Если (не ТекСтрока.ДанныеСтроки.ЭтоГруппа) ТОгда
ПОКА Выборка.НайтиСледующий(Новый Структура("ТочкаОбслуживания", ТекСтрока.ДанныеСтроки.Ссылка)) ЦИКЛ //Тогда
Если Выборка.РабочаяТочка Тогда
Если ТекСтрока.Ячейки.Доставка.Значение = Неопределено ТОгда
Доставка = ТекСтрока.ДанныеСтроки.Ссылка.Доставка;
иначе
Доставка = ТекСтрока.ДанныеСтроки.Доставка ;
КонецЕсли;
Если Доставка Тогда
ТекСтрока.ЦветФона = ЦветДоставка;
Иначе
ТекСтрока.ЦветФона = ЦветИнкассация;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//КонецЕсли;
Выборка.Сбросить();
Если Не ТекСтрока.ДанныеСтроки.Актуальность Тогда
ТекСтрока.ЦветФона = ЦветВархиве;
КонецЕсли;
Если ТекСтрока.Ячейки.Подразделение.Значение = ОсновноеПодразделение Тогда
ИначеЕсли ЗначениеЗаполнено(ОсновноеПодразделение)И Прав(СокрЛП(ОсновноеПодразделение.Код),3) ="001" тогда
ИначеЕсли Не ЗначениеЗаполнено(ОсновноеПодразделение) Тогда
иначе
ТекСтрока.Ячейки.Картинка.ЦветФона = ЦветДругая;
ТекСтрока.Ячейки.Подразделение.ЦветФона = ЦветДругая;
КонецЕсли;
/// А Д Р Е С А
Если ВыборкаАдреса.НайтиСледующий(Новый Структура("Объект", ТекСтрока.ДанныеСтроки.Ссылка)) Тогда
ТекСтрока.ячейки.Адрес.Значение = СокрЛП(ВыборкаАдреса.НаселённыйПункт);// АдресТО;
ВыборкаАдреса.Сбросить();
КонецЕсли;
Если ВыборкаТелефон.НайтиСледующий(Новый Структура("Объект", ТекСтрока.ДанныеСтроки.Ссылка)) Тогда
ТекСтрока.ячейки.Телефон.Значение = СокрЛП(ВыборкаТелефон.Представление);// АдресТО;
ВыборкаТелефон.Сбросить();
КонецЕсли;
МаршрутыПоДням = ""; т=0;
Пока ВыборкаМаршруты.НайтиСледующий(Новый Структура("Владелец", ТекСтрока.ДанныеСтроки.Ссылка)) Цикл
МаршрутыПоДням = МаршрутыПоДням+?(т=0,ОбработатьМаршрутыЗаезда(ВыборкаМаршруты),"/"+ОбработатьМаршрутыЗаезда(ВыборкаМаршруты));
т=1;
КонецЦикла;
ТекСтрока.ячейки.Маршруты.Значение = МаршрутыПоДням;// АдресТО;
ВыборкаМаршруты.Сбросить();
КонецЕсли;
КонецЦикла;
Показать
Как и предполагал. Нужно логику поменять раскраски.
Как вариант в обработчике "ПриПолученииДанных" сделать нужные расчеты.
У вас много .Ссылка. а это длительная операция.
После первого обращения .Ссылка. в дальнейшем 1С кэширует и будет быстрее к объекту. ...
в обработчике "ПриПолученииДанных" происходит работа с порциями строк. И можно делать запросы к БД.
Как вариант в обработчике "ПриПолученииДанных" сделать нужные расчеты.
У вас много .Ссылка. а это длительная операция.
После первого обращения .Ссылка. в дальнейшем 1С кэширует и будет быстрее к объекту. ...
в обработчике "ПриПолученииДанных" происходит работа с порциями строк. И можно делать запросы к БД.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот