Нюансы работы компоновщика настроек. Отборы в отчётах

Мы довольно подробно рассмотрели настройки отчетов, реализованных на базе СКД. Теперь разберем более тонкие и детальные настройки вариантов отчета. Окно «продвинутых» настроек варианта отчета вызывается по команде «Еще» - «Прочее» - «Изменить вариант отчета».

Окно изменения варианта отчета разделено на две части:

1. Структура отчета.

2. Настройки отчета.


Раздел структуры варианта отчета аналогичен вкладке «Структура» стандартных настроек отчета. Назначение и настройка группировок подробно рассмотрена в ч. 1 статьи.

Таблица структуры варианта отчета, кроме непосредственно колонки с группировками, содержит несколько дополнительных колонок:

Раздел настроек варианта отчета дает пользователю широкие возможности по конфигурированию отчета под свои потребности. Она практически полностью совпадает со стандартными настройками отчета, рассмотренными в ч. 1. Рассмотрим все вкладки раздела и отметим различия.

Раздел настроек состоит из следующих вкладок:

1. Параметры. Содержит параметры СКД, доступные пользователю.

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


Таблица параметров представлена в формате «Параметр»-«Значение». При необходимости можно менять значения параметров. Нажатие на кнопку «Свойства элемента пользовательских настроек» открывает пользовательские настройки элемента.


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

Свойства элемента пользовательских настроек также имеют группируемые поля, поля, отборы и элементы условного оформления.

2. Пользовательские поля. Содержит поля, которые формирует сам пользователь на основании данных, выбираемых отчетом.


Пользователь может добавить два вида полей:

  • Новое поле выбор…
  • Новое поле выражение…

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


Например, вычислим оценку количества продаж. Будем считать, что, если продано меньше 10 единиц товара, продали мало, а если больше 10 единиц - много. Для этого зададим 2 значения вычисляемого поля: первое будет с отбором «Количество товаров Меньше или равно "10"», второе с отбором «Количество товаров Больше "10"».

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

Например, вычислим средний процент скидки. Средний процент скидки рассчитывается по формуле: [Сумма продаж без скидки] - [Сумма продаж со скидкой] / [Сумма продаж без скидки]. Необходимо помнить, что сумма продаж без скидки может быть нулевой, поэтому используем оператор ВЫБОР для проверки. Получим следующие выражения:

· Для детальных записей:

Выбор

Когда [Сумма продаж без скидки] = 0

Тогда 0

Иначе [Сумма продаж без скидки] - [Сумма продаж со скидкой] / [Сумма продаж без скидки]

Конец

· Для итоговых записей:

Выбор

Когда Сумма([Сумма продаж без скидки]) = 0

Тогда 0

Иначе Сумма([Сумма продаж без скидки]) - Сумма([Сумма продаж со скидкой]) / Сумма([Сумма продаж без скидки])

Конец

Как было сказано ранее, в выражении итоговых записей используем агрегатную функцию «Сумма».

3. Группируемые поля. Содержит поля, по которым будет группироваться результат варианта отчета. Группируемые поля настраиваются отдельно для каждой из группировок, но можно задать общие группируемые поля для варианта отчета, если выбрать в дереве структуры корень «Отчет». Можно добавить поле из результата отчета, пользовательское поле или выбрать авто поле, тогда система подберет поля автоматически. Также данная вкладка позволяет изменять порядок следования группируемых полей.


4. Поля. Содержит поля, которые будут выведены в результат варианта отчета. Поля настраиваются отдельно для каждой из группировок, но можно задать общие поля для варианта отчета, если выбрать в дереве структуры корень «Отчет». Можно добавить поле из результата отчета, пользовательское поле или выбрать авто поле, тогда система подберет поля автоматически. Также данная вкладка позволяет изменять порядок следования полей.

Поля можно группировать, чтобы логически выделить какую-либо часть отчета или задать особое расположение колонок. При добавлении группы становится активна колонка «Расположение» и позволяет выбрать один из вариантов расположения:

  • Авто - система располагает поля автоматически;
  • Горизонтально - поля располагаются горизонтально;
  • Вертикально - поля располагаются вертикально;
  • В отдельной колонке - поля располагаются в разных колонках;
  • Вместе - поля располагаются в одной колонке.


5. Отбор. Содержит отборы, используемые в варианте отчета. Настройка отборов была подробно рассмотрена в части 1 данной статьи. Отборы настраиваются отдельно для каждой из группировок, но можно задать общие отборы для варианта отчета, если выбрать в дереве структуры корень «Отчет».


6. Сортировка. Содержит поля сортировки, используемые в варианте отчета. Настройка полей сортировки была подробно рассмотрена в части 1 данной статьи. Сортировка настраиваются отдельно для каждой из группировок, но можно задать общие поля сортировки для варианта отчета, если выбрать в дереве структуры корень «Отчет».


7. Условное оформление. Содержит элементы условного оформления, используемые в варианте отчета. Настройка условного оформления была подробно рассмотрена в части 1 данной статьи. Условное оформление настраивается отдельно для каждой из группировок, но можно задать общие элементы условного оформления для варианта отчета, если выбрать в дереве структуры корень «Отчет».


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


