Как сделать перенос строк в поле отчета на СКД?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке отчетов на схеме компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда текстовое поле содержит список элементов, разделенных запятыми (например, список сотрудников: "Иванов В.В., Маринова А.Т., Сидоров А.А."). Вывод такого текста в одну строку сильно затрудняет чтение отчета, особенно если список длинный. Логичным решением является перенос каждого элемента на новую строку.

Давайте подробно разберем, как решить эту задачу в 1С. Мы проанализируем различные подходы — от классического вызова функций общего модуля до современных возможностей платформы без изменения конфигурации, а также рассмотрим важные нюансы визуального оформления.

Решение 1. Использование функции общего модуля и вычисляемого поля (Классический метод)

Если в вашей конфигурации уже хранится строка с перечислением сотрудников через запятую, мы можем динамически заменять запятые на символ переноса строки прямо во время формирования отчета. Для этого настроим вычисляемое поле в СКД и обратимся к серверному общему модулю.

Выполним следующие шаги:

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

Функция ПреобразоватьСтрокуДляСКД(Знач ИсходныйТекст) Экспорт
    
    // Заменяем запятую с пробелом на запятую с последующим переносом строки
    Возврат СтрЗаменить(ИсходныйТекст, ", ", "," + Символы.ПС);
    
КонецФункции
  1. Откроем нашу схему компоновки данных и перейдем на вкладку «Вычисляемые поля».
  2. Добавим новую строку. В колонке «Путь к данным» укажем имя нового поля (например, КраткийСоставПредставление).
  3. В колонке «Выражение» пропишем вызов нашей функции: РаботаСОтчетами.ПреобразоватьСтрокуДляСКД(КраткийСоставДокумента).
  4. Заменим в настройках вывода отчета старое поле КраткийСоставДокумента на наше новое вычисляемое поле КраткийСоставПредставление.

Важное примечание: При программном выводе отчета (особенно во внешних отчетах) не забудьте инициализировать процессор компоновки данных с разрешением использования внешних функций. Посмотрим на пример кода:


ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);

Решение 2. Современный подход без изменения конфигурации (Для платформы 1С 8.3.20 и выше)

Давайте выясним причину, почему разработчики часто избегают создания функций в общих модулях. Это требует изменения метаданных конфигурации, что усложняет последующее обновление. Если вы работаете на современных версиях платформы (начиная с 8.3.20), СКД поддерживает строковые функции, такие как СтрЗаменить, непосредственно в языке выражений.

Рассмотрим по шагам, как настроить перенос строк исключительно средствами СКД:

  1. Откроем схему компоновки данных и перейдем на вкладку «Параметры».
  2. Добавим новый параметр с именем ПС (перенос строки).
  3. Установим для него флажок «Ограничение доступности», чтобы скрыть параметр от конечного пользователя в настройках отчета.
  4. В колонке «Выражение» укажем системное значение: Символы.ПС.
  5. Перейдем на вкладку «Вычисляемые поля» (или откроем выражение представления системного поля на вкладке «Наборы данных»).
  6. Пропишем следующее выражение: СтрЗаменить(КраткийСоставДокумента, ", ", "," + &ПС).

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

Решение 3. Использование агрегатной функции "СоединитьСтроки" (Без хранения избыточных данных в БД)

Проанализируем ситуацию глубже. Хранение склеенных текстовых строк (таких как КраткийСоставДокумента) в базе данных часто является избыточным и заставляет нас перепроводить старые документы при изменении алгоритмов заполнения. Мы можем полностью отказаться от этого реквизита и формировать список сотрудников «на лету» прямо из табличной части документа в запросе СКД.

Разберем этот метод:

  1. В запросе набора данных СКД выберем документы и левым соединением подключим его табличную часть (например, ФизическиеЛица или Сотрудники). Выведем поле Сотрудник.Наименование в выборку.
  2. Перейдем на вкладку «Ресурсы» нашей схемы компоновки.
  3. Добавим поле Сотрудник в список ресурсов.
  4. В колонке «Выражение» используем мощную встроенную агрегатную функцию СКД:

СоединитьСтроки(Сотрудник, &ПС, ", ")

Здесь параметр &ПС — это созданный нами параметр со значением Символы.ПС (как описано в Решении 2). Платформа автоматически сгруппирует всех сотрудников по документам и выведет их аккуратным списком, где каждая фамилия будет начинаться с новой строки. Для реализации подобного объединения данных подойдёт пример сборки значений колонки из нескольких строк в СКД.

Решение 4. Обязательное условное оформление ("Размещение текста")

Даже если мы применили любой из вышеперечисленных методов и добавили символы переноса строки, система компоновки данных при выводе в табличный документ может проигнорировать их. Весь текст все равно отобразится в одну строку или сожмется. Выясним, почему это происходит.

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

  1. В схеме компоновки данных перейдем во вкладку «Настройки», а затем на вкладку «Условное оформление».
  2. Добавим новый элемент оформления.
  3. В появившемся окне параметров найдем свойство «Размещение» (в некоторых версиях платформы оно называется «Размещение текста») и установим значение «Переносить».
  4. Перейдем на вкладку «Оформляемые поля» и добавим туда наше поле (например, КраткийСоставДокумента или наше вычисляемое поле).
  5. Условия оформления оставляем пустыми (правило должно применяться ко всем строкам отчета).

После применения этой настройки платформа будет автоматически расширять высоту строк таблицы, корректно отображая каждый элемент списка на новой строке.

Решение 5. Запись данных с переносом строки непосредственно в базу данных

Иногда возникает необходимость сделать так, чтобы переносы строк хранились непосредственно в самом документе (чтобы они красиво выглядели на формах документов и в печатных формах без дополнительных манипуляций в СКД).

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


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

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

← На главную