При разработке интерфейсов на "Обычных формах" (в конфигурациях на базе 1С:Предприятие 8.2 или 8.3 в режиме совместимости) программисты часто сталкиваются с ситуацией, когда программно добавленная колонка в списке справочника или документа обрезает строку. Текст выводится не полностью, а ограничивается ровно десятью знаками. Рассмотрим подробно, почему это происходит, как изменить настройки отображения и как оптимизировать этот процесс для повышения производительности системы.
В платформе 1С объект ТабличноеПоле, который используется для отображения списков, работает строго с типами данных. Когда мы добавляем на форму новую колонку, не связанную напрямую с реквизитом справочника (вычисляемую колонку), система должна определить, какой тип данных в ней будет храниться. По умолчанию, если тип не задан явно в конфигураторе, 1С назначает такой колонке тип Строка с длиной 10 символов.
Проанализируем ситуацию: когда в процедуре ПриВыводеСтроки мы пишем код ОформлениеСтроки.Ячейки.ИмяКолонки.Значение = "ДлиннаяСтрока", платформа пытается привести переданную строку к типу данных колонки. Поскольку тип ограничен десятью символами, всё, что находится за пределами этого лимита, безвозвратно обрезается. Это поведение является стандартным для ядра платформы при работе с нетипизированными элементами управления.
Самый быстрый способ обойти ограничение без изменения свойств в конфигураторе — это использование свойства Текст вместо свойства Значение. Разница между ними принципиальна:
Рассмотрим пример правильного кода в обработчике ПриВыводеСтроки:
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
СтрокаДляОтображения = "";
Если ДанныеСтроки.ПризнакМТР = 1 Тогда
СтрокаДляОтображения = "Товар";
ИначеЕсли ДанныеСтроки.ПризнакМТР = 2 Тогда
СтрокаДляОтображения = "Оборудование (производственное)";
КонецЕсли;
// Вместо .Значение используем метод УстановитьТекст()
ОформлениеСтроки.Ячейки.ПризнакМТРРасшифровка.УстановитьТекст(СтрокаДляОтображения);
КонецПроцедуры
Если нам необходимо, чтобы в колонке хранилось именно Значение (например, для последующего анализа или выгрузки), мы должны изменить метаданные самой колонки на форме. Разберем по шагам, как это сделать:
ТабличноеПоле и откройте список его колонок.Строка без указания длины.Строка, а в поле "Длина" укажите достаточное количество символов (например, 50 или 100) либо установите флаг "Неограниченная длина".Также можно изменить Тип элемента управления. Если установить его как Поле ввода, у него появится собственная настройка типа, которая перекроет настройки колонки.
Проанализируем производительность. Процедура ПриВыводеСтроки вызывается для каждой отрисовываемой строки списка по отдельности. Если пользователь быстро прокручивает список, это создает значительную нагрузку на процессор. Профессиональным стандартом разработки в 1С считается использование события ПриПолученииДанных.
Это событие вызывается один раз для всей группы строк, которые планируется отобразить на экране. Рассмотрим пример реализации:
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Оформление Из ОформленияСтрок Цикл
// Получаем данные текущей строки через ссылку
Данные = Оформление.ДанныеСтроки;
Если Данные.ПризнакМТР = 1 Тогда
ТекстЯчейки = "Товар";
ИначеЕсли Данные.ПризнакМТР = 2 Тогда
ТекстЯчейки = "Оборудование";
КонецЕсли;
Оформление.Ячейки.ПризнакМТРРасшифровка.УстановитьТекст(ТекстЯчейки);
КонецЦикла;
КонецПроцедуры
Важное преимущество: в этом методе можно выполнять запросы к базе данных сразу по всем ссылкам из массива ОформленияСтрок, что в десятки раз быстрее, чем делать запросы в цикле ПриВыводеСтроки.
Выясним причину еще одной частой проблемы: если вы скрываете колонку ПризнакМТР (снимаете флаг видимости), то в коде ДанныеСтроки.ПризнакМТР может вернуть пустое значение или ошибку. Это происходит потому, что платформа 1С в целях экономии трафика не считывает из базы данные тех полей, которые не отображаются на форме.
Чтобы данные были доступны в коде даже при скрытой колонке, выполните следующие действия:
СправочникСписок (или другой источник данных формы).ПризнакМТР).После этого платформа будет включать данное поле в SQL-запрос выборки данных независимо от видимости колонок на экране пользователя, и ваш алгоритм расшифровки будет работать корректно.
Мы рассмотрели три основных способа решения проблемы с ограничением длины строки. Для простых текстовых подписей оптимально использовать УстановитьТекст(). Для сложных интерфейсов с вычислениями правильнее будет настроить типы данных в конфигураторе и перенести логику в событие ПриПолученииДанных. Помните о свойстве Использовать всегда, чтобы ваши алгоритмы не зависели от настроек видимости, установленных пользователем.