В практике разработки на платформе 1С часто возникает ситуация, когда стандартные возможности платформы накладывают ограничения на пользовательский интерфейс. Типичный пример — использование табличного документа (макета) не просто для вывода данных, а как полноценного инструмента ввода. Рассмотрим ситуацию: в ячейке макета настроен выбор элемента справочника. По умолчанию система отображает в этой ячейке «Наименование» объекта. Однако стандартная длина наименования ограничена 150 символами, а пользователю необходимо видеть и вводить длинные описания, которые хранятся в реквизите Комментарий с неограниченной длиной. Выясним, как обойти это ограничение и заставить систему выводить нужное нам поле.
Когда мы устанавливаем в ячейке макета свойство СодержитЗначение и указываем тип (например, СправочникСсылка.Номенклатура), платформа при выборе значения автоматически пытается получить строковое представление этого объекта. По умолчанию представлением является именно реквизит Наименование (или Код, если так настроено в метаданных). Проблема заключается в том, что даже если мы программно запишем в параметр макета длинную строку, при интерактивном перевыборе значения в этой ячейке пользователем, система снова подставит краткое наименование.
Проанализируем ситуацию: нам необходимо изменить логику формирования «Представления» объекта на уровне всей системы или конкретного контекста. Разберем наиболее эффективные способы решения этой задачи.
Этот метод является наиболее элегантным и надежным, если нам нужно, чтобы поле Комментарий выводилось вместо Наименования везде, где используется данный справочник. Для реализации этого подхода нам потребуется внести изменения в модуль менеджера соответствующего справочника. Рассмотрим подробнее необходимые процедуры.
Во-первых, воспользуемся обработчиком ОбработкаПолученияПолейПредставления. Этот обработчик определяет, какие именно поля должны быть считаны из базы данных для формирования строки представления. По умолчанию это только наименование, но нам нужно добавить и комментарий.
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("Комментарий");
// Отключаем стандартную обработку, чтобы система учла наш список полей
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Во-вторых, реализуем саму логику формирования строки в обработчике ОбработкаПолученияПредставления. Именно здесь мы скажем системе, что в качестве итоговой строки нужно вернуть текст комментария.
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Проверяем, заполнен ли комментарий
Если ПустаяСтрока(Данные.Комментарий) Тогда
Представление = Данные.Наименование; // Если пусто, оставляем наименование
Иначе
Представление = Данные.Комментарий; // Подставляем наш длинный текст
КонецЕсли;
// Обязательно устанавливаем СтандартнаяОбработка в Ложь
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Важный нюанс: использование этого метода повлияет на все списки, поля выбора и отчеты, где фигурирует данный справочник. Если поле Комментарий содержит очень большие объемы данных (мегабайты текста), это может негативно сказаться на производительности списков и потреблении оперативной памяти.
Если глобальное изменение представления справочника нежелательно, мы можем решить задачу локально, на уровне формы, где отображается табличный документ. Рассмотрим, как это сделать по шагам:
ПолеТабличногоДокумента.ПриИзменении и создайте соответствующий обработчик в модуле формы.Посмотрим на пример кода, реализующего этот алгоритм:
Процедура ТабличноеПолеПриИзменении(Элемент)
ТекущаяОбласть = Элемент.ТекущаяОбласть;
// Проверяем, что в ячейке именно ссылка на наш справочник
Если ТипЗнч(ТекущаяОбласть.Значение) = Тип("СправочникСсылка.ВашСправочник") Тогда
СсылкаНаОбъект = ТекущаяОбласть.Значение;
// Получаем комментарий напрямую из базы
ДлинныйТекст = СсылкаНаОбъект.Комментарий;
// Устанавливаем Текст ячейки, при этом Значение (ссылка) сохраняется
ТекущаяОбласть.Текст = ДлинныйТекст;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он не затрагивает другие части системы. В ячейке сохраняется ссылка на объект (для расшифровки или дальнейшей обработки), но визуально пользователь видит полный текст комментария.
Просто подставить длинный текст недостаточно — нужно обеспечить его корректное отображение в макете. Если оставить стандартные настройки, текст «уйдет» за границы ячейки или будет обрезан. Чтобы этого избежать, проанализируем настройки свойств ячейки в конфигураторе или программно:
Переносить. Это позволит тексту разбиваться на несколько строк внутри одной ячейки.Автовысота. В противном случае, даже с включенным переносом, высота ячейки останется стандартной, и пользователь увидит только первую строку текста.Поскольку одной из целей часто является последующая выгрузка отчета в Excel, следует помнить о технических лимитах. Программа Microsoft Excel имеет ограничение на количество символов в одной ячейке (около 32 767 символов). Если ваш Комментарий в 1С превышает этот предел, при сохранении табличного документа в формат .xls или .xlsx текст будет принудительно обрезан на стороне Excel.
Также обратите внимание, что при использовании метода ТабличныйДокумент.Записать(), 1С выгружает именно то, что отображается на экране (свойство Текст ячейки). Если вы реализовали подмену через ОбработкаПолученияПредставления, данные выгрузятся корректно без дополнительных усилий.
Мы рассмотрели два основных способа вывода длинного текста в макет. Выбор зависит от архитектуры вашей задачи: первый способ идеален для единообразного отображения данных во всей системе, а второй — для точечной настройки конкретного отчета или формы ввода. Сочетание этих методов с правильной настройкой свойств ячеек (перенос текста и автовысота) позволяет создавать удобные и функциональные интерфейсы даже в рамках такого жесткого инструмента, как табличный документ.