1с скд не видит параметры

Обновлено: 08.07.2024

Отчеты на СКД в типовых решениях частенько сделаны очень сложно. Чтобы понять, почему они выдают какой-то результат, необходимо взять запросы наборов данных или схему компоновки данных целиком и "перебраться" с ними в консоли запросов или консоли отчетов СКД, указав значения всех параметров. Но беда в том, что готового запроса или схемы компоновки в конфигураторе нет, т.к. сложные отчеты собираются программно по кусочкам, а параметров много и к тому же часть параметров устанавливается функциями общих модулей, модулей менеджеров и т.п.

Я предлагаю набор функций, которые через режим отладки помогут быстро "перебраться" в консоли запросов или отчетов. Эти функции находятся в расширении в общем модуле ОтладкаСКД.

Подключаем расширение, перезапускаемся, появляется подсистема "Отладка СКД"

На примере демо-базы Бухгалтерии возьмем отчет "Задолженность покупателей по срокам долга". В этом отчете запрос набора данных собирается каждый раз в зависимости от количества интервалов, заданных в настройках, при этом значения параметров в запросе очень много.


Посмотрим наименования наборов данных в схеме компоновки данных:

-"ОсновнойНабор"(запрос);

- "ПросроченнаяЗадолженность" (таблица значений);

- "ДанныеПервичныхДокументов" (запрос).


I Шаги для перехода к отладке отчета в консоле запросов

  1. Определим, где ставить точку остановки, используя замер производительности.
  2. В указанной точке вызовем функцию для получения структуры запроса одного из набора данных с параметрами.
  3. Перейдём в консоль запросов и выполним запрос.

1. Определяем место точки остановки отладки в Конфигураторе

В конфигураторе в разделе "Отладка" подключаемся к серверному сеансу для отладки. Будем "ловить" место, где, в конечном итоге, выполняется отчет. Не забываем в разделе "Автоматическое подключение" подключится к фоновым заданиям, т. к. отчеты на СКД "любят" выполняться фоновыми заданиями.


Включаем "Замер производительности" и нажимаем "Сформировать" в отчете. Отключаем "Замер производительности", смотрим и ищем нужное место


В итоге видим, что реальное выполнение отчета происходит в общем модуле "Бухгалтерские отчеты" , переходим туда и ставим точку остановки именно там, как можно ближе к методу КомпоновщикаМакета.Выполнить, чтобы не пропустить какие-либо промежуточные процедуры и функции, которые могут изменить настройки.

2. Получаем запрос с установленными параметрами в виде XML

Для того, чтобы получить в итоге конечный запрос, необходимо иметь "Схему компоновки данных" и "Компоновщик настроек данных" (точнее Настройки компоновщика). Внимательно посмотрев текст модуля в месте точки остановки, видим эти переменные. Включаем Табло отладки и пишем:


ОтладкаСКД.ЗапросВСтрокуXML(ОтладкаСКД.ПолучитьЗапросНабора(СхемаКомпоновкиДанных,КомпоновщикНастроек,"ОсновнойНабор"))

Видим, что в 1-ой записи получили запрос набора данных "ОсновнойНабор" (тип "Запрос"), а во 2-ой тот же запрос набора данных "ОсновнойНабор" (тип "Запрос") в XML.

Копируем строку XML и запускаем консоль запросов

3. В "Консоле запросов" выполняем запрос

Вставляем скопированную строку XML в текст запроса (хотя это не совсем текст запроса, но это трюк консоли) и нажимаем в "Еще" "Заполнить из XML"


И о чудо ! Строка ХМL превратилась в текст запроса и в параметры с установленными значениями.

Если всё это делать "руками", то установка значений параметров займёт много времени с одной стороны, а с другой можно легко пропустить какое-либо значение в параметрах, например в списках, что приведёт к неверному (другому) результату запроса.

Запрос выполнился, всё работает, дальше уже разбираемся с запросом.


II Шаги для перехода отлаживать отчет в консоли отчетов СКД

  1. Определим, где ставить точку остановки, используя замер производительности.
  2. В указанной точке вызовем функцию для получения схемы компоновки в XML и настроек компоновщика в XML.
  3. Перейдём в консоль отчетов СКД и добавим там отчет, вариант отчета.

1.Определим, где ставить точку остановки, используя замер производительности

Этот шаг ничем не отличается от ранее описанного для работы с консолью запросов

2.Получение схемы компоновки данных и настроек компоновщика в XML

Поставив точки остановки и остановившись при выполнении отчета, пишем в "Табло отладки"


Получаем 2 строки XML:

- Схема компоновки данных

- Настройки компоновщика (вариант отчета)

Копируем эти строки в 2 файла. Создаём здесь в конфигураторе 2 текстовых файла и сохраняем например "СхемаСКД.txt" и "НастройкиСКД.txt"

3. Консоль отчетов СКД и добавим там отчет, вариант отчета.

Открывает стандартную консоль отчетов СКД с ИТС

Добавляем "Вариант отчета" и кнопку "Ещё-Загрузить настройки", выбираем файл ""НастройкиСКД.txt"


Всё готов отчет, все параметры и настройки заданы.


. Конкретно в этом отчете есть дополнительный набор в виде таблицы значений, поэтому отчет не выполнится. Но это уже нюансы этого отчета. Чуть ниже сделана небольшая доработка, чтобы можно было в консоли отчетов СКД работать и с внешними наборами данных (таблицами значений)

08.01.2019 Добавлена возможность в консоли отчетов СКД загружать данные внешних наборов данных, используемых в схеме СКД

Отчет не заработает, если ему не передать таблицу значений в качестве внешнего набора данных. Имя этого набора "Просроченная задолженность" (на скриншотах выше это можно увидеть). К сожалению в консоли отчетов СКД от 1С нет стандартной возможности передать эти внешние наборы, поэтому пришлось немного её доработать. Добавлена новая кнопка "Внешние наборы данных" (доработанная консоль в расширении).

Как это делаем по шагам:

1. Отладкой находим место, где эти таблицы внешних наборов собираются и передаются на выполнение.

В том же модуле БухгалтерскиеОтчетыВызовСервера, где мы нашли метод выполнения макета компоновки, чуть ниже находим строку, в которой передаются внешние наборы данных на выполнение процессору компоновки, ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, и переменную ВнешниеНаборыДанных, эта структура в которой содержатся таблицы для внешних наборов


2. Выгружаем эти таблицы в XML

С помощью функции ОтладкаСКД.ВнешниеНаборыДанныхВXML , конвертируем переменную ВнешниеНаборыДанных в XML. Сохраняем эту строку в текстовый файл, например ВнешниеНаборыСКД.txt


3. Загружаем внешние наборы данных в консоль , выполняем отчет.

Теперь возвращаемся в консоль отчетов СКД из расширения и вызываем пункт "Внешние наборы данных" и выбираем файл ВнешниеНаборыСКД.txt




Видно, что загрузился из файла один внешний набор ПросроченнаяЗадолженность (планирую также добавить редактор таблиц значений для работы с внешними набора данных).

Закрываем окно и нажимаем НАКОНЕЦ "Сформировать" и отчет формируется.


16.01.2019 Добавлена в расширение для отладки отчетов функция, которая позволяет во время отладки в Конфигураторе выгрузить отлаживаемый отчет во внешний отчет (в файл) со всеми настройками в момент точки остановки:

ОтладкаСКД.Клиент.СгенерироватьВнешнийОтчет(ПолныйПутьКОтчету = Неопределено, ДанныеСКД)

. Внимание: Данная функция работает только для сеанса "Толстый клиент"

Например, чтобы выгрузить отчет в файл внешнего отчета необходимо в отладке вычислить выражение:

Далее отчет можно запускать как отдельный внешний отчет.

ИТОГ: С помощью функций расширения "ОтладкаСКД" можно быстро начать отлаживать довольно сложные отчеты СКД в различных консолях или просто разобраться в ситуации прямо в отладке.

На текущий момент перечень функций в расширении:

Функция ПолучитьМакетаКД - Возвращает макет выполнения компоновки данных

Функция ПолучитьЗапросНабора - Возвращает запрос с текстом запроса и значениями параметров из компоновщика