В заключение хотелось бы отметить, что настройки отчета можно не только сохранять в качестве варианта отчета, но и выгружать в файл (меню «Еще» - «Сохранить настройки»). Для загрузки необходимо выбрать «Загрузить настройки» и выбрать сохраненный файл. Таким образом, мы можем передавать настройки варианта отчета между различными базами, имеющими одинаковую конфигурацию.


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

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Система компоновки данных 1С 8.3 для начинающих: делаем связь наборов данных

  • Написать отчёт, который выводит клиентов и их любимые продукты. У каждого клиента есть любимый цвет, а у каждого продукта свой цвет - вот на основании этих цветов и нужно определять "любимость" продукта. К примеру, если у Андрея любимый цвет красный, то одним из его любимых продуктов будут помидоры (они красного цвета).
  • Применить в отчёте два набора данных. Первый набор - это данные из таблицы справочника "Клиенты". Второй - данные из таблицы справочника "Еда".
  • Осуществить связь этих двух наборов , чтобы в отчёте остались только любимые продукты для каждого из клиентов.

Создаем новый отчет

Открываем базу "Гастроном" в конфигураторе и через главное меню создаём новый отчет:

Вид документа - "Внешний отчет":

В форме нового отчёта указываем имя "Урок6" и нажимаем кнопку "Открыть схему компоновки данных":

Оставляем имя схемы по умолчанию:

Добавляем первый набор данных

В открывшейся схеме переходим на закладку "Наборы данных" и через зелёный плюсик выбираем "Добавить набор данных - запрос":

Вызываем конструктор запроса:

Указываем таблицу "Клиенты" и поля, которые требуется получить из запроса:

Добавляем второй набор данных

Добавляем второй набор данных:

Выделяем его (НаборДанных2) и снова вызываем конструктор запроса:

Указываем таблицу справочника "Еда" и поля, которые требуется получить из запроса:

Получился такой текст запроса:

Обратите внимание, что у нас сейчас в отчёте присутствуют два набора данных: НаборДанных1 и НаборДанных2. У каждого свой текст запроса и свои данные.

Делаем имена более наглядными

Для наглядности, давайте переименуем НаборДанных1 в Клиенты, а НаборДанных2 в Еда.

Сделайте это двойным щелчком по каждому из наборов:

Данные каждого из наборов мы сможем использовать в нашем отчёте. К этим данным мы будем обращаться через поля.

В данный момент у набора "Клиенты" следующие поля: "Наименование" и "ЛюбимыйЦвет", а у набора "Еда": "Наименование" и "Цвет".

Видим, что имена пересекаются и мы легко запутаемся. Поэтому давайте изменим имена полей на более говорящие.

Выделяем набор "Клиенты" и меняем имена полей так:

Затем выделяем набор "Еда" и меняем имена полей так:

Вызываем конструктор настроек

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

Тип отчета - "Список...":

Выбираем поля для отчета из обоих наборов:

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

Проверяем отчёт

Сохраняем отчет и формируем в режиме пользователя:

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

Но нам нужно из всех этих записей оставить только те у которых поле "ЛюбимыйЦветКлиента" равно полю "ЦветЕды":

Осуществляем связь двух наборов данных

Для этого осуществим связь двух наборов данных (Клиенты и Еда) по полям ЛюбимыйЦветКлиента и ЦветЕды.

Переходим на закладку "Связи наборов данных" и нажимаем на кнопку-плюсик, чтобы добавить новую связь:

Настраиваем параметры как на рисунке ниже:

Сделаю пояснения.

Источник и приёмник связи. Ну тут всё понятно. Указываем первый набор (Клиенты) и второй набор (Еда) данных. Хочу обратить особое внимание, что связь будет осуществляться по принципу внешнего левого соединения (мы его проходили в теме запросов в прошлых модулях). Исходя из этого и нужно выбирать какой набор будет источником, а какой приёмником.

Выражение источник. Указываем здесь выражение или просто поле из набора данных источника (мы здесь указали поле ЛюбимыйЦветКлиента из набора Клиенты).

Выражение приемник. Указываем здесь выражение или просто поле из набора данных приёмника (мы здесь указали поле ЦветЕды из набора Еда).

Таким образом данная связь оставит из прошлого списка только те строки, у которых поле ЛюбимыйЦветКлиента равно полю ЦветЕды.

Сохраним отчёт и запустим в режиме пользователя:

Отлично!

Сделаю пояснение про поле "Условие связи ", об которое так часто бьют свои копья начинающие программисты.

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

В этом случае для всех строк из источника связи перед осуществлением связи будет проверяться это выражение (условие связи). И если это выражение равно ИСТИНА, то будет предприниматься попытка установить связи этой строки со строками из приемника связи. Если же выражение равно ЛОЖЬ, то таких попыток предприниматься не будет.

Полагаю, нет нужды рассказывать, что такое СКД, компоновщик настроек и вообще весь набор объектов, предназначенных для работы с СКД. Основные направления использования, не считая хитрых действий в коде, это динамические списки и отчёты, причём в обоих случаях «за кадром» остаётся весьма существенный функционал. Мы зачастую даже не задумываемся, какова логика поведения и взаимосвязи всех участников процесса, т.к. обычно решаем достаточно простые задачи или полагаемся на умолчания платформы. Но, где есть умолчания, есть и внутренняя логика, эдакая «медвежья услуга» 1С, преодолеть плоды которой для достижения нужного эффекта иногда трудно и неочевидно, и при этом достаточно лишь правильно воспользоваться инструментарием.

Желающие могут пропустить части 1-4 и сразу перейти к примерам.

Попробую чуть более подробно остановиться на работе отборов СКД для случая их применения в отчётах. Полагаю, поведение в динамических списках, за рядом оговорок, будет близким. Итак, отборы в отчётах, немного теории и потом конкретные примеры.

Используются СП 8.3.6 и выше, разделы ИТС (пункт 10.3.7.5 и др.), книга «Профессиональная разработка в системе 1С-Предприятие 8» (Казань, 2012 г., второй том). В книге Е.Хрусталёвой вообще ничего внятного на эту тему не нашлось.

Часть 1

У компоновщика настроек, как известно, есть коллекции «Настройки», «Фиксированные настройки» (далее «ФН») и «Пользовательские настройки» (далее «ПН»). У отчёта может быть задано несколько вариантов, при этом связи между вариантом, Н, ПН и ФН весьма своеобразны. Также, не будем забывать об источнике доступных настроек, и его «прародителе», которым обычно бывает сама схема, тоже имеющая свои настройки по умолчанию.

* Настройки – настройки, созданные в режиме Конфигуратора и изменяемые в режиме правки варианта отчёта;

* ПользовательскиеНастройки – настройки, которые изменяет пользователь в режиме «1С:Предприятие» сугубо интерфейсно;

* ФиксированныеНастройки – те настройки, которые задаются из встроенного языка, в т.ч. неявно задаются системой. В это свойство попадают значения отбора, которые передаются в форму с помощью ее параметров (структура «Отбор»).

Настройки и ФН схожи по устройству и имеют коллекцию «Отбор» типа «Отбор компоновки данных», доступную для изменения состава в любое время существования отчёта. При этом Настройки доступны для интерфейсного изменения через правку варианта, а ФН вообще никак не доступны. ПН, в свою очередь, это «каша», где равноправными элементами могут быть как сам «Отбор», так и отдельные объекты типа «Элемент отбора компоновки данных» (т.н. вложенный объект). Несмотря на наличие соответствующих методов, изменять состав коллекции элементов ПН программно нельзя, если это ПН самого отчёта, а не сделанные «с нуля» конструктором – 1С сообщит, что «Коллекция пользовательских настроек не может изменять свой состав, так как она связана с настройками компоновки данных.» На ИТС сказано: «Свойство недоступно для записи с помощью встроенного языка.», но, как мы увидим позже, повлиять на ПН можно. «Каша» объектов имеет внутренние связи – она проверяется на непротиворечивость условий при формировании отчёта, и при изменении состава. На ИТС читаем: «Не будут добавляться элементы, которые сами отмечены как пользовательские. Например, в пользовательский отбор не будет помещен элемент отбора, который отмечен как пользовательский. Не будут добавлены элементы, содержащие пользовательские элементы. Например, не будет добавлена группа условий, если в этой группе присутствуют элементы, отмеченные как пользовательские. Для вложенных элементов свойство РежимОтображения не анализируется. Они добавляются или не добавляются вместе с родительскими элементами.» Таким образом, негласно действует «старшинство» объектов. При этом можно получить эффект, когда интерфейс позволит указать противоречивые отборы для варианта и его ПН, а также внутри ПН.

Казалось бы, «старшим» является вариант. Но нажатие на "Ещё"/"Изменить вариант" и подтверждение изменений в открывшейся форме вызывает обработчик события формы , при этом отбор появляется в панели "Основные" на форме, вызываемой из "Настройки...", и появляется на форме отчёта, но НЕ показывается на закладке "Отбор"; причём либо он появляется сразу и на основной форме отчёта, и на форме по "Настройки..." (если есть флаг "Включать в пользовательские настройки"), либо ни там, ни там. Но в любом случае на закладке "Отбор" формы "Настройки..." его НЕ будет. Разница между закладкой "Основные" формой "Настройки..." и основной формой отчёта определяется полем "Режим редактирования" (обычный - только в "Настройках", быстрый - ещё и на самой форме отчёта), но это, думаю, все знают. Кстати, значения «Отбора» и «Быстрых» никак не синхронизированы и могут противоречить друг другу, а вот «Быстрый» на форме отчёта и на форме настроек жёстко синхронны. Так вот, при правке варианта он сам становится изменённым (но его ID и имя не меняются), а вот ПН остаются НЕ модифицированными (т.е. даже если речь о них, т.е. о флаге включения того или иного элемента в ПН).

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

ПриЗагрузкеВариантаНаСервере

ПриОбновленииСоставаПользовательскихНастроекНаСервере

При этом ни вариант, ни ПН ничем и никак не изменяются. Отсюда ясно, что вариант и настройки если и связаны, то отнюдь не напрямую.

