1с построитель отчета запрос

Обновлено: 07.07.2024

Построитель отчетов — это объект, встроенного языка, предназначенный для динамического создания отчета в 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. Настройка отбора, который связан с полями ввода формы: номенклатура и период

Работа построителя отчета и построителя запроса с произвольным источником данных

При разработке отчетов иногда возникает необходимость вывести отчет, данные для которого не могут быть получены с помощью языка запросов. Такая ситуация может возникнуть, например, если для расчета данных используется некий сложный алгоритм, или же данные, для вывода отчет получаются не из информационной базы, а, например из внешнего файла. Построитель отчета предоставляет возможность вывода отчета из произвольного источника данных.

В качестве источника данных для вывода отчета могут быть использованы:

  • ТаблицаЗначений,
  • РезультатЗапроса,
  • ОбластьЯчеекТабличногоДокумента,
  • Табличная часть,
  • РегистрНакопленияНаборЗаписей ,
  • РегистрСведенийНаборЗаписей,
  • РегистрБухгалтерииНаборЗаписей,
  • РегистрРасчетаНаборЗаписей.

Для того чтобы построитель отчета выводил отчет для произвольного источника данных, достаточно установить описание источника данных в свойство построителя ИсточникДанных . Свойство построителя отчета ИсточникДанных может содержать значение типа ОписаниеИсточникаДанных . Объект ОписаниеИсточникаДанных содержит сам источник данных, а также содержит описание колонок источника данных. Каждое описание колонки источника данных содержит:

  • Имя - содержит имя колонки в источнике данных,
  • ПутьКДанным - содержит описание зависимости колонок друг от друга. Колонка, чей путь к данным получен через точку от пути к данным другого поля, считается реквизитом другой колонки. Если поле содержит через точку слово Представление, то данное поле считается представлением для колонки, от пути к данным которого получается представление. Примеры. Если колонка "Номенклатура" имеет путь к данным "Номенклатура", а колонка "Код" имеет путь к данным "Номенклатура.Код", то данная колонка будет считаться реквизитом колонки "Номенклатура". Колонка с путем к данным "Номенклатура.Представление" будет считаться представлением для колонки "Номенклатура",
  • Поле - признак того, что данная колонка может быть использована в качестве поля отчета,
  • Порядок - признак того, что по данной колонке возможно упорядочивание,
  • Отбор - признак того, что на данную колонку возможно накладывать отбор,
  • Измерение - признак того, что данная колонка может быть использовано как группировка отчета,
  • Итог - строка, содержащая выражение для расчета итога. Для построителя отчета выражение данной строки соответствует выражению для вычисления итога, используемому в языке запросов,

При установке источника данных объекту ОписаниеИсточникаДанных , описания колонок создаются и заполняются автоматически.

Объект ОписаниеИсточникаДанных имеет конструктор, в качестве параметра которого может быть передан источник данных, для которого создается описание, при этом свойство ИсточникДанных будет заполнено переданным источником данных, описания колонок будут заполнены информацией о колонках из источника данных.

Пример установки источника данных построителю отчета:

ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначенийРезультат);

Дальнейшая работа с построителем отчета не отличается от работы с построителем отчета в режиме работы с запросом: построитель отчета предоставляет свою полную функциональность, за исключением вывода иерархических итогов. Кроме того, при работе с произвольным источником данных, у построителя отчета нельзя получить запрос, который будет использован для получения данных из информационной базы.

Работа построителя запроса с произвольным источником данных идентична работе с произвольным источником построителя отчета.

Пример использования построителя отчета с произвольным источником данных можно найти в универсальной обработке "Консоль анализа журнала регистрации".

Просто собрание процедур и функций, которые я использую в работе с построителями запросов и СКД. Позволяют сэкономить время при разработке, являются эдакой "маленькой БСП". Рассчитаны на серверное исполнение и серверный вызов (там, где это допустимо по контексту).

// Возвращает булево - есть ли отборы СКД
Функция ЕстьОтборыСКД(рОткуда) Экспорт
Если ТипЗнч(рОткуда)=Тип("ОтборКомпоновкиДанных") или ТипЗнч(рОткуда)=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
обрОткуда=рОткуда;
ИначеЕсли ТипЗнч(рОткуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Настройки.Отбор;
Иначе
Возврат Ложь;
КонецЕсли;
Для каждого отб Из обрОткуда.Элементы Цикл
Если отб.Использование Тогда Возврат Истина КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции

// Вносит элемент отбора в отбор СКД и возвращает его
Функция ДобавитьЭлементОтбора(рКуда,рПоле,рЗначение=Неопределено,рВидСравнения=Неопределено,рИскатьИмеющийся=Ложь) Экспорт
Попытка
рПустышка=Неопределено;
Если не ЗначениеЗаполнено(рВидСравнения) Тогда
рВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
КонецЕсли;
//
Если ТипЗнч(рПоле)=Тип("Строка") Тогда
обрПоле=Новый ПолеКомпоновкиДанных(СокрЛП(рПоле));
ИначеЕсли ТипЗнч(рПоле)=Тип("ПолеКомпоновкиДанных") Тогда
обрПоле=рПоле;
Иначе
Возврат рПустышка;
КонецЕсли;
//
Если ТипЗнч(рКуда)=Тип("ОтборКомпоновкиДанных") или ТипЗнч(рКуда)=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
обрКуда=рКуда.Элементы;
ИначеЕсли ТипЗнч(рКуда)=Тип("НастройкиКомпоновкиДанных") Тогда
обрКуда=рКуда.Отбор.Элементы;
ИначеЕсли ТипЗнч(рКуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрКуда=рКуда.Настройки.Отбор.Элементы;
Иначе
Возврат рПустышка;
КонецЕсли;


Процедура КопироватьПорядокСКД(рОткуда,рКуда,рТолькоИспользуемые=Ложь) Экспорт
Если ТипЗнч(рОткуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Настройки.Порядок.Элементы;
ИначеЕсли ТипЗнч(рОткуда)=Тип("НастройкиКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Порядок.Элементы;
ИначеЕсли ТипЗнч(рОткуда)=Тип("ПорядокКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Элементы;
Иначе
Возврат;
КонецЕсли;
Если обрОткуда.Количество()=0 Тогда Возврат КонецЕсли;
Если ТипЗнч(рКуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрКуда=рКуда.Настройки.Порядок.Элементы;
ИначеЕсли ТипЗнч(рКуда)=Тип("НастройкиКомпоновкиДанных") Тогда
обрКуда=рКуда.Порядок.Элементы;
ИначеЕсли ТипЗнч(рКуда)=Тип("ПорядокКомпоновкиДанных") Тогда
обрКуда=рКуда.Элементы;
Иначе
Возврат;
КонецЕсли;
//
Для каждого рПоле Из обрОткуда Цикл
Если не рПоле.Использование и рТолькоИспользуемые Тогда Продолжить КонецЕсли;
элпор=обрКуда.Добавить(ТипЗнч(рПоле));
ЗаполнитьЗначенияСвойств(элпор,рПоле);
КонецЦикла;
КонецПроцедуры


Процедура КопироватьУсловноеОформлениеСКД(рОткуда,рКуда,рТолькоИспользуемые=Ложь) Экспорт
Если ТипЗнч(рОткуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Настройки.УсловноеОформление.Элементы;
ИначеЕсли ТипЗнч(рОткуда)=Тип("УсловноеОформлениеКомпоновкиДанных") Тогда
обрОткуда=рОткуда.Элементы;
Иначе
Возврат;
КонецЕсли;
Если обрОткуда.Количество()=0 Тогда Возврат КонецЕсли;
Если ТипЗнч(рКуда)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
обрКуда=рКуда.Настройки.УсловноеОформление.Элементы;
ИначеЕсли ТипЗнч(рКуда)=Тип("УсловноеОформлениеКомпоновкиДанных") Тогда
обрКуда=рКуда.Элементы;
Иначе
Возврат;
КонецЕсли;
//
Для каждого рЭУ Из обрОткуда Цикл
Если не рЭУ.Использование и рТолькоИспользуемые Тогда Продолжить КонецЕсли;
новэу=обрКуда.Добавить();
ЗаполнитьЗначенияСвойств(новэу,рЭУ);
Для каждого эуо Из рЭУ.Оформление.Элементы Цикл
Если эуо.Использование Тогда
новэу.Оформление.УстановитьЗначениеПараметра(эуо.Параметр,эуо.Значение);
КонецЕсли;
КонецЦикла;
Для каждого пэу Из рЭУ.Поля.Элементы Цикл
Если пэу.Использование Тогда
ЗаполнитьЗначенияСвойств(новэу.Поля.Элементы.Добавить(),пэу);
КонецЕсли;
КонецЦикла;
КопироватьОтборСКД(рЭУ.Отбор,новэу.Отбор);
КонецЦикла;
КонецПроцедуры


Процедура УстановитьПараметрСКД(рКомпоновщикНастроек,рИмяПараметра,рЗначениеПараметра) Экспорт
Если ПустаяСтрока(рИмяПараметра) Тогда Возврат КонецЕсли;
Для каждого рПараметр Из рКомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы Цикл
Если СокрЛП(рПараметр.Параметр)<>СокрЛП(рИмяПараметра) Тогда Продолжить КонецЕсли;
рПараметр.Значение=рЗначениеПараметра;
рПараметр.Использование=Истина;
Прервать;
КонецЦикла;
КонецПроцедуры


// Вспомогательная к ИнициализироватьПроцессорКД, раскрывает набор-объединение рекурсивно
Процедура ПолучитьИменаОбъектовИзНаборов(рНабор,мИмён)
Если ТипЗнч(рНабор)=Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
Если мИмён.Найти(рНабор.ИмяОбъекта)=Неопределено Тогда мИмён.Добавить(рНабор.ИмяОбъекта) КонецЕсли;
ИначеЕсли ТипЗнч(рНабор)=Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных") Тогда
Для каждого рПоднабор Из рНабор.Элементы Цикл
ПолучитьИменаОбъектовИзНаборов(рПоднабор,мИмён);
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Возврат Истина;
КонецФункции

В некоторых случаях надо очень внимательно следить за вызовом с клиента, могут попасться несериализуемые.

Если кому пригодится, будет хорошо. Если кто заметит косяки - пишите, плиз, буду исправлять.

Построитель отчета - мощная штука для быстрого написания отчетов.
Однако иногда хочется использовать свои макеты, да и просто хотелось бы иметь "рыбу", которую можно было бы быстро использовать для написания отчета, особенно если данные берутся из таблицы значений.
Это именно такая "рыба".

Я предлагаю функцию обПостроительВывестиПоГруппировкам , которая занимается выводом таблицы значений с помощью построителя отчета с заданными группировками, итогами и параметрами группировок.
Итоги можно использовать любые - количество, сумма, среднее.
Пока еще не поддерживается сортировка, именно поэтому список параметров передается в виде структуры, чтобы можно было добавлять свои параметры.
Используется гибкое управление параметрами:
= Если не задан макет, то замена макета не производится
= Если не заданы параметры построителя, то они и не назначаются
= Может использоваться в качестве источника не только таблица значений, но и результат запроса
= Если не задан табличный документ, то она не выводится

Пример вызова функции:

Структура макета

Строки с уровнями именуются Уровень0, Уровень1, .
Колонки с уровнями именуются кУровень0, кУровень1, …
Детальная информация по строкам именуется кДетали.
Общие итоги именуются ОбщиеИтоги, шапка таблицы - ШапкаТаблицы, подвал таблицы - ПодвалТаблицы.


Может быть на картинке не заметно, но колонки с итогами содержат параметры, которые называются так же, как итоги в таблице значений, т.е. например "Сумма", "Остаток", "Количество".

Кроме измерений и итогов, можно выводить доп.параметры, например на рисунке виден параметр Адрес.

Замечания по коду

Пусть у нас есть некая таблица значений ТЗ.
Построитель отчета, привязанный к этой таблице значений, создается так:

Допустим, в списке значений спзГруппы у нас находится список колонок-группировок для отчета, в структуре спзИтоги - список колонок-итогов (колонки-итоги должны иметь явно указанный тип число, иначе не будет суммироваться итог).

Нужно указать, что колонки спзГруппы будут измерениями построителя - функция обПостроительОтчетаУстановитьИзмерения .
Нужно указать, что колонки спзИтоги будут итогами построителя и назначить им некоторую функцию итогов (Количество,Сумма) - функция обПостроительОтчетаУстановитьИтоги .
Затем вызывает заполнение настроек построителя:

Затем мы выполняем построитель и заполняем параметры вывода макета:

Теперь нужно подставить в построитель наш собственный макет. Но в макете построителя и в нашем названия групп могут не совпадать, поэтому нужно скорректировать названия. В переменной Макет хранится наш макет, мы его обработаем и подставим в макет построителя:

Читайте также: