Обход дерева значений в 1С с удалением строк
Дерево значений весьма специфичный тип данных в 1С. По сути это таже самая таблица значений но которая имеет свойства иерархичности (древовидности). Соответственно обход дереве не такая и тривиальная задача как кажется на первый взгляд. Ведь нужно обходить древо рекурсивно.
В одной из задач мне понадобилось обойти дерево и удалить из него строки с пустыми значениями. Так как я не особо часто работал с деревом значений, то я принялся реализовывать эту задачу в упор, просто обходя дерево и удаляя строки, однако в таком случае меня ждал провал. При удалении строки из дерева, количество элементов меняется, соответственно индекс обхода цикла сбивается и остаются не удаленные строки. К сожалению я не сразу понял, это и уйму времени потратил на поиск верного решения. Ниже привожу работающий у меня код. На уникальность не претендую, обход дерева значений рекурсивно нашел в интернете и переделал на свой лад.
&НаСервере Процедура склад_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) //Вставить содержимое обработчика ДеревоЗнач = РеквизитФормыВЗначение("ДеревоВыбора"); ОбходДереваДетально(ДеревоЗнач); ЗначениеВРеквизитФормы(ДеревоЗнач, "ДеревоВыбора"); КонецПроцедуры //Рекурсивная процедура &НаСервере Процедура ОбходДереваДетально(ПереданноеДер) Тз = Новый Массив; Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл СтрПолученногоДерева.Маркируемый = СтрПолученногоДерева.Характеристика.ор_МаркируемыйТовар; Если СтрПолученногоДерева.Строки.Количество()>0 Тогда ОбходДереваДетально(СтрПолученногоДерева); Иначе Если СтрПолученногоДерева.Остаток = 0 Тогда Тз.Добавить(СтрПолученногоДерева); КонецЕсли; КонецЕсли; КонецЦикла; Для Каждого строкаКУдалению Из Тз Цикл ПереданноеДер.Строки.Удалить(строкаКУдалению); КонецЦикла; Тз.Очистить(); КонецПроцедуры
Думаю по коду и так все понятно. Все операции производим на сервере, а потому получаем значения реквизита формы. Передаем на сервер. Там обходим и строки к удалению помещаем в пустой массив. Дальше обходим массив и удаляем строки из нашего дерева. Следующим шагом перемещаем значение дерева опять на форму.
Источник
1С 8.3 : Как удалить строку или очистить дерево значений
Помните, что при при удалении/очистке строки, все подчиненные строки удаляются.
Очистить дерево значений: Дерево.Строки.Очистить();
&НаСервере
Процедура ОчиститьНаСервере()
тДерево = РеквизитФормыВЗначение("Дерево");
тДерево.Строки.Очистить();
ЗначениеВРеквизитФормы(тДерево, "Дерево");
КонецПроцедуры
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее & нужно только знать ее индекс:
&НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура УдалитьНаСервере()
тДерево = РеквизитФормыВЗначение("Дерево");
тДерево.Строки.Удалить(0);
ЗначениеВРеквизитФормы(тДерево, "Дерево");
КонецПроцедуры
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить — сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора ВКС — Высококвалифицированные специалисты — какие настройки нужно сделать ЗУП? 0
В этой статье мы вкратце расскажем — какие настройки нужно сделать ЗУП для временно пребывающих высококвалифицированных иностранных специалистов. Гражданство Откройте сотрудника и перейдите в настройки данных о Гражданстве Если сотрудник ВКС то Выгрузка картинок из базы 1С в XML 2
В нынешнее время для электронного каталога или интернет-магазина необходимо выгружать не только информацию о цене и характеристиках товара, но и сопутствующие изображения. Хранящиеся в базе или связанные с номенклатурой изображения порой приходилось Посмотреть все результаты поиска похожих
Еще в этой же категории
Дерево значений в таблицу значений или в табличную часть и обратно 9
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени ДеревоЗначений в ТекстовыйДокумент 3
// Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу. // // Параметры: // рВетка — дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип ко Как отобразить дерево значений на управляемой форме 0
Создадим новую внешнюю обработку. Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно. НаСервере Процедура ПриСозданииНаСервере(Отказ, Станда Посмотреть все в категории Работа с Деревом Значений
Источник
Как удалить строку или очистить дерево значений
Помните, что при при удалении/очистке строки, все подчиненные строки удаляются.
Очистить дерево значений: Дерево.Строки.Очистить();
&НаСервере
Процедура ОчиститьНаСервере()
тДерево = РеквизитФормыВЗначение("Дерево");
тДерево.Строки.Очистить();
ЗначениеВРеквизитФормы(тДерево, "Дерево");
КонецПроцедуры
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее & нужно только знать ее индекс:
&НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура УдалитьНаСервере()
тДерево = РеквизитФормыВЗначение("Дерево");
тДерево.Строки.Удалить(0);
ЗначениеВРеквизитФормы(тДерево, "Дерево");
КонецПроцедуры
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить — сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 — получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=» D:ВашаБаза1с77″ ; Пользователь= Посмотреть все результаты поиска похожих
Еще в этой же категории
Примеры работы с Деревом значений в УП 11
Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 н Дерево значений в таблицу значений или в табличную часть и обратно 9
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени Преобразование дерева значений в таблицу значений и обратно 6
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее Как в дереве значений строку перекинуть в другой родитель? 5
Процедура ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0) Если Уровень = 0 Тогда НоваяСтрока = НовыйРодитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока); ПереместитьСтрокуДерева(Де Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт Посмотреть все в категории Работа с Деревом Значений
Источник