В процессе разработки часто возникает задача формирования текстового представления объекта для вывода в табличную часть или отчет. На первый взгляд, простая операция склейки строк может занимать значительную часть времени выполнения алгоритма. Проанализируем типичную ситуацию, когда замер производительности показывает, что на формирование одной строки уходит более 10% времени работы всей процедуры, и разберем способы исправления этой ситуации.
Рассмотрим исходный пример кода, который вызвал замедление:
НовСтрТовары.ПредставлениеТовара = "" + НовСтрТовары.Номенклатура + ?(ЗначениеЗаполнено(ТекстМест)," ","") + ТекстМест + ЦветПредставление;
На первый взгляд кажется, что проблема в конкатенации (склеивании) строк через оператор +. Однако в контексте 1С основной "тормоз" кроется в фрагменте НовСтрТовары.Номенклатура. Когда мы обращаемся к ссылочному полю таким образом в строковом выражении, платформа выполняет неявный запрос к базе данных, чтобы получить строковое представление объекта (обычно это наименование). Если этот код выполняется в цикле по строкам табличной части, мы получаем классическую проблему "запроса в цикле".
Проанализируем ситуацию: если данные уже находятся в таблице или были получены ранее, нам не нужно заставлять платформу каждый раз обращаться к базе. Вместо использования ссылки Номенклатура, лучше использовать уже имеющееся текстовое поле. Рассмотрим, как можно изменить подход:
ПРЕДСТАВЛЕНИЕ(Номенклатура) или Номенклатура.Наименование.Пример оптимизированного кода при заполнении из запроса:
// В запросе:
// ВЫБРАТЬ Представление(Т.Номенклатура) КАК НоменклатураНаименование, ...
Для Каждого СтрокаВыборки Из РезультатЗапроса Цикл
НовСтр = ТаблицаТоваров.Добавить();
// Используем уже готовую строку из запроса, а не ссылку
НовСтр.ПредставлениеТовара = СтрокаВыборки.НоменклатураНаименование + ...
КонецЦикла;
Для улучшения читаемости и небольшого ускорения сборки строки (особенно если фрагментов много) рекомендуется использовать функцию СтрШаблон. Она позволяет избежать создания множества промежуточных объектов в памяти, которые возникают при использовании оператора +.
Выясним, как переписать исходное выражение:
Пробел = ?(ЗначениеЗаполнено(ТекстМест), " ", "");
НовСтрТовары.ПредставлениеТовара = СтрШаблон("%1%2%3%4",
Строка(НовСтрТовары.Номенклатура),
Пробел,
ТекстМест,
ЦветПредставление);
Важный момент: использование Строка(Ссылка) работает быстрее, чем неявное приведение типа "" + Ссылка, так как платформа сразу применяет оптимизированный механизм получения представления.
Если нам всё же необходимо получить представления для большого массива ссылок, и мы не можем сделать это в основном запросе, воспользуемся методом ПолучитьПредставленияСсылок(). Это "профессиональный" способ оптимизации, который позволяет за один серверный вызов получить тексты для всех объектов сразу.
Разберем по шагам алгоритм применения этого метода:
ОбщегоНазначения.ПолучитьПредставленияСсылок() (или системный аналог).
МассивСсылок = ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура");
Представления = ПолучитьПредставленияСсылок(МассивСсылок); // Системный метод или из БСП
Для Каждого Стр Из ТаблицаТоваров Цикл
ТекстНоменклатуры = Представления[Стр.Номенклатура];
Стр.ПредставлениеТовара = ТекстНоменклатуры + ...
КонецЦикла;
Часто в табличных частях номенклатура повторяется. В таких случаях мы можем значительно сэкономить время, если будем запоминать уже сформированные строки. Проанализируем пример использования кэша в виде соответствия:
КэшПредставлений = Новый Соответствие;
Для Каждого Стр Из ТаблицаТоваров Цикл
СформированноеПредставление = КэшПредставлений[Стр.Номенклатура];
Если СформированноеПредставление = Неопределено Тогда
// Формируем строку только один раз для каждого уникального товара
СформированноеПредставление = Строка(Стр.Номенклатура) + ...;
КэшПредставлений.Вставить(Стр.Номенклатура, СформированноеПредставление);
КонецЕсли;
Стр.ПредставлениеТовара = СформированноеПредставление;
КонецЦикла;
Подводя итог, для оптимизации сборки строк представления в 1С следует придерживаться следующих правил:
Ссылка.Наименование).ПолучитьПредставленияСсылок.СтрШаблон для повышения качества кода и стабильности производительности.Соблюдение этих простых правил позволит сократить время обработки строк с 13% до долей процента, что существенно повысит отзывчивость интерфейса для пользователя.