Как реализовать многострочный ввод для строковых реквизитов в 1С 7.7?

Программист 1С v7.7
← На главную

Разработка интерфейсов в среде 1С:Предприятие 7.7 часто сталкивается с ограничениями, которые в более современных версиях платформы решаются одной галочкой в свойствах. Одной из таких задач является создание многострочного поля ввода, особенно когда речь идет о стандартных реквизитах, таких как Наименование. В этой статье мы подробно разберем, как обойти системные ограничения, проанализируем механизмы хранения данных и выберем оптимальный способ реализации многострочности.

Проблема стандартного реквизита «Наименование»

Разберем ситуацию: пользователю необходимо вводить длинное наименование товара или услуги, которое не помещается в одну строку. В свойствах элемента формы типа «Поле ввода» для реквизита Наименование платформа 7.7 жестко блокирует возможность включения многострочного режима, если длина строки ограничена в метаданных. Ситуация осложняется тем, что Наименование — это индексируемое поле, и сделать его «неограниченным» в конфигураторе технически невозможно. Рассмотрим способы решения этой задачи по шагам.

Способ 1: Использование вспомогательного реквизита (Метод синхронизации)

Проанализируем наиболее стабильный и рекомендуемый метод. Он заключается в создании дополнительного реквизита, который будет служить «буфером» для ввода данных. Это позволяет сохранить индексацию основного наименования и предоставить пользователю удобный интерфейс.

  1. В конфигураторе добавим новый реквизит справочника, например, ПолноеНаименование с типом Строка неограниченной длины.
  2. Разместим этот реквизит на форме элемента справочника. В свойствах элемента формы (Поле ввода) установим флажок «Многострочный». Это позволит тексту автоматически переноситься на новые строки.
  3. Теперь нам нужно обеспечить связь между многострочным полем и стандартным наименованием. Для этого в формуле элемента формы ПолноеНаименование пропишем код для синхронизации.

Рассмотрим пример реализации в модуле формы:


Процедура ПриЗаписи()
    // При сохранении элемента обрезаем многострочный текст 
    // для записи в стандартное наименование
    Наименование = Лев(ПолноеНаименование, ПолучитьПустоеЗначение("Строка"));
    // Если нужно конкретное ограничение, например 100 символов:
    Наименование = Лев(СокрЛП(ПолноеНаименование), 100);
КонецПроцедуры

Процедура ПриОткрытии()
    // Если вспомогательный реквизит пуст (например, для старых записей),
    // заполним его из обычного наименования
    Если ПустоеЗначение(ПолноеНаименование) = 1 Тогда
        ПолноеНаименование = Наименование;
    КонецЕсли;
КонецПроцедуры

Способ 2: Визуальный «хак» с изменением длины реквизита

Выясним причину, по которой иногда удается обмануть конфигуратор. Существует старый прием, который работает для обычных (не системных) реквизитов справочника или документа:

Шаг 1. Временно установите в метаданных для строкового реквизита тип «Строка неограниченной длины».

Шаг 2. Зайдите в редактор формы и вынесите этот реквизит. Теперь платформа позволит вам включить свойство «Многострочный».

Шаг 3. Вернитесь в метаданные и установите реквизиту обратно ограниченную длину (например, 200 символов). На форме свойство «Многострочный» останется активным, и поле будет работать как многострочное.

Важно: Этот метод не применим к системному реквизиту Наименование, так как его длину нельзя сделать неограниченной. Также помните, что при вводе текста более установленного лимита, 1С отсечет лишние символы при сохранении объекта в базу данных.

Особенности хранения данных: SQL против DBF

Проанализируем ситуацию с хранением неограниченных строк, о которой упоминалось в обсуждении. Это критически важно для производительности системы.

В файловой версии (DBF) все строки неограниченной длины хранятся в одной общей таблице 1CSTRTBL. В этой таблице текст разбивается на блоки. Если у вас много пользователей одновременно редактируют многострочные поля, это может привести к блокировкам всей таблицы 1CSTRTBL, что парализует работу базы.

В версии для SQL Server ситуация лучше, так как используются таблицы _1CSTRTBL, но механизм хранения остается похожим. Мы рекомендуем использовать строки неограниченной длины только там, где это действительно необходимо, чтобы не раздувать размер индексов и не замедлять выборку данных в списках.

Способ 3: Использование внешних компонент (FormEx)

Если штатных средств недостаточно, программисты часто прибегают к использованию библиотеки FormEx. Она позволяет расширить возможности встроенного языка 1С 7.7. С помощью FormEx можно программно управлять свойствами объектов формы, которые недоступны в обычном режиме.

Например, можно перехватить нажатие клавиши Enter в обычном текстовом поле и вставить символ переноса строки РазделительСтрок. Однако стоит помнить, что символ переноса строки в поле ограниченной длины может отображаться как «квадратик», если поле не переведено в многострочный режим на уровне стилей Windows (Edit Control).

Способ 4: Использование ActiveX элементов

Разберем еще один продвинутый вариант — вставку объекта ActiveX на форму 1С. Обычно используют Microsoft Forms 2.0 TextBox. Этот элемент управления изначально поддерживает:

Для работы с ним вам придется инициализировать объект при открытии формы и передавать его значение в реквизит 1С при закрытии или записи:


// Пример обращения к ActiveX на форме
Процедура ПриОткрытии()
    ОбъектМногострочный = Форма.АктивИксПоле.Объект;
    ОбъектМногострочный.MultiLine = -1; // True
    ОбъектМногострочный.Text = МойРеквизитТекст;
КонецПроцедуры

Метод «Визуального обмана» для просмотра

Если ваша задача — просто отобразить длинный текст на форме без возможности его прямого редактирования, мы рекомендуем использовать элемент типа «Текст» вместо «Поля ввода». В свойствах элемента «Текст» установите достаточную высоту, и платформа автоматически будет переносить слова. Для редактирования же такого текста можно предусмотреть кнопку, открывающую отдельное модальное окно с полноценным редактором неограниченной строки.

Подведение итогов

Мы рассмотрели различные подходы к реализации многострочности в 1С 7.7. Для системного реквизита Наименование единственным надежным способом является связка с дополнительным реквизитом неограниченной длины. Для прочих строковых полей можно использовать «хак» с временным изменением типа или внешние компоненты. Выбирая решение, всегда учитывайте нагрузку на базу данных и удобство пользователя при работе с формами списков, где многострочные данные могут отображаться некорректно.

← На главную