1с построитель отчета дерево
Восьмая версия платформы 1С предлагает достаточно много новых объектов конфигурации, каждый из которых обладает своими методами и свойствами, позволяющими упростить процесс разработки приложений и оптимизировать производительность. Один из них – построитель отчетов.
О том, что такое построитель отчета в 1с, какие функции он выполняет, и какое применение он нашел в программировании, и хотелось бы поговорить в этой статье.
Построитель отчета в 1С – что это?
Это объект конфигурации, который позволяет вывести данные в табличный документ или диаграмму. В качестве источника данных могут выступать:
-
;
- Результат выполнения запроса;
- Область ячеек табличного документа;
- Табличная часть документа или справочника;
- Набор записей регистра.
Кроме этого построитель отчета в 1С имеет реквизит «Текст» в который может передаваться текст запроса, результат которого надо посмотреть.
На Рис.1 представлен участок кода, который позволяет с помощью «Построителя отчета» вывести на экран произвольную таблицу значений
Таким образом, очевидным вариантом использования построителя является проектирование отчетов. Не таким явным направлением использования построителя является его использование для настройки пользователем различных элементов запроса (группировок, отборов и т.д.).
Кстати, результат выполнения кода, указанного на Рис.1 можно увидеть на Рис.2
Настройка построителя
Построитель отчетов в некотором смысле напоминает систему компоновки данных и может использоваться в тех случаях, когда СКД по тем или иным причинам недоступна или существует вероятность, что она отработает неправильно.
Как и СКД построитель включает:
- Группировки (уровни иерархии при выводе информации);
- Показатели (значения, по которым необходимо получить итог);
- Дополнительные рассчитываемые поля (реквизиты элементов, результаты действий со значениями);
- Фильтры (отборы);
- Сортировки.
Настройки макета оформления построителя предполагают различные уровни и точности детализации.
Алгоритм использования построителя
Естественно, в зависимости от ситуации, код программы использования построителя отчета может серьезно различаться. Основной алгоритм использования не меняется:
- Объявляем создание нового объекта типа ПостроительОтчета;
- На этом этапе можно либо использовать ПостроительЗапроса для создания текста выборки, либо, используя объект ОписаниеИсточникаДанных воспользоваться существующей выборкой;
- Настройки построителя отчета можно задать, используя метод объекта построителя ЗаполнитьНастройки();
- Отказаться от использования стандартного макета оформления, создающегося методом автогенерации, можно определив свойство объекта Макет у построителя;
- Если не используется ОписаниеИсточникаДанных, на этом этапе необходимо выполнить запрос, используем метод Выполнить();
- Последним этапом является запуск метода Вывести(), вывод можно осуществить в табличный документ, или в соответствующий элемент формы.
Использование расшифровки в построителе
Третья строчка на Рис.1 включает расшифровку ячеек результата выполнения построителя.
Для этого мы воспользовались свойством ЗаполнениеРасшифровки. Тип этого свойства – ВидЗаполненияРасшифровкиПостроителяОтчета, оно может принимать одно из трех значений:
- ЗначенияГруппировок – при активизации ячейки будет использоваться значение указанной в ней группировки;
- НеЗаполнять – значение по умолчанию, означающее, что для конечного результата расшифровка использоваться не будет;
- Расшифровка – структура расшифровки будет заполнена значениями всех группировок исходной выборки.
Кроме этого пользователь имеет возможность самостоятельно задать расшифровку, используя метод НастроитьРасшифровку(). Участок кода, запускающий этот метод представлен на Рис.3
Пример использования построителя для включения отборов в отчете
Немного практической части. Иногда случается ситуация, когда необходимо создать отчет с некоторыми отборами. Решить эту задачу можно и с использованием СКД, а можно воспользоваться построителем:
- Начнем с создания внешнего отчета и добавление в него реквизита с произвольным именем и типизацией ПостроительОтчета (Рис.4);
- Создаем форму отчета и размещаем на ней интерфейсный объект ТабличноеПоле, типизируем его как Отбор и связываем со свойством Отбор созданного реквизита Рис.5
- Создаем процедуру ПриОткрытии(), связанную с соответствующем событием нашей формы;
- Код, прописанный в ней обязательно должен содержать запрос построителя отчета, пример кода приведен на Рис.6, для создания текста построителя можно воспользоваться конструктором запроса, в конструкторе условия построителя и дополнительные его настройки указываются на соответствующей закладке Рис.7;
Условия отбора, прописанные в фигурных <> скобках текста запроса будут исполняться только в случае если соответствующий отбор активирован и использован пользователем;
Внешний вид созданного нами отчета и его результат показан на Рис.9
Безусловно, в пределах одной статьи достаточно сложно продемонстрировать все возможности нового объекта, но получить о нем представление и начать его использовать с учетом полученных знаний, нам кажется, можно.
Очень часто пользователи для более удобной работы просят вывести таблицу в виде дерева, например, когда отгружается одна и та же номенклатурная позиция, но с разными характеристиками. Чтобы не растягивался документ, можно вывести всю номенклатуру документа, а если необходимо посмотреть с какими характеристиками, мы просто жмем плюсик и раскрыть список.
Данная статья посвящена тому, какие есть способы преобразовать обычную табличную часть в структуру данных в виде дерева.
Для примера возьмем документ "Рейс" в конфигурации "ТМС логистика". В документе на закладке "Маршрут" выводиться информация о виде операции (погрузка, выгрузка) и адрес.
Пример документа «ТМС логистика»
Для реализации задачи в реквизиты формы добавляем реквизит "ДеревоМаршрутов" типа "ДеревоЗначений" и создаем в нем колонки, полностью повторяющие табличную часть. После этого надо написать процедуру по заполнению "ДереваМаршрутов".
В этой статье будут рассмотрены только варианты заполнения "ДереваЗначений", с одним уровнем вложенности. Обработка выбора, добавления и удаления строк и сохранения – это тема, достойная отдельной статьи, но, по сути, там нет такой вариативности, какую обеспечивает заполнение "ДереваЗначений".
1. Подготовка "дерева" через формирование запроса базы данных.
Данный метод подходит, если необходимо сделать группировку только по одному полю. Например, если нам необходимо сгруппировать данные только по полю "Операция".
Запрос = Новый Запрос;
| упРейсМаршрут.НомерСтроки КАК НомерСтроки,
| упРейсМаршрут.ЗаданиеНаПеревозкуГруза КАК ЗаданиеНаПеревозкуГруза,
| упРейсМаршрут.Операция КАК Операция,
| упРейсМаршрут.Адрес КАК Адрес,
| упРейсМаршрут.НомерЗвена КАК НомерЗвена
| &ТЗМаршрут КАК упРейсМаршрут
| ВТМаршрут.НомерСтроки КАК НомерСтрокиТЧ,
| ВТМаршрут.ЗаданиеНаПеревозкуГруза КАК ЗаданиеНаПеревозкуГруза,
| ВТМаршрут.Операция КАК Операция,
| ВТМаршрут.Адрес КАК Адрес,
| ВТМаршрут.НомерЗвена КАК НомерЗвена
| ВТМаршрут КАК ВТМаршрут
В результате формирования запроса базы данных получаем дерево типов данных вида:
Дерево типов данных
2. Подготовка "дерева" через СКД в 1С
Данный метод подходит, если надо сделать группировку по нескольким полям. Например, нам необходимо сгруппировать данные по полям "Операция" и "Адрес".
Создаем схему компоновки данных, где на закладке "Настройка" указываем группировку по нескольким полям. В данном примере 2 поля:
Схема компоновки данных
Затем пишем вызов СКД в 1С:
//получаем схему СКД
//инициализируем настройки СКД
ДанныеРасшифровкиСКД = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
//передаем данные в СКД
ВнешниеДанные = Новый Структура("Маршруты",Объект.Маршрут.Выгрузить());
//подготавливаем данные для получения из СКД
ПромежуточноеДерево = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
//передаем полученное дерево на форму
В результате выполнения мы получаем базу данных в виде дерева, группируемого по двум полям:
Таблица в виде дерева
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Построитель отчетов — это объект, встроенного языка, предназначенный для динамического создания отчета в 1С 8.3 как программными, так и интерактивными средствами.
Основными областями применения построителя отчетов являются стандартные отчеты 1С и аналитические отчеты, произвольные выборки для обработки информации, создание отчетов пользователями без доработки в конфигурации.
В качестве источника данных для построителя отчета могут выступать: таблица значений, результаты запроса, область ячеек табличного документа, табличная часть, набор записей регистров (накопления, сведений, бухгалтерии, расчета).
1С Предприятие имеет особые расширения синтаксиса, предназначенные специально для построителя отчетов в 1С. Такие инструкции оформляются в фигурные скобки <. >. При обычном выполнении запроса они будут игнорироваться платформой. Механизм работы скобок прост: вне скобок прописывается текст запроса для построителя, в внутри – запрос для настроек.
2. Настройки из текста запроса 1С
Настройки формируются автоматически на основе исходного текста запроса 1С или же могут быть указаны явно в тексте запроса с использованием расширения языка запросов 1С.
Настройки включают в себя:
Можно предоставить пользователю возможность изменять настройки построителя отчета не с помощью табличных полей 1С 8.3, расположенных в форме, а с помощью полей ввода. Это может понадобиться, например, в тех случаях, когда пользователю нужно иметь возможность настроить лишь некоторые, заранее известные настройки построителя 1С. Например, даты формирования отчета в 1С, отбор по номенклатуре и т.д. В этом случае в форме можно разместить поля ввода и связать их со значениями соответствующих элементов отбора построителя отчета.
Для формирования табличного документа построитель отчета использует макет или созданный разработчиком, или генерируемый автоматически.
Построитель отчета 1С позволяет вывести данные в табличный документ или диаграмму.
Построитель отчетов может использоваться в тех случаях, когда СКД недоступна или существует вероятность, что она отработает неправильно.
При разработке отчетов 1С иногда возникает необходимость вывести отчет 1С, данные для которого не могут быть получены с помощью языка запросов 1С. Такое происходит, например, если для расчета данных в 1С используется некий сложный алгоритм, или же данные для вывода в отчет в 1С получаются не из информационной базы, а, например, из внешнего файла. В таком случае уместно использовать построитель отчета, так как он предоставляет возможность вывода данных для отчета из произвольного источника.
3. Пример разработки отчета 1С
Наш отчет будет выводить данные в элемент формы – табличный документ, а также в элемент формы – диаграмму. В отчете с использованием табличного документа мы настроим отбор по номенклатуре и (или) по периоду.
То есть в отчете можно будет посмотреть остатки по номенклатуре 1С, по периоду (условие больше или равно), и по номенклатуре и по периоду.
Итак, начнем.
1. Объявляем создание нового объекта типа ПостроительОтчета;
2. Источником данных мы выберем текст запроса 1С.
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.СуммаОстаток КАК СуммаОстаток
| РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
|ИТОГИ СУММА(КоличествоОстаток), СУММА(СуммаОстаток) ПО
| Номенклатура КАК Номенклатура";
Конструкция ПостроительОтчета.ЗаполнитьНастройки(); Выполняет автоматическое заполнение настроек построителя из текста запроса.
Пример описания Таблицы значений в качестве источника данных.:
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначенийРезультат);
3. Можно воспользоваться макетом, созданным разработчиком:
Или автоматически сформированным макетом, со своими настройками:
Макет.Область().ЦветФона = Новый Цвет(100,100,100);
Макет.Область().ЦветТекста = Новый Цвет(222,222,222);
// Установка макета построителя отчета
4. Настройка отбора, который связан с полями ввода формы: номенклатура и период
если не Номенклатура.Пустая() тогда
Если Отбор.Найти("Номенклатура") = Неопределено Тогда
если не Период="" тогда
Если Отбор.Найти("Период") = Неопределено Тогда
5. Некоторые настройки отчета в 1С 8.3
Построитель.ТекстЗаголовка="Отчет с использованием Запроса по периоду";
6. Запуск метод Вывести() (в табличный документ, или в соответствующий элемент формы).
ПостроительОтчета.Выполнить(); // выводит в отдельном окне
ПостроительОтчета.Вывести(ЭлементФормы.Диаграмма);// вывод в элемент формы диаграмму.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.
Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».
Дерево значений
Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.
Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».
Дерево значений на форме
Визуальное представление дерева значений обеспечивает элемент «Табличное поле».
Дерево значений на обычной форме Дерево значений на управляемой форме
Заполнение дерева значений
При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.
Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.
Небольшой пример программного заполнения таблицы значений для управляемых форм:
Обход дерева значений
Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:
Как свернуть и развернуть дерево значений
Сворачивается и разворачивается дерево значений очень просто.
Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).
Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.
Как удалить строку и очистить дерево значений
Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.
Очистить дерево значений:
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее — нужно только знать ее индекс:
Запрос и дерево значений
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».
Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:
Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.
Дерево значений в таблицу значений и обратно
Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.
Отбор в дереве значений
Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.
Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.
Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.
Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.
Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.
На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 31, средняя оценка: 4,90 из 5)
Дерево значений представляет из себя некую структуру с иерархией. Каждая строка имеет свойства «Родитель» и «Строки». У каждой строки может быть сколько угодно подчиненных строк. При этом такие операции как поиск, сортировка, подсчет итогов можно проводить с учетом уровня иерархии и подчиненных строк.
Программное создание дерева значений
Как уже упоминалось выше, каждая строка имеет свойство Строки , которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений имеет свойство Строки , которое содержит коллекцию строк верхнего уровня.
- Добавляет колонку в конец коллекции колонок дерева значений.
- Возвращаемое значение: КолонкаДереваЗначений .
Заполнить табличное поле на форме
Визуальное представление дерева значений на форме обеспечивает элемент Таблица .
Пример программного заполнения дерева значений для управляемых форм:
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом Выгрузить() и указать параметр ТипОбхода отличным от того, что стоит по умолчанию, т.е. ПоГруппировкам или ПоГруппировкамСИерархией .
Свернуть и развернуть строки дерева значений
Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть() и Развернуть() .
- Сворачивает узел в указанной строке дерева.
- ИдектификаторСтроки — идентификатор строки таблицы.
- Разворачивает узел в указанной строке дерева.
- ИдектификаторСтроки — идентификатор строки таблицы.
- СПодчиненными — определяет необходимость раскрытия подчиненных узлов.
- Получает коллекцию элементов дерева верхнего уровня.
- Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
- Получает коллекцию дочерних элементов.
- Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:
- ДанныеФормыСтруктура — содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект .
- ДанныеФормыКоллекция — это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
- ДанныеФормыСтруктураСКоллекцией — это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
- ДанныеФормыДерево — объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
Удалить строку и очистить дерево значений
Поиск в дереве значений
Среди наиболее часто используемых методов стоит отметить метод Найти() коллекции строк дерева значений.
- Значение (обязательный, тип Произвольный ). Искомое значение.
- Колонки (необязательный, тип Строка ). Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми. Если параметр не указан, поиск осуществляется по всем колонкам дерева. Значение по умолчанию — Пустая строка.
- ВключатьПодчиненные (необязательный, тип Булево ). Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). Если Истина — строки подчиненных коллекций участвуют в поиске. Значение по умолчанию — Ложь .
Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений ), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено . Предназначен для поиска уникальных значений.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Читайте также: