1с скопировать отбор скд
Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Если нужен не «вариант по умолчанию»
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
- СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
- Отбор — Устанавливает отбор на результат СКД.
- КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
После того, как присвоено значение переменной СхемаКомпоновкиДанных — через нее мы можем получить доступ к формирующим запросам схемы через свойство коллекцию НаборыДанных . Элемент набора данных имеет интересующее нас свойство Запрос . Это текстовый параметр, содержащий в себе запрос. С помощью функций редактирования текста, его можно изменить, например, добавить отбор по недоступному через КомпоновщикНастроек полю.
Или если с добавлением нового параметра
Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Этот код установит значение для отбора, а если такого отбора нет в настройках, то добавит. В случае если точно известно, есть или нет такой отбор — то код можно упростить.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
П.С. Если СКД позволяет делать пользовательские настройки, то их и отрабатывает.
(2) AnryMc,
В процедуре ПриКомпоновкеРезультатат когда выполняю код, не видит пользовательские настройки, если я явно не указываю (КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0].Значение = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение), А чего мне делать не очень хочется, есть же стандартные средства, только какие я не знаю). А что если пользователь установил отборы, как скопировать все отборы стандартным способом из пользовательских настроек, вот это я имею ввиду
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
Пока истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
Для а = 1 по ДокументРезультат.ВысотаТаблицы Цикл
Ячейка = ДокументРезультат.Область(а,1,а,1);
Если Ячейка.Текст = "Итого" тогда
ОбластьСтрока = ДокументРезультат.Область(а,1,а,5);
ОбластьСтрока.Шрифт = Новый Шрифт(ОбластьСтрока.Шрифт, "Myriad Pro", 8, Истина);
КонецЕсли;
КонецЦикла;
Пользовательские настройки - что это? Откуда они появляются? Это элементы управления которые вы самостоятельно добавили на форму? Это форма "основного" отчета или "специальная" форма настроек? Ответ зависит от множества факторов - поэтому желательно подробнее описать ситуацию.
П.С. И часто правильно поставив вопрос вы найдете на него ответ.
П.П.С. Т.к. я не доконца понял вопрос, то "наобум" подскажу, может єто то.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Параметр = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если Параметр <> Неопределено Тогда
Параметр.Значение.ДатаНачала = ТекущаяДата();
Параметр.Значение.ДатаОкончания = ТекущаяДата();
Параметр.Использование = Истина;
ПользовательскийПараметр = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Параметр.ИдентификаторПользовательскойНастройки);
Если ПользовательскийПараметр <> Неопределено Тогда
ПользовательскийПараметр.Значение = Параметр.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ЭтаФорма .Отчет.КомпоновщикНастроек. ПользовательскиеНастройки .Элементы.Найти
(4) AnryMc, КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0].Значение = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Значение
Вот пример копирования пользовательских настроек. Пользовательские это те настройки что задаются пользователем. Других не бывает)) Пользовательские настройки это стандартная коллекция СКД
Это я знаю, но "делать" их можно по разному. Например поместить на форму отчета свой реквизит и потом передавать его в СКД или вызвав стандартную настройку СКД и тогда она "подхватит" настройки сама.
я не понимаю вопрос:
Наверное поздно уже, но вот так я отбор перенес.
У меня выполняется схема и результат выгружается в ТЗ.
На форме помимо таблицы с результатами лежит таблица пользовательских настроек.
Приведенная ниже функция позволяет скопировать любой элемент коллекции СКД со всеми вложенными в него элементами. Умеет копировать все элементы, перечисленные в таблицах в другой моей публикации.
- Вариант 1. На форме есть динамический список с отбором. Необходимо при открытии этой формы восстанавливать отборы, настроенные пользователем ранее.
- Вариант 2. Необходимо полностью или частично перенести настройки между схемами компоновки, компоновщиками настроек, динамическими списками.
Пример сохранения отборов для динамического списка.
- Создадим на форме динамический список СписокКонтрагенты.
- Выведем отбор списка в виде поля
- Создадим реквизит формы СписокКонтрагентыОтборСохранение с типом Произвольный
- При изменении отбора будем записывать новый отбор в реквизит СписокКонтрагентыОтборСохранение
- При восстановлении настроек будем заполнять отбор из сохраненного реквизита
Это демонстрация использования функции копирования на примере отборов динамических списков. Но она универсальна и применялась мною для программной работы с настройками СКД.
2. Предопределенные отборы динамических списков
Пусть на форме есть два динамических списка Контрагенты и Договоры.
Необходимо при двойном щелчке по первому списку, устанавливать отбор во втором списке.
При этом пользователь имеет возможность установить дополнительные условия в отборе второго списка и они должны сохраняться.
Например, пользователь может установить условие, чтобы отображались только договоры с покупателем. А при щелчке по контрагенту, необходимо, чтобы в отборе изменился контрагент, но не удалился отбор по типу договора.
В нашем упрощенном примере предопределенное условие только одно. Но предопределенных условий может быть и несколько, например, еще по периоду, если это выборка по документам контрагента.
Пример решения.
- Все предопределенные условия помещаем в группу "И".
- У этой группы задаем некое предопределенное представление
- Перед установкой отбора ищем предопределенную группу и удаляем ее
- Затем создааем ее снова и помещаем в нее все необходимые условия
Применение метода рассматривается на примере отборов динамических списков, но этот же принцип можно использовать для работы с настройками СКД.
Заключение
Тестировалось на платформе 8.3.8+, режим совместимости 8.2.13+. Но описанные приемы должны работать и на более ранних версиях 1С 8.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
суббота, 21 декабря 2013 г.
Сохранение/восстановление отборов СКД в регистр "Сохраненные настройки"
В продолжение статьи Выгрузка результата СКД в таблицу значений рассмотрим, как установить отбор для созданной нами СКД, а также сохранять и восстанавливать настройки отбора и периода.
Для сохранения будут использоваться стандартные процедуры, которые применяются в отчетах в толстом клиенте (регистр сведений "Сохраненные настройки").
1) Для начала добавим в обработку реквизит "НастройкаОтбора" - тип "Строка", неограниченной длины. В этом реквизите и будет храниться наш отбор. Сохранять отбор будем с помощью функции сохранения значений ЗначениеВСтрокуВнутр(), а восстанавливать - ЗначениеИзСтрокиВнутр().
3) Откроем форму выберем пункт меню "Форма" - "Вставить элемент управления. " и добавим табличную часть "НастройкаОтбора" вместе с командной панелью.
4) Откроем свойства табличной части и в поле "Данные" выберем тип "КомпоновщикНастроек.Настройки.Отбор". Табличная часть примет вид как на рисунке ниже.
На панели формы создадим две кнопки "Сохранить" и "Восстановить настройки", а в модуле формы определим такой код:
Перем СКД ;
Перем мТекущаяНастройка ;
Процедура КнопкаВыполнитьНажатие ( Кнопка )
Продажи . Загрузить ( РезультатКомпоновкиВТЗ ( СКД , КомпоновщикНастроек ));
Процедура ПередОткрытием ( Отказ , СтандартнаяОбработка )
СохраненнаяНастройка = ?( ЗначениеЗаполнено ( НастройкаОтбора ), ЗначениеИзСтрокиВнутр ( НастройкаОтбора ),Неопределено);
КомпоновщикНастроек . Инициализировать (Новый ИсточникДоступныхНастроекКомпоновкиДанных ( СКД ));
Настройки = ?(НЕ СохраненнаяНастройка = Неопределено, СохраненнаяНастройка , СКД . НастройкиПоУмолчанию );
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройки );
// Процедура восстановления сохраненных настроек
//
Процедура ВосстановитьНастройки () Экспорт
СтруктураНастройки = Новый Структура ;
СтруктураНастройки . Вставить ( "Пользователь" , глЗначениеПеременной ( "глТекущийПользователь" ));
СтруктураНастройки . Вставить ( "ИмяОбъекта" , Строка ( ЭтотОбъект ));
СтруктураНастройки . Вставить ( "НаименованиеНастройки" , ?( мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка . НаименованиеНастройки ));
Результат = УниверсальныеМеханизмы . ВосстановлениеНастроек ( СтруктураНастройки );
Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат ;
ВосстановитьНастройкиИзСтруктуры ( Результат . СохраненнаяНастройка );
// Процедура сохранения настроек
//
Процедура СохранитьНастройки () Экспорт
СтруктураНастройки = Новый Структура ;
СтруктураНастройки . Вставить ( "Пользователь" , глЗначениеПеременной ( "глТекущийПользователь" ));
СтруктураНастройки . Вставить ( "ИмяОбъекта" , Строка ( ЭтотОбъект ));
СтруктураНастройки . Вставить ( "НаименованиеНастройки" , ?( мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка . НаименованиеНастройки ));
СтруктураНастройки . Вставить ( "СохраненнаяНастройка" , СохраненнаяНастройка );
СтруктураНастройки . Вставить ( "ИспользоватьПриОткрытии" , Ложь);
СтруктураНастройки . Вставить ( "СохранятьАвтоматически" , Ложь);
Результат = УниверсальныеМеханизмы . СохранениеНастроек ( СтруктураНастройки );
Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат ;
Иначе
мТекущаяНастройка = СтруктураНастройки ;
КонецЕсли;
// Процедура восстановления значений реквизитов
//
Процедура ВосстановитьНастройкиИзСтруктуры ( СтруктураСНастройками ) Экспорт
Если ТипЗнч ( СтруктураСНастройками ) <> Тип ( "Структура" ) Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств ( ЭтотОбъект , СтруктураСНастройками );
ЗагрузитьНастройкуОтбора ();
// Процедура сохранения значений реквизитов
//
Процедура СформироватьСтруктуруДляСохраненияНастроек ( СтруктураСНастройками ) Экспорт
Если ТипЗнч ( СтруктураСНастройками ) <> Тип ( "Структура" ) Тогда
СтруктураСНастройками = Новый Структура ;
КонецЕсли;
СтруктураСНастройками . Вставить ( "НастройкаОтбора" , ЗначениеВСтрокуВнутр ( КомпоновщикНастроек . Настройки ));
СтруктураСНастройками . Вставить ( "НачалоПериода" , НачалоПериода );
СтруктураСНастройками . Вставить ( "КонецПериода" , КонецПериода );
Процедура ДействияФормыСохранитьНастройки ( Кнопка )
Процедура ДействияФормыВосстановитьНастройки ( Кнопка )
СКД = ПолучитьМакет ( "ПродажиЗаПериод" );
Функция РезультатКомпоновкиВТЗ ( СКД , КомпоновщикНастроек ) Экспорт
НастройкиКомпоновщика = КомпоновщикНастроек . Настройки ;
ПараметрыНастройки = НастройкиКомпоновщика . ПараметрыДанных ;
// устанавливаем параметры отчета
ЗначениеПараметра = ПараметрыНастройки . НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных ( "НачалоПериода" ));
ЗначениеПараметра . Значение = НачалоПериода ;
ЗначениеПараметра = ПараметрыНастройки . НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных ( "КонецПериода" ));
ЗначениеПараметра . Значение = КонецДня ( КонецПериода );
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновкиДанных = КомпоновщикМакета . Выполнить ( СКД , НастройкиКомпоновщика . Тип ( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновкиДанных . Инициализировать ( МакетКомпоновкиДанных );
ТаблицаРезультат = Новый ТаблицаЗначений ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
ПроцессорВывода . УстановитьОбъект ( ТаблицаРезультат );
ПроцессорВывода . Вывести ( ПроцессорКомпоновкиДанных );
6) После запуска обработки можно установить параметры: начало и конец периода, а также определить отбор. Потом сохранить настройку. При последующей работе можно вернуться к этой настройке нажав кнопку восстановления настроек. Как это сделать показано на скриншоте.
Пример обработки можно скачать ЗДЕСЬ.
Редко какой отчет в 1С не использует отборы, разве что печатные формы и какие-то специальные отчеты. В большинстве отчетов в 1С требуется возможность выборочного анализа. Поэтому в этой статье мы поговорим про настройку отборов в отчетах, построенных с помощью 1С СКД.
После того как вы добавили наборы, определили ресурсы, задали структуру отчета с помощью группировок , можно приступать к настройке фильтров. В СКД это делается на закладке «Отбор», которая доступна или для всего отчета или для определенной группировки.
Новый элемент в список отбора можно добавить несколькими способами – двойной клик по доступному полю, перетаскивание, клавиша в меню:
При этом только через клавишу в меню можно добавить группу в отбор, которая объединяет элементы внутри этой группы по заданному условию (И, ИЛИ).
По умолчанию если элементы отбора не включены ни в какую группу и объединяются с помощью оператора «И».
Вид сравнения в элементе отбора зависит от типа поля (левого значения):
Операции доступные для числа:
Операции доступные для строки:
Для строки добавлены операции – «содержит», «начинается с», «соответствует шаблону» и те же операции с оператором «Не» (Не содержит и т.д.).
Операции доступные для ссылки:
Далее разберем типовые ситуации при использовании отбора
Самый простой вариант использование отбора – добавить фиксированный отбор, который будет действовать всегда (если конечно пользователь не изменит его в варианте отчета):
Обычно такие отборы имеет смысл переносить в текст запроса. Особенно в том случае, если пользователь не должен его менять вообще ни при каком условии.
Иногда в отчете на 1С СКД возникает необходимость исключить в отчете значения некоторых группировок (колонок или строк). Причем сделать это в запросе не представляется возможным, потому что исключать такие строки возможно только после компоновки.
В этом случае используется возможность СКД накладывать отборы на заданную группировку. Рассмотрим, например, такой отчет:
Допустим нам нужно исключить из отчета все строки, в которых итоговое количество по номенклатуре меньше 15. В запросе мы такое условие применить не можем. Установим для этого отбора для группировки «Номенклатура»:
Получим такой отчет:
Отборы на группировках часто используются в отчетах вида «Ведомость по остаткам»:
При использовании группировки по периоду (регистратору) в таких отчетах появляются строки, отвечающие за начальный остаток при использовании даты начала периода отличной от самой ранней. Чтобы убрать такие строки, можно использовать отбор на группировке по регистратору:
Чтобы убрать отбор, выделенный на рисунке на закладке «Другие настройки» для этой же группировки отключим вывод отбора:
Обычно мы редко используем фиксированные отборы. Чаще нам нужны отборы, которые может изменять пользователь. Можно, чтобы пользователь изменял отборы через функционал 1С СКД «Изменить вариант», но это не совсем верный путь – вариант отчета это скорее постоянный «скелет», который настраивается один раз и потом используется многократно. Отборы же это что-то часто изменяемое, поэтому правильнее редактировать их через механизм пользовательских настроек.
Итак, вернемся к нашему отчету. Допустим нам необходимо добавить в отчет отбор по группе номенклатуры (или по элементу) и чтобы этот отбор был доступен для изменения пользователем.
Добавим для этого отбор на уровне отчета. Вид сравнения по умолчанию сделаем «В группе», отключим по умолчанию использование отбора и в диалоге редактирования пользовательских настроек включим наш отбор в пользовательские настройки.
Перейдем теперь в режим предприятия.
Наш отбор доступен для редактирования на форме. За доступность прямо в форме отчета отвечает «Режим редактирования». Значение «Быстрый доступ» означает, что отбор доступен прямо на форме отчета. Если значение равно «Обычный», отбор доступен через кнопку «Настройки». Как видно на рисунке пользователь может выбирать вариант сравнения, управлять действием (включен / отключен) отбора.
Если вам необходимо установить фиксированный отбор (вид сравнения и правое значение константы), но пользователь должен управлять включением / отключением отбора, тогда вам необходимо заполнить представление отбора в пользовательской настройке:
В этом случае в настройки добавляется только флаг использования отбора, которым может управлять пользователь:
Если вам в отборе нужно изменить представления поля, по которому делается отбор, то для этого есть еще одно представление:
Получается вот так:
Мы можем вывести все отборы для редактирования пользователем. Для этого на уровне отчета вызовем диалог редактирования пользовательских настроек:
То же самое можно сделать на уровне любой группировки, если нужно, чтобы была возможность редактирования отборов для заданной группировки. В режиме предприятия это выглядит следующим образом:
Как известно, в 1С СКД используется не только в отчетах, но и в формах, содержащих динамические списки. У динамического списка есть несколько свойств, которые относятся к СКД. Среди этих свойств имеется свойство «Отбор» с типом «ОтборКомпоновкиДанных». Чтобы установить отбор в динамическом списке есть два способа. Первый способ – передать отборы через параметр формы с одноименным названием – «Отбор». Этот параметр является структурой, в которой ключ ссылается на поле, для которого устанавливается отбор. Значение же содержит данные, с которыми производится сравнение. Можно также передать в качестве правого значения – массив, фиксированный массив, список значений. В этом случае вид сравнения равняется «ВСписке», для одиночного элемента вид сравнения устанавливается как «Равно». Этот способ ограничен в возможностях – с его помощью нельзя накладывать сложные условия с операторами «И» и «ИЛИ», нельзя использовать виды сравнения кроме двух указанных.
Отбор, установленный таким образом, передается в фиксированные настройки компоновщика настроек, связанного с динамическим списком. Он не виден пользователю и недоступен для изменения.
Второй способ – непосредственное редактирование отбора в динамическом списке или в компоновщике. Обычно в типовых конфигурация для этого есть ряд методов и функций для установки таких отборов.
Например, вызов основного метода для установки отбора выглядит так:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, «Ссылка», Параметры.ДобавитьДля, ВидСравненияКомпоновкиДанных.НеРавно);
Данная функция производит поиск существующего элемента отбора, изменяет его если нашла, а если не нашла, то добавляет с помощью такой процедуры:
В форме содержащей динамический список также как в отчете на СКД, возможно настроить пользовательский отбор. Как это можно сделать показано на рисунке:
Также у элемента формы, с которым связан список нужно установить группу пользовательских настроек, в которой будут отображаться настройки для пользователя:
Читайте также: