При компоновке результата скд 1с отбор
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: делаем отбор и сортировку на уровне СКД
Автор уроков и преподаватель школы: Владимир Милькин
Ставим цель
- Создать новый отчёт «Урок5.erf».
- Вывести в этом отчёте города (включая название города, мэра и численность).
- Упорядочить города в списке по численности (по возрастанию)
- Прямо на форме отчёта дать пользователю возможность делать отбор городов по минимальной численности.
Создаём новый отчёт в конфигураторе
Открываем базу «Гастроном» в конфигураторе.
Из главного меню конфигуратора выбираем пункт «Файл»->»Новый. «:
Вид документа: «Внешний отчет»:
В качестве имени пишем «Урок5» и нажимаем кнопку «Открыть схему компоновки данных»:
Соглашаемся с именем схемы компоновки данных по умолчанию:
В открывшейся схеме компоновки данных добавляем набор данных — запрос:
Составляем запрос
Запускаем конструктор запроса:
Из таблицы справочника «Города» выбираем поля: «Наименование», «Мэр» и «Численность»:
Получился такой запрос:
Выводим отчёт в виде списка
Переходим на закладку «Настройки» и нажимаем волшебную палочку, чтобы вызывать конструктор настроек:
Тип отчёта выбираем «Список»:
В отчёте будут отображаться следующие поля:
Сохраняем отчет и тут же проверяем в режиме пользователя:
Сортируем города по численности
Теперь давайте упорядочим записи отчёта по возрастанию численности.
Для этого переходим на вкладку «Настройки», выбираем пункт «Отчет», ниже выбираем вкладку «Сортировка» и перетаскиваем поле численность из первой колонки во вторую.
Направление сортировки указываем «По возрастанию»:
Сохраняем отчёт и проверяем в режиме пользователя:
Делаем отбор городов по численности
Теперь давайте сделаем так, чтобы в отчёте выводились только города с численностью от 1 миллиона человек (включительно). Такая возможность называется отбор.
Переходим на вкладку «Настройки», выбираем пункт «Отчет», далее переходим на вкладку «Отбор» и перетаскиваем поле «Численность» из левой колонки в правую.
В качестве вида сравнения указываем «Больше или равно», а в качестве правого значения — 1000000:
Сохраняем отчет и проверяем в режиме пользователя:
Видим, что остались города с численностью больше миллиона и этот факт (отбора) явно отражён в заголовке отчета.
Выносим параметр отбора на форму отчета
Осталось сделать так, чтобы пользователь мог сам настраивать пороговое значение отбора. Другими словами, чтобы вместо миллиона он мог поставить свою цифру.
Заходим на вкладку «Настройки», выделяем пункт «Отчет», внизу выбираем вкладку «Отбор», выделяем элемент отбора «Численность» и нажимаем справа внизу на зелёный плюсик:
В открывшемся окне ставим галку «Включать в пользовательские настройки»:
Вновь сохраняем отчет и запускаем в режиме пользователя.
Видим, что появилось поле «Численность» меняя условие и значение которого мы управляем отбором городов в отчёте:
Войдите на сайт как ученик
Авторизуйтесь, чтобы получить доступ ко всем материалам школы
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Источник
СКД При компоновке результата
Добрый день всем! Кто знает почему так происходит. Сам не смог разобраться. Создаю отчет с помощью СКД и в событии отчета указанном в теме программно компоную результат, но при выполнении компоновки макета параметры содержат значения по умолчанию ("дата" — пустая , "вид цен" — пустая ссылка), хотя в форме отчета эти параметры заполнены другими значениями. Если выполнять стандартную обработку то параметры заполнены верно. Код ниже. Всем заранее спасибо!
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВидЦен = КомпНастр.ПараметрыДанных.Элементы.Найти("ВидыЦен");
ВидЦен.Значение = Справочники.ВидыЦен.НайтиПоНаименованию("Дилерская");
ДокументРезультат.Очистить();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпНастр, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПолеПоКоторомуНеобходимоПолучитьЗначение = "Номенклатура";
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
ЗначениеВыводимыхДанных = Неопределено;
Для каждого ЗначениеПараметра из ЭлементРезультата.ЗначенияПараметров Цикл
Если ТипЗнч(ЗначениеПараметра.Значение) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
ПоляРасшифровки = ДанныеРасшифровки.Элементы[ЗначениеПараметра.Значение].ПолучитьПоля();
Для Каждого ПолеРасшифровки из ПоляРасшифровки Цикл
Если ПолеРасшифровки.Поле = ПолеПоКоторомуНеобходимоПолучитьЗначение Тогда
ЗначениеВыводимыхДанных = ПолеРасшифровки.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ЗначениеВыводимыхДанных) Тогда
//ВысотаТабДок = ДокументРезультат.ВысотаТаблицы;
//_________ФОТО___НОМЕНКЛАТУРЫ__________________
ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%Картинка%");
Если ОбластьДляКартинки <> Неопределено Тогда
ФотоНоменклатурыВыборка = РегистрыСведений.ПрисоединенныеФайлы.Выбрать(Новый Структура("ПрисоединенныйФайл", ЗначениеВыводимыхДанных.ФайлКартинки));
Если ФотоНоменклатурыВыборка.Следующий() Тогда
ФотоНоменклатуры = Новый Картинка(ФотоНоменклатурыВыборка.ХранимыйФайл.Получить());
Иначе
ФотоНоменклатуры = Неопределено;
КонецЕсли;
Если Не ФотоНоменклатуры = Неопределено Тогда
Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Индекс = ДокументРезультат.Рисунки.Индекс(Рис);
ДокументРезультат.Рисунки[Индекс].Картинка = ФотоНоменклатуры;
ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.АвтоРазмер;
ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);
ОбластьДляКартинки.Текст = "%КартинкаДобавлена%"
Иначе
//ДокументРезультат.Рисунки[Индекс].Картинка = БиблиотекаКартинок.Справка;
//ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.РеальныйРазмер;
//ДокументРезультат.Рисунки.Удалить(ДокументРезультат.Рисунки[Индекс]);
ОбластьДляКартинки.Текст = "";
КонецЕсли;
КонецЕсли;
//_________ФОТО___УПАКОВКИ__________________
ОбластьДляКартинки = ДокументРезультат.НайтиТекст("%КартинкаУпаковки%");
Если ОбластьДляКартинки <> Неопределено Тогда
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
| ПрисоединенныеФайлы.ХранимыйФайл
|ИЗ
| РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
|ГДЕ
| ВЫРАЗИТЬ(ПрисоединенныеФайлы.ПрисоединенныйФайл КАК Справочник.НоменклатураПрисоединенныеФайлы).ВладелецФайла = &Номенклатура
| И ВЫРАЗИТЬ(ПрисоединенныеФайлы.ПрисоединенныйФайл КАК Справочник.НоменклатураПрисоединенныеФайлы).Наименование ПОДОБНО ""Короб%""");
Запрос.УстановитьПараметр("Номенклатура", ЗначениеВыводимыхДанных);
ФотоУпаковкаВыборка = Запрос.Выполнить().Выбрать();
Если ФотоУпаковкаВыборка.Следующий() Тогда
ФотоУпаковки = Новый Картинка(ФотоУпаковкаВыборка.ХранимыйФайл.Получить());
Иначе
ФотоУпаковки = Неопределено;
КонецЕсли;
Если Не ФотоУпаковки = Неопределено Тогда
Рис = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Индекс = ДокументРезультат.Рисунки.Индекс(Рис);
ДокументРезультат.Рисунки[Индекс].Картинка = ФотоУпаковки;
ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.АвтоРазмер;
ДокументРезультат.Рисунки[Индекс].Расположить(ОбластьДляКартинки);
ОбластьДляКартинки.Текст = "%КартинкаДобавлена%"
Иначе
//ДокументРезультат.Рисунки[Индекс].Картинка = БиблиотекаКартинок.Справка;
//ДокументРезультат.Рисунки[Индекс].РазмерКартинки = РазмерКартинки.РеальныйРазмер;
//ДокументРезультат.Рисунки.Удалить(ДокументРезультат.Рисунки[Индекс]);
ОбластьДляКартинки.Текст = "";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
Источник
Программная установка параметров и отборов СКД
Иногда возникает необходимость устанавливать отборы и параметры СКД программно. При открытии формы, например, или при формировании отчета на сервере для дальнейшей его отправки на почту.
И если с параметрами все предельно просто — информации в сети полно, то вот отборы у меня отняли много времени. В этой статье я приведу код, с помощью которого можно устанавливать отборы и параметры СКД программно.
Как я уже говорил — с параметрами все просто. У этих элементов есть метод «Найти» и поэтому функция выглядит так:
Вызов процедуры при открытии формы принимает следующий вид:
С отборами сложнее по 2 причинам:
- У отборов нет метода «Найти» и приходится делать перебором
- Отборы не являются предустановленными настройками компоновщика и поэтому их нужно будет добавлять, в случае отсутствия
Но код не намного сложнее, когда уже знаешь что писать:
Ну и вызов этой процедуры:
По большей части статью писал для себя, потому что возникла необходимость программной установки отбора в отчете СКД и я уверен, что я уже делал это несколько раз. Но информацию в интернете найти не смог. Возможно плохо искал. Теперь же мне не придется искать долго.
В любом случае — буду рад, если это еще кому-то пригодится.
4 комментария
КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
Добрый день, прошу помощи. При выводе результатов отчета в СКД, после создания макета заголовка, в печатной форме заголовок выводится после результатов отбора и введенных параметров. А нужно чтобы выводилось над ними. Подскажите где в скд находятся настройки вывода последовательности указанных данных?
Спасибо! Очень полезно, кусочек кода по установке отборов и мне пригодился.
Добрый день!
Пытаюсь открыть форму отчёта, сделанного на СКД, из формы другого документа. Не удаётся добиться формирования отчёта с передаваемыми параметрами. В форме документа:
ПараметрыДляОтчета = Новый Структура;
ПараметрыДляОтчета.Вставить(«ДатаДокумента», Объект.Дата);
ОткрытьФорму(«Отчет.ОтчетПоРегиструОстатковТоваров.Форма»,ПараметрыДляОтчета);
В форму отчёта эти параметры передаются.
СКД устанавливает свой параметр Период. Устанавливаю его, а также параметр ДатаДокумента,
который подразумевается использовать в запросе отчёта в процедуре ПриСозданииНаСервере():
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
ПараметрДанныхПериод = Настройки.ПараметрыДанных.Элементы[0];
ПараметрДанныхПериод.Значение = Параметры.ДатаДокумента;
ПараметрДанныхПериод.Использование = Истина;
ПараметрДанныхДатаДокумента = Настройки.ПараметрыДанных.Элементы[1];
ПараметрДанныхДатаДокумента.Значение = Параметры.ДатаДокумента;
ПараметрДанныхДатаДокумента.Использование = Истина;
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Проверяю в процедуре ПередЗагрузкойВариантаНаСервере():
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(«ДатаДокумента»);
Параметр с нужным значением в настройках имеется. Аналогично для параметра Период.
В процедуре ПриОбновленииСоставаПользовательскихНастроекНаСервере()
значения параметров уже другие. И результат отчёта, соответственно, другой.
С чего бы и как бороться с таким явлением?
В какой момент компоновщик выполняет отчёт при открытии формы?
Источник
Предисловие
Редко какой отчет в 1С не использует отборы, разве что печатные формы и какие-то специальные отчеты. В большинстве отчетов в 1С требуется возможность выборочного анализа. Поэтому в этой статье мы поговорим про настройку отборов в отчетах, построенных с помощью 1С СКД.
После того как вы добавили наборы, определили ресурсы, задали структуру отчета с помощью группировок , можно приступать к настройке фильтров. В СКД это делается на закладке «Отбор», которая доступна или для всего отчета или для определенной группировки.
Новый элемент в список отбора можно добавить несколькими способами – двойной клик по доступному полю, перетаскивание, клавиша в меню:
При этом только через клавишу в меню можно добавить группу в отбор, которая объединяет элементы внутри этой группы по заданному условию (И, ИЛИ).
По умолчанию если элементы отбора не включены ни в какую группу и объединяются с помощью оператора «И».
Вид сравнения в элементе отбора зависит от типа поля (левого значения):
Операции доступные для числа:
Операции доступные для строки:
Для строки добавлены операции – «содержит», «начинается с», «соответствует шаблону» и те же операции с оператором «Не» (Не содержит и т.д.).
Операции доступные для ссылки:
Далее разберем типовые ситуации при использовании отбора
Фиксированный отбор
Самый простой вариант использование отбора – добавить фиксированный отбор, который будет действовать всегда (если конечно пользователь не изменит его в варианте отчета):
Обычно такие отборы имеет смысл переносить в текст запроса. Особенно в том случае, если пользователь не должен его менять вообще ни при каком условии.
Исключение определенных группировок из отчета
Иногда в отчете на 1С СКД возникает необходимость исключить в отчете значения некоторых группировок (колонок или строк). Причем сделать это в запросе не представляется возможным, потому что исключать такие строки возможно только после компоновки.
В этом случае используется возможность СКД накладывать отборы на заданную группировку. Рассмотрим, например, такой отчет:
Допустим нам нужно исключить из отчета все строки, в которых итоговое количество по номенклатуре меньше 15. В запросе мы такое условие применить не можем. Установим для этого отбора для группировки «Номенклатура»:
Получим такой отчет:
Отборы на группировках часто используются в отчетах вида «Ведомость по остаткам»:
При использовании группировки по периоду (регистратору) в таких отчетах появляются строки, отвечающие за начальный остаток при использовании даты начала периода отличной от самой ранней. Чтобы убрать такие строки, можно использовать отбор на группировке по регистратору:
Чтобы убрать отбор, выделенный на рисунке на закладке «Другие настройки» для этой же группировки отключим вывод отбора:
Добавить отбор для пользователя
Обычно мы редко используем фиксированные отборы. Чаще нам нужны отборы, которые может изменять пользователь. Можно, чтобы пользователь изменял отборы через функционал 1С СКД «Изменить вариант», но это не совсем верный путь – вариант отчета это скорее постоянный «скелет», который настраивается один раз и потом используется многократно. Отборы же это что-то часто изменяемое, поэтому правильнее редактировать их через механизм пользовательских настроек.
Итак, вернемся к нашему отчету. Допустим нам необходимо добавить в отчет отбор по группе номенклатуры (или по элементу) и чтобы этот отбор был доступен для изменения пользователем.
Добавим для этого отбор на уровне отчета. Вид сравнения по умолчанию сделаем «В группе», отключим по умолчанию использование отбора и в диалоге редактирования пользовательских настроек включим наш отбор в пользовательские настройки.
Перейдем теперь в режим предприятия.
Наш отбор доступен для редактирования на форме. За доступность прямо в форме отчета отвечает «Режим редактирования». Значение «Быстрый доступ» означает, что отбор доступен прямо на форме отчета. Если значение равно «Обычный», отбор доступен через кнопку «Настройки». Как видно на рисунке пользователь может выбирать вариант сравнения, управлять действием (включен / отключен) отбора.
Если вам необходимо установить фиксированный отбор (вид сравнения и правое значение константы), но пользователь должен управлять включением / отключением отбора, тогда вам необходимо заполнить представление отбора в пользовательской настройке:
В этом случае в настройки добавляется только флаг использования отбора, которым может управлять пользователь:
Если вам в отборе нужно изменить представления поля, по которому делается отбор, то для этого есть еще одно представление:
Получается вот так:
Мы можем вывести все отборы для редактирования пользователем. Для этого на уровне отчета вызовем диалог редактирования пользовательских настроек:
То же самое можно сделать на уровне любой группировки, если нужно, чтобы была возможность редактирования отборов для заданной группировки. В режиме предприятия это выглядит следующим образом:
Отборы на форме и в динамических списках
Как известно, в 1С СКД используется не только в отчетах, но и в формах, содержащих динамические списки. У динамического списка есть несколько свойств, которые относятся к СКД. Среди этих свойств имеется свойство «Отбор» с типом «ОтборКомпоновкиДанных». Чтобы установить отбор в динамическом списке есть два способа. Первый способ – передать отборы через параметр формы с одноименным названием – «Отбор». Этот параметр является структурой, в которой ключ ссылается на поле, для которого устанавливается отбор. Значение же содержит данные, с которыми производится сравнение. Можно также передать в качестве правого значения – массив, фиксированный массив, список значений. В этом случае вид сравнения равняется «ВСписке», для одиночного элемента вид сравнения устанавливается как «Равно». Этот способ ограничен в возможностях – с его помощью нельзя накладывать сложные условия с операторами «И» и «ИЛИ», нельзя использовать виды сравнения кроме двух указанных.
Отбор, установленный таким образом, передается в фиксированные настройки компоновщика настроек, связанного с динамическим списком. Он не виден пользователю и недоступен для изменения.
Второй способ – непосредственное редактирование отбора в динамическом списке или в компоновщике. Обычно в типовых конфигурация для этого есть ряд методов и функций для установки таких отборов.
Например, вызов основного метода для установки отбора выглядит так:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, «Ссылка», Параметры.ДобавитьДля, ВидСравненияКомпоновкиДанных.НеРавно);
Данная функция производит поиск существующего элемента отбора, изменяет его если нашла, а если не нашла, то добавляет с помощью такой процедуры:
В форме содержащей динамический список также как в отчете на СКД, возможно настроить пользовательский отбор. Как это можно сделать показано на рисунке:
Также у элемента формы, с которым связан список нужно установить группу пользовательских настроек, в которой будут отображаться настройки для пользователя:
Источник