Нажатие на "Настройки..." и подтверждение изменений в открывшейся форме вызывает только событие ПриОбновленииСоставаПользовательскихНастроекНаСервере (при этом ПН становятся изменены, но представления и ключа (если их не было) не получают; если включён «Быстрый» для элементов объекта «Отбор» ПН, то кроме "Отбор", появляются и собственно его элементы как поля, т.е. ведёт себя аналогично вложенным элементам. Эти сделанные настройки сохраняются при закрытии и восстанавливаются при следующем входе в форму. Вариант оно никак трогает и не меняет.

Нажатие на "Ещё"/"Установить стандартные настройки" в форме настроек (а также и пункт «Стандартные настройки» в правке варианта) вызывает только событие ПриОбновленииСоставаПользовательскихНастроекНаСервере . При этом вариант становится изменённым, а вот ПН меняются. Если перед этим вариант был изменён, он остаётся изменённым (ни сброса флага изменённости, ни сброса реально сделанных настроек не происходит).

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

Отсюда рекомендация: если надо в режиме «Конфигуратор» задать некие отборы, чтобы не возиться с кодом и чтобы при этом их не было в варианте, но были бы в интерфейсе отчёта – следует манипулировать не элементами отбора варианта, меняя их свойства, а самим отбором, кнопками «Свойства элемента…» и «Пользовательские настройки».

Добавление чего-либо, появившегося в Настройках, в состав ПН, требует действий в коде или интерфейсе, а вот удаление и очистка Настроек сказываются на ПН сразу и безо всяких обновлений, например:

Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();

Перед закрытием формы отчёта система спрашивает, только если были изменения варианта. Если были изменения ПН, они сохранятся автоматически безо всяких вопросов, и так же автоматически попытаются примениться в следующем сеансе работы с отчётом.

Примечания:

При ряде ошибок именно применения настроек сначала выводится сообщение о проблеме, а потом всё равно происходит компоновка, вызов события и построение отчёта. При этом ФН, если они и были, всё равно игнорируются, и роль играют только Настройки.

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

Установка изменённости варианта и установка изменённости ПН не связаны напрямую, это два разных направления изменений.

У ПН, помимо прочего, есть «Дополнительные настройки». Мне никак не удалось понять, чем и в какой момент они заполняются. Хотя в отчёте и есть настройки, "отмеченные в отборе и условном оформлении" как пользовательские (согласно СП), но дополнительные настройки во всех случаях оказывались пусты. На ИТС об этом ничего.

Несмотря на утверждение в СП, ПН прекрасно сериализуются в xml.

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

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

Часть 2

Работа с Настройками и ФН через их коллекцию почти всегда допустима, но важно помнить, что меняется сущность «третьего уровня». На первом уровне всегда находятся настройки самой СКД по умолчанию, они же фигурируют неявно в источнике доступных настроек; на втором уровне – настройки используемого варианта. Но тут логика позволяет либо «затереть» нижележащие указания, либо их проигнорировать. А вот работа с ПН вольностей уже не предусматривает, и тонкие манипуляции надо делать с помощью специальных методов, а иногда и временных вспомогательных объектов-посредников, например:

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

У компоновщика настроек имеется метод (), который загружает значения пользовательских настроек, переданные в качестве параметра метода. Метод ПолучитьНастройки () позволяет получить копию текущих настроек (с учетом пользовательских настроек). Метод ЗагрузитьНастройки () загружает переданные настройки в компоновщик настроек (пользовательские настройки также перезаполняются на основании переданных данных, с учётом наличия ключей, см. пример ниже).

Применение пользовательских настроек к основным настройкам выполняется в методе ПолучитьНастройки () компоновщика настроек. При этом выполняются следующие действия:

* Для типов ЭлементОтбораКомпоновкиДанных содержимое элементов копируется в соответствующие пользовательские элементы настроек.

* Для типов ОтборКомпоновкиДанных элементы, находящиеся в основных настройках и отмеченные как Недоступный, остаются без изменения. Элементы из ПН переносятся в основные. Они добавляются в конец коллекции для Отбора.

* Для типов ГруппаЭлементовОтбораКомпоновкиДанных устанавливается свойство Использование в соответствующем элементе основных настроек (на основании признака использования элемента ПН).

Часть 3

При формировании окончательной настройки, если цитировать ИТС, различные варианты настроек комбинируются следующим образом:

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

* Если какой-либо вид настроек отмечен как пользовательский не целиком, а поэлементно, то элементы, отмеченные как пользовательские, попадут в результирующие настройки из свойства КомпоновщикНастроек.ПользовательскиеНастройки, а элементы, отмеченные как недоступные, будут взяты в результирующие настройки из свойства КомпоновщикНастроек.Настройки.

* Фиксированные настройки добавляются в результирующие настройки «как есть». При этом недопустима ситуация, когда в ФН и ПН есть одноименные настройки, например отбор с одинаковым левым значением в условии. Замечу, что даже полнейшее совпадение всех свойств этих условий запрещено. Честно говоря, несколько нелогично.

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

Часть 4.

Расширение формы отчёта предоставляет нам параметры «ФН» и «ПН», однако нигде не рекомендуется заполнять их напрямую, передавая в форму. Как показали эксперименты, без дополнительных танцев с бубном наполнение этих параметров игнорируется – оно затирается при инициализации компоновщика в процессе открытия и при получении ранее сохранённых ПН. Рекомендуется работать с ключами ПН, по которым получать их из хранилища настроек и уже тогда раскрывать и использовать, и делается это автоматически на стороне формы отчёта, а не вызывающей формы.

Параметр «ИсточникДоступныхНастроек» автоматически транслируется в сведения компоновщика уже при создании формы на сервере и переопределяться не может. Вернее, может, но эффект это даст только после полного переопределения всей цепочки связанных объектов. При этом ПолучитьИсточникДоступныхНастроек () вплоть до конца отработки всех событий открытия формы будет возвращать Неопределено.

Замечу, что параметры формы, по сути не являющиеся ключевыми, «растягивают» своё действие на несколько событий, если установлен флаг формирования при открытии. Так, в событии ОбработкаПроверкиЗаполненияНаСервере , вызванном при открытии и формировании, параметр «Отбор» будет доступен, а при нём же, но вызванном просто нажатием пользователя на кнопку «Сформировать» - уже нет. Связано это с тем, что все эти события отрабатывают за одно «посещение» сервера, если формирование при открытии включено, и только в самом их конце управление передаётся на клиент и вызывается ПриОткрытии . При этом неключевые параметры, естественно, теряются.

Общий порядок выполнения событий при открытии формы с флагом формирования отчёта при открытии (несколько больше, чем описано в «Проф.разработке»):

ПриСозданииНаСервере

ПередЗагрузкойВариантаНаСервере

ПриЗагрузкеВариантаНаСервере

ПередЗагрузкойПользовательскихНастроекНаСервере

ПриЗагрузкеПользовательскихНастроекНаСервере

ПриОбновленииСоставаПользовательскихНастроекНаСервере

ОбработкаПроверкиЗаполненияНаСервере

ПриОткрытии

При этом ни вариант, ни ПН не являются изменёнными, если не предпринимались специальные усилия.

Часть 5.

Теперь остановимся более подробно на задаче открытия формы отчёта с его построением и предварительно указанным отбором. Краткие сведения об этом есть на ИТС и в методических рекомендациях, но там освещён только сам принцип и не раскрыты тонкости. Итак, для контекстного вызова отчёта необходимо передать его форме параметр «СформироватьПриОткрытии», равный Истина; и параметр «Отбор», содержащий структуру. Ключи структуры – это имена полей СКД или параметров СКД, а значения и есть их значения. Цитируя СП, если есть параметр СКД с именем, соответствующим имени ключа структуры, то значение будет установлено ему. Если параметра нет, но есть поле, то будет добавлен отбор на это поле. При этом, если есть одноимённые параметр и поле, то система просто тихо это проигнорирует и не установит ничего.

В «Проф.разработке» приведён пример изменения (т.е. перехвата и перенастройки) ПН «на лету» в событии ПередЗагрузкойПользовательскихНастроекНаСервере , куда передаётся аргумент, содержащий текущие ПН. На самом деле это не всегда так – например, возможны случаи, когда ошибка сохранения ПН в предыдущем сеансе, или противоречия между Настройками, ФН и ПН приведут к тому, что аргумент «Настройки» будет пуст. И что самое интересное, полноценно перенастроить его в этом событии не удастся, это можно сделать только «в конце» последовательности событий, а именно, в событии ОбработкаПроверкиЗаполненияНаСервере .

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

Для простого случая, когда в СКД ничего не предзадано и никакие элементы не включены в ПН, ситуация такова: Настройки – пусты; ФН – содержат правильный отбор; ПН содержат пустой Отбор. Формирование работает правильно, но с точки зрения пользователя интерфейс противоречит внутренностям и обескураживает – отбор работает, но не виден. Аналогично, если в настройках структуры варианта включить Отбор в ПН, отчёт также строится с учётом отбора, но пользователь также не видит никакие отборы.

Зададим в настройках СКД в Конфигураторе предотборы (равные пустым значениям) и включим их в ПН. По идее, ФН должны заполнить Настройки, а те – ПН, но на самом деле имеем: в Настройках – Отбор с нужным элементом, но пустым правым значением, ФН – содержат правильный отбор, а ПН – всё равно не содержат ничего. Вдобавок, в этом случае и отчёт не построится, т.к. правое значение отбора пусто, несмотря на переданное в параметре Отбор значение.

Попытка поработать с элементами ПН также не даёт результата. Для элемента ПН можно изменить разве что флаг «Использование» и участие в «Быстрых». Значение отбора на интерфейсе будет пустым, никаких ошибок система не выдаст. Аналогично, попытка поработать с Отбором ПН также отработает, в отладчике правое значение будет видно как верно заполненное, но на интерфейсе вы не увидите ничего. А менять состав ПН, напомню, нельзя. Таким образом, требуются дополнительные ухищрения. Например:

&НаСервере Процедура УстановитьПредзаданныеОтборы(ПользНастройки) Если не Параметры.Свойство("Отбор") Тогда Возврат КонецЕсли; Если Параметры.Отбор.Количество()=0 Тогда Возврат КонецЕсли; рТипЭО=Тип("ЭлементОтбораКомпоновкиДанных"); Для каждого киз Из Параметры.Отбор Цикл рПоле=Новый ПолеКомпоновкиДанных(киз.Ключ); // Если (ТипЗнч(киз.Значение)=Тип("Массив") или ТипЗнч(киз.Значение)=Тип("СписокЗначений")) и киз.Значение.Количество()>1 Тогда рВидСравнения=ВидСравненияКомпоновкиДанных.ВСписке; Иначе рВидСравнения=ВидСравненияКомпоновкиДанных.Равно; КонецЕсли; // рНужныйОтбор=Неопределено; // смотрим, есть ли Отбор в польз.настройках рНужныйЭО=Неопределено; // смотрим, есть ли отдельный ЭлементОтбораКомпоновкиДанных в польз.настройках Для каждого элнастр Из ПользНастройки.Элементы Цикл Если ТипЗнч(элнастр)=Тип("ОтборКомпоновкиДанных") и рНужныйОтбор=Неопределено Тогда // он может быть только один рНужныйОтбор=элнастр; // это можно было бы делать и вне цикла, но перебирать польз.настройки надо и ради элементов... ИначеЕсли ТипЗнч(элнастр)=рТипЭО Тогда // это элемент отбора, их может быть много, но нас интересуют не инициализированные или с нужным полем Если элнастр.ЛевоеЗначение=рПоле или элнастр.ЛевоеЗначение=Неопределено и рНужныйЭО=Неопределено Тогда рНужныйЭО=элнастр; КонецЕсли; КонецЕсли; КонецЦикла; // Если рНужныйОтбор<>Неопределено Тогда // он идёт как приоритетный рНужныйЭОизОтбора=Неопределено; Для каждого элотб Из рНужныйОтбор.Элементы Цикл Если элотб.ЛевоеЗначение=рПоле Тогда рНужныйЭОизОтбора=элотб; Прервать КонецЕсли; КонецЦикла; Если рНужныйЭОизОтбора=Неопределено Тогда рНужныйЭОизОтбора=рНужныйОтбор.Элементы.Добавить(рТипЭО); рНужныйЭОизОтбора.ЛевоеЗначение=рПоле; КонецЕсли; рНужныйЭОизОтбора.ВидСравнения=рВидСравнения; рНужныйЭОизОтбора.ПравоеЗначение=киз.Значение; рНужныйЭОизОтбора.Использование=Истина; // рНужныйЭО.Использование=Ложь; ИначеЕсли рНужныйОтбор=Неопределено и рНужныйЭО<>Неопределено Тогда // ставим на элемент рНужныйЭО.ЛевоеЗначение=рПоле; рНужныйЭО.ВидСравнения=рВидСравнения; рНужныйЭО.ПравоеЗначение=киз.Значение; рНужныйЭО.Использование=Истина; КонецЕсли; рНужный=Неопределено; Для каждого элотб Из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл // по-хорошему, тут должен быть рекурсивный поиск! Если ТипЗнч(элотб)=рТипЭО и элотб.ЛевоеЗначение=рПоле Тогда рНужный=элотб; Прервать КонецЕсли; КонецЦикла; Если рНужный=Неопределено Тогда рНужный=Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(рТипЭО); рНужный.ЛевоеЗначение=рПоле; КонецЕсли; рНужный.ВидСравнения=рВидСравнения; рНужный.ПравоеЗначение=киз.Значение; рНужный.Использование=Истина; // КонецЦикла; Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить(); // иначе скажет, что элементы пересекаются/противоречат КонецПроцедуры

Вызывать это наиболее правильно так:

&НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) УстановитьПредзаданныеОтборы(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); КонецПроцедуры

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

