При разработке на платформе «1С:Предприятие» перед программистом часто встает вопрос: как правильно и максимально эффективно собрать строку из нескольких фрагментов? Казалось бы, простая задача, но выбор метода — будь то обычное сложение через оператор +, использование платформенной функции СтрШаблон или вызов функции БСП СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку — может существенно повлиять на производительность системы, читаемость кода и возможность локализации конфигурации. В этой статье мы подробно разберем, какой инструмент и в какой ситуации будет предпочтительнее.
Разберем самый очевидный способ — обычное сложение строк. На первый взгляд, это самый быстрый метод, особенно когда нам нужно соединить всего два фрагмента (для визуального проектирования таких конструкций подойдет генератор форматированной строки), например, строковый литерал и переменную. Рассмотрим пример:
ТекстСообщения = "Текущий пользователь: " + ИмяПользователя;
Проанализируем ситуацию с точки зрения платформы. В 1С строки являются неизменяемыми объектами (immutable). Это означает, что при выполнении операции А + Б + В платформа не просто дописывает символы в конец первой строки, а каждый раз выделяет новый блок памяти, создает промежуточный объект, копирует туда данные и только потом переходит к следующему шагу. Если мы складываем всего два коротких литерала, это происходит мгновенно. Однако в циклах или при сборке длинных текстов (где иногда лучше применить регулярные выражения) такой подход превращается в «убийцу» производительности из-за фрагментации памяти и постоянных аллокаций.
Важный нюанс: Конкатенация делает код «жестким». Если ваше решение планируется использовать в многоязычной среде, переводчику будет крайне сложно изменить порядок слов в предложении, так как он зашит в логику кода через оператор + — ускорить локализацию поможет автоматический переводчик печатных форм и строк 1С.
Начиная с версии платформы 8.3.6, разработчикам доступна встроенная функция СтрШаблон. Она реализована на уровне ядра (C++) и работает значительно быстрее, чем любые аналоги, написанные на встроенном языке 1С. Рассмотрим типичный пример её использования:
ТекстШаблона = НСтр("ru = 'Документ №%1 от %2 был успешно проведен'");
Результат = СтрШаблон(ТекстШаблона, НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));
Почему этот метод считается предпочтительным? Разберем по шагам:
НСтр. Переводчик может поменять местами параметры %1 и %2 в зависимости от грамматики другого языка, при этом сам код изменять не потребуется.Строка(Число)).Однако у СтрШаблон есть ограничение: она поддерживает подстановку не более 10 параметров (от %1 до %10). Если вам нужно больше — придется искать альтернативы.
Многие разработчики по привычке используют функцию из состава Библиотеки Стандартных Подсистем (БСП): СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку, заглядывая в справочник по методам БСП для поиска примеров. Выясним причину популярности этого метода.
В современных версиях БСП эта функция является «умной» оберткой. Если версия платформы позволяет, она внутри себя вызывает ту же самую СтрШаблон. Если же параметров больше 10 или требуется сложная предварительная обработка, БСП выполняет это программно.
Почему АПК (Автоматизированная проверка конфигураций) иногда ругается на СтрШаблон? Проблема не в самой функции, а в её использовании. Разработчики часто пишут СтрШаблон("Текст %1", Параметр), забывая про НСтр. АПК настроен так, чтобы поощрять использование функций БСП, которые исторически лучше интегрированы с механизмами локализации и стандартами разработки фирмы «1С» — для контроля качества кода пригодится инструментарий для отладки и оптимизации кода 1С.
Если ваша задача — собрать строку из огромного массива фрагментов (например, генерация сложного SQL-запроса или построение XML вручную), забудьте про конкатенацию и даже про шаблоны. Здесь лучшим выбором будет СтрСоединить.
Посмотрим на пример эффективной склейки:
МассивСтрок = Новый Массив;
Для Каждого СтрокаДанных Из ТаблицаРезультатов Цикл
МассивСтрок.Добавить(СтрокаДанных.Значение);
КонецЦикла;
ИтоговаяСтрока = СтрСоединить(МассивСтрок, Символы.ПС);
Этот метод работает по принципу StringBuilder в других языках программирования. Платформа сначала вычисляет суммарную длину всех элементов массива, выделяет один общий буфер памяти и один раз копирует туда все данные. Это в десятки и сотни раз быстрее, чем сложение строк в цикле через +.
Проанализируем ситуацию и подведем итоги выбора метода:
СтрШаблон с НСтр. Это стандарт качества. Конкатенация через + будет чуть быстрее по замерам (на микросекунды), но проигрывает в культуре кода.СтрСоединить для большого количества фрагментов.СтрШаблон или функции БСП. Это обеспечит правильную локализацию и легкое чтение кода коллегами.Важный совет: Не стоит преждевременно оптимизировать то, что и так работает быстро. Если функция вызывается раз в час при нажатии кнопки пользователем, разница в 0.001 сек между + и СтрШаблон не имеет значения. В этом случае на первое место выходит поддержка кода и его понятность.
Подводя итог, можно сказать: используйте СтрШаблон как основной инструмент для формирования текстов, СтрСоединить для работы с массивами данных и конкатенацию + только для самых простых, не требующих перевода технических строк в критических по скорости местах.