Функция ПолучитьЗапросыНаборов - Возвращает структура запросов всех наборов данных с примененными настройками и значениям параметров компоновщика

Функция ПолучитьРезультатЗапросаНабора - Возвращает результат запроса набора данных с примененными настройками и параметрами компоновщика

Функция ПолучитьРезультатыЗапросовНаборов - Возвращает структуру результатов запросов всех наборов данных схемы компоновки данных с примененными настройками компоновщика

Функция ТабДокВXML - Возвращает результат выполнения СКД в табличный документ в XML, далее табличный документы можно получить обработкой "Табличный документ(Отладка СКД)", включенной в расширение

Функция ПолучитьТабДок - Возвращает результат выполнения СКД в табличный документ

Функция ПолучитьТЗ - Возвращает результат выполнения СКД в таблицу значений

Функция ПолучитьДЗ - Возвращает результат выполнения СКД в дерево значений

ВнешниеНаборыДанныхВXML - возвращает таблицы для внешних наборов данных в XML

СгенерироватьВнешнийОтчет(ПолныйПутьКОтчету, ДанныеСКД) - выгружает во внешний отчет отлаживаемый отчет со всеми настройками.

включены вспомогательные функции из БСП также (в БСП они в общем модуле ОбщегоНазначения) для конфигураций без БСП:

Функция ЗначениеВСтрокуXML

Функция ЗначениеИзСтрокиXML

Функция ЗапросВСтрокуXML

Ещё чуть-чуть доработана "Консоль запросов", добавлено при создании параметров поддержка типов "Массив", "Список значений", "Стандартный период". Без этого может выдавать ошибку по кнопку "Заполнить из XML" при определенных параметрах компоновщика.

Параметры могут использоваться практически в любом месте запроса и выполнять самые различные функции.

Параметры обозначаются знаком & после которого следует имя параметра.

Параметр может быть полем запроса, частью произвольного выражения поля запроса, условием для виртуальной таблицы, частью выражения в отборе запроса и так далее:

При построении запроса конструктором на вкладке “Условия” если не стоит галочка “Произвольное”, то конструктор считает что в правом значении параметр и он записывается без символа &.


Таким образом этот блок настраивается в конструкторе.

Если значение параметра не задано, то построение СКД будет невозможно и будет выдана ошибка, поэтому такие параметры называют “обязательными” или “жесткими”.

Выбрать.

Этот блок располагается в запросе типа выборка данных пакета запросов СКД в первом запросе объединения между перечнем полей и “ИЗ” и заключается в фигурные скобки.


Таким образом этот блок настраивается в конструкторе.

При автоматическом заполнении полей набора данных, для не включенных в блок расширения “ВЫБРАТЬ”, добавляются все поля списка выборки и их дочерние поля. Они становятся доступными для выбора, упорядочивания, группировки, отбора. Также добавляются поля, которые упомянуты в параметре “Условия” виртуальных таблиц как доступные для отбора.

Отбор, установленный в пользовательских настройках, будет действовать не только на основной запрос, но и на все запросы в пакете. Но это не всегда соответствует логике отчета, к примеру, если помимо отобранной номенклатуры и сумм по ней нужно выводить общую сумму продаж для сравнения. В таких случаях нам нужны специфические отборы в каждом запросе пакета.

Блок расширения “ГДЕ” может быть расположен после или вместо обычного блока “ГДЕ” в любом запросе, подзапросе, запросах объединения и заключается в фигурные скобки. Для присвоения отбору псевдонима используется конструкция “КАК”. Псевдоним нужно использовать чтобы отбор производился конструкцией расширения языка запросов, но не происходил автоматически по наименованию поля.

Если автозаполнение полей набора отключено, поля из этого блока попадают в перечень полей набора доступными только для отбора, использование дочерних полей зависит от наличия конструкции “.*”.

Если автозаполнение включено, и это поле включено в блок расширения “ВЫБРАТЬ” тогда настройки обоих блоков объединяются. Если не включено в “ВЫБРАТЬ” то поля попадают доступными для вывода, группировки, отбора и упорядочивания.


В случае если нужно дополнительно установить какое то ограничение полю, то можно вручную установить галочку в соответствующее поле перечня полей набора данных СКД.

Также в блоке “ГДЕ” вместо параметра может быть произвольное выражение с использованием конструкции ВЫБОР или параметров со страницы “Параметры” СКД. Правда в последнем случае вид сравнения необходимо указывать конкретно.

Нужно с осторожностью использовать вид сравнения МЕЖДУ поскольку:

Если параметры НачалоПериода и КонецПериода не будут заданы, то система получит документы за весь период.

Если параметры НачалоПериода и КонецПериода будут заданы, то система получит документы за указанный период.

Если какой-то один из параметров не будет задан, то система выдаст ошибку.

Один из вариантов решения это разбить МЕЖДУ на два условия чтобы система не выдавала ошибку в случае одного незаполненного параметра.

Это же замечание относится к любым выражением с использованием нескольких параметров.

Параметры виртуальных таблиц.

В параметрах виртуальных таблиц в отличие от предыдущих блоков, каждый параметр заключается в фигурные скобки. В полях относящихся к периоду название параметра ставится с &. Пример &ДатаНачала. В поле “Условие” параметры оформляются аналогично блоку “ГДЕ”.

Параметры из полей периода попадают на страницу “Параметры” СКД. Если автозаполнение включено и в поле периода параметр не вписан, параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД.


Таким образом, эти параметры заполняются в конструкторе запроса. Для открытия формы “Параметры виртуальной таблицы” нужно выбрать виртуальную таблицу в списке таблиц и нажать выделенную синим кнопку. Также тут у таблиц есть булевый реквизит “Обязательная” и числовой реквизит “Номер группы”. Если признак обязательности таблицы не установлен, то она будет добавляться в результирующий запрос только в случае, когда хотя бы одно поле из нее задействовано в компоновке. Номер группы заполняется для необязательных таблиц и обозначает группу таблиц, которые будут добавлены в результирующий запрос только, когда из этой группы таблиц задействовано хотя бы одно поле.

В параметрах виртуальных таблиц возможно совместное использование “жестких” параметров запросов и “мягких” параметров компоновки данных.

В этом примере если в настройках установлено значение параметра &НачалоПериода, то будет использоваться его значение. В противном случае в качестве значения параметра виртуальной таблицы будет использоваться значение “жесткого” параметра “&Начало”.

Если автозаполнение включено и в поля периода не вписаны “мягкие” параметры компоновки данных то параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД и текст запроса:

будет соответствовать следующему:

В этом случае “мягкие” параметры также будут иметь приоритет над “жесткими”.


Обзорный вид страницы.


На эту страницу автоматически добавляются все параметры из запроса. Можно добавлять свой параметр в для использования его в вычисляемых полях например.

Строка параметра имеет следующие реквизиты:


Таким же образом можно указать формат числа для численного параметра и длину строки для строкового.

А для того чтобы введенные значения интерпретировались в отчете как начало и конец дня следует в запросе использовать функции НачалоПериода() и КонецПериода() .

Также в примере к реквизиту “Тип” можно было в выражениях использовать функции встроенного языка запросов, особенность применения этих функций в данном месте такова, что строковые параметры функций надо брать в кавычки.

и в запросе можно было бы писать проще поскольку в параметрах уже будет содержаться начало и конец периода:



Даты начала и конца стандартного периода также содержат и время. ДатаНачала имеет время 00:00:00, а ДатаОкончания 23:59:59. Получится что пользователь выберет стандартный период в “Период” а разработчик будет использовать корректные “ПериодНачало” и “ПериодОкончание”.




В настройках варианта мы можем установить галочку “Отображать недоступные параметры”, это можно использовать если для разных вариантов мы хотим использовать разный набор параметров.

У параметров в табличной части мы можем установить значение по умолчанию для варианта, включить использование по умолчанию установив галочку слева. Нажав на кнопку, расположенную справа внизу, мы открываем окно пользовательских настроек параметра.



Если Режим редактирования установить Быстрый доступ, то параметр появится на форме.


Если у параметра “Период” представление заполнить строкой “ПеРиОд”, то вместо название будет показано содержания поля представление.

Если у отчета СКД нет формы, то платформа создаст автоматическую, на которой будут табличный документ результата, кнопки управления и быстрые пользовательские настройки.