&НаКлиенте Процедура ОткрытьОтчет(Команда) Если ЗначениеЗаполнено(Объект.Ссылка) Тогда отб=Новый Структура("СсылкаНаСправочник",Объект.Ссылка); // так поле названо в СКД отчёта ПараметрыФормы=Новый Структура("Отбор,СформироватьПриОткрытии",отб,Истина); ОткрытьФорму("Отчет.Отчет1.Форма.ФормаОтчета",ПараметрыФормы,ЭтаФорма); КонецЕсли; КонецПроцедуры

Часть 6.

При необходимости менять настройки отчёта в процессе работы с ним, в т.ч. и при запуске, и после открытия, наиболее правильным способом представляется изменение «от начала», т.е. от настроек СКД. Изменение схемы СКД выполняется только с объектом Отчёт (или ВнешнийОтчёт), а не с данными формы, и само по себе ничего не меняет - в Настройках и в ПН остаётся то же, что и было, а ФН вообще могут оставаться пусты. Поэтому, в зависимости от наших задач:

После выполнения

Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастрПоУмолч)

изменяется только вариант, и ничего более;

После выполнения приёма, приведённого в п.2 (с использованием «посредника» и метода ЗагрузитьПользовательскиеНастройки ()

срабатывает, только если сбросить текущие ПН средствами интерфейса. Сами по себе они, при изменении варианта, не изменятся. При этом меняется Отбор, но не добавляется новый ЭлементОтбора.

После выполнения

ЭтаФорма.СоздатьЭлементыФормыПользовательскихНастроек(,РежимОтображенияНастроекКомпоновкиДанных.Все)

платформа просто тихо падает. Проверено на нескольких разных релизах. А вызов с режимом отображения настроек только для быстрых не имеет смысла – мы же не повлияли на их состав, поэтому ничего всё равно не изменится.

А поскольку нам всё-таки нужно полноценно изменить не только внутренние отборы, но и отображение на форме отчёта и в связанных формах, то либо приходится менять только Отбор, либо действовать следующим образом:

&НаСервере Процедура ИзменитьСКД() рОбъект=РеквизитФормыВЗначение("Отчет"); отб=рОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Получить(0).Настройки.Отбор; эо=отб.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); эо.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("СсылкаНаСправочник.Поле1"); эо.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно; эо.ПравоеЗначение=Истина; эо.Использование=Истина; ЗначениеВРеквизитФормы(рОбъект,"Отчет"); Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(рОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию); Отчет.КомпоновщикНастроек.Восстановить(); // желательно, хотя ФН это всё равно не затрагивает. // собственно, именно это можно назвать изменением состава ПН Для каждого эл Из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл эл.РежимОтображения=РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; Если ПустаяСтрока(эл.ИдентификаторПользовательскойНастройки) Тогда // можно для элемента ПН использовать метод эл.УстановитьИдентификатор, см.его справку в СП, там всё достаточно внятно эл.ИдентификаторПользовательскойНастройки="ID123"; // важно - идентификатор может быть ЛЮБЫМ, не UUID и не GUID! эл.ПредставлениеПользовательскойНастройки="Проба"; КонецЕсли; КонецЦикла; комп=Новый КомпоновщикНастроекКомпоновкиДанных; комп.ЗагрузитьНастройки(рОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию); Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(комп.ПользовательскиеНастройки); Для каждого эл Из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл эл.РежимОтображения=РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; // вытащим на форму отчёта КонецЦикла; // и вот теперь это даст эффект: ЭтаФорма.СоздатьЭлементыФормыПользовательскихНастроек(,РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ); КонецПроцедуры

