- Как получить из запроса 1С дерево значений и отобразить его в таблице управляемой формы с помощью БСП
- Размещаем дерево значений на управляемой форме
- Получаем счета за период с группировкой по контрагентам
- Выгружаем данные из запроса в таблицу с иерархией в виде дерева
- Реализуем процедуры сворачивания и разворачивания дерева
- Как отобразить дерево значений на управляемой форме
- Похожие FAQ
- Еще в этой же категории
Как получить из запроса 1С дерево значений и отобразить его в таблице управляемой формы с помощью БСП
Отображение дерева значений в таблице формы – задача на первый взгляд простая, но на практике не такая уж и тривиальная – даже у матерых разработчиков она, порой, вызывает сложности.
В статье на учебном, но вполне прикладном примере, разберем следующие действия:
- Разместим таблицу на форме и подготовим ее к приему иерархических данных.
- Получим выставленные счета за период с группировкой по контрагентам.
- Выгрузим данные из запроса в таблицу с иерархией в виде дерева.
- Бонусом сделаем так, чтобы пользователь мог сворачивать и разворачивать дерево, а также отмечать нужные элементы в нем для последующей обработки.
Для разработки данного примера будем использовать типовую конфигурацию Бухгалтерия предприятия, редакция 3.0 (3.0.135.22)
Также изучим и будем использовать функции и процедуры библиотеки стандартных подсистем БСП, подходящие под нашу задачу.
Нам потребуется новая внешняя обработка. Создаем ее и поехали!
Размещаем дерево значений на управляемой форме
Идем в реквизиты формы и создаем новый элемент типа «Дерево значений». Сам реквизит так и назовем «Дерево».
Внутри дерева нам понадобятся следующие колонки:
- Флаг – Тип: булево – с помощью него пользователь будет отмечать нужные элементы
- Контрагент – Тип: СправочникСсылка.Контрагенты
- Документ – Тип: ДокументСсылка.СчетНаОплатуПокупателю
Превратим дерево в таблицу – для этого перетащим его мышкой на форму. Под словом «превратим» надо понимать, что после помещения на форму дерево предстает перед нами в форме таблицы, хранящей в себе данные типа «ДеревоЗначений».
В тоже время тип реквизита «Дерева» может быть также «ТаблицаЗначений» — это полезно просто понимать, но для нашей задачи не нужно.
Для красоты сделаем в таблице следующее:
- Уберем из состава команд «Добавить», «Скопировать» и «Изменить». Чтобы пользователи не портили получаемые для обработки данные, эти действия должны быть заблокированы.
В итоге получим такой вид нашей таблицы:
На данном этапе уже все готово для приема данных из запроса.
Но я хочу, чтобы вы обратили внимание на следующие важные свойства элементов таблицы – зачастую эти детали могут застопорить разработку и отнять ваше время:
Чтобы флаг отображался как флаг (галочка) нужно проверить, чтобы у соответствующей колонки свойство «Вид» имело значение «Поле флажка»
Если это свойство будет установлено в какое-либо другое значение, то вы можете получить неожиданные результаты.
У таблицы есть свойство «Отображение», которое может принимать значения «Список», «Иерархический список», «Дерево». Распространенная ошибка заключается в установке этого свойства в значение «Дерево». Если при этом таблица хранит в себе реквизит типа «ТаблицаЗначений», — а не дерево! – то ожидать от нее поведения, характерного для дерева, такого как сворачивание-разворачивание группировок, не стоит. Как работает это свойство и чего от него стоит ожидать мы увидим далее. В нашем случае это свойство установлено правильно по умолчанию.
Получаем счета за период с группировкой по контрагентам
Получать будем, конечно же запросом. В запросе нам понадобятся те же самые поля, которые мы определили для нашего дерева, т.е. «Флаг», «Контрагент» и «Документ».
Но сначала создадим команду и вынесем ее на командную панель таблицы «Дерево». Команду назовем «Заполнить».
Также подготовим даты, необходимые нам для выборки счетов.
Теперь создадим процедуры на клиенте и сервере и привяжем клиентскую процедуру к команде «Заполнить».
Текст запроса будем размещать в серверной процедуре. Он будет таким:
| СчетНаОплатуПокупателю.Контрагент КАК Контрагент,
| СчетНаОплатуПокупателю.Ссылка КАК Документ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
| СчетНаОплатуПокупателю.Дата МЕЖДУ &ДатаНач И &ДатаКон
|ИТОГИ // Чтобы получилось дерево, в запросе обязательно должны быть итоги!
Обратите внимание! Чтобы на выходе из запроса у нас получилось дерево, нужно выполнить 2 обязательных условия:
- Использовать директиву «ИТОГИ» в тексте запроса. Именно благодаря итогам формируется иерархия дерева. В нашем случае нужны итоги по полю «Контрагент», а в качестве суммируемого поля выступает «Флаг».
- Чтобы выгрузка из результата запроса была сформирована с обходом типа «ПоГруппировкам». В нашем случае используется конструкция:
РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // Выгрузка в дерево значений!
Выгружаем данные из запроса в таблицу с иерархией в виде дерева
Нам осталось вывести данные из запроса на экран пользователю. Для этого передадим в запрос выбранные даты, выполним его и осуществим выгрузку результата на форму. Код будет таким:
Если ДатаОкончания = Дата(1, 1, 1, 0, 0, 0) Тогда
ДатаОкончания = Дата(3999, 12, 31); // бесконечно большая дата
РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // Выгрузка в дерево значений!
// Выгрузка результата запроса в дерево
Как вы заметили, формирование дерева на форме при помощи типовой функции БСП занимает всего 3 строки кода.
В первой строке мы получаем строки дерева верхнего уровня типа «ДанныеФормыКоллекцияЭлементовДерева». Второй строкой очищаем их. А третьей – заполняем типовой процедурой, встроенной в конфигурацию.
Разбирать саму процедуру я не буду – при желании можно сделать это самостоятельно, обратившись к модулю конфигурации «ОбщегоНазначения».
Теперь пора протетсить, что получилось. Для этого сохраним обработку и откроем ее в режиме предприятия. По кнопке «Заполнить» получаем такой результат:
Видно, что дерево сформировалось. Его группировками, как и задумывалось, является контрагент, а в колонке флаг стоит заветная «галочка». С помощью нее пользователь может отмечать, какие счета он хочет подвергнуть дальнейшей обработке.
Реализуем процедуры сворачивания и разворачивания дерева
Чтобы организовать свертку-раскрытие дерева добавим в команды формы соответствующие действия и вынесем их на командную панель таблицы в виде кнопок.
Для красоты на кнопках разместим картинки из стандартной
Теперь пропишем процедуры и привяжем их к командам.
Привожу универсальный код процедур для сворачивания и разворачивания деревьев в любой таблице на управляемых формах, которые вы передадите в параметре.
// где «ИмяТаблицы» — реквизит формы типа «ТаблицаФормы», хранящий значений типа «ДеревоЗначений»
Процедура СвернутьДеревоНаФорме(ТаблицаФормы)
Если ТипЗнч(ТаблицаФормы) = Тип(«ТаблицаФормы») Тогда
Для каждого СтрокаДерева Из СтрокиДерева Цикл
Если ПодчиненныеСтроки.Количество() = 0 Тогда
КонецПроцедуры
//где «ИмяТаблицы» — реквизит формы типа «ТаблицаФормы», хранящий значений типа «ДеревоЗначений»
Процедура РазвернутьДеревоНаФорме(ТаблицаФормы)
Для каждого СтрокаПервогоУровня Из ДанныеФормыДерево.ПолучитьЭлементы() Цикл
КонецПроцедуры
Процедура СвернутьДерево(Команда)
КонецПроцедуры
Процедура РазвернутьДерево(Команда)
КонецПроцедуры
Посмотрим на результат разворачивания дерева по кнопке глазами пользователя:
Конфигурирование, БСП, Универсальный код, Управляемые формы, ДеревоЗначений, Полезные процедуры и функции
Источник
Как отобразить дерево значений на управляемой форме
Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
// который будет отображен на управляемой форме
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
СтрокаУ1.Узел = "Узел"+к1;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1.Строки.Добавить();
СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2.Строки.Добавить();
СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
Новый ОписаниеТипов("ДеревоЗначений")));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
ЭлементДерево.ПутьКДанным = "Дерево";
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
КонецЦикла;
КонецПроцедуры
Похожие FAQ
Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Excel файл как Внешний источник данных 16
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто. 1. В конфигурации добавляет новый объект метаданных типа » Внешние источники данных» и назовем его просто » Excel» . https://helpf.pro/uploads/img Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую «из коробки» применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц V82.COMConnector.1: Не найдена лицензия COM-соединением 1
При подключении из одной базы к другой через COM внезапно стала появляться следующая ошибка: «V82.COMConnector.1: Не найдена лицензия COM-соединением», хотя никаких изменений на серверах не делалось. Релиз платформы был 8.2.13. Обновил до 14-го – не Посмотреть все результаты поиска похожих
Еще в этой же категории
Примеры работы с Деревом значений в УП 11
Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 н Дерево значений в таблицу значений или в табличную часть и обратно 9
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени Преобразование дерева значений в таблицу значений и обратно 6
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее Как в дереве значений строку перекинуть в другой родитель? 5
Процедура ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0) Если Уровень = 0 Тогда НоваяСтрока = НовыйРодитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока); ПереместитьСтрокуДерева(Де Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт Посмотреть все в категории Работа с Деревом Значений
Источник