Как передать таблицу значений с сервера на клиент и реализовать выбор строки в 1С

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

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

Проблема использования Таблицы Значений на клиенте

Рассмотрим стандартную ситуацию: на сервере мы подготовили данные, свернули их и хотим, чтобы пользователь выбрал одну из строк. Напрямую вернуть ТаблицаЗначений нельзя — система выдаст ошибку. Если мы преобразуем таблицу в массив структур, метод ВыбратьСтроку перестает работать, так как он не определен для типа Массив. Выясним, как обойти это ограничение.

Решение 1: Использование Списка Значений

Это самый быстрый и эффективный способ, если вам нужно, чтобы пользователь выбрал один конкретный элемент (например, стеллаж или склад). Мы преобразуем данные в объект СписокЗначений, который прекрасно работает на клиенте.

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


// На стороне клиента
&НаКлиенте
Процедура ВыборСтеллажа(Команда)
    // Получаем массив структур с сервера
    МассивДанных = ПолучитьДанныеНаСервере();
    
    // Создаем список значений для интерактивного выбора
    Список = Новый СписокЗначений;
    Для каждого Элемент из МассивДанных Цикл
        // Заполняем: Значение (ссылка), Представление (текст для пользователя)
        Список.Добавить(Элемент.Стеллаж, Строка(Элемент.Стеллаж) + " (Кип: " + Элемент.КолКип + ")");
    КонецЦикла;
    
    // Показываем диалог выбора
    ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите стеллаж:");
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Обрабатываем выбор пользователя
        ЗначениеВыбора = ВыбранныйЭлемент.Значение;
        Сообщить("Выбран стеллаж: " + ЗначениеВыбора);
    КонецЕсли;
КонецПроцедуры

Решение 2: Переход к асинхронным методам (отказ от модальности)

Современные конфигурации 1С часто работают в режиме "Запрет модальных окон". В этом случае метод ВыбратьЭлемент работать не будет. Разберем, как использовать ОписаниеОповещения для асинхронного выбора. Это более правильный подход с точки зрения современной архитектуры платформы 8.3.


&НаКлиенте
Процедура НачатьВыбор(Команда)
    Список = Новый СписокЗначений;
    // ... заполнение списка ...
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораСтеллажа", ЭтотОбъект);
    Список.ПоказатьВыборИзСписка(Оповещение, "Выберите стеллаж");
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораСтеллажа(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Логика обработки выбора
    КонецЕсли;
КонецПроцедуры

Решение 3: Реквизиты формы и ДанныеФормыКоллекция

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

  1. Создайте на форме реквизит с типом ТаблицаЗначений (назовем его ТаблицаВыбора).
  2. Добавьте в эту таблицу нужные колонки.
  3. На сервере заполните этот реквизит с помощью метода ЗначениеВДанныеФормы.

На клиенте этот реквизит будет иметь тип ДанныеФормыКоллекция. Вы можете вывести его на форму в виде элемента "Таблица", и пользователь сможет выбрать строку обычным двойным кликом или нажатием кнопки. Для программного поиска в такой коллекции удобно использовать метод НайтиСтроки, который работает быстрее ручного перебора.

Рекомендации по оптимизации

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

Таким образом, мы выяснили, что отсутствие метода ВыбратьСтроку на клиенте — это не ошибка, а особенность архитектуры управляемого приложения. Используя СписокЗначений для простых задач или ДанныеФормыКоллекция для сложных таблиц, мы можем организовать удобный интерфейс для пользователя.

← На главную