Разработка интерфейсов в среде 1С:Предприятие 7.7 часто сталкивается с ограничениями, которые в более современных версиях платформы решаются одной галочкой в свойствах. Одной из таких задач является создание многострочного поля ввода, особенно когда речь идет о стандартных реквизитах, таких как Наименование. В этой статье мы подробно разберем, как обойти системные ограничения, проанализируем механизмы хранения данных и выберем оптимальный способ реализации многострочности.
Разберем ситуацию: пользователю необходимо вводить длинное наименование товара или услуги, которое не помещается в одну строку. В свойствах элемента формы типа «Поле ввода» для реквизита Наименование платформа 7.7 жестко блокирует возможность включения многострочного режима, если длина строки ограничена в метаданных. Ситуация осложняется тем, что Наименование — это индексируемое поле, и сделать его «неограниченным» в конфигураторе технически невозможно. Рассмотрим способы решения этой задачи по шагам.
Проанализируем наиболее стабильный и рекомендуемый метод. Он заключается в создании дополнительного реквизита, который будет служить «буфером» для ввода данных. Это позволяет сохранить индексацию основного наименования и предоставить пользователю удобный интерфейс.
ПолноеНаименование с типом Строка неограниченной длины.ПолноеНаименование пропишем код для синхронизации.Рассмотрим пример реализации в модуле формы:
Процедура ПриЗаписи()
// При сохранении элемента обрезаем многострочный текст
// для записи в стандартное наименование
Наименование = Лев(ПолноеНаименование, ПолучитьПустоеЗначение("Строка"));
// Если нужно конкретное ограничение, например 100 символов:
Наименование = Лев(СокрЛП(ПолноеНаименование), 100);
КонецПроцедуры
Процедура ПриОткрытии()
// Если вспомогательный реквизит пуст (например, для старых записей),
// заполним его из обычного наименования
Если ПустоеЗначение(ПолноеНаименование) = 1 Тогда
ПолноеНаименование = Наименование;
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой иногда удается обмануть конфигуратор. Существует старый прием, который работает для обычных (не системных) реквизитов справочника или документа:
Шаг 1. Временно установите в метаданных для строкового реквизита тип «Строка неограниченной длины».
Шаг 2. Зайдите в редактор формы и вынесите этот реквизит. Теперь платформа позволит вам включить свойство «Многострочный».
Шаг 3. Вернитесь в метаданные и установите реквизиту обратно ограниченную длину (например, 200 символов). На форме свойство «Многострочный» останется активным, и поле будет работать как многострочное.
Важно: Этот метод не применим к системному реквизиту Наименование, так как его длину нельзя сделать неограниченной. Также помните, что при вводе текста более установленного лимита, 1С отсечет лишние символы при сохранении объекта в базу данных.
Проанализируем ситуацию с хранением неограниченных строк, о которой упоминалось в обсуждении. Это критически важно для производительности системы.
В файловой версии (DBF) все строки неограниченной длины хранятся в одной общей таблице 1CSTRTBL. В этой таблице текст разбивается на блоки. Если у вас много пользователей одновременно редактируют многострочные поля, это может привести к блокировкам всей таблицы 1CSTRTBL, что парализует работу базы.
В версии для SQL Server ситуация лучше, так как используются таблицы _1CSTRTBL, но механизм хранения остается похожим. Мы рекомендуем использовать строки неограниченной длины только там, где это действительно необходимо, чтобы не раздувать размер индексов и не замедлять выборку данных в списках.
Если штатных средств недостаточно, программисты часто прибегают к использованию библиотеки FormEx. Она позволяет расширить возможности встроенного языка 1С 7.7. С помощью FormEx можно программно управлять свойствами объектов формы, которые недоступны в обычном режиме.
Например, можно перехватить нажатие клавиши Enter в обычном текстовом поле и вставить символ переноса строки РазделительСтрок. Однако стоит помнить, что символ переноса строки в поле ограниченной длины может отображаться как «квадратик», если поле не переведено в многострочный режим на уровне стилей Windows (Edit Control).
Разберем еще один продвинутый вариант — вставку объекта ActiveX на форму 1С. Обычно используют Microsoft Forms 2.0 TextBox. Этот элемент управления изначально поддерживает:
Для работы с ним вам придется инициализировать объект при открытии формы и передавать его значение в реквизит 1С при закрытии или записи:
// Пример обращения к ActiveX на форме
Процедура ПриОткрытии()
ОбъектМногострочный = Форма.АктивИксПоле.Объект;
ОбъектМногострочный.MultiLine = -1; // True
ОбъектМногострочный.Text = МойРеквизитТекст;
КонецПроцедуры
Если ваша задача — просто отобразить длинный текст на форме без возможности его прямого редактирования, мы рекомендуем использовать элемент типа «Текст» вместо «Поля ввода». В свойствах элемента «Текст» установите достаточную высоту, и платформа автоматически будет переносить слова. Для редактирования же такого текста можно предусмотреть кнопку, открывающую отдельное модальное окно с полноценным редактором неограниченной строки.
Мы рассмотрели различные подходы к реализации многострочности в 1С 7.7. Для системного реквизита Наименование единственным надежным способом является связка с дополнительным реквизитом неограниченной длины. Для прочих строковых полей можно использовать «хак» с временным изменением типа или внешние компоненты. Выбирая решение, всегда учитывайте нагрузку на базу данных и удобство пользователя при работе с формами списков, где многострочные данные могут отображаться некорректно.