1с скд изменить текст запроса программно
Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Если нужен не «вариант по умолчанию»
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
- СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
- Отбор — Устанавливает отбор на результат СКД.
- КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
После того, как присвоено значение переменной СхемаКомпоновкиДанных — через нее мы можем получить доступ к формирующим запросам схемы через свойство коллекцию НаборыДанных . Элемент набора данных имеет интересующее нас свойство Запрос . Это текстовый параметр, содержащий в себе запрос. С помощью функций редактирования текста, его можно изменить, например, добавить отбор по недоступному через КомпоновщикНастроек полю.
Или если с добавлением нового параметра
Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Этот код установит значение для отбора, а если такого отбора нет в настройках, то добавит. В случае если точно известно, есть или нет такой отбор — то код можно упростить.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
Есть запрос на СКД.
Нужно, при формировании документа-результата, обращаться к каждой текущей строке выборки и, проверяя значения на соответствие условиям, выводить определенные данные в свой макет группировки. Кроме того по каждой строке нужно в переменную записывать по условию сумму значений (т.е. из одной строки сумму включать в переменную, из другой нет), а затем выводить ее в свой макет общих итогов (стандартные общие итоги не считают по такому алгоритму).
Подскажите, как это можно сделать?
а в других процедурах (ПриКомпоновкеРезультата или других) нельзя отловить каждую текущую строку выборки?
(9) нет, пробовал их.
у меня так(результат запроса):
Договор____СуммаДоговора____Документ
1__________5000_____________Док1
1__________5000_____________Док2
1__________5000_____________Док3
1__________5000_____________Док4
В общих итогах по полю Договор выводит 20000, хотя сумма по договору=5000 и надо выводить 5000.
Поэтому думал как-то программно проверять на значение текущей строки в выборке и суммировать в какую-то переменную реальную сумму по договору(5000) и потом значение этой переменной выводить в общие итоги.
(11)так я и суммирую только по договору. Договор есть в четырех документах, соответственно 5000*4=20000. А сумма по договору=5000.
т.е. надо так сделать:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000
(10) Я так понял группировка Документ самая нижняя. Добавь в запросе еще одно поле для счетчика документов. На закладке ресурсы добавь еще один ресурс СуммаДоговора рассчитывать по договору, в выражении Сумма(СуммаДоговора)/Сумма(ПолеСчетчикаДокументов) и есстественно через выбор для проверки Сумма(ПолеСчетчикаДокументов) <> 0. Как-то так. Это если структура группировок жесткая.
(16) пробовал этот вариант: для отдельного договора считает сумму по договору правильно, для общих итогов неправильно. Для примера (14) итог по сумме договора посчитает 32000/8=4000, а надо 8000
(17) В общем-то можно в форму добавить новую кнопку "Сформировать" и прописать алгоритм формирования отчета через СКД. Если надо, я могу алгоритм обработки скинут
(21) подскажите, как там проверить, какая группировка там текущая и в зависимости от этого выводить свой определенный макет вместо стандартного.
(14) У тебя не правильно построен запрос. необходимо в компоновке создать два набора данных "Договор" и "Документы" и связать их на закладке "Связи наборов данных" и ВСЕ.
(23) так то же самое получится. Для одного договора (и его суммы) есть несколько документов. При Левом соединениии (все договоры и документы удовлетворяющие условию связи по договору) будет таблица как в (14), т.е. суммы договоров будут повторяться для каждого документа. Далее в итогах они будут увеличиваться в столько раз, сколько документов по договору.
(24) Есть еще вариант, не знаю, будет ли тебе это сложновато?
В СКД есть возможность импользовать "Вложенные схемы".
Суть в том, чтоб строку с итогами выводить отдельной схемой
(28) Не путай человека.
(27) Если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
(31) Все зависит от задачи. Ты можешь написать сколь угодно сложные запросы в наборах, а компоновка будет обрабатывать уже готовые наборы. В том числе и при помощи описания связей.
еще вопрос в тему: если в какую-то колонку (поле) в скд нужно будет выводить результат выборки строк какой-то таблицы (прямо через запятую последовательно значения строк выборки), то как это можно сделать?
т.е. примерно так (характеристики):
Договор____СуммаДоговора_____Характеристики_______Документ
1__________5000_______________доп.согл1,допсогл2___Док1___
1__________5000_______________доп.согл1,допсогл2___Док2___
1__________5000_______________доп.согл1,допсогл2___Док3___
1__________5000_______________доп.согл1,допсогл2___Док4___
2__________3000_______________доп.согл1,допсогл2___Док1___
2__________3000_______________доп.согл1,допсогл2___Док2___
2__________3000_______________доп.согл1,допсогл2___Док3___
2__________3000_______________доп.согл1,допсогл2___Док4___
Итого______8000___________________________________________
(36) т.е. так же отдельным набором данных присоединить таблицу характеристик к таблице договоров по условию совпадения по договору, а как потом перебрать все значения таблицы характеристик по договору и вставить их в одну ячейку?
(38) неправильно написал: в поле характеристики через запятую надо вывести значения строк регистра сведений по каждому договору.
(39) Сворачивание нескольких строк в одну отдельная задача.
А в данном случае не понял структуру характеристик. "доп.согл." - это значение характеристики? Тип какой? Сколько может быть характеристик? Подозрение, что не совсем верно организовано хранение данных. Если доп.согл. - это документы, то лучше бы добавить в них реквизит с ссылкой на договор. В общем не понятно.
(40) мне как раз и нужно несколько строк в одну свернуть.Это можно сделать с помощью конструктора скд?
Характеристики - это периодический регистр сведений для договора. Хранит номера, даты, названия доп. соглашений с опред. даты. Нужно перебрать все строки регистра по договору, и вывести их результат через запятую в одном поле скд.
(41) СКД такой вопрос не решает. Можно при помощи запроса (много раз обсуждалось) или при помощи предварительной обработки характеристик - создаем программно ТЗ с колонками "Договор" и "Характеристики" (уже свернутые) и передаем в СКД как объект.
я как раз запросом и пытаюсь сделать - добавил для характеристик набор-запрос, а как в одну строку-то свернуть?
Кстати. В 8.2.14 появилась в СКД функция ВычислитьВыражение, которая, если я правильно понял, может делать тоже самое, что и запрос из (46).
(46) а если у меня для объекта может быть 1 св-во, а может быть и 20, то тогда надо добавлять 20 полей?
КАК Свойство1
.
КАК Свойство20
(48) Ну если кому то нужен отчет, в ячейке которого через запятую будет перечислено 20 свойств - пиши "КАК Свойство20".
А в приведенный запрос будет отображать первые четыре даже если реально 20.
(49) имел ввиду нет ли чего более универсального, т.к. хранить во врем. таблице 20 полей, которые не всегда будут использованы.
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Строка() - Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами "; ".
(67) через Строка пробовал, но в тексте запроса это не работает, опять же непонятно, как какой-то тип (число, дата) преобразовать в строку в самом запросе
(69) в вычисляемых полях нельзя использовать в выражении вычисляемые поля. У меня нужно сначала к дате добавить символ (", "), затем сложить несколько таких полей. Т.е. поле с датой и с символом(",") должно быть готовое уже в запросе, а потом в вычисляемом поле уже несколько таких полей сложить.
В запросе получаешь поля Т.Свойство1 . Т.Свойство20.
в вычисляемом поле пишешь
Формат(Свойство1,"ДЛФ=D") + ", " + . + Формат(Свойство20,"ДЛФ=D")
(71) я именно так и сделал. Не устраиваю лишние запятые в случае пустых значений. Поэтому нужна предварительная обработка, чтобы "Свойство1" уже содержало текст "Свойство1, " в случае наличия, и текст "" в случае отсутствия текста в "Свойство1".
можно ли менять размер колонок в скд, не используя макеты? Потому как слишком широкие стандартные колонки.
(83) Колонка "Оформление" в описании полей на закладках "Наборы данных" и "Вычисляемые поля".
Или постобработка табличного документа.
ВычислитьВыражениеСГруппировкойМассив пока оставлю. Попробую еще вариант сделать то же через внешний набор данных.
Шрифт заголовков можно изменить в "Макете оформления компоновки данных". Выбор макета осуществляется в настройках компоновки на закладке "Другие настройки". Создать свой макет можно либо в общих макетах ветки конфигурации. либо в другом объекте где возможно создание макетов. При создании макета надо указать тип макета - "Макет оформления компоновки данных". В открывшемся окне редактора макета, за основу возможно взять один из стандартных макетов и отредактировать его.
В какой процедуре нужно этот макет оформления (созданный на основе стандартного) привязывать к компоновщику макета? При нажатии на кнопку "сформировать"? т.е. надо свою кнопку "сформировать" с обработчиком делать?
(92) это стандартный макет. Я так понял, чтобы изменить шрифт заголовков полей группировок, нужно создать свой макет оформления и в нем изменить шрифт. А потом программно его подвязать к компоновщику макета. Если не так, поясните.
(29) Вы писали, что если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
Подскажите, если делать не через скд, а просто запросом в модуле отчета, то как результат запроса можно привести к виду (т.е. чтобы итоговая сумма по всем договорам была равна 8000)?
таб1:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000.
Я кроме как объединением таблиц не знаю. В случае объединения будет так (таб2):
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________""_________0
1__________0________________Док1_______5600
1__________0________________Док2_______4500
1__________0________________Док3_______1200
2__________3000_____________""_________0
2__________0________________Док1_______1600
2__________0________________Док2_______2500
2__________0________________Док3_______1250
Итого______8000________________________ХХХ
Подскажите, можно ли такое сделать через соединение, т.к. в 1-ом результате (таб1) если делать итоги по сумме договора, получится 32000.
(94)-(95). Создал в разделе макетов отчета макет с типом "Макет оформления компоновки данных". В нем загрузил стандартный макет. Изменил его. Сохранил. Макет в настройках не появился.
+(98)
Подвязал этот макет к компоновщику макета:
После этого отчет выводится через этот макет. Но в настройках его не нашел, поясните.
В данной статье мы рассмотрим практически все возможности и множество нюансов, которые относятся к параметрам в Системе Компоновки Данных 1С (в сокращении — СКД). Параметры в запросе СКД, фигурные скобочки в запросе СКД — оно же Расширение языка запросов для СКД, особенности настройки страницы “Параметры” СКД, вывод параметров на форму, программная установка параметров, мягкие и жесткие параметры.
Параметры могут использоваться практически в любом месте запроса и выполнять самые различные функции.
Параметры обозначаются знаком & после которого следует имя параметра.
Параметр может быть полем запроса, частью произвольного выражения поля запроса, условием для виртуальной таблицы, частью выражения в отборе запроса и так далее:
При построении запроса конструктором на вкладке “Условия” если не стоит галочка “Произвольное”, то конструктор считает что в правом значении параметр и он записывается без символа &.
Таким образом этот блок настраивается в конструкторе.
Если значение параметра не задано, то построение СКД будет невозможно и будет выдана ошибка, поэтому такие параметры называют “обязательными” или “жесткими”.
Выбрать.
Этот блок располагается в запросе типа выборка данных пакета запросов СКД в первом запросе объединения между перечнем полей и “ИЗ” и заключается в фигурные скобки.
В этом блоке мы перечисляем поля, которые пользователь может выбирать для вывода, группировки и упорядочивания. Конструкция «.*» в параметре “Марка.*” позволяет выбирать для вывода, группировки и упорядочивания дочерние поля значения, например, Марка.Код. Слово “КАК” позволяет задать псевдоним, например, “Ссылка КАК Машина”. Поля в этом блоке попадают в перечень полей набора, даже если отключено автозаполнение. Если автозаполнение включено, то упомянутые поля попадают в соответствии с тем, как они настроены расширением кода, то есть если ссылочное поле без конструкции “.*” дочерние поля доступны не будут, если указан псевдоним — именно он попадет в перечень полей набора.
Таким образом этот блок настраивается в конструкторе.
При автоматическом заполнении полей набора данных, для не включенных в блок расширения “ВЫБРАТЬ”, добавляются все поля списка выборки и их дочерние поля. Они становятся доступными для выбора, упорядочивания, группировки, отбора. Также добавляются поля, которые упомянуты в параметре “Условия” виртуальных таблиц как доступные для отбора.
Отбор, установленный в пользовательских настройках, будет действовать не только на основной запрос, но и на все запросы в пакете. Но это не всегда соответствует логике отчета, к примеру, если помимо отобранной номенклатуры и сумм по ней нужно выводить общую сумму продаж для сравнения. В таких случаях нам нужны специфические отборы в каждом запросе пакета.
Блок расширения “ГДЕ” может быть расположен после или вместо обычного блока “ГДЕ” в любом запросе, подзапросе, запросах объединения и заключается в фигурные скобки. Для присвоения отбору псевдонима используется конструкция “КАК”. Псевдоним нужно использовать чтобы отбор производился конструкцией расширения языка запросов, но не происходил автоматически по наименованию поля.
Если автозаполнение полей набора отключено, поля из этого блока попадают в перечень полей набора доступными только для отбора, использование дочерних полей зависит от наличия конструкции “.*”.
Если автозаполнение включено, и это поле включено в блок расширения “ВЫБРАТЬ” тогда настройки обоих блоков объединяются. Если не включено в “ВЫБРАТЬ” то поля попадают доступными для вывода, группировки, отбора и упорядочивания.
В случае если нужно дополнительно установить какое то ограничение полю, то можно вручную установить галочку в соответствующее поле перечня полей набора данных СКД.
Параметры в блоке «ГДЕ» не обязательны для заполнения, поэтому эти параметры называют “необязательными” или “мягкими”.
Также в блоке “ГДЕ” вместо параметра может быть произвольное выражение с использованием конструкции ВЫБОР или параметров со страницы “Параметры” СКД. Правда в последнем случае вид сравнения необходимо указывать конкретно.
Нужно с осторожностью использовать вид сравнения МЕЖДУ поскольку:
Если параметры НачалоПериода и КонецПериода не будут заданы, то система получит документы за весь период.
Если параметры НачалоПериода и КонецПериода будут заданы, то система получит документы за указанный период.
Если какой-то один из параметров не будет задан, то система выдаст ошибку.
Один из вариантов решения это разбить МЕЖДУ на два условия чтобы система не выдавала ошибку в случае одного незаполненного параметра.
Это же замечание относится к любым выражением с использованием нескольких параметров.
Параметры виртуальных таблиц.
В параметрах виртуальных таблиц в отличие от предыдущих блоков, каждый параметр заключается в фигурные скобки. В полях относящихся к периоду название параметра ставится с &. Пример &ДатаНачала. В поле “Условие” параметры оформляются аналогично блоку “ГДЕ”.
Поведение параметров из поля “Условие” при снятии или установке галочки “Автозаполнение” также аналогично блоку «ГДЕ».
Параметры из полей периода попадают на страницу “Параметры” СКД. Если автозаполнение включено и в поле периода параметр не вписан, параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД.
Таким образом, эти параметры заполняются в конструкторе запроса. Для открытия формы “Параметры виртуальной таблицы” нужно выбрать виртуальную таблицу в списке таблиц и нажать выделенную синим кнопку. Также тут у таблиц есть булевый реквизит “Обязательная” и числовой реквизит “Номер группы”. Если признак обязательности таблицы не установлен, то она будет добавляться в результирующий запрос только в случае, когда хотя бы одно поле из нее задействовано в компоновке. Номер группы заполняется для необязательных таблиц и обозначает группу таблиц, которые будут добавлены в результирующий запрос только, когда из этой группы таблиц задействовано хотя бы одно поле.
В параметрах виртуальных таблиц возможно совместное использование “жестких” параметров запросов и “мягких” параметров компоновки данных.
В этом примере если в настройках установлено значение параметра &НачалоПериода, то будет использоваться его значение. В противном случае в качестве значения параметра виртуальной таблицы будет использоваться значение “жесткого” параметра “&Начало”.
Если автозаполнение включено и в поля периода не вписаны “мягкие” параметры компоновки данных то параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД и текст запроса:
будет соответствовать следующему:
В этом случае “мягкие” параметры также будут иметь приоритет над “жесткими”.
Обзорный вид страницы.
На эту страницу автоматически добавляются все параметры из запроса. Можно добавлять свой параметр в для использования его в вычисляемых полях например.
Строка параметра имеет следующие реквизиты:
Имя — это имя параметра, с помощью которого к его значению можно обращаться в тексте запроса, в вычисляемых полях и других местах где доступны выражения.
Заголовок — название, выводимое пользователю.
Тип — определяет тип параметра. Иногда при выборе дат периода, пользователю не нужно указывать время. Тогда нажав на “…” можно указать состав даты — Дата.
Таким же образом можно указать формат числа для численного параметра и длину строки для строкового.
А для того чтобы введенные значения интерпретировались в отчете как начало и конец дня следует в запросе использовать функции НачалоПериода() и КонецПериода() .
Доступные значения — определяет перечень доступных значений. Представляет собой список значений со стандартными полями — значение и представление, где значение типа параметра. Для ссылочного типа доступны для выбора только предопределенные данные.
Доступен список значений — определяет доступность параметру принимать значение “список значения”.
Значение — предустановленное значение параметра. Типа параметра. Для ссылочного типа доступны для выбора только предопределенные данные.
Выражение — выражение, значение которого примет параметр. Что примечательно здесь могут использоваться как функции встроенного языка запросов, так и функции встроенного языка программирования и даже функции из общих модулей. К примеру, параметру ТекДата присваивается значение функции встроенного языка программирования ТекущаяДата().
Также в примере к реквизиту “Тип” можно было в выражениях использовать функции встроенного языка запросов, особенность применения этих функций в данном месте такова, что строковые параметры функций надо брать в кавычки.
и в запросе можно было бы писать проще поскольку в параметрах уже будет содержаться начало и конец периода:
Иногда, для повышения удобства пользователю для выбора периода лучше дать не два поля с типом Дата, а одно поле с типом Стандартный Период. Тогда, к примеру, создаем три параметра: “Период” с типом СтандартныйПериод, “ПериодНачало” и “ПериодОкончание” с типом Дата. Первый параметр без ограничения доступности. Вторые с ним. В выражение “ПериодНачало” пишем “&Период.ДатаНачала”, в “ПериодОкончания” — “&Период.ДатаОкончания”.
Даты начала и конца стандартного периода также содержат и время. ДатаНачала имеет время 00:00:00, а ДатаОкончания 23:59:59. Получится что пользователь выберет стандартный период в “Период” а разработчик будет использовать корректные “ПериодНачало” и “ПериодОкончание”.
Параметр функциональной опции — используется в механизме функциональных опций.
Включать в доступные поля — включает параметр в доступные поля для выбора в настройках.
Ограничение доступности — ограничивает возможность изменения значения параметра пользователем.
Запрещать незаполненные значения — если установлено и значение параметра не заполнено — отчет не сформируется и выдаст ошибку.
Использование — устанавливает использование параметра. Если установлено Авто и параметр используется в запросе или выражениях, а пользователь перед формированием не установит галочку около параметра — отчет при формировании выдаст ошибку. Пользователь может установить эту галочку непосредственно, или она установится автоматически при изменении значения параметра. Если установлено Всегда, то этой проверки на то, что пользователь заполнил этот параметр — не будет.
Параметры редактирования — содержит настройки редактирования как у поля формы.
В настройках варианта мы можем установить галочку “Отображать недоступные параметры”, это можно использовать если для разных вариантов мы хотим использовать разный набор параметров.
У параметров в табличной части мы можем установить значение по умолчанию для варианта, включить использование по умолчанию установив галочку слева. Нажав на кнопку, расположенную справа внизу, мы открываем окно пользовательских настроек параметра.
В пользовательских настройках мы можем включить параметр в пользовательские настройки. Установим режим редактирования обычный. Тогда он будет доступен в форме, вызываемой кнопкой “Настройки…”.
Если Режим редактирования установить Быстрый доступ, то параметр появится на форме.
Если у параметра “Период” представление заполнить строкой “ПеРиОд”, то вместо название будет показано содержания поля представление.
Если у отчета СКД нет формы, то платформа создаст автоматическую, на которой будут табличный документ результата, кнопки управления и быстрые пользовательские настройки.
Можно создать свою форму для отчета и вывести на нее табличное поле со всеми пользовательскими настройками. Вот так:
Для этого в созданной форме в конфигураторе вытаскиваем на форму Пользовательские настройки из Компоновщика отчета.
В некоторых случаях параметр не прост, и для его расчета нужен некий алгоритм с циклом или ветвлениями. К примеру если отчет формируем в понедельник то в отчете сравниваются продажи по дням позапрошлой и прошлой недели, а в остальные дни недели сравниваются продажи по дням прошлой и текущей недели. Получается у нас от значения дня недели текущего дня зависит сразу четыре параметра: &НачалоПрошлойНедели, &КонецПрошлойНедели, &НачалоТекущейНедели и &КонецТекущейНедели. А еще нам надо дать возможность пользователю формировать отчет как будто он сформирован вчера или неделю назад. В таком случае мы создаем реквизит формы ТекДата типа Дата. Выводим его на форму. В событии ПриИзменении() пишем.
Таким образом можно программно менять параметры из формы.
Параметры это ключевой инструмент для управления отчетом. Использование параметров дает возможность решить множество прикладных задач, таких как калькуляция на основе информации в базе и значений введенных интерактивно для конкретной калькуляции и многих других. В данной статье рассмотрены практически все относящиеся к параметрам механизмы и особенности. Рамках статьи не рассмотрен блок “Характеристики” Расширения языка запросов для СКД поскольку он не касается параметров. Не рассмотрена настройка параметра “Параметр функциональной опции” поскольку ее описание лучше включить в статью по функциональным опциям.
also Что-то вроде FAQ Отзывов (11) В закладки
О рубрике
Данный цикл статей, по сути, будет обычным FAQ по вопросам СКД. Здесь вы найдете ответы на самые часто задаваемые вопросы по компоновке. Думаю, данный раздел будет очень полезным.
Естественно, первым вопросом, на который мы дадим ответ, будет тот, что указан в заголовке. Этот вопрос задавался на 1с-ных форумах миллионы раз, но новички упорно спрашивают вновь и вновь. Так зафиксируем же ответ, и будем кидаться в новичков этой ссылкой.
Как же установить параметр в СКД программно
Устанавливать параметр будем в ПриОткрытии:
Нет похожих статей
Не помешали бы пояснения типа что это за объект “КомпоновщикНастроек”, а что это за свойство у него такое “Настройки” и т.д.
А про синтакс-помощник слышали?? Выделите “КомпоновщикНастроек” в коде программы и нажмите . И будет описание объекта, его методов и свойств.. Читайте …
1. “Устанавливать параметр будем в ПриОткрытии:” при открытии чего? если формы то это событие не срабатывает, срабатывает ПередОткрытием()
2. И даже если этот програмный код вставить при обработке события ПередОткрытием() выкинет с ошибкой “на 2ю строку.
*8.1
Значение не является значение объектного типа (Использование)
Спасибо! Чудесно отработало на 8.2, немного видоизменил (модуль объекта):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(“Город”);
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(“Город”);
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(“Ответственный”);
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = ПараметрыСеанса.ТекущийПользователь;
Вот так работает. Фиксированные настройки видит, Настройки – нет. Вероятно, надо почитать мануал, но решительно нет времени. КомпоновщикНастроек Отчету присваивать нет нужды.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(“Город”);
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(“Город”);
ПараметрСКДФикс = КомпоновщикНастроек.ФиксированныеНастройки.ПараметрыДанных.Элементы.Найти(“Город”);
ПараметрСКДФикс.Использование = Истина;
ПараметрСКДФикс.Значение = ПараметрСКД.Значение;
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(“Ответственный”);
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = ПараметрыСеанса.ТекущийПользователь;
ПараметрСКДФикс = КомпоновщикНастроек.ФиксированныеНастройки.ПараметрыДанных.Элементы.Найти(“Ответственный”);
ПараметрСКДФикс.Использование = Истина;
ПараметрСКДФикс.Значение = ПараметрСКД.Значение;
При изменении настроек, после формирования отчета и попытке закрыть форму спрашивает, сохранитиь ли измененный вариант. Кто подскажет, как избаиться от этого?
also Полезные примеры Ваш отзыв В закладки
Когда СКД только появилась, я задавал себе вопрос: “СКД для отчетов – замечательная вещь! Может быть, как-то можно ее использовать в работе и в других областях? Вместо запросов”. С одной стороны, СКД – очень мощный инструмент, с другой стороны – как-то не совсем удобно или понятно его использовать (там же надо что-то куда-то вставлять, чтобы получить данные), а запрос написал и выгрузил в таблицу или дерево. Все разрешилось само собой (методом проб и ошибок, конечно), когда я стал решать реальные задачи. Сейчас я даже простые данные получаю с помощю СКД… спросите, почему? Есть одна, но очень серьезная причина:
Легкость написания, а главное, отладки запроса (в любой консоли). Те, кто сталкивался с запросами, знают, что некоторые запросы очень сложно отлаживать. Приходится использовать дополнительные обработки, чтобы “на лету” изменить параметры и посмотреть, что получится. К тому же в тех обработках, что я знаю, данные представляются как таблица значений, и понять, какое дерево значений получится в итоге, довольно сложно. Используя же СКД, мы получаем полное визуальное представление о получаемых данных (за исключением иерархических данных, СКД при выгрузке, например, в дерево их просто выгрузит в развернутом виде, по каждому полю, но и это решаемо.), а потом просто копируем настройки СКД в свою обработку.
Все же остается вопрос: как проще, быстрее и удобнее использовать СКД? Ведь тут, казалось бы, написание простых запросов имеет преимущество (хотя бы по времени написания). Лично для меня многие вопросы закрылись после написания шаблонов. Надеюсь, что и для Вас они будут полезны.
Вставляем данный код в модуль своей обработки, отчета или даже конфигурации и используем, где потребуется.
Например, получение данных сводится к трем простым действиям:
1. Написать запрос и настроить СКД в любой консоли, позволяющей это сделать.
2. Выгрузить настройки из консоли и загрузить в макет
3. Написать в необходимом месте код типа:
Читайте также: