1с постраничный вывод отчета на скд
Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Если нужен не «вариант по умолчанию»
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
- СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
- Отбор — Устанавливает отбор на результат СКД.
- КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
После того, как присвоено значение переменной СхемаКомпоновкиДанных — через нее мы можем получить доступ к формирующим запросам схемы через свойство коллекцию НаборыДанных . Элемент набора данных имеет интересующее нас свойство Запрос . Это текстовый параметр, содержащий в себе запрос. С помощью функций редактирования текста, его можно изменить, например, добавить отбор по недоступному через КомпоновщикНастроек полю.
Или если с добавлением нового параметра
Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Этот код установит значение для отбора, а если такого отбора нет в настройках, то добавит. В случае если точно известно, есть или нет такой отбор — то код можно упростить.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
В ходе выполнения своей повседневной работы столкнулся с интересной клиентской задачей - требовалось результат отчета СКД вывести на форму отчета в разные вкладки формы в разные табличные документы. Как оказалось, информации по такому выводу отчета в интернете маловато, поэтому решил скомпоновать свой опыт решения этой задачи в одной статье.
-Отчет на СКД с кучей независимых друг от друга группировок.
-Форма отчета со страницами и табличными документами результата отчета на них.
Требуется вывести каждую группировку в соответствующий ей табличный документ.
На форме отчета сделал свою кнопку "Сформировать". Событием "ПриКомпоновкеРезультата" не удалось воспользоваться, т.к. из этого события нет доступа к табличным документам на форме отчета.
В процедуре вывода отчета используем следующий код:
Сначала, запихиваем все табличные документы результата в массив и очищаем эти табличные документы.
Затем готовим процессоры вывода и пихаем их в свой массив. Суть метода в том, чтобы отчет скомпоновать один раз, а вот результат отчета вывести с помощью отдельных процессоров вывода для каждой таблицы. В цикле устанавливаем каждому процессору вывода свой табличный документ и начинаем вывод.
Последним этапом является вывод нашего результата отчета. Он происходит в немного модифицированном типовом цикле вывода.
Важный момент. Первый элемент результата СКД содержит все макеты результата, поэтому его нужно вывести во все табличные документы.
Чтобы определить момент, когда нужно перейти в новую таблицу для вывода следующей группировки я между группировками отчета добавил служебную группировку ПереходВДругуюТаблицу и в параметры отчета СКД новый параметр данных Разрыв, который и вывожу в этой служебной группировке. Это сделано, чтобы однозначно определить, что выводимый элемент отчета является сигналом к переходу на новую страницу. Для служебной группировки сделал условное оформление - Цвет фона, Цвет текста и Цвет границы - белый, чтобы не засорять нам отчет. Кстати, этот же метод можно использовать для вставки разрыва страницы после группировки в результате отчета, если для нашей служебной группировке настроить макет и добавить туда горизонтальный разделитель страницы.
Особенности создания отчетов в 1С v8 в режиме толстого клиента
Как сделать выбор варианта?
- На панель отчета помещаем кнопку "ВыбратьВариант"
- На форму помещаем поле "НаДату"
Особенности создания отчетов через СКД
Поэтапное создание отчета
- Создать Отчет в узле Отчетов
- Создать Макет в отчете, тип которого - Схема компоновки данных
- В свойствах отчета установить: Основная схема компоновки данных = Созданный Макет
- В свойствах отчета установите подсистему, которой он принадлежит (отчет в Предприятии будет выведен в верхней навигационной панели)
- Создать запрос в Макете (пункт: Добавить набор данных - Запрос)
- В закладке Параметры у Макета необходимо убрать галочки у всех строк в колонке ОграничениеДоступности - т.е. все параметры будут доступны для редактирования пользователю
- В закладке Настройки у Макета необходимо в окне, где выводится узел Отчет, создать новую группировку без указания поля группировки - будет создана детальная строка
- В закладке Настройки у Макета, в окне где выводится дополнительный набор закладок, выбрать доп. закладку Параметры - пометить все параметры галочкой и на каждом параметре нажать кнопку Свойства элемента пользовательских настроек, откроется окно настройки параметра, где необходимо поставить галочку - Включать параметр в пользовательские настройки
- В закладке Настройки у Макета, в окне где выводится дополнительный набор закладок, выбрать доп. закладку ВыбранныеПоля - там необходимо добавить колонки которые будут выводиться в отчете
- Запускайте Предприятие, открывайте отчет, устанавливайте значения параметров, Сформировать (проверьте что выбран Основной вариант формирования отчета)
Как добавить нередактируемый пользователем параметр?
Например, нам нужно установить параметр запроса "Информационная база"
- В форме макета компоновки на закладке Параметры у нужного параметра снять флаги "Включать в доступные поля" и "Ограничение доступности"
- В форме макета компоновки на закладке Настройка на подзакладке (внизу) Параметры у нужного параметра снять флаг, открыть свойства (кнопка с гаечным ключом), на этой форме:
- Снять флаг "Включать в пользовательские настройки"
- Режим редактирования установить "Недоступный"
- В модуле формы отчета в обработчике события "ПриЗагрузкеВариантаНаСервере" (можно и ПриОткрытии, но НЕ ПриСозданииНаСервере, т.к. она выполняется ДО загрузки настроек отчета и настройки будут перезаписаны) программно установить параметр:
Как задать варианты отчета?
- В форме макета компоновки на закладке Настройки в поле слева можно создать необходимые варианты отчета
Как задать группировки?
- В форме макета компоновки на закладке Настройки в поле справа вверху можно создать необходимые группировки
Как программно вывести отчет?
Как тестировать отчет?
- Сформировать ситуацию в клиентском тесте - удобнее всего через таблицу ситуации
- получить форму отчета - форма = ПолучитьФорму("Отчет.ДвижениеПроцесов.Форма.ФормаОтчета");
- загрузить нужный вариант отчета - установить параметр расширения формы отчета "КлючВарианта" (имя настройки в макете компоновки данных)
- загрузить нужные настройки отчета - ? заполнить параметр расширения формы отчета "ПользовательскиеНастройки" (тип "ПользовательскиеНастройкиКомпоновкиДанных ") так не получилось, все сложно, см. ниже.
- открыть форму - форма.Открыть()
- выполнить формирование - форма.СкомпоноватьРезультат();
- проверить содержимое табличного документа форма.Результат - хорошо бы иметь функции сравнения с эталонной mxl
- закрыть форму - форма.Закрыть(); - а может быть, можно и не открывать, надо проверить
- описание: меню Справка/Синтакс-помощник/закладка Содержание/Интерфейсные объекты управляемого приложения/Расширения управляемой формы/Расширение управляемой формы для отчета/Параметры формы
При сложных запросах СКД гораздо удобнее тестировать сам запрос отдельно, в серверных тестах, и только после отладки переносить в макет СКД.
- проще создавать тестовую ситуацию
- проще проверять результат
- быстрее
Но хотя бы один простейший клиентский smoke-тест все равно нужен.
Как загрузить нужные настройки отчета?
В документации описано, что есть такой параметр расширения формы отчета "ПользовательскиеНастройки" типа "ПользовательскиеНастройкиКомпоновкиДанных", но там очень сложная объектная структура, не удалось её использовать.
Реально работающая схема:
1. Создаём в отчете параметры
- Период типа СтандартныйПериод
- Отбор типа СписокЗначений (лучше было бы Структура, но её нет в списке типов параметров, как и произвольного типа)
2. В процедуру ПолучитьФорму передаем нужные параметры:
3. В обработчиках событий формы устанавливаем параметры
- Есть ПараметрыДанных, то есть то что устанавливается в параметры запроса СКД
- Некоторые из них назначаются в настройке варианта в ПользовательскиеНастройки (в свойтсвах параметра есть флаг "Включить в пользовательские настройки"
- Даже если при загрузке на сервере в параметры данных загрузить нужные значения, потом открывается форма, в которую автоматически загружаются сохраненные в прошлый раз настройки. Эти настноки при формировании отчета "перебивают" настройки данных
- В обработчике ПриЗагрузкеПользовательскихНастроекНаСервере передаваемый объект Настройки является копией реальных настроек, поэтому чтобы изменить настройки, которые появятся на форме, надо заполнять объект Отчет.КомпоновщикНастроек.ПользовательскиеНастройки
Как сделать множественные (списком) параметры запроса в СКД?
В запросе нужно использовать выражение "В (&ИмяПараметра)" (см. Логические выражения в языке запросов 1Cv8)
В настройке макета схемы СКД на закладке "Параметры" для этого параметра надо поставить галочку в колонке "Доступен список значений". В этом случае при выборе параметра СКД выдает форму редактирования списка, в которой можно добавить любое значение параметров.
Как сделать отключаемые параметры запроса в СКД?
В запросе СКД надо использовать конструкции, окруженные фигурными скобками "<>".
Если галочка в форме отчета (панель быстрой настройки) у соответствующего параметра снята, то эта конструкция убирается из запроса.
Подробнее см. Расширение языка запросов для системы компоновки данных (1Cv8)
Как сделать отчет с разворотом по колонкам?
Для этого в настройке варианта отчета (редактирование макета компоновки данных, закладка "Настройка", поле справа вверху), нужно в качестве первой группировки добавить "Таблица".
После этого в узле "Таблица" появляются ветки "Строки" и "Колонки", куда и добавляются нужные группировки.
Как настроить формат вывода полей?
В редакторе макета компоновки данных на закладке "Наборы данных" в правой верхней области есть список полей отчёта.
Есть две возможности:
- Настроить значение колонки "Выражение представления"
- здесь можно ввести выражение языка, выдающее нужную строку
- с полям ресурсов это не работает
- Настроить значение колонки "Оформление"
- в оформлении есть свойство "Формат" - это значение, аналогичное параметру функции языка "Формат", можно задать нужный вид
- преобразование типов здесь не сделать
Для полей ресурсов можно задавать выражения вычисления (закладка "Ресурсы") - например,
для перевода из секунд в часы.
Нужную точность можно задать через "Оформление" поля на закладке "Наборы данных".
Особенности установки параметров системы компоновки данных
Существуют и требуют различной обработки по крайней мере ТРИ вида параметров:
ПараметрыДанных
ПараметрыДанных определяются в запросе (источнике данных) СКД.
Параметры данных передаются в запрос источника данных и определяют извлекаемые данные.
В объекта КомпоновщикНастроек есть специальное свойство для работы с параметрами данных КомпоновщикНастроек.Настройки.ПараметрыДанных
Можно установить вызовом вида
Отбор
Отборы накладываются на полученные данные после извлечения из источника данных.
В объекта КомпоновщикНастроек есть специальное свойство для работы с отборами КомпоновщикНастроек.Настройки.Отбор.
ПользовательскиеНастройки
Пользовательские настройки определяют данные, которые пользователь может настроить на форме.
Пользовательские настройки могут отображаются на форме в специальной таблице и могут быть вызваны по кнопке "Настройки" и из меню "Все действия".
Пользовательские настройки связаны с параметрами данных и отборами каким-то достаточно сложным образом, эту связь можно настраивать визуально, но программно с ними работать как-то очень неудобно.
Пока не нашлось ничего лучшего, как устанавливать значения существующей коллекции по индексу, что само собой может отъехать при изменении макета СКД в визуальном редакторе.
Кроме того, если какой-то параметр данных объявлен пользовательским, то программной установки параметра данных (см.выше) недостаточно, восстанавливаемое значение пользовательской настройки перебивает установку параметра данных. Поэтому для таких параметров нет смысла устанавливать параметр данных, нужно сразу устанавливать пользовательскую настройку.
Удобное место для установки нужных значений - обработчик события "ПриЗагрузкеПользовательскихНастроекНаСервере" расширения формы отчёта.
Использование источника данных в виде объекта
Для использования набора данных типа объект нужно передать внешний источник данных методу Инициализировать объекта "Процессор компоновки данных".
Язык выражений системы компоновки данных
Использование нестандартных макетов оформления отчета СКД
Кое-как удалось заставить СКД формировать заголовки группировок.
Непонятная на первый взгляд фишка - то, что в настройках группировок нужно задать "Имя" группировки (через контекстное меню - "Установить имя"), а кроме того это имя группировки надо добавлять в "Детальные записи" а не в групприровки..
В общем, темный лес, не для средних умов..
Вывод разрыва страницы при печати через СКД
Просто вставить в макет разрыв страницы ничего не дало - в результат он не попадает.
Поиск дал информацию что это проблема СКД
В новой версии 8.2 в модуле объекта отчета есть обработчик события ПриКомпоновкеРезультата. (Приятная особенность - пример в документации 8.2 написан с ошибками и вообще не работает:)
В ходе выполнения своей повседневной работы столкнулся с интересной клиентской задачей - требовалось результат отчета СКД вывести на форму отчета в разные вкладки формы в разные табличные документы. Как оказалось, информации по такому выводу отчета в интернете маловато, поэтому решил скомпоновать свой опыт решения этой задачи в одной статье.
-Отчет на СКД с кучей независимых друг от друга группировок.
-Форма отчета со страницами и табличными документами результата отчета на них.
Требуется вывести каждую группировку в соответствующий ей табличный документ.
На форме отчета сделал свою кнопку "Сформировать". Событием "ПриКомпоновкеРезультата" не удалось воспользоваться, т.к. из этого события нет доступа к табличным документам на форме отчета.
В процедуре вывода отчета используем следующий код:
Сначала, запихиваем все табличные документы результата в массив и очищаем эти табличные документы.
Затем готовим процессоры вывода и пихаем их в свой массив. Суть метода в том, чтобы отчет скомпоновать один раз, а вот результат отчета вывести с помощью отдельных процессоров вывода для каждой таблицы. В цикле устанавливаем каждому процессору вывода свой табличный документ и начинаем вывод.
Последним этапом является вывод нашего результата отчета. Он происходит в немного модифицированном типовом цикле вывода.
Важный момент. Первый элемент результата СКД содержит все макеты результата, поэтому его нужно вывести во все табличные документы.
Чтобы определить момент, когда нужно перейти в новую таблицу для вывода следующей группировки я между группировками отчета добавил служебную группировку ПереходВДругуюТаблицу и в параметры отчета СКД новый параметр данных Разрыв, который и вывожу в этой служебной группировке. Это сделано, чтобы однозначно определить, что выводимый элемент отчета является сигналом к переходу на новую страницу. Для служебной группировки сделал условное оформление - Цвет фона, Цвет текста и Цвет границы - белый, чтобы не засорять нам отчет. Кстати, этот же метод можно использовать для вставки разрыва страницы после группировки в результате отчета, если для нашей служебной группировке настроить макет и добавить туда горизонтальный разделитель страницы.
Многим мало одного примера какого-либо приема разработки, они хотят понимать, где еще на практике можно использовать разобранный способ.
Вопрос
Для чего может использоваться метод поэлементного вывода результата? В каких задачах может это потребоваться? В отладчике считываю данные “ЭлементРезультата“, но никакого смысла не понимаю.
(нажмите, чтобы увеличить картинку)
Ответ
Например, в одном из видеоуроков рассматривается вопрос программной фиксации шапки отчета. Для этого используется поэлементный вывод результата.
Программный код получился вот такой:
Комментарий слушателя
Этот пример работает, но я не понимаю, почему он работает. Что представляет из себя ЭлементРезультата. Сколько их будет в цикле? Что конкретно выводит каждый такой элемент? Почему именно в том элементе, где количество параметров >0, мы добавляем код? Что еще можно получить из перебора этих элементов?
Комментарий тренера
Система компоновки данных выводит результирующий отчет в табличный документ не сразу за одно действие, а определенными порциями. При компоновке выполняются запросы к базе, рассчитываются итоги, учитываются макеты, происходит оформление ячеек отчета, отрисовка ячеек табличного документа и т.д. Все алгоритмы реализованы на уровне платформы, прикладному разработчику недоступны. Ему доступен только тот факт, что вывод отчета происходит порциями, шагами. Каждая порция – это и есть элемент результата компоновки данных. Фактически это специальный вспомогательный объект, при выводе этого элемента в отчет выводится отдельная ячейка, строка, заголовок, описания параметров отчета, описания отборов и т.д.
В элементе результата компоновки данных можно выделить 2 основных свойства. Это Макет (как должна выглядеть выводимая область) и ЗначенияПараметров (какие значения должны принимать параметры в этой области).
Чтобы получить представление, как всё это устроено, можно использовать консоль компоновки от ИР (инструменты разработчика). В ней есть инструмент Исследовать – Элементы результата. Можно посмотреть, как заполнены свойства каждого элемента результата.
Можно провести аналогию с формированием отчета при помощи макета – табличного документа. Сначала мы выводим секцию с заголовком, потом выводим шапку отчета, потом в цикле выводим в отчет строки данных, затем подвал с итоговыми значениями. Каждый такой этап дает нам представление об элементах результата компоновки данных.
Как происходит вывод отчета? При выводе отчета сначала выводится заголовок, описание отборов отчета, шапка отчета. В этих данных нет никаких параметров, все выводимые данные находятся непосредственно в выводимом макете (это можно проверить при помощи инструмента ИР Плоский макет компоновки):
Затем нужно выводить данные самого отчета – строки с данными. И вот тут уже будут заполнены значения параметров.
Значит, у нас есть признак: как только значения параметров становятся заполнены, значит, шапку отчета мы уже вывели, приступаем к выводу строк отчета, но сами строки еще не вывели. Следовательно, это самый подходящий момент, чтобы зафиксировать шапку отчета. Получаем высоту таблицы – именно столько строк в табличном документе и нужно закрепить.
Читайте также: