1c типовая консоль отчетов параметры
Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Если нужен не «вариант по умолчанию»
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
- СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
- Отбор — Устанавливает отбор на результат СКД.
- КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
После того, как присвоено значение переменной СхемаКомпоновкиДанных — через нее мы можем получить доступ к формирующим запросам схемы через свойство коллекцию НаборыДанных . Элемент набора данных имеет интересующее нас свойство Запрос . Это текстовый параметр, содержащий в себе запрос. С помощью функций редактирования текста, его можно изменить, например, добавить отбор по недоступному через КомпоновщикНастроек полю.
Или если с добавлением нового параметра
Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
Проект имеет низкую популярность, причем мало качают обработку! Предпологаю что коллеги не знают как и где ее применить (или у каждого имеется уже такая собственная))))). Порылся в интернете и не нашел нормального описания "Консоли отчетов" с применением системы компоновки данных (далее СКД) и решил описать то что знаю с примерами реализаций задач. Данное описание будет дополнятся и дорабатываться в этом блоге. Описание можно использовать просто как пособие по СКД, в этом случае исчите главы со словом "ОПИСАНИЕ".
Так как разбирался я со всем сам и зачастую методом научного тыка, то прошу строго не судить, а попровлять ошибки или дополнять описание комментариями (дельные комментарии буду плюсовать и включать в описание). По всем вопросам непонятным Вам в СКД пишите здесь или в личку (если вдруг кто стесняется).
НАЧНЕМ С КОНЦА:
Для того чтобы понять где применить обработку из проекта необходимо знать что умеет СКД и как это реализовать, но так как мне длизко по духу решение практических задач и если я сейчас начну рассказывать теорию то половина останется непонятым или забытым, поэтому хочу разобрать несколько практических примеров, а потом расскажу о прелестях СКД.
Наверно все знают универсальные типовые обработки такие как "Групповая обработка справочников и документов" (входящая в состав конфигураций) и "Универсальный подбор и обработка объектов" которая есть на диске ИТС. Часто я мечтал их объеденить, так как последняя имеет большой функционал по обработке объектов но умеет выбирать только по одному виду объектов. Остальные обработки не будем рассмаривать, скажу только одно, ни одна не подошла мне полностью каято чегото не умеет.
Условие задания:
Мы заметили ошибку в проведении документа(ов) из за которой неверно делались движения регистра например в ЗУП "ВзаиморасчетыСРаботникамиОРганизаций"
***
. Замечание: Несложно взять любой другой регистр влюбой конфигурации, это замечание будет относится и для всех примеров, примеры прозрачные и могут относится к любой конфигурации.
***
и исправили ее. Отлично, но теперь нам надо перепровести все документы (или за период) связанные с этим регистром. В этом и будет заключаться наша простая задача.
Вариантов несколько:
1. Использовать универсальные обработки.
Но в первой обработе придется руками отмечать самим все документы у которых есть движения по этому регистру что не совсем удобно потому что по нашему регистру их 24 и все на память не упомнишь. Во второй вообще заколебешься перебирать по одному документы. Вот и получается, что универсальные обработки не совсем уж и универсальные и это еще самый простой пример из практики.
2. Написать обработку самому. На самом деле написать такую обработку не сложно, но связано с ошибками (результат выборки мы можем посмотреть только в отладчике и не в очень уобной форме). Ко всему прочему обычно я такие обработки относил в папку Temp и удалял. Как иногда обидно что помнишь что когда то писал обработку, но написать заново легче чем найти.
3. Попробуем использовать обработку из проекта. В ней требуется написать запрос который делается в конструкторе за 3 секунды если не писать условий если писать чуть больше:
ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций.Регистратор
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Период, МЕСЯЦ)
И написать код по перепроведению объектов, но над этим придется потрудится ))))):
Для каждого СтрокаДерева Из ДеревоОбъектов Цикл
СтрокаДерева.Регистратор.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
где: ДеревоОбъектов - итог работы СКД (обрабатываемое нами дерево), Регистратор - наименование поля полученного нами дерева в данном случае документа регистратора. Далее получаем объект и записываем его с проведением.
Надоела уже эта практика отвлечемся на теорию ))))
Некоторые скажут насчет примера выше: "В каком конструкторе, да там в ентих конструкторАх черт ногу сломит". И будут несовсем правы все там сделано для нас программистов, потому что иногда так приходится изёживаться чтобы собрать необходимый набор данных что и этого функционала может не хватить.
ОПИСАНИЕ: Закладка "Наборы данных"
На закладке присутствует окошко с деревом наших наборов данных и две кнопочки над ним: 1) "Добавить набор данных" - добавляет один из наборов данных
-"Запрос" - уже знакомый многим запрос с конструктором и всеми сопутствующими делами. Конструктор запроса можно вызвать кнопкой "Конструктор запроса. " находящейся справа над полем "Запрос", которое заполняется текстом запроса если выделенный в левом окошечке набор даннх является запросом (. Замечание: Если при нажати на кнопку "Конструктор запроса. " в окошке "Запрос" выделена определенная область, то конструктор пытается отрыть именно эту область, применяется если необходимо открыть и отредактировать например только вложенный запрос).
-"Объект" - при использовании данного набора данных нам придется написать имя внешнего набора данных переданных например через ПроцессорКомпоновкиДанных.Инициализировать(, , , ) придется описать и все реквизиты передаваемые во внешних данных и используемые в СКД.
-"Объединение" - название говорит само за себя: данный вид позволяет объединять несколько наборов данных "запрос" и/или несколько надоров данных "объект" в один набор данных.
2) "Удалить текущий" - удаляет текущий набор данных
НЮАНСЫ И ТОНКОСТИ при работе с Консолью отчетов, СКД, запросами
- Если Вы рассчитываете выражение и при каких либо условиях одно из составляющих окажется NULL (Реквизит1 - Реквизит2, например если Реквизит2 = NULL) то в результате расчета Вы получите так же NULL. Необходимо учитывать такие ситуации и например применять конструкцию ЕСТЬNULL(Реквизит2, 0). ПРОДОЛЖЕНИЕ СЛЕДУЕТ.
Поговорим об особенностях формирования внешних отчетов в программе 1С Бухгалтерия 8 без применения схемы компоновки информации. За исходную информацию примем необходимость: «Составить отчет по сч. 62 бухучета , в котором в разрезе Контрагентов и их Договоров станут отражаться обороты за определенный период».
Создание макета внешнего отчета
Для создания отчета в 1С Бухгалтерия 2.0 понадобится шаблон для вывода информации, или, другими словами, макет, в котором будут составляться таблицы, задаваться необходимые параметры и т.д. Для добавки шаблона кликаем на раздел Макеты, находящийся в дереве мета-данных отчета, после – на Добавить. При формировании макета определяем вид Табличный документ.
В шаблоне – четыре основных части:
- Шапка – в которой станет располагаться название отчета, временной отрезок, за который он создан, шапка таблицы.
- ДанныеКонтрагент – здесь будет находиться информация по контрагентам в таблице.
- ДанныеДоговорКонтрагента – тут мы станем указывать информацию по соглашению с контрагентом, также в таблице.
- Подвал – часть предназначается для указания итоговых параметров по всему отчету для Расхода и Прихода.
Начнем формировать части шаблона. Для этого выделяем необходимое число строк, после чего:
- Нажимаем одновременно сочетание клавиш «N + Shift + Ctrl»;
- Или кликаем на Назначить имя, расположенное в меню Имена в разделе Меню Таблица.
В Шапке прописываем название документа: Обороты сч. 62. Используя инструмент Границы, рисуем шапку отчета, после – задаем параметры. Последние позволяют указывать в отчете необходимые сведения. Но об этом мы поговорим позднее.
Параметр в шаблоне создается путем выбора необходимой ячейки и указания в ней (без пробелов) названия параметра. После нужно будет нажать на ячейку, используя правую кнопку мышки, и в выпавшем списке кликнуть на строчку Свойства. Выберите заполнение Параметр в закладке Макета в свойствах ячейки.
В результате название параметра в ячейке окажется окруженным скобками (<>). Вид получившейся Шапки должен быть таким:
В части ДанныеКонтрагент задаем параметры для указания названия контрагента, и для Расхода и Прихода по сч. 62. С этой целью используем инструмент Границы, оформляя часть как строку таблицы.
В части ДанныеДоговорКонтагент определяем парамаметры для указания названия соглашения, Расхода и Прихода по сч. 62. С этой целью используем инструмент Границы, оформляя часть как строку таблицы. Выполняем незначительный отступ перед параметром ДоговорКонтрагент (разбейте и соедините ячейки, работая с правой кпонкой мышки). Отступ потребуется для того, чтобы в документе было заметно, что строчка по соглашению располагается ниже по иерархии, в сравнении со строчкой по контагенту .
В части Подвал указываем параметры для результатов Расхода и Прихода.
В результате должен появиться шаблон следующего вида:
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Этот код установит значение для отбора, а если такого отбора нет в настройках, то добавит. В случае если точно известно, есть или нет такой отбор — то код можно упростить.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Программирование
Переходить к программированию можно после формирования формы. Выводим окно выбора периода. Нажимаем на кнопку правой кнопкой мышки, переходим в раздел Свойства – здесь выбираем События (в этом меню, используя символ лупы, в модуле формы мы создадим процедуру Кнопка-1Нажатие).
Для переключения между модулем и самой формой можно использовать расположенные в нижней части закладки.
Вызвать окно выбора периода можно, используя стандартный модуль ОбработчикНастройкаПериодаНажатие , расположенный в меню РаботаСДиалогами . Здесь в качестве параметров необходимо передать отчетные реквизиты КонецПериода и НачалоПериода .
Приступаем к программированию – нам нужен код для формирования и вывода отчета. Используем уже имеющуюся процедуру КнопкаСформироватьНажатие . Она станет осуществляться при клике на Сформировать.
Прежде всего, нам нужна переменная для поля таблицы-документа, в котором будут указываться данные.
ТабДок = ЭлементыФормы . ТабДок
Создался шаблон. Используя ПолучитьМакет (< ИмяМакета >), в параметр ему присвоим имя шаблона. При существовании такого шаблона, система отыщет его.
Макет = ПолучитьМакет («Макет»)
Оформляем переменные для всех областей шаблона. Используем макет ПолучитьОбласть (< ИмяОбласти >).
ОбластьШапка = Макет. ПолучитьОбласть («Шапка»)
ОбластьПодвал = Макет. ПолучитьОбласть («Подвал»);
ОбластьДанныеДоговор =Макет. ПолучитьОбласть (« ДанныеДоговор »)
ОбластьДанныеКонтрагент = Макет. ПолучитьОбласть (« ДанныеКонтрагент »).
Проводим очистку поля таблицы-документа. После этого каждый новый сформированный отчет станет удалять прежнюю информацию.
По завершению инициализации переменных, начинаем по очереди заполнять и выводить части шаблона – с Шапки. У Шапки есть КонецПериода и НачалоПериода – зададим тут показатели периода формирования документа. С этой целью используем Параметры области макета.
КонецПериода = ОбластьШапка .Параметры. КонецПериода
НачалоПериода = ОбластьШапка .Параметры. НачалоПериода
Другие действия с частью не нужны: убираем Шапку в поле таблицы-документа.
ТабДок .Вывести( ОбластьШапка )
Пишем запрос для базы данных, который позволит получать обороты по сч. 62 из бух . регистра Хозрасчетный. Указываем переменную для расположения запроса.
Запрос = новый Запрос.
Перенесем необходимые параметры в запрос перед написанием текста. Мы создаем запрос по сч. 62 бухучета , значит, прежде всего, нам нужен параметр для него.
Запрос. УстановитьПараметр («Счет62», ПланыСчетов .Хозрасчетный. НайтиПоКоду («62»)).
Теперь в запрос нужно перенести период создания отчета. Помните, что для периода формирования существуют соответствующие реквизиты. Перенесем их как параметры.
Запрос. УстановитьПараметр (« КонецПериода », КонецПериода )
Запрос. УстановитьПараметр (« НачалоПериода », НачалоПериода )
Используя конструктор запросов, создаем текст запроса. Рекомендуем отказаться от попытки написания запросов вручную, и всегда использовать конструктор, который не может допустить ошибку и опечатку. Вы сэкономите силы и время даже при создании наиболее сложных запросов. В коде указываем:
Далее наводим курсор мышки между кавычками, кликаем правой клавишей мышки и определяем строку Конструктор запроса. Откроется нужное нам окошко.
Сейчас нужно указать необходимую таблицу базы данных утилиты. Наша таблица должна быть виртуальной - Обороты регистра бухгалтерии Хозрасчетный. В окошке конструктора она располагается слева.
Переносим таблицу в часть Таблица и приступим к вводу параметров. Для любой виртуальной таблицы запроса имеется особый комплект параметров, воспользовавшись которыми, можно находить необходимые сведения в главной таблице. В нашем примере главной таблицей будет Регистр бухгалтерии Хозрасчетный. Открываем окошко параметров виртуальной таблицы.
Указываем параметры и периоды , которые ранее переносились в запрос. Для того, чтобы в тексте запроса можно было применить параметр, необходимо перед его названием указывать & (знак амперсанда ).
Теперь нужно оформить условие по сч. 62 бухгалтерского учета. С этой целью ищем УсловиеСчета в параметрах виртуальной таблицы, и пишем условие в нем.
Счет В ИЕРАРХИИ (&Счет62)
Кроме того, можно использовать Конструктор для формирования условий. Кликните на кнопку с 3 точками.
После этого на виртуальную таблицу больше не нужно будет накладывать никаких условий. Дальше кликаем на кнопку ОК, расположенную в окошке с параметрами виртуальной таблицы. После – определяем необходимые нам поля из таблички Хозрасчетной.Обороты. в частности требуются Расход и Приход, Договор контрагента и Контрагент. Просмотреть перечень полей, возможных в выбранной сейчас таблице, можно, кликнув на значок «+» (он располагается около наименования таблицы). Переносим необходимые поля в правую часть конструктора запросов (название части аналогичное – ПОЛЯ). Если вы перейдете в план счетов бухучета , то обнаружите, что для сч. 62 аналитика по ДоговоруКонтрагента — Субконто2, а по Контрагенту — это Субконто1.
Соответственно, из полей виртуальной таблички нам нужны Субконто2 и Субконто1. В связи с необходимостью Расхода и Прихода по сумме, дополнительно треуются поля СуммаОборотКт и СуммаОборотДт .
Оформив наименования определенных сейчас полей. С этой целью необходимо открыть меню Объединения/Псевдонимы, и указать необходимые названия полей.
В связи с тем, что в формируемом нами отчете информация станет указываться в соответствии с иерархией (соглашения с контрагентами будут выходить на уровне, перед которым будет располагаться уровень самих контрагентов), нужно настроить демонстрацию информации в иерархии, используя Итоги. Открываем подраздел Итоги в конструкторе. Переносим в поля группировок один за другим Контрагент и ДоговорКонтрагента , далее - итоговые Приход и Расход.
Все необходимые процедуры в редакторе выполнены. Остается кликнуть на кнопку ОК и убедиться в том, что в программном коде отражается текст только что сформированного запроса. Вид текста должен быть следующим:
| ХозрасчетныйОбороты .Субконто1 КАК Контрагент,
| ХозрасчетныйОбороты .Субконто2 КАК ДоговорКонтрагента ,
| ХозрасчетныйОбороты . СуммаОборотДт КАК Приход,
| ХозрасчетныйОбороты . СуммаОборотКт КАК Расход
| РегистрБухгалтерии .Хозрасчетный.Обороты(& НачалоПериода , & КонецПериода , , Счет В ИЕРАРХИИ (&Счет62), , , , ) КАК ХозрасчетныйОбороты
По окончанию формирования запроса, необходимо оформить части Подвал, ДанныеДоговорКонтрагент и ДанныеКонтрагент . Все указанные части нужно оформлять, указывая информацию, полученную при проведении запроса. В связи с тем, что в запросе есть группирование (в частности, ДоговорКонтрагента и Контрагент), указываем для него информацию таким путем:
ВыборкаКонтрагент = Запрос.Выполнить().Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
В результате у нас будут записи с результатом по каждому контрагенту.
Прежде, чем обходить информацию выборки, используя цикл, инициализируем переменные, которые предназначаются для расчета всех результатов отчета:
Для корректного вывода данных с учетом иерархии и разворотами по знаку «+», указываем начало автоматической группировки строчек документа-таблицы:
Все предварительные работы завершены. Следует начать обходить итоги запроса. Для обхода потребуется использовать цикл Пока:
Пока ВыборкаКонтрагент .Следующий() Цикл
Аннулируем параметры Расход и Приход области ДанныеКонтрагент в самом начале цикла. Что это нам даст? Предположим, что по поставщику, назовем его Х, расход составляет 10, а приход 20. У следующего за ним поставщика, назовем его Н, расход и приход отсутствуют полностью. При аннулировании параметров Расхода и Прихода в такой ситуации в строке по поставщику Н окажутся данные поставщика Х – расход 10 и приход 20.
ОбластьДанныеКонтрагент .Параметры.Приход = 0;
ОбластьДанныеКонтрагент .Параметры.Расход = 0;
Теперь оформляем данными элемента выборки часть ДанныеКонтрагент
ЗаполнитьЗначенияСвойств ( ОбластьДанныеКонтрагент .Параметры, ВыборкаКонтрагент );
Оформив данные, можно выводить часть в Табличный документ. Т.к. мы работаем с автоматическим группированием строчек, необходимо определить степень строки в группировке (в нашем случае у отчета окажется 2 степени, для договоров контрагентов – второго уровня, для самих контрагентов – первого уровня).
ТабДок .Вывести( ОбластьДанныеКонтрагент ,1);
После для указанного контрагента нужно выполнить выборку по его соглашениям:
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент .Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
Используем цикл Пока для выполнения обхода:
Пока ВыборкаДоговорКонтрагента .Следующий() Цикл
Обнуляем параметры Расход и Приход в цикле по соглашениям контрагентов. Оформляем часть ДанныеДоговора из выборки и выносим эту часть на 2-ой уровень записей в таблицу-документ:
ОбластьДанныеДоговор .Параметры.Приход = 0;
ОбластьДанныеДоговор .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеДоговор .Параметры, ВыборкаДоговорКонтрагента );
ТабДок .Вывести( ОбластьДанныеДоговор ,2);
Кроме того, к переменным расчета итоговых показателей по Расходу и Приходу в данном цикле присоединим нынешние показатели.
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента .Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента .Расход;
После этого вынос данных в части ДанныеДоговорКонтрагент и ДанныеКонтрагент будет закончен. Потребуется только окончить автоматическую группировку строчек таблицы-документа:
Циклы, ответственные за демонстрацию информации в частях документа ДанныеДоговорКонтрагент и ДанныеКонтрагент , целиком станут иметь следующий вид:
Пока ВыборкаКонтрагент .Следующий() Цикл
ОбластьДанныеКонтрагент .Параметры.Приход = 0;
ОбластьДанныеКонтрагент .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеКонтрагент .Параметры, ВыборкаКонтрагент );
ТабДок .Вывести( ОбластьДанныеКонтрагент ,1);
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент .Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
Пока ВыборкаДоговорКонтрагента .Следующий() Цикл
ОбластьДанныеДоговор .Параметры.Приход = 0;
ОбластьДанныеДоговор .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеДоговор .Параметры, ВыборкаДоговорКонтрагента );
ТабДок .Вывести( ОбластьДанныеДоговор ,2);
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента .Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента .Расход;
На завершающем этапе необходимо перенести итоговые сведения в часть Подвал и перевести сам Подвал в таблицу-документ:
ОбластьПодвал .Параметры. ИтогоПриход = ИтогоПриход ;
ОбластьПодвал .Параметры. ИтогоРасход = ИтогоРасход ;
ТабДок .Вывести( ОбластьПодвал );
После этого процедура формирования внешнего отчета в программе 1С Бухгалтерия 2.0 версия 8 без применения схемы компоновки данных будет полностью окончена. С этой минуты отчет можно будет создавать, используя рабочий режим утилиты 1С версия 8, и добавлять в справочник ВнешниеОбработки .
Хотите получать подобные статьи по четвергам?
Быть в курсе изменений в законодательстве?
Подпишитесь на рассылку
Отчеты на СКД в типовых решениях частенько сделаны очень сложно. Чтобы понять, почему они выдают какой-то результат, необходимо взять запросы наборов данных или схему компоновки данных целиком и "перебраться" с ними в консоли запросов или консоли отчетов СКД, указав значения всех параметров. Но беда в том, что готового запроса или схемы компоновки в конфигураторе нет, т.к. сложные отчеты собираются программно по кусочкам, а параметров много и к тому же часть параметров устанавливается функциями общих модулей, модулей менеджеров и т.п.
Я предлагаю набор функций, которые через режим отладки помогут быстро "перебраться" в консоли запросов или отчетов. Эти функции находятся в расширении в общем модуле ОтладкаСКД.
Подключаем расширение, перезапускаемся, появляется подсистема "Отладка СКД"
На примере демо-базы Бухгалтерии возьмем отчет "Задолженность покупателей по срокам долга". В этом отчете запрос набора данных собирается каждый раз в зависимости от количества интервалов, заданных в настройках, при этом значения параметров в запросе очень много.
Посмотрим наименования наборов данных в схеме компоновки данных:
-"ОсновнойНабор"(запрос);
- "ПросроченнаяЗадолженность" (таблица значений);
- "ДанныеПервичныхДокументов" (запрос).
Создание внешнего отчета
Прежде всего, перейдем в режим Конфигуратора , выберем подраздел Файл, после кликнем на значок Новый документ или слово Новый, и создадим файл внешнего отчета.
Выберем строку Внешний отчет в перечне. После формирования файлы, укажем его Наименование (допустим, ПростейшийОтвет ) и выполним сохранение на диск. Кроме того, внесем несколько реквизитов вида Дата – КонецПериода и НачалоПериода . Они потребуются для выставления временных рамок при выборке информации в процессе создания отчета.
I Шаги для перехода к отладке отчета в консоле запросов
- Определим, где ставить точку остановки, используя замер производительности.
- В указанной точке вызовем функцию для получения структуры запроса одного из набора данных с параметрами.
- Перейдём в консоль запросов и выполним запрос.
1. Определяем место точки остановки отладки в Конфигураторе
В конфигураторе в разделе "Отладка" подключаемся к серверному сеансу для отладки. Будем "ловить" место, где, в конечном итоге, выполняется отчет. Не забываем в разделе "Автоматическое подключение" подключится к фоновым заданиям, т. к. отчеты на СКД "любят" выполняться фоновыми заданиями.
Включаем "Замер производительности" и нажимаем "Сформировать" в отчете. Отключаем "Замер производительности", смотрим и ищем нужное место
В итоге видим, что реальное выполнение отчета происходит в общем модуле "Бухгалтерские отчеты" , переходим туда и ставим точку остановки именно там, как можно ближе к методу КомпоновщикаМакета.Выполнить, чтобы не пропустить какие-либо промежуточные процедуры и функции, которые могут изменить настройки.
2. Получаем запрос с установленными параметрами в виде XML
Для того, чтобы получить в итоге конечный запрос, необходимо иметь "Схему компоновки данных" и "Компоновщик настроек данных" (точнее Настройки компоновщика). Внимательно посмотрев текст модуля в месте точки остановки, видим эти переменные. Включаем Табло отладки и пишем:
ОтладкаСКД.ЗапросВСтрокуXML(ОтладкаСКД.ПолучитьЗапросНабора(СхемаКомпоновкиДанных,КомпоновщикНастроек,"ОсновнойНабор"))
Видим, что в 1-ой записи получили запрос набора данных "ОсновнойНабор" (тип "Запрос"), а во 2-ой тот же запрос набора данных "ОсновнойНабор" (тип "Запрос") в XML.
Копируем строку XML и запускаем консоль запросов
3. В "Консоле запросов" выполняем запрос
Вставляем скопированную строку XML в текст запроса (хотя это не совсем текст запроса, но это трюк консоли) и нажимаем в "Еще" "Заполнить из XML"
И о чудо ! Строка ХМL превратилась в текст запроса и в параметры с установленными значениями.
Если всё это делать "руками", то установка значений параметров займёт много времени с одной стороны, а с другой можно легко пропустить какое-либо значение в параметрах, например в списках, что приведёт к неверному (другому) результату запроса.
Запрос выполнился, всё работает, дальше уже разбираемся с запросом.
II Шаги для перехода отлаживать отчет в консоли отчетов СКД
- Определим, где ставить точку остановки, используя замер производительности.
- В указанной точке вызовем функцию для получения схемы компоновки в XML и настроек компоновщика в XML.
- Перейдём в консоль отчетов СКД и добавим там отчет, вариант отчета.
1.Определим, где ставить точку остановки, используя замер производительности
Этот шаг ничем не отличается от ранее описанного для работы с консолью запросов
2.Получение схемы компоновки данных и настроек компоновщика в XML
Поставив точки остановки и остановившись при выполнении отчета, пишем в "Табло отладки"
Получаем 2 строки XML:
- Схема компоновки данных
- Настройки компоновщика (вариант отчета)
Копируем эти строки в 2 файла. Создаём здесь в конфигураторе 2 текстовых файла и сохраняем например "СхемаСКД.txt" и "НастройкиСКД.txt"
3. Консоль отчетов СКД и добавим там отчет, вариант отчета.
Открывает стандартную консоль отчетов СКД с ИТС
Добавляем "Вариант отчета" и кнопку "Ещё-Загрузить настройки", выбираем файл ""НастройкиСКД.txt"
Всё готов отчет, все параметры и настройки заданы.
. Конкретно в этом отчете есть дополнительный набор в виде таблицы значений, поэтому отчет не выполнится. Но это уже нюансы этого отчета. Чуть ниже сделана небольшая доработка, чтобы можно было в консоли отчетов СКД работать и с внешними наборами данных (таблицами значений)
08.01.2019 Добавлена возможность в консоли отчетов СКД загружать данные внешних наборов данных, используемых в схеме СКД
Отчет не заработает, если ему не передать таблицу значений в качестве внешнего набора данных. Имя этого набора "Просроченная задолженность" (на скриншотах выше это можно увидеть). К сожалению в консоли отчетов СКД от 1С нет стандартной возможности передать эти внешние наборы, поэтому пришлось немного её доработать. Добавлена новая кнопка "Внешние наборы данных" (доработанная консоль в расширении).
Как это делаем по шагам:
1. Отладкой находим место, где эти таблицы внешних наборов собираются и передаются на выполнение.
В том же модуле БухгалтерскиеОтчетыВызовСервера, где мы нашли метод выполнения макета компоновки, чуть ниже находим строку, в которой передаются внешние наборы данных на выполнение процессору компоновки, ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, и переменную ВнешниеНаборыДанных, эта структура в которой содержатся таблицы для внешних наборов
2. Выгружаем эти таблицы в XML
С помощью функции ОтладкаСКД.ВнешниеНаборыДанныхВXML , конвертируем переменную ВнешниеНаборыДанных в XML. Сохраняем эту строку в текстовый файл, например ВнешниеНаборыСКД.txt
3. Загружаем внешние наборы данных в консоль , выполняем отчет.
Теперь возвращаемся в консоль отчетов СКД из расширения и вызываем пункт "Внешние наборы данных" и выбираем файл ВнешниеНаборыСКД.txt
Видно, что загрузился из файла один внешний набор ПросроченнаяЗадолженность (планирую также добавить редактор таблиц значений для работы с внешними набора данных).
Закрываем окно и нажимаем НАКОНЕЦ "Сформировать" и отчет формируется.
16.01.2019 Добавлена в расширение для отладки отчетов функция, которая позволяет во время отладки в Конфигураторе выгрузить отлаживаемый отчет во внешний отчет (в файл) со всеми настройками в момент точки остановки:
ОтладкаСКД.Клиент.СгенерироватьВнешнийОтчет(ПолныйПутьКОтчету = Неопределено, ДанныеСКД)
. Внимание: Данная функция работает только для сеанса "Толстый клиент"
Например, чтобы выгрузить отчет в файл внешнего отчета необходимо в отладке вычислить выражение:
Далее отчет можно запускать как отдельный внешний отчет.
ИТОГ: С помощью функций расширения "ОтладкаСКД" можно быстро начать отлаживать довольно сложные отчеты СКД в различных консолях или просто разобраться в ситуации прямо в отладке.
На текущий момент перечень функций в расширении:
Функция ПолучитьМакетаКД - Возвращает макет выполнения компоновки данных
Функция ПолучитьЗапросНабора - Возвращает запрос с текстом запроса и значениями параметров из компоновщика
Функция ПолучитьЗапросыНаборов - Возвращает структура запросов всех наборов данных с примененными настройками и значениям параметров компоновщика
Функция ПолучитьРезультатЗапросаНабора - Возвращает результат запроса набора данных с примененными настройками и параметрами компоновщика
Функция ПолучитьРезультатыЗапросовНаборов - Возвращает структуру результатов запросов всех наборов данных схемы компоновки данных с примененными настройками компоновщика
Функция ТабДокВXML - Возвращает результат выполнения СКД в табличный документ в XML, далее табличный документы можно получить обработкой "Табличный документ(Отладка СКД)", включенной в расширение
Функция ПолучитьТабДок - Возвращает результат выполнения СКД в табличный документ
Функция ПолучитьТЗ - Возвращает результат выполнения СКД в таблицу значений
Функция ПолучитьДЗ - Возвращает результат выполнения СКД в дерево значений
ВнешниеНаборыДанныхВXML - возвращает таблицы для внешних наборов данных в XML
СгенерироватьВнешнийОтчет(ПолныйПутьКОтчету, ДанныеСКД) - выгружает во внешний отчет отлаживаемый отчет со всеми настройками.
включены вспомогательные функции из БСП также (в БСП они в общем модуле ОбщегоНазначения) для конфигураций без БСП:
Функция ЗначениеВСтрокуXML
Функция ЗначениеИзСтрокиXML
Функция ЗапросВСтрокуXML
Ещё чуть-чуть доработана "Консоль запросов", добавлено при создании параметров поддержка типов "Массив", "Список значений", "Стандартный период". Без этого может выдавать ошибку по кнопку "Заполнить из XML" при определенных параметрах компоновщика.
С развитием 1С, появлением новых платформ 8.2, 8.3 продолжают развиваться так же и такие инструменты как Схема компоновки данных (СКД).
Как же теперь вывести быстрые настройки в отчетах на управляемых формах, например отбор? Тут просто нужно знать, что делать. Некоторый плюс управляемых форм - не нужно рисовать элементы формы, платформа их разметит сама. Только нужно ей сказать об этом. И в данном случае нужно знать, каким образом указать необходимость размещения на форме отчета на СКД вывода параметров отчета. Пример из типовой конфигурации 1С: Управление торговлей 8, ред. 11
Как же разработчикам удалось разместить на управляемой форме отчета быстрый доступ к параметру отчета типа начало периода/конец периода и к отборам, учитывая тот факт, что явно в конфигураторе форма у отчета никак не определена? Все оказывается достаточно не сложно.
Для определения параметра в виде "Период" на форме отчета, как видно на предыдущей картинке, необходимо к существующим параметрам, полученным из параметров запроса (источника данных) "НачалоПериода" и "КонецПериода" доопределить дополнительный параметр "Период", тип которого "СтандартныйПериод", значение выбриается из списка, какой больше будет подходить. В колонке "В. " ( "Видимость " ) установить флажок, снять признак "О. " ("Органичение доступности"), у исходных параметров - наоборот. Так же необходимо определить выражения для параметров "Начало периода" и "КонецПериода", как представлено: &Период.ДатаНачало и &Период.ДатаОкончания
Теперь нужно настроить в СКД возможность вывода параметру на управляемую форму автоматически. Для этого переходим на закладку "Найстройки" схемы компоновки данных. На закладке параметры выделяемя строку с параметром "Период", справа от списка паарметров нажимаем кнопку "Свойства элемента пользовательских настроек". И в окне "Пользовательские настройки элемента" устанавливаете признак "Включать в пользовательские настройки". После этой процедуры параметр сам автоматически будет выведен на форму отчета, работающего в управляемом приложении.
После этого только хочется дополнить, что вывод отборов отчета на управляемой форме настраивается подобным образом:
Создание формы отчета
Форма необходима для появления кнопки Формировать, указания срока формирования и внесения информации. Получить ее можно, перейдя к дереву с мета-данными и выбрав в нем раздел Форма. Кликайте на Добавить. На 1-ой странице конструктора для создания форм никакие корректировки не нужны. Кликайте сразу на Далее.
На новой странице указывайте для размещения на форме два реквизита – КонецПериода и НачалоПериода .
В результате будет показана форма следующего вида:
Этот вид формы нам не подходит, изменим его:
- Перенесем в верхнюю часть панели кнопку Сформировать, пока что расположенную внизу;
- Вытянем форму горизонтально и вертикально;
- Разместим по горизонтили КонецПериода и НачалоПериода ;
- Добавим Поле табличного документа (элемент управления) в форму. Поле потребуется нам для вывода отчета. Укажем его название – ТабДок ;
- Создадим кнопку для определения периода (при клике на нее станет показываться окно выбора необходимого периода). Заниматься написанием программного кода для этой кнопки мы сейчас не станем. Размещаем ее около полей периода.
В результате указанных действий форма выглядит так:
Читайте также: