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