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