8.х Как представить дерево значений в виде структуры или массива?

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Sunbear, 29 мар 2011.

  1. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    в Структура одному значению соответствует 1, а мне нужно 2 , потому что кроме значения есть еще и родитель.
  2. shurikvz
    Online

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    для чего?
  3. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    чтобы можно было вызвать его на клиенте
  4. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    зачем нужна трансформация дерева в структуру? почему не устраивает работа с деревом? опишите задачу подробнее..
  5. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    Сейчас в нашей конфигурации используется динамическое поле формы
    Основные идеи таковы:
    1. Реквизиты формы, элементы формы, имена обработчиков описываются в формата XML.
    2. В момент создания динамического поля выполняется разбор XML и создаются соответствующие объекты.
    3. Существует реквизит формы, ассоциированный с динамическим полем, хранит префикс экземпляра динамического поля.

    Нужно сделать другую реализацию:
    1. Динамическое поле - это форма (например, общая форма) с реквизитами и элементами.
    2. В момент создания динамического поля внутри другой формы в этой форме создаются реквизиты, элементы и команды,
    в точности такие, какие есть в динамическом поле.
    3. В модуле основной формы есть клиентская переменная, которая ассоциируется с динамическим полем, и
    получается путем вызова функции ПолучитьФорму("Имя формы динамического поля").
    Эта форма никогда не открывается, а лишь предоставляет интерфейс к экспортным функциям своего модуля.
  6. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    а в какой момент нужно превратить дерево в структуру? при разборе XML файла?
  7. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    Раньше динамическое поле было модулем и функция создать {динамическое поле} была серверной. Сейчас динамическое поле - форма. и функция запускается на клиенте. При разборе Xml строки нужно использовать структуру вместо дерева.
  8. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    Вот гениальный алгоритм, который я сделал с помощью своего брата близнеца :)
    Код:
    Процедура обрабТег(родитель,чтение)
    перем узелдерева;	
    ж=0;
    Пока Чтение.Прочитать() Цикл
    узелДерева = Новый Структура;
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    узелдерева.Вставить("ИмяТега",Чтение.Имя);
    Атрибуты = Новый Структура;
    Пока Чтение.ПрочитатьАтрибут() Цикл
    Атрибуты.Вставить(Чтение.Имя, Чтение.Значение);
    КонецЦикла;
    узелдерева.Вставить("Атрибуты",Атрибуты);
    узелдерева.Вставить("Родитель",родитель);	
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
    возврат;
    КонецЕсли;
    обрабТег(узелдерева,чтение);
    ж=ж+1;
    Если Узелдерева.родитель =родитель Тогда
    добавитьстроки(родитель,ж,присвоить(Узелдерева));
    КонецЕсли;  
    КонецЦикла;
    КонецПроцедуры 
    
    &НаКлиенте
    ////
    // Функция: ПреобразоватьИзСтрокиXMLВДерево
    //   Выполняет преобразование строки XML в дерево.
    //
    // Параметры:
    //   СтрокаXML
    //     Строка XML, которую нужно преобразовать в дерево.
    //
    // Возврат:
    //   Дерево значений, содержащее следующие:
    //     ИмяТега
    //       Строка с именем тега элемента XML.
    //     Атрибуты
    //       Структура с атрибутами элемента XML.
    //    Родитель
    //       Структура, являющаяся родителем текущего элемента
    //     Строки
    //       Структура потомков текущего элемента
    ///
    Функция ПреобразоватьИзСтрокиXMLВДерево(СтрокаXML) экспорт
    Перем Чтение, УзелДерева, Атрибуты;
    узелДерева = Новый Структура;
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(СтрокаXML);
    Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    УзелДерева.Вставить("ИмяТега",Чтение.Имя);
    Атрибуты = Новый Структура;
    Пока Чтение.ПрочитатьАтрибут() Цикл
    Атрибуты.Вставить(Чтение.Имя, Чтение.Значение);
    КонецЦикла;
    УзелДерева.Вставить("Атрибуты",Атрибуты);
    УзелДерева.Вставить("Родитель");
    обрабТег(УзелДерева,Чтение);	
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
    
    КонецЕсли;
    КонецЦикла;
    Возврат узелдерева;
    КонецФункции
    
    
  9. TopicStarter Overlay
    Sunbear
    Offline

    Sunbear Опытный в 1С

    Регистрация:
    11 фев 2010
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    &НаКлиенте
    ////
    // Функция: Присвоить
    // Копирует все ключи и значения структуры б и возвращает их по значению.
    //
    // Параметры:
    // б
    // структура, которая будет скопирована
    //
    // Возврат:
    // структура, которая является копией б по значению
    ///
    Функция Присвоить(знач б)
    а=новый структура;
    Если б<>неопределено Тогда
    Для каждого киз Из б Цикл
    а.Вставить(киз.ключ,киз.значение);
    КонецЦикла;
    возврат а
    иначе
    возврат неопределено
    КонецЕсли;
    КонецФункции // ()


    &НаКлиенте
    ////
    // Процедура: ДобавитьСтроку
    // Добавляет строку в текущую структуру.
    //
    // Параметры:
    // УзелдереваКуда
    // структура, куда будет добавлена строка
    // УзелСтрока
    // структура, которая будет добавлена в качестве строки
    ///
    процедура ДобавитьСтроку(УзелдереваКуда,и1,УзелСтрока)
    строки=Новый структура;
    Если УзелдереваКуда.Свойство("строки") Тогда
    УзелдереваКуда.Свойство("строки",строки);
    КонецЕсли;
    строки.вставить("и"+строка(и1),узелстрока);
    узелдереваКуда.вставить("Строки",строки);
    Конецпроцедуры
  10. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    я начал было делать через рекурсивный обход дерева.. но другие дела возникли ;) поэтому только набросок..

    ---

    Процедура РекурсивныйОбходДерева(СтрокиДерева, РодительскийУзел)

    Для каждого СтрокаДерева Из СтрокиДерева Цикл

    // создаем новый узел, связываем его с родителем

    Если СтрокаДерева.Строки.Количество()>0 Тогда
    РекурсивныйОбходДерева(СтрокаДерева.Строки, Узел);
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры


    Процедура КнопкаВыполнитьНажатие(Кнопка)

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

    Узел = Новый Структура;
    Узел.Вставить("Ссылка", "");
    Узел.Вставить("Родитель", "");

    РекурсивныйОбходДерева(Дерево.Строки, Узел);

    КонецПроцедуры

Поделиться этой страницей