Как оптимизировать сборку строки и заполнение представлений в табличной части 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача формирования текстового представления объекта для вывода в табличную часть или отчет. На первый взгляд, простая операция склейки строк может занимать значительную часть времени выполнения алгоритма. Проанализируем типичную ситуацию, когда замер производительности показывает, что на формирование одной строки уходит более 10% времени работы всей процедуры, и разберем способы исправления этой ситуации.

В чем заключается основная проблема производительности?

Рассмотрим исходный пример кода, который вызвал замедление:


НовСтрТовары.ПредставлениеТовара = "" + НовСтрТовары.Номенклатура + ?(ЗначениеЗаполнено(ТекстМест)," ","") + ТекстМест + ЦветПредставление;

На первый взгляд кажется, что проблема в конкатенации (склеивании) строк через оператор +. Однако в контексте 1С основной "тормоз" кроется в фрагменте НовСтрТовары.Номенклатура. Когда мы обращаемся к ссылочному полю таким образом в строковом выражении, платформа выполняет неявный запрос к базе данных, чтобы получить строковое представление объекта (обычно это наименование). Если этот код выполняется в цикле по строкам табличной части, мы получаем классическую проблему "запроса в цикле".

Решение 1: Избавление от обращений через точку

Проанализируем ситуацию: если данные уже находятся в таблице или были получены ранее, нам не нужно заставлять платформу каждый раз обращаться к базе. Вместо использования ссылки Номенклатура, лучше использовать уже имеющееся текстовое поле. Рассмотрим, как можно изменить подход:

  1. Если данные выбираются запросом, необходимо сразу добавить в выборку ПРЕДСТАВЛЕНИЕ(Номенклатура) или Номенклатура.Наименование.
  2. При заполнении строки использовать уже полученную строку.

Пример оптимизированного кода при заполнении из запроса:


// В запросе:
// ВЫБРАТЬ Представление(Т.Номенклатура) КАК НоменклатураНаименование, ...

Для Каждого СтрокаВыборки Из РезультатЗапроса Цикл
    НовСтр = ТаблицаТоваров.Добавить();
    // Используем уже готовую строку из запроса, а не ссылку
    НовСтр.ПредставлениеТовара = СтрокаВыборки.НоменклатураНаименование + ... 
КонецЦикла;

Решение 2: Использование функции СтрШаблон

Для улучшения читаемости и небольшого ускорения сборки строки (особенно если фрагментов много) рекомендуется использовать функцию СтрШаблон. Она позволяет избежать создания множества промежуточных объектов в памяти, которые возникают при использовании оператора +.

Выясним, как переписать исходное выражение:


Пробел = ?(ЗначениеЗаполнено(ТекстМест), " ", "");
НовСтрТовары.ПредставлениеТовара = СтрШаблон("%1%2%3%4", 
    Строка(НовСтрТовары.Номенклатура), 
    Пробел, 
    ТекстМест, 
    ЦветПредставление);

Важный момент: использование Строка(Ссылка) работает быстрее, чем неявное приведение типа "" + Ссылка, так как платформа сразу применяет оптимизированный механизм получения представления.

Решение 3: Пакетное получение представлений

Если нам всё же необходимо получить представления для большого массива ссылок, и мы не можем сделать это в основном запросе, воспользуемся методом ПолучитьПредставленияСсылок(). Это "профессиональный" способ оптимизации, который позволяет за один серверный вызов получить тексты для всех объектов сразу.

Разберем по шагам алгоритм применения этого метода:

  1. Сначала соберем все уникальные ссылки (например, номенклатуру) в массив.
  2. Вызовем метод ОбщегоНазначения.ПолучитьПредставленияСсылок() (или системный аналог).
  3. В цикле заполнения будем брать готовые строки из полученного соответствия.

МассивСсылок = ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура");
Представления = ПолучитьПредставленияСсылок(МассивСсылок); // Системный метод или из БСП

Для Каждого Стр Из ТаблицаТоваров Цикл
    ТекстНоменклатуры = Представления[Стр.Номенклатура];
    Стр.ПредставлениеТовара = ТекстНоменклатуры + ...
КонецЦикла;

Решение 4: Кэширование данных

Часто в табличных частях номенклатура повторяется. В таких случаях мы можем значительно сэкономить время, если будем запоминать уже сформированные строки. Проанализируем пример использования кэша в виде соответствия:


КэшПредставлений = Новый Соответствие;

Для Каждого Стр Из ТаблицаТоваров Цикл
    СформированноеПредставление = КэшПредставлений[Стр.Номенклатура];
    
    Если СформированноеПредставление = Неопределено Тогда
        // Формируем строку только один раз для каждого уникального товара
        СформированноеПредставление = Строка(Стр.Номенклатура) + ...; 
        КэшПредставлений.Вставить(Стр.Номенклатура, СформированноеПредставление);
    КонецЕсли;
    
    Стр.ПредставлениеТовара = СформированноеПредставление;
КонецЦикла;

Рекомендации по итогам анализа

Подводя итог, для оптимизации сборки строк представления в 1С следует придерживаться следующих правил:

Соблюдение этих простых правил позволит сократить время обработки строк с 13% до долей процента, что существенно повысит отзывчивость интерфейса для пользователя.

← На главную