Собственно, изучать эту механику можно ещё долго. Эта публикация выросла из изучения способов решения одной конкретной проблемы, и поэтому весьма однобокая; но подоздреваю, что о внутренней логике настроек, особенно пользовательских, вообще можно написать отдельную книгу не тоньше, чем хрусталёвская. У меня на это, к сожалению, сил и времени нет. Кому пригодятся конкретные наработки - уже хорошо.

Кое-что выяснено экспериментально и потому спорно. Знающие больше - приглашаются критиковать и комментировать.

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

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

Для конфигурально предопределенных вариантов можно задать, какие их настройки будут доступны пользователю. Например, можно запретить делать отбор либо группировку для элемента. Это указывается в Свойствах элемента пользовательских настроек:

Указываем вариант доступа пользователя к настройке:

От этого зависит, что пользователь увидит в настройке отчета в Предприятии:

Вопрос 11.32 экзамена 1С:Профессионал по Платформе. Какой вариант отчета в схеме компоновки данных будет считаться по умолчанию?
  1. Тот, который стоит в списке вариантов первым
  2. Тот, у которого установлено свойство вариант по умолчанию
  3. Тот, который определялся первым в процессе создания вариантов
Правильный ответ первый, описание в тексте.
Вопрос 11.35 экзамена 1С:Профессионал по Платформе. Как добавить настройку в список пользовательских настроек?
  1. в форме настройки пользовательского элемента можно указать признак того, что элемент является пользовательским
  2. в форме настройки пользовательского элемента включить быстрый доступ в режиме редактирования
  3. добавление осуществляется установкой флажка в свойстве "Использовать"
