При решении учебных и практических задач в среде «1С:Предприятие 8» часто возникает необходимость вывести пользователю сводную информацию. Одной из типичных задач является формирование единого сообщения, содержащего список товаров и их обороты (суммы продаж, остатки и т.д.). Рассмотрим подробнее, как реализовать этот функционал правильно, эффективно и красиво.
Проанализируем ситуацию: у нас есть результат запроса или выборка данных на сервере, и нам нужно передать эту информацию на клиент, чтобы показать её пользователю. Главная техническая сложность для начинающего разработчика заключается в том, что метод Сообщить() выводит каждую строку как отдельное сообщение. Если товаров будет много, пользователь получит «простыню» из десятков отдельных окон, что крайне неудобно. Наша цель — собрать весь текст в одну переменную и вывести его одним блоком.
Разберем по шагам простейший алгоритм реализации этой задачи в модуле формы или в общем модуле:
Посмотрим на пример кода, который реализует сборку текста на стороне сервера. Это наиболее понятный способ для решения небольших задач.
&НаСервере
Функция СобратьТекстВывестиСумму()
ТекстСообщения = "";
// Предположим, у нас уже есть РезультатЗапроса
Если РезультатЗапроса.Пустой() Тогда
Возврат "Сведения отсутствуют!";
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Формируем строку для текущей номенклатуры
СтрокаТовара = "Товар: " + Выборка.Номенклатура + " — продан на сумму: " + Выборка.СуммаОборот;
// Добавляем строку к общему тексту и вставляем символ переноса строки (ПС)
ТекстСообщения = ТекстСообщения + СтрокаТовара + Символы.ПС;
КонецЦикла;
Возврат ТекстСообщения;
КонецФункции
В данном примере мы используем системную константу Символы.ПС (перенос строки). Именно она отвечает за то, чтобы каждая новая номенклатура начиналась с новой строки в окне сообщений.
Выясним причину, по которой опытные разработчики стараются избегать оператора + при работе с очень большими строками. В языке 1С строки являются неизменяемым типом данных. Это значит, что при каждом сложении Текст = Текст + НоваяСтрока система создает в памяти новую копию всей накопленной строки. Если номенклатуры тысячи, это может замедлить работу программы.
Рассмотрим более профессиональный и быстрый способ с использованием объекта Массив и функции СтрСоединить:
&НаСервере
Функция СобратьТекстЭффективно()
СписокСтрок = Новый Массив;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ТекстСтроки = СтрШаблон("Товар: %1, Оборот: %2", Выборка.Номенклатура, Выборка.Сумма);
СписокСтрок.Добавить(ТекстСтроки);
КонецЦикла;
// Объединяем все элементы массива в одну строку, разделяя их переносом строки
Возврат СтрСоединить(СписокСтрок, Символы.ПС);
КонецФункции
Использование функции СтрСоединить работает значительно быстрее на больших объемах данных, так как выделение памяти происходит более эффективно.
Просто вывести число (сумму оборота) недостаточно. Без форматирования суммы могут выглядеть как 15000.5 вместо привычных 15 000,50. Проанализируем, как сделать текст профессиональным с помощью функции Формат().
При сборке строки рекомендуется использовать следующую конструкцию:
СтрокаОборота = Формат(Выборка.СуммаОборот, "ЧДЦ=2; ЧГ=3,0");
Здесь ЧДЦ=2 указывает на два знака после запятой, а ЧГ=3,0 включает разделение групп разрядов пробелами. Это сделает ваш «отчет в сообщении» гораздо более читаемым для пользователя.
Хотя стандартный метод Сообщить() прост в освоении, современная платформа 1С 8.3 предлагает использовать объект СообщениеПользователю. Рассмотрим, почему это лучше. Этот объект позволяет не только вывести текст, но и связать его с конкретным элементом формы. Если в будущем вы захотите выводить сообщение не «вообще», а по конкретной строке документа, этот навык вам пригодится.
&НаКлиенте
Процедура ВывестиРезультат(Команда)
ТекстДляВывода = СобратьТекстВывестиСумму();
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстДляВывода;
Сообщение.Сообщить();
КонецПроцедуры
Иногда данных оказывается так много, что обычное текстовое сообщение становится неудобным для восприятия. В таких случаях стоит рассмотреть другие механизмы платформы:
Подводя итог, для решения вашей учебной задачи оптимальным будет сборка массива строк на сервере с последующим объединением через СтрСоединить и выводом через СообщениеПользователю. Это продемонстрирует не только знание синтаксиса, но и понимание вопросов производительности платформы.