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

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

При решении учебных и практических задач в среде «1С:Предприятие 8» часто возникает необходимость вывести пользователю сводную информацию. Одной из типичных задач является формирование единого сообщения, содержащего список товаров и их обороты (суммы продаж, остатки и т.д.). Рассмотрим подробнее, как реализовать этот функционал правильно, эффективно и красиво.

Анализ задачи и базовый подход

Проанализируем ситуацию: у нас есть результат запроса или выборка данных на сервере, и нам нужно передать эту информацию на клиент, чтобы показать её пользователю. Главная техническая сложность для начинающего разработчика заключается в том, что метод Сообщить() выводит каждую строку как отдельное сообщение. Если товаров будет много, пользователь получит «простыню» из десятков отдельных окон, что крайне неудобно. Наша цель — собрать весь текст в одну переменную и вывести его одним блоком.

Разберем по шагам простейший алгоритм реализации этой задачи в модуле формы или в общем модуле:

  1. Создаем строковую переменную для накопления текста.
  2. Выполняем запрос к данным.
  3. В цикле обхода результата запроса добавляем информацию о каждой позиции номенклатуры в нашу переменную.
  4. Используем специальные символы для переноса строки, чтобы текст не слипался в одну длинную горизонтальную линию.
  5. Возвращаем готовую строку на клиент и выводим её.

Реализация через конкатенацию строк

Посмотрим на пример кода, который реализует сборку текста на стороне сервера. Это наиболее понятный способ для решения небольших задач.


&НаСервере
Функция СобратьТекстВывестиСумму()
    ТекстСообщения = "";
    
    // Предположим, у нас уже есть РезультатЗапроса
    Если РезультатЗапроса.Пустой() Тогда
        Возврат "Сведения отсутствуют!";
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Формируем строку для текущей номенклатуры
        СтрокаТовара = "Товар: " + Выборка.Номенклатура + " — продан на сумму: " + Выборка.СуммаОборот;
        
        // Добавляем строку к общему тексту и вставляем символ переноса строки (ПС)
        ТекстСообщения = ТекстСообщения + СтрокаТовара + Символы.ПС;
    КонецЦикла;
    
    Возврат ТекстСообщения;
КонецФункции

В данном примере мы используем системную константу Символы.ПС (перенос строки). Именно она отвечает за то, чтобы каждая новая номенклатура начиналась с новой строки в окне сообщений.

Оптимизация сборки текста через массив

Выясним причину, по которой опытные разработчики стараются избегать оператора + при работе с очень большими строками. В языке 1С строки являются неизменяемым типом данных. Это значит, что при каждом сложении Текст = Текст + НоваяСтрока система создает в памяти новую копию всей накопленной строки. Если номенклатуры тысячи, это может замедлить работу программы.

Рассмотрим более профессиональный и быстрый способ с использованием объекта Массив и функции СтрСоединить:


&НаСервере
Функция СобратьТекстЭффективно()
    СписокСтрок = Новый Массив;
    
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        ТекстСтроки = СтрШаблон("Товар: %1, Оборот: %2", Выборка.Номенклатура, Выборка.Сумма);
        СписокСтрок.Добавить(ТекстСтроки);
    КонецЦикла;
    
    // Объединяем все элементы массива в одну строку, разделяя их переносом строки
    Возврат СтрСоединить(СписокСтрок, Символы.ПС);
КонецФункции

Использование функции СтрСоединить работает значительно быстрее на больших объемах данных, так как выделение памяти происходит более эффективно.

Улучшение читаемости: форматирование чисел

Просто вывести число (сумму оборота) недостаточно. Без форматирования суммы могут выглядеть как 15000.5 вместо привычных 15 000,50. Проанализируем, как сделать текст профессиональным с помощью функции Формат().

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

СтрокаОборота = Формат(Выборка.СуммаОборот, "ЧДЦ=2; ЧГ=3,0");

Здесь ЧДЦ=2 указывает на два знака после запятой, а ЧГ=3,0 включает разделение групп разрядов пробелами. Это сделает ваш «отчет в сообщении» гораздо более читаемым для пользователя.

Использование объекта СообщениеПользователю

Хотя стандартный метод Сообщить() прост в освоении, современная платформа 1С 8.3 предлагает использовать объект СообщениеПользователю. Рассмотрим, почему это лучше. Этот объект позволяет не только вывести текст, но и связать его с конкретным элементом формы. Если в будущем вы захотите выводить сообщение не «вообще», а по конкретной строке документа, этот навык вам пригодится.


&НаКлиенте
Процедура ВывестиРезультат(Команда)
    ТекстДляВывода = СобратьТекстВывестиСумму();
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстДляВывода;
    Сообщение.Сообщить();
КонецПроцедуры

Альтернативные варианты вывода

Иногда данных оказывается так много, что обычное текстовое сообщение становится неудобным для восприятия. В таких случаях стоит рассмотреть другие механизмы платформы:

  1. ПоказатьОповещениеПользователя() — если нужно вывести краткое всплывающее уведомление в углу экрана.
  2. ФорматированнаяСтрока — если вы хотите выделить названия товаров жирным шрифтом или цветом.
  3. ПоказатьЗначение() — если текста очень много, можно передать его в этот метод, и 1С откроет отдельное текстовое окно с возможностью поиска и копирования.

Подводя итог, для решения вашей учебной задачи оптимальным будет сборка массива строк на сервере с последующим объединением через СтрСоединить и выводом через СообщениеПользователю. Это продемонстрирует не только знание синтаксиса, но и понимание вопросов производительности платформы.

← На главную