При разработке внешних обработок программисты часто сталкиваются с ситуацией, когда текстовые данные (например, комментарии, наименования или артикулы) отображаются не полностью. В этой статье мы подробно разберем, почему данные могут обрезаться, и рассмотрим все способы изменения длины строковых реквизитов в таблицах на управляемых формах.
Если при заполнении таблицы программным кодом или через запрос вы замечаете, что строка всегда обрезается до определенного количества символов (например, 10, 25 или 50), это явный признак того, что для данного реквизита установлены жесткие квалификаторы строки. В системе 1С:Предприятие 8.3 длина строки — это не просто визуальный параметр, а свойство типа данных реквизита.
Рассмотрим ситуацию: вы получаете данные из запроса, где поле имеет неограниченную длину, но записываете их в таблицу, где в настройках указано Длина: 25. В момент присваивания значения платформа принудительно отсекает "лишние" символы, чтобы значение соответствовало типу данных приемника.
Чаще всего внешние обработки проектируются с использованием Табличных частей, которые создаются непосредственно в дереве метаданных самого объекта обработки (на вкладке "Основные"). Это позволяет сохранять данные в файле обработки между вызовами процедур сервера.
Проанализируем шаги по исправлению длины в этом случае:
Изделия).Наименование или Комментарий).Строка, и изменим значение в поле Длина на нужное (например, 100 или 500).Важно: Если установить неограниченную длину для реквизита табличной части, система позволит хранить тексты любого размера, однако такие поля имеют свои особенности при сортировке и индексации в базе данных.
Иногда таблица создается не в объекте, а непосредственно в форме обработки на вкладке "Реквизиты". Такие таблицы существуют только во время работы формы и не сохраняются в объекте обработки.
Выясним, как изменить тип данных в этом случае:
ДанныеФормыКоллекция).Помните, что изменение свойств Элемента формы (в левой части редактора формы) не поможет. Свойства элемента (колонки таблицы на форме) отвечают только за визуальное отображение: ширину колонки, шрифт и возможность многострочного ввода. Реальное ограничение данных всегда кроется в Реквизите. Для быстрой проверки и настройки отображения открытых форм в режиме предприятия подойдёт инструмент для просмотра и редактирования свойств открытых форм.
Часто программисты пытаются решить проблему обрезки данных прямо в тексте запроса. Посмотрим на типичный пример кода, который может использоваться для получения данных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
| ВЫРАЗИТЬ(ЗаказКлиентаТовары.Ссылка.Комментарий КАК СТРОКА(150)) КАК Наименование
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
|ГДЕ
| ЗаказКлиентаТовары.Ссылка.Номер = &Номер";
Использование оператора ВЫРАЗИТЬ крайне полезно, когда источник данных имеет неограниченную длину (например, тип Строка с неограниченной длиной в СУБД), а нам нужно привести его к фиксированной длине для корректной выгрузки в таблицу или для обеспечения возможности сортировки. Однако, если после выполнения этого запроса вы присваиваете результат строке таблицы с длиной 25, оператор ВЫРАЗИТЬ( ... КАК СТРОКА(150)) не спасет — данные все равно будут обрезаны до 25 символов при записи в таблицу. Для глубокого понимания работы с такими полями пригодится публикация с разбором ограничений полей неограниченной длины и оператора ВЫРАЗИТЬ.
Рассмотрим правильный подход к заполнению таблицы на форме, когда мы обходим выборку запроса. Обратите внимание, что переменная СтрокаТаблицы должна быть получена из объекта, тип колонок которого мы уже настроили ранее.
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Добавляем новую строку в табличную часть обработки
НоваяСтрока = Объект.Изделия.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
// Если здесь колонка "Наименование" имеет длину 100 в метаданных,
// данные из Выборка.Наименование (длиной 150) будут обрезаны до 100.
НоваяСтрока.Наименование = Выборка.Наименование;
КонецЦикла;
После того как мы увеличили длину реквизита в метаданных (до 100, 200 символов или до неограниченной), может возникнуть другая проблема: текст помещается в ячейку, но видна только его часть, так как ячейка слишком узкая. Чтобы пользователь мог комфортно читать длинные строки, выполним следующие настройки Элемента формы:
Да.Да. Это позволит тексту переноситься на новую строку внутри одной ячейки, если он не помещается по ширине.Подведем итог нашего анализа. Для решения проблемы с обрезкой строки во внешней обработке необходимо выполнить три действия:
ВЫРАЗИТЬ с малым значением длины.Если вы создаете таблицу значений программно "на лету" (через Новый ТаблицаЗначений), не забывайте указывать описание типов при добавлении колонок, используя конструктор Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)). Это гарантирует, что ваши данные сохранят свою целостность при передаче между процедурами.