Правильный ответ первый.
Вопрос 11.40 экзамена 1С:Профессионал по Платформе. В настройках системы компоновки данных обязательно должны быть заданы
  1. Структура настроек
  2. Параметры
  3. Выбранные поля
  4. Группируемые поля
  5. Сортировка
  6. Все выше перечисленное
Правильный ответ первый. Структура обязательна, все остальной СКД может добавить автоматически, либо оно необязательно в принципе.
Вопрос 11.41 экзамена 1С:Профессионал по Платформе. Каким образом будет выглядеть форма отчета после применения следующих настроек?
  1. В виде таблицы из четырех колонок: "Товар", "Склад", "Количество остаток", "Сумма остаток"
  2. В виде таблицы из трех колонок: "Товар", "Склад", "Количество остаток"
  3. В виде таблицы, количество колонок которой будет зависеть от количества складов, на которых существуют ненулевые остатки
  4. Отчет сформирован не будет
Правильный ответ четвертый - в корневом элементе структуры настроек не стоит галочка, следовательно, данные для вывода не определены.
Вопрос 11.42 экзамена 1С:Профессионал по Платформе. Что произойдет при формировании отчета, если в пользовательском режиме настройки системы компоновки данных отсутствуют?
  1. Будут использованы "Настройки по умолчанию", заданные разработчиком в схеме компоновки данных
  2. Из списка вариантов настроек будет использован вариант, следующий за текущим
  3. Будут использованы пользовательские настройки
  4. Отчет сформирован не будет
