Как вывести текст из справочника в поле на форме и настроить навигацию Вперед и Назад

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выбор элемента управления для отображения текста

Прежде чем переходить к коду, проанализируем, какой элемент формы лучше всего подходит для вывода текста вопроса, который пользователь не должен редактировать. У нас есть два основных варианта:

  1. Поле ввода: Если мы используем стандартное Поле ввода, нам необходимо установить свойство Только просмотр в значение Истина. Это предотвратит случайное изменение данных. Также полезно включить Многострочный режим и Расширенное редактирование, если текст вопроса предполагает большой объем информации.
  2. Поле надписи: Это более элегантный вариант для отображения текста «только для чтения». Оно выглядит как обычный текст на форме, не имеет рамок (при соответствующих настройках) и не принимает фокус ввода, что улучшает пользовательский опыт (UX).
  3. Поле HTML-документа: Если текст вашего справочника содержит форматирование (жирный шрифт, курсив, списки), использование этого элемента позволит отображать данные в максимально наглядном виде.

Рассмотрим подробнее реализацию навигации, так как это наиболее сложная часть задачи.

Подготовка данных и инициализация формы

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

В модуле формы определим переменные (реквизиты формы):

Проанализируем процедуру инициализации в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Выбираем все подходящие элементы справочника, упорядоченные по ссылке (моменту создания)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Вопросы.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.Вопросы КАК Вопросы
        |ГДЕ
        |   Вопросы.ПредметнаяОбласть = &ПредметнаяОбласть
        |УПОРЯДОЧИТЬ ПО
        |   Ссылка"; // Ссылка гарантирует порядок создания
    
    Запрос.УстановитьПараметр("ПредметнаяОбласть", НазваниеОбласти);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Объект.СписокСсылок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");
        Объект.ТекущийИндекс = 0;
        ОтобразитьТекущийВопрос();
    Иначе
        ТекстВопроса = "Вопросы по данной теме не найдены.";
        Элементы.ГруппаНавигации.Доступность = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Реализация механизма переключения элементов

Теперь выясним причину, по которой стоит вынести код отображения в отдельную процедуру. Это позволит нам вызывать её из разных мест: при открытии, при нажатии «Вперед» и при нажатии «Назад».


&НаСервере
Процедура ОтобразитьТекущийВопрос()
    
    Если Объект.СписокСсылок.Количество() > 0 Тогда
        ТекущаяСсылка = Объект.СписокСсылок[Объект.ТекущийИндекс];
        // Получаем текст вопроса напрямую из ссылки
        ТекстВопроса = ТекущаяСсылка.Вопрос; 
        
        // Управляем доступностью кнопок
        Элементы.КнопкаНазад.Доступность = (Объект.ТекущийИндекс > 0);
        Элементы.КнопкаВперед.Доступность = (Объект.ТекущийИндекс < Объект.СписокСсылок.Количество() - 1);
    КонецЕсли;
    
КонецПроцедуры

Настройка кнопок навигации

Рассмотрим ситуацию с кнопками. Вы можете создать обычные команды формы («Далее» и «Назад») и разместить их в командной панели или непосредственно на форме. Однако в обсуждении упоминался вариант с кнопкой регулирования в самом поле ввода. Посмотрим на этот пример:

Если у Поля ввода установлено свойство КнопкаРегулирования = Да, то при нажатии на стрелочки вызывается событие Регулирование. Разберем его обработчик:


&НаКлиенте
Процедура ТекстВопросаРегулирование(Элемент, Направление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное поведение
    
    Если Направление = 1 Тогда // Нажата кнопка "Вверх" (будем считать это "Вперед")
        Если Объект.ТекущийИндекс < Объект.СписокСсылок.Количество() - 1 Тогда
            Объект.ТекущийИндекс = Объект.ТекущийИндекс + 1;
        КонецЕсли;
    ИначеЕсли Направление = -1 Тогда // Нажата кнопка "Вниз" ("Назад")
        Если Объект.ТекущийИндекс > 0 Тогда
            Объект.ТекущийИндекс = Объект.ТекущийИндекс - 1;
        КонецЕсли;
    КонецЕсли;
    
    ОтобразитьТекущийВопросНаСервере();
    
КонецПроцедуры

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

Оптимизация работы с большими текстами

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

Также стоит предусмотреть проверку на наличие данных. Если запрос вернул пустой результат, необходимо корректно заблокировать элементы интерфейса, чтобы пользователь не получил ошибку обращения к пустому индексу массива.

Таким образом, комбинируя работу с запросами, индексацию массива ссылок на стороне формы и использование событийных обработчиков, мы получаем гибкий и быстрый механизм навигации по элементам справочника 1С.

← На главную