- Не работает отбор в СКД
- Как заставить СКД правильно отбирать по ресурсам при ОБЪЕДИНЕНИИ наборов
- Не работает отбор в системе компоновки данных
- [ Разбор вопросов ] Тонкости СКД – настройки, варианты, расчет итогов по вычисляемым полям, программная обработка
- Вопрос №1: “Почему могут быть не доступны варианты отчетов на СКД в пользовательском режиме?”
- Ответ
- Вопрос №2: “Можно ли делать отбор на уровне детальных записей по вычисляемым полям в СКД?”
- Ответ
- Вопрос №3: “В каком случае можно установить значения параметров в процедуре ПередКомпоновкойМакета модуля менеджера отчета?”
- Ответ
- Вопрос №4: “Как вывести изображение в колонтитулах отчета на СКД?”
- Ответ
- Вопрос №5: “Каким образом можно программно получать настройки отчета на СКД?”
- Ответ
- Вопрос по объединению наборов и отбору в СКД
Не работает отбор в СКД
(15) в качестве теста добавьте вычисляемое поле МенеджерПоле
и укажите выражение Менеджер.
если отбор на МенеджерПоле сработает, значит ваше предположение верно. Тогда в выбранных полях заменить Менеджер на МенеджерПоле и т.д.
(19) по этому фрагменту коду понятно, что стандартная компоновка отключена.
Значит есть вероятность, что в программной компоновке стандартное поведение отбора отключили.
Я бы еще в настройке компоновки создал в качестве теста новый вариант с нуля чтобы флажки Авто стали на свои места и проверил формирование с отборами
Посмотрите модуль объекта для отчета.
Там может быть процедура вроде этой:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если ее заремить, то отчет будет вести себя стандартно.
Ха-Ха! я тоже наткнулся на подобную проблему.
Было: отчет на СКД с кучей временных таблиц и разнообразными джойнами.
Отбор по контрагенту работал выборочно. по каким-то КА работает, по другим не работает. без отбора выводит всех .
Корень зла крылся в том, что при формировании одной из промежуточных временных таблиц был юнион одной таблицы с джойном пары других таблиц. В результате джойна могли появляться NULL значения.
Заменил левый джойн на полный, для того чтобы не получалось NULL значений в ссылочных колонках и isnull( ХЗ, 0) в числовых колонках.
В итоге, по всей цепочке временных таблиц и в итоговой выборке NULL пропали и отбор СКД заработал адекватно.
По логике моего отчета Контрагент должен быть заполнен какой-либо вменяемой ссылкой, не пустым значением.
Если по вашей логике допустимы пустые значения — то их можно заполнить через isNull( HZ , Значение(Справочник.какойто.пустаяссылка))
Мораль — СКД не любит NULL в колонках , по которым выполняется отбор.
Источник
Как заставить СКД правильно отбирать по ресурсам при ОБЪЕДИНЕНИИ наборов
Дано — СКД с объединением двух наборов данных, например вот такая https://yadi.sk/d/0hqGXPlq37vHht (заведется в любой конфигурации, включая пустую).
Если просто добавить поле «Ресурс» в отборы, то СКД воткнет отбор в предложение ГДЕ в каждом наборе по отдельности. А хочется, чтобы отбор на ресурсы накладывался уже после объединения.
Итого, вопрос: Есть ли у СКД возможность как-то так ее заставить, чтобы отбор на ресурс накладывался уже после объединения?
То есть, например, если выполнить этот отчет без отборов, то будет две строчки (так и надо).
Если наложить отбор «Ресурс >= 2», то будет только одна строчка — из второго набора. Данные первого набора будут отфильтрованы начисто, т.к. первый набор состоит из идентичных строчек, значение ресурса в которых по отдельности меньше 2. Хочется в этом случае тоже видеть две строчки потому, что итог по первому набору таки больше двух.
Происходит это все на 8.3.6.2299 в любом режиме.
Что пробовал:
1. Включить ограничение использования в наборе, но не включать в объединении — это все равно что вообще удалить ресурс из полей отбора.
2. Пользовательское поле — это все равно, что ни чего не делать, отбор накладывается перед объединением.
3. Вычисляемое поле — результат нулевой разного сорта. Чаще всего оно не компонуется, т.к. не может найти поле.
(0) Можно, установить отбор через условное оформление.
Так же можно сперва сформировать ТЗ, а потом поместить его в СКД, в качестве источника данных 😉
(1) отбор через условное оформление. это как?
хочется оставить объединение наборов, т.к. в реальном отчете там их чуток поболе, чем два и объединение с одной стороны упрощает сопровождение отчета, в с другой — если пользователь исключит поля каких-то наборов, то этих наборов и в объединении не будет
1. Имеем СКД с набором данных — запрос.
2. Далее пользователь настраивает компоновщик настроек, в котором имеется отбор, например по наименованию.
3. А Надо , что бы этот отбор применялся лишь к первой таблице.
Можно снять флажок «Автозаполнение» и воспользоваться расширением языка запросов для компоновки данных (это то что в фигурных скобках).
С фигурными скобками пробовал — не помогало. А вот снятие галочки — помогло. Спасибо большое.
(6) (8) это другой вопрос и, как сделать это, я знаю. ЭТо как раз делается путем добавления поля в отборы компоновки — в первой таблице надо добавить, во второй — не добавлять. Автора под вопроса подкосила галочка «Автозаполнение» — ее надо выключить для этого. Или назвать как-то поле отбора по-другому, но тогда пользователю кукушечку снесет.
Вопрос в топике совсем другой.
(11) например бывает так, что данные собираются из базы и внешнего источника, тогда не обойтись без нескольких наборов.
кстати, пример не совсем корректный, я бы в первом наборе добавил «Б», а во втором — «а».
Источник
Не работает отбор в системе компоновки данных
Делаю отчет на СКД. Источник данных — запрос:
ВЫБРАТЬ
ибсВыданныеТалоныОстаткиИОбороты.Контрагент КАК Контрагент,
ибсВыданныеТалоныОстаткиИОбороты.ДоговорКонтрагента КАК Договор,
ибсВыданныеТалоныОстаткиИОбороты.Талон КАК Талон,
ибсРеквизитыДоговоровСрезПоследних.ибсРайон КАК Район,
ибсРеквизитыДоговоровСрезПоследних.ибсТипДоговора КАК ТипДоговора,
ибсВыданныеТалоныОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
ибсВыданныеТалоныОстаткиИОбороты.КоличествоПриход КАК Выдано,
ибсВыданныеТалоныОстаткиИОбороты.КоличествоРасход КАК Использовано,
ибсВыданныеТалоныОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ибсВыданныеТалоны.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ибсВыданныеТалоныОстаткиИОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ибсРеквизитыДоговоров.СрезПоследних(&КонецПериода, ) КАК ибсРеквизитыДоговоровСрезПоследних
ПО ибсВыданныеТалоныОстаткиИОбороты.ДоговорКонтрагента = ибсРеквизитыДоговоровСрезПоследних.ДоговорКонтрагента
УПОРЯДОЧИТЬ ПО
Контрагент, Договор
В компоновке указываю ресурсы НачальныйОстаток, Выдано, Использовано, КонечныйОстаток. Создаю единственную группировку Контрагент, Договор, Талон, Договор, ТипДоговора и на закладке выбранные поля добавляю все 4 ресурса. Отчет формируется правильно, но при включении отбора по полям Район или ТипДоговора получаю пустой отчет. Что я делаю не так? Почему поля взяты из таблицы прикрепленной Левым соединением нельзя использовать в отборе?
Источник
[ Разбор вопросов ] Тонкости СКД – настройки, варианты, расчет итогов по вычисляемым полям, программная обработка
Поток вопросов по СКД в Мастер-группе не прекращается. Сегодняшняя подборка тому подтверждение. Вопросы связаны и с платформенными изменениями самой системы компоновки данных, и с развитием БСП, и с расширением практик применения СКД в современных типовых решениях.
Вопрос №1: “Почему могут быть не доступны варианты отчетов на СКД в пользовательском режиме?”
Ответ
Если такая база базируется на БСП, то тут еще могут влиять механизмы БСП. Например, пользователю по ограничениям доступа недоступен конкретный вариант отчета, поэтому он его и не видит. Также для подсистемы БСП “Варианты отчетов” в общем модуле ВариантыОтчетовПереопределяемый в процедуре НастроитьВариантыОтчетов нужно явно описывать используемые варианты отчетов и запустить приложение с ключом ЗапуститьОбновлениеИнформационнойБазы.
Пример подключения отчетов к подсистеме “Варианты отчетов” есть на странице нашего сайта – Подключение отчетов к подсистеме “Варианты отчетов”. Возможно, в вашем случае какое-то из описанных действий не было выполнено.
Вопрос №2: “Можно ли делать отбор на уровне детальных записей по вычисляемым полям в СКД?”
(нажмите, чтобы увеличить картинку)
Ответ
Ошибка не будет возникать, если для отбора на уровне детальных записей изменить настройку Применение – указать значение “После группировки или для иерархии”:
(нажмите, чтобы увеличить картинку)
Появление ошибки связано с использованием в выражении для вычисляемого поля функции ВычислитьВыражение с указанными параметрами Начало и Конец, которая должна быть вычислена на основании только некоторых записей группировки.
Вопрос №3: “В каком случае можно установить значения параметров в процедуре ПередКомпоновкойМакета модуля менеджера отчета?”
- Эта процедура вызывается “сама”? То есть, если я сделаю такую процедуру в модуле менеджера, мне не нужно будет прописывать её вызов? Смущает, что в списке предопределенных возможных процедур нет такой (например, ПриКомпоновкеРезультата в модуле объекта есть). Прилагаю скриншот, поясняющий, какой список имею в виду.
- Переопределение параметров правильно делать именно в этой процедуре? Почему не в процедуре ПриКомпоновкеРезультата модуля объекта или в модуле формы?
- Если у меня внешний отчет, то модуля менеджера в нем нет – значит, такую процедуру я не могу использовать?
Ответ
- В этом видеоуроке демонстрируется типовая конфигурация Бухгалтерия предприятия. Она базируется на Библиотеке стандартных подсистем (БСП), которая содержит отдельную подсистему для работы с отчетами. В этой подсистеме реализовано большое количество универсальных методов. Рассмотрим на примере отчета из видеоурока. В модуле отчета есть код, который вызывает метод общего модуля:
А в общем модуле БухгалтерскиеОтчетыВызовСервера есть функция ПодготовитьОтчет, в которой содержится следующий код:
Следовательно, в модуле менеджера отчета можно доработать компоновщик, например, установить значения параметров. Инициируется этот вызов в процедуре ПриКомпоновкеРезультата.
Подобные фрагменты кода есть и в других конфигурациях, основанных на БСП, например, в УТ 11. Получается, что для доработок отчетов на БСП есть универсальные точки входа, где можно размещать свой код. В отчетах для конфигураций не на БСП этот подход работать не будет.
- Это зависит от того, для какой конфигурации разрабатывается отчет. Если конфигурация создается с нуля, то такой метод из модуля менеджера просто некому будет вызвать. Если конфигурация базируется на БСП, то можно “подсмотреть” в типовых отчетах, как они разработаны. Также в документации по БСП, размещенной на сайте ИТС, можно изучить подробное устройство подсистемы Варианты отчетов.
- Да, во внешних отчетах и обработках в принципе не существует модуля менеджера.
Вопрос №4: “Как вывести изображение в колонтитулах отчета на СКД?”
Ответ
Да, начиная с платформы 8.3.15 появилась возможность добавить картинку в колонтитул.
В конфигураторе это можно сделать в меню Таблица – Настройки печати – Колонтитулы:
(нажмите, чтобы увеличить картинку)
Вопрос №5: “Каким образом можно программно получать настройки отчета на СКД?”
Но во многих видео настройки получаются такой строкой:
И далее по этим настройкам формируется отчет. Почему так? Зачем нам могут быть нужны настройки, которые не содержат значений, заданных пользователем? В каких случаях и каким способом нужно получать настройки?
Ответ
Чтобы решить, какие именно настройки следует использовать, нужно задавать себе вопрос “Отчет с какими настройками мне нужно сформировать для решения поставленной задачи?”
- Чаще всего на практике нужно учитывать пользовательские настройки, значит, используем метод:
В таком случае из компоновщика получаем настройки, которые уже включают в себя и пользовательские, и фиксированные настройки. С этими “результирующими” настройками компонуем отчет. В методе ПриКомпоновкеРезультата в модуле отчетов чаще всего встречается именно этот вариант
- Если нужно взять настройки не из компоновщика, а из схемы компоновки, то воспользуемся настройками по умолчанию:
Такой вариант встречается при компоновке из программного кода, например, когда на форме обработки компоновщик вообще не отображается. В таком случае удобно обратиться к настройкам, описанным непосредственно в схеме компоновки
- СКД часто используется в обработках – для заполнения ТЧ, списка справочников или документов для обработки. Настройки компоновщика размещаются на форме, пользователь может их редактировать – настраивать отборы по своему усмотрению. А пользовательские настройки в таком случае не используются, поскольку мы не отчет разрабатываем, а всего лишь обработку. Значит, можно взять настройки из компоновщика:
Источник
Вопрос по объединению наборов и отбору в СКД
Добрый день. Большая просьба помочь разобраться с таким вопросом: допустим делаем отчёт на скд, условимся что отчёт будет состоять из двух наборов:
1 набор — выбираем данные из собственного регистра сведений — измерения номенклатура, характеристика и числовой ресурс.
2 набор — регистр накопления ЗакупкиОбороты. Выбираем номенклатуру, характеристику, стоимость (СтоимостьОборот).
У первого набора свои даты, у второго свои.
Соединяем два набора:
источник связи (Набор1) — приемник связи (Набор2) — выражение источник (номенклатура) — выражение приемник (номенклатура)
источник связи (Набор1) — приемник связи (Набор2) — выражение источник (характеристика ) — выражение приемник (характеристика )
Закидываем данные в отчёт, строим за разные даты — всё хорошо отрабатывает. Далее в скд в отборах устанавливаем отбор по контрагенту у закупок, строим за те же даты — цифры по первому набору совсем другие. Почему так?? Мы же присоединяем к набору1 все остальные данные. Почему в наборе1 при указании отборов пропадают данные, хотя период по собственному регистру с отборами и без стоит одинаковый? Не могу понять в чём загвоздка? Подскажите пожалуйста что не так??
Наверное потому что в Наборе 1 тоже есть поле Контрагент?
Правильно заданный вопрос по СКД содержит картинки всех настроек.
Если в системе компоновки данных описывается связь между двумя наборами данных, то набор данных, к которому идет связь, будет считаться зависимым . Набор данных, от которого идет связь, будет считаться родительским по отношению к зависимому от него набору данных.
.
В схеме компоновки данных нет указания типа связи. Все связи считаются левыми внешними соединениями. То есть запись родительского набора данных будет использоваться в компоновке даже в том случае, если для нее не найдены записи в зависимом наборе.
В макете компоновки данных возможно указание типа связи. Тип связи генерируется компоновщиком макета в зависимости от накладываемых глобальных отборов. Если на поле набора данных, являющегося зависимым, накладывается глобальный отбор, генерируемые связи в макете компоновки данных от этого набора данных до всех его родительских наборов (вплоть до начала иерархии наборов данных) будут иметь тип Внутренняя . Это означает, что записи родительского набора данных будут участвовать в компоновке только в том случае, если будут найдены записи в зависимых наборах данных.
в (10) написал неправду. в (6) все правильно
вот такая «фигнюшечка» добавляется если делаешь отбор. и действительно соединение становится внутренним. а ведь везде пишут, что наборы соединяются через левое соединение
(10) да , не работает действительно, рано радовался.
не совсем так. два набора живут отдельно. должен сначала отбор наложиться на второй набор и затем левое соединение. — так бы отработало как нужно, но не отрабатывает.
Так какие идеи как побороть отбор?
1. соединить данные в запросе
2. поменять тип связи в модуле отчета при компоновке. нужен программный вывод
(19) Всё равно «съедаются» данные при установке отбора. Одним запросом без отбора за любой период — копейка в копейку. С отбором — цифры совершенно другие. Ок, прицеплю один запрос, опустим кривость самого запроса (данные получаются верные). Проблема та же что и запрос с простейшими наборами — без отбора всё работает как надо, с отбором — цифры совсем другие. Что не так.
(21) я написал два варианта как по разному можно решить
1. если делаем через запрос, то отбор нужно делать так, чтобы результирующий запрос выбрал все нужные данные
2. если в модуле объекта делаем то у МакетКомпоновки нужно поправить ТипСвязи у свойства СвязиНаборов (как-то там). по умолчанию там будет Внутренне, а нужно Левое
думаю что второй вариант будет проще. в первом варианте заключаем ГДЕ в скобки <> и то что будет написано в скобках не должно «отрубать» записи исходного набора
пока нет времени подумать как это лучше сделать (и можно ли вообще)
Источник