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