Можно создать свою форму для отчета и вывести на нее табличное поле со всеми пользовательскими настройками. Вот так:


Для этого в созданной форме в конфигураторе вытаскиваем на форму Пользовательские настройки из Компоновщика отчета.


В некоторых случаях параметр не прост, и для его расчета нужен некий алгоритм с циклом или ветвлениями. К примеру если отчет формируем в понедельник то в отчете сравниваются продажи по дням позапрошлой и прошлой недели, а в остальные дни недели сравниваются продажи по дням прошлой и текущей недели. Получается у нас от значения дня недели текущего дня зависит сразу четыре параметра: &НачалоПрошлойНедели, &КонецПрошлойНедели, &НачалоТекущейНедели и &КонецТекущейНедели. А еще нам надо дать возможность пользователю формировать отчет как будто он сформирован вчера или неделю назад. В таком случае мы создаем реквизит формы ТекДата типа Дата. Выводим его на форму. В событии ПриИзменении() пишем.

Таким образом можно программно менять параметры из формы.

Параметры это ключевой инструмент для управления отчетом. Использование параметров дает возможность решить множество прикладных задач, таких как калькуляция на основе информации в базе и значений введенных интерактивно для конкретной калькуляции и многих других. В данной статье рассмотрены практически все относящиеся к параметрам механизмы и особенности. Рамках статьи не рассмотрен блок “Характеристики” Расширения языка запросов для СКД поскольку он не касается параметров. Не рассмотрена настройка параметра “Параметр функциональной опции” поскольку ее описание лучше включить в статью по функциональным опциям.

При разработке отчета на СКД часто требуется указать связь между параметрами этого отчета. Например если в отчете имеется параметры "Номенклатура" и "Серия", при выборе серии показывать только серии данной номенклатуры. Или нужно отображать в списке выбора элементов справочника "ЗначенияСвойствОбъектов" только значения, принадлежащие определенному элементу плана видов характеристик "ДополнительныеРеквизитыИСведения". Несмотря на то, что в полях и параметрах СКД есть возможность указать параметры выбора и связи параметров выбора, этот механизм не работает (по крайней мере, так обстоит дело в ERP 2.4.9.98).

Можно написать свою форму отчета, разместить на ней элементы отбора и сделать в ней все, что угодно. Но не хотелось бы терять мощные механизмы общей формы "ФормаОтчета" или копипастить их в свой отчет.

Можно модифицировать общую форму "ФормаОтчета" под свои задачи. Но не хотелось бы это делать каждый раз при разработке нового отчетов.

Предлагаю пример решения этой задачи для двух вариантов:

1. Фиксированный параметр выбора для поля "Отбор". В отчете сделан отбор по полю с типом "Справочник.ЗначенияСвойствОбъектов". При выборе значения отбора требуется показать пользователю только элементы с заданным владельцем.

2. Связи параметров выбора для поля "Параметр". В отчете имеется 2 параметра: Номенклатура и Серия. При выборе серии, показывать пользователю только серии выбранной номенклатуры

1. Фиксированный параметр выбора

Создаем отчет (файл ВнешнийОтчет_ФиксированныеПараметрыОтбора.erf).

Если отчет встроен в расширение, то необходимо:

1. Добавить в расширение подсистему ПодключаемыеОтчетыИОбработки

2. Добавить отчет в эту подсистему

3. В модуле менеджера отчета написать код:

В 1С добавить дополнительный реквизит справочника Номенклатура "Раздел комплектации" с типом значений "Дополнительное значение". Указать или сгенерировать имя реквизита, в моем случае это "РазделКомплектации_c7a03c267bb64e0eb58489873f24c25e"

В отчете составляем текст запроса:

Для поля "РазделКомплектации" нужно указать тип значения СправочникСсылка.ЗначенияСвойствОбъектов

На вкладке "Параметры" укажем выражение для параметра "Свойство": ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "РазделКомплектации_c7a03c267bb64e0eb58489873f24c25e", Истина)

Включим отбор по полю "РазделКомплектации" в пользовательские настройки: на вкладке "Настройки", "Отбор" добавими отбор "РазделКомплектации", щелкнем на нем правой кнопкой мыши, "Свойства элементов пользовательских настроек", установим флажок "Включать в пользовательские настройки".