Правильный ответ четвертый - приоритено то, что указал пользователь. Пользовательские настройки пусты, следовательно отчет сформирован не будет.
Вопрос 11.43 экзамена 1С:Профессионал по Платформе.
  1. На левую границу первой секунды даты, указанной в параметре "Период"
  2. Будут получены актуальные остатки, если другое значение не задано в параметре системы компоновки данных, созданном на основании имени внешнего параметра, указанного в тексте запроса для параметра "Период" виртуальной таблицы
Правильный ответ четвертый. Галочка "Период" не стоит, то есть пользвательский отбор не задан. В общем случае это означает актуальные остатки, но возможно, параметр периода определен в иной настройке СКД.
Вопрос 11.44 экзамена 1С:Профессионал по Платформе. На какую точку на оси времени будут получены остатки при формировании отчета?
  1. На левую границу первой секунды даты, указанной в параметре "Период"
  2. На правую границу последней секунды даты, указанной в параметре "Период"
  3. Будут получены актуальные остатки
  4. Будут получены актуальные остатки, если другое значение не задано в параметре системы компоновки данных, созданном на основании имени внешнего параметра, указанного в тексте запроса для параметра "Период" виртуальной таблицы
Правильный ответ первый - тут явно указан отбор.

Вопрос 11.45 экзамена 1С:Профессионал по Платформе. На рисунке показана форма отчета, созданная системой по умолчанию. Элемент какого вида настроек обведен рамкой?

  1. Пользовательских настроек
  2. Фиксированных настроек
  3. Варианта настроек
  4. Элемент может относиться к любому виду настроек, в зависимости от значения его свойства "Путь к данным"
Правильный ответ первый.
Вопрос 11.46 экзамена 1С:Профессионал по Платформе. В отчете отбор по полю "Склад" задан одновременно во всех видах настроек. Что произойдет при попытке сформировать отчет?
  1. Отчет сформирован не будет
  2. Отчет будет сформирован с применением отбора из пользовательских настроек
  3. Отчет будет сформирован с применением отбора из фиксированных настроек
  4. Отчет будет сформирован с применением отбора из текущего варианта настроек
Что за "все виды настроек" непонятно, но по ответам правильный вариант первый.
Вопрос 11.47 экзамена 1С:Профессионал по Платформе. В отчете отбор по полю "Склад" задан одновременно в пользовательских настройках и в текущем варианте настроек. Что произойдет при попытке сформировать отчет?
  1. Отчет будет сформирован с применением отбора из пользовательских настроек, если стоит флаг "Использование". Если флаг "Использование" - не установлен, то отбора не будет
  2. Отчет будет сформирован с применением отбора из пользовательских настроек, если стоит флаг "Использование". Если флаг "Использование" - не установлен, то будет использована настройка отбора из варианта настроек
  3. Отчет будет сформирован с применением отбора из варианта настроек, если стоит флаг "Использование". Если флаг "Использование" - не установлен, то отбора не будет
  4. Отчет будет сформирован с применением отбора из варианта настроек, если стоит флаг "Использование". Если флаг "Использование" - не установлен, то будет использована настройка отбора из пользовательских настроек
Правильный вариант первый.
Вопрос 11.49 экзамена 1С:Профессионал по Платформе. При работе с настройками пользователь может задать поле группировки
  1. В отдельном окне "Группировка"
  2. В отдельном окне "Редактирование полей группировки"
  3. На закладке "Группируемые поля"
  4. В отдельном окне "Группировка" и на закладке "Группируемые поля"
  5. В отдельном окне "Группировка", в отдельном окне "Редактирование полей группировки и на закладке "Группируемые поля"
Правильный ответ пятый. Окно Группировка:

Опции Редактирование полей группировки и Группируемые поля:

Вопрос 11.50 экзамена 1С:Профессионал по Платформе. Пользователь создал "с нуля" вариант настроек. Какие настройки ему пришлось редактировать? Выберите наиболее полный и правильный ответ
  1. Выбранные поля отчета, отбор отчета, отбор по складу, дополнительные настройки таблицы, сортировку номенклатуры, параметры, условное оформление номенклатуры
  2. Выбранные поля отчета, отбор отчета, дополнительные настройки таблицы, условное оформление номенклатуры, выбранные поля склада, параметры, сортировку отчета
  3. Выбранные поля отчета, отбор отчета, отбор по складу, дополнительные настройки таблицы, условное оформление номенклатуры, параметры, структуру отчета
  4. Выбранные поля отчета, отбор отчета, отбор по складу, дополнительные настройки отчета, параметры, условное оформление номенклатуры, структуру отчета
Правильный ответ третий, нужно внимательно посмотреть на скриншот.