В модуле отчета указываем, что мы перехватываем событие "ПослеЗаполненияПанелиБыстрыхНастроек":
В обработчике этого события нужно найти элемент формы в панели быстрого отбора, в котором пользователь указывает значение отбора "Раздел комплектации". В параметрах выбора этого элемента задаем отбор по владельцу - плану видов характеристик "Раздел комплектации":

2. Связи параметров выбора

Здесь мне уже не получилось обойтись без модификации общей формы "ФормаОтчета". Произошло это потому, что не получилось задать связи параметров выбора в существующих элементах панели быстрых настроек. Я выбрал обходной путь - скрывать существующий элемент формы со значением отбора, и подставлять на его место свой элемент. Связи параметров выбора зависимого элемента (серии) я задаю с данными этого элемента. Я постарался свести изменения ФормыОтчета к минимуму, и сделать их универсальными (их не нужно переписывать при создании другого отчета).

Создаем отчет (файл ВнешнийОтчет_СвязиПараметровВыбора.erf).

Как и в предыдущем примере, если отчет встроен в расширение, то необходимо:

1. Добавить в расширение подсистему ПодключаемыеОтчетыИОбработки

2. Добавить отчет в эту подсистему

3. В модуле менеджера отчета написать:

В отчете составляем текст запроса:

Параметры "Номенклатура" и "Серия" включим в пользовательские настройки (см. выше).

В модуле отчета указываем, что мы перехватываем событие "ПослеЗаполненияПанелиБыстрыхНастроек":
В обработчике этого события:

1. Находим элементы формы - значения параметров "Номенклатура" и "Серия"

2. Добавляем в форму новый реквизит "МойРеквизит_Номенклатура". Добавить элемент формы для этого реквизита.
Элементу формы указать обработчик события "ПриИзменении" (обработчик этого события и будет то единственным изменением общей формы "ФормаОтчета").

3. Скрываем старый элемент формы "Номенклатура".

4. Для элемента формы "Серия" задаем связи параметров выбора.

5. Сохраняем необходимую в дальнейшем информацию в дополнительных свойствах пользовательских настроек компоновщика настроек:

Как добавить параметр для отчета на форму, созданного на СКД? Чтобы было, как например в оборотно-сальдовой ведомости, выбор начала и окончания периода и, например, организации. В свое время, долгое время поисков не увенчалось успехом. После небольшого перерыва в разработке на 1С, попытки найти что-либо подобное, опять же не увенчались успехом. На форумах находил только стандартный код построителя отчета. Конечно, можно изменить и его, но для несложного отчета, когда требуется для удобства пользователя просто вынести реквизиты на форму, чтобы не залезать каждый раз в настройки отчета, менять стандартный код не требуется. Нужно только внести небольшие коррективы. Ниже, привожу текст кода:

Процедура ДатаНачПриИзменении ( Элемент )
ПараметрДатаНач = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы.Найти ( "НачалоПериода" );
ПараметрДатаНач . Использование = Истина;
ПараметрДатаНач . Значение = НачалоДня ( ДатаНач );
КонецПроцедуры

Писать в модуле формы, в обработчике ПриИзменении элемента. В примере - элемент "Начало периода".
В принципе, это все. Как дополнение, можно сделать еще обработчик ПередОткрытием формы, куда записать следующий код для открытия отчета уже с предустановленными параметрами:

Процедура ПередОткрытием ( Отказ , СтандартнаяОбработка )
ПараметрДатаНач = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "НачалоПериода" ) ;
ПараметрДатаНач . Использование = Истина;
ПараметрДатаНач . Значение = ДатаНач ;

ПараметрДатаКон = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "КонецПериода" );
ПараметрДатаКон.Использование = Истина;
ПараметрДатаКон.Значение = ДатаКон ;

ПараметрОрганизация = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "Организация" );
ПараметрОрганизация.Использование = Истина;
ПараметрОрганизация.Значение = Организация ;
КонецПроцедуры

Значение параметров ДатаНач, ДатаКон и Организация для этой процедуры нужно определить отдельно.

Читайте также: