Ни у кого не вызывает сомнений необходимость научиться работать с отчетами на СКД и динамическими списками программно. На эту тему написано много хороших статей. Вот некоторые из них:
Пример создания отчета на СКД полностью программно
Все возможные варианты вывода картинок в отчет на СКД
Процедура ПриКомпоновкиРезультата
Сложность здесь заключается не сколько в самом алгоритме программного формирования отчета – он достаточно простой и неоднократно описан:
Схема = СхемаКомпоновкиДанных;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Сложность обычно возникает при программной работе с настройками отчета или динамического списка. Ну или с программным формированием самой схемы компоновки. Программное создание схемы компоновки требуется достаточно редко. В данной статье я его рассматривать не буду. Также за рамками статьи останется программная работа с расшифровкой отчета и вывод картинок. Материалы по этим темам вы найдете по приведенным выше ссылкам.
Я рассмотрю нюансы программной работы с настройками компоновки в целом и конкретно работу с отборами. Отборы - это наиболее распространенный вариант программной работы с отчетами или с динамическим списком.
Прежде чем перейти к практике, как всегда, немного теории. Для тех, кто в теме, и хорошо все это знает, переходите сразу к следующему разделу.
Немного теории…
Компоновщик настроек – это объект, который предоставляет возможность настраивать представление данных отчета или динамического списка построенных на СКД. Объект «Отчет» помимо самой схемы компоновки, имеет компоновщик настроек. В форме отчета компоновщик настроек доступен через основной реквизит формы «Отчет». В форме динамического списка, компоновщик также доступен через основной реквизит формы «Список».
Компоновщик настроек не может существовать без схемы компоновки, он неразрывно связан с ней. Если посмотреть содержимое этого объекта в конфигураторе, можно увидеть следующее:
Как видим, существует аж три различных раздела настроек:
- Настройки
- Пользовательские настройки
- Фиксированные настройки
У тех, кто только начинает осваивать СКД это может вызвать недоумение. И это вполне понятно. Почему бы не сделать только один вариант настроек и не работать с ним?
Ну что же, вполне резонный вопрос. Как минимум, сильно упростилась бы работа с этим объектом.
Но разработчики 1С так не думают. На сколько это оправдано – сказать сложно. В любом случае нам остается только принимать то, что есть, разбираться в этом и искать положительные стороны, которые безусловно есть.
И так разберем по порядку все варианты настроек. Как Вы увидите позже, это очень важно понимать для ПРАВИЛЬНОЙ работы с ними.
Замечу еще раз, что все что будет сказано, справедливо как для отчетов так и для динамических списков.
Настройки
Название говорит о том, что это основные настройки компоновки. Это так и есть. Собственно, открывая конструктор схемы компоновки в конфигураторе или в 1С-предприятии (в режиме толстого клиента) на закладке «Настройки» мы видим и работаем именно с этим вариантом настроек. То-есть при интерактивной работе мы работаем с Настройками компоновки данных.
Подробное описание интерактивной работы с настройками компоновки читайте в статье Работа с настройками системы компоновки.
Тип Настроек компоновки данных - «НастройкиКомпоновкиДанных». Настройки содержат в себе отдельные разделы для работы с отборами, параметрами, порядком, структурой, условным оформлением:
Пользовательские настройки
Пользовательские настройки не доступны в конструкторе схемы компоновки. Как должно быть понятно из названия - это настройки, которые доступны пользователям. Другими словами, это подмножество Настроек, которые доступны пользователям.
Подробнее об интерактивной работе с пользовательскими настройками читайте в статье Работа с пользовательскими настройками.
Не смотря на то, что Пользовательские настройки это подмножество Настроек, для программной работы с ними используется отдельный раздел компоновщика настроек. Более того, его тип - «ПользовательскиеНастройкиКомпоновкиДанных», который отличается от типа Настроек.
В отличие от Настроек, Пользовательские настройки содержат в себе общий список всех элементов настроек, которые включены в пользовательские. Это могут быть как целые разделы (отбор, порядок, структура), так и отдельные элементы того или иного раздела. Это очень ВАЖНО понимать при программной работе с настройками:
Для связи элемента Настроек и Пользовательских настроек существует специальный реквизит Настроек «ИдентификаторПользовательскийНастройки». Собственно для программного включения элемента настроек в пользовательские настройки, достаточно установить для него идентификатор пользовательской настройки:
ЭлементОтбораВНастройках.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
Настройки и Пользовательские настройки могут накладываться друг на друга. В этом случае приоритет будут иметь Пользовательские настройки. Это легко проверить. Можно добавить на форму отчета объект «Отбор» из раздела Настроек, и добавить один из элементов отбора в пользовательские настройки. В этом случае в пользовательском режиме можно установить один и тот же элемент отбора в Настройках и в Пользовательских настройках:
На заметку. Из описанного выше правила есть исключение. Элементы Настроек с режимом отображения «Не доступный» не замещаются элементами пользовательских настроек, а складываются с ними по логическому «И».
Фиксированные настройки
А это уже отдельный, не связанный с другими, вариант настроек. Предполагается, что Фиксированные настройки не доступны для интерактивного редактирования ни в конфигураторе ни в 1С-предприятии. Это не совсем так. Вы можете добавить на форму отчета или динамического списка раздел «Отбор» фиксированных настроек. Это даст возможность редактировать их в пользовательском режиме.
Тем не менее, основное предназначение Фиксированных настроек, это программное редактирование. В большинстве случаев, из Фиксированных настроек используется только раздел «Отбор». Это могут быть любые предустановленные отборы, которые должны быть не доступны для пользователей. Особенно часто элементы фиксированных настроек используются для отображения динамических списков. Они даже вынесены как отдельные реквизиты списка.
Еще одно отличие от Настроек и Пользовательских настроек заключается в том, что Фиксированные настройки применяются ко всем вариантам отчета.
Важно иметь в виду, что при наложении Фиксированных настроек и Настроек или Пользовательских настроек будет вызвано исключение:
На заметку. Среди реквизитов динамического списка присутствуют элементы настроек компоновки, такие как: отбор, группировка, порядок, условное оформление, параметры. Это элементы Фиксированных настроек. Это вполне логично, так как эти настройки не могут быть изменены в Настройках или в Пользовательских настройках.
Доступ к настройкам в процедуре модуля отчета «ПриКомпоновкеРезультата»
В процедуре «ПриКомпоновкеРезультата», можно получить доступ к настройкам через схему компоновки или компоновщик настроек. Получить настройки можно следующим образом:
СхемаКомпоновкиДанных.НастройкиПоУмолчанию – настройки, как они заданы при редактировании схемы компоновки, без учета изменений в пользовательском режиме.
КомпоновщикНастроек.ПолучитьНастройки() – результирующие настройки, которые получены путем совмещения Настроек, Пользовательских настроек и Фиксированных настроек.
Также через компоновщик можно получить непосредственно тот или иной вариант настроек (Пользовательские, Фиксированные…).
То-есть, для программной работы с настройками в процедуре «ПриКомпоновкиРезультата» можно работать с настройками, заданными по умолчанию, отдельно с каким-либо видом настроек либо с результирующими настройками.
Следует иметь в виду, что если используются результирующие настройки и отчет формируется стандартным способом, необходимо загрузить исправленные результирующие настройки обратно в компоновщик настроек:
КомпоновщикНастроек.ЗагрузитьНастройки(СкорректированныеНастройки);
Программная работа с отборами
Наиболее частый вариант программной работы с настройками компоновки - это работа с отборами.
Как уже стало понятно из предыдущего раздела, есть возможность добавить отбор тремя различными способами, в зависимости от необходимого результата. На самом деле способов добавления даже еще больше. Разберем их подробнее.
Отбор может быть изменен пользователями в настройках
Оба эти варианты используются для установки отборов, которые в последствие могут быть изменены пользователями.
Вариант 1. Отбор целиком добавлен в пользовательские настройки:
ОтборНастройки = Отчет.КомпоновщикНастроек.Настройки.Отбор;
//Поиск элемента пользовательских настроек по уникальному идентификатору раздела настроек
ОтборПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ОтборНастройки.ИдентификаторПользовательскойНастройки);
ОтборПоСкладу = Неопределено;
ПолеКомпоновкиСклад = Новый ПолеКомпоновкиДанных("Склад");
//Поиск еже созданного ранее элемента отбора
Для каждого ЭлементОтбора Из ОтборПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
и ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновкиСклад Тогда
ОтборПоСкладу = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЦикла;
//Создание нового элемента отбора в пользовательских настройках
Если ОтборПоСкладу = Неопределено Тогда
ОтборПоСкладу = ОтборПользовательскиеНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСкладу.ЛевоеЗначение = ПолеКомпоновкиСклад;
ОтборПоСкладу.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
//Для вывода отбора в быстром доступе необходимо обязательно назначить идентификатор пользовательской настройки
ОтборПоСкладу.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
СоздатьЭлементыФормыПользовательскихНастроек();
КонецЕсли;
ОтборПоСкладу.Использование = Истина;
ОтборПоСкладу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСкладу.ПравоеЗначение = Склад;
В этом случае работа происходит с коллекцией «Элементы» элемента пользовательских настроек «ЭлементОтбораКомпоновкиДанных». Вся закладка с отборами должна быть включена в пользовательские настройки. Поиск нужного элемента Пользовательских настроек выполняется по уникальному идентификатору полученному из раздела Настроек «Отбор».
В пользовательском режиме, отбор будет доступен в форме отчета (так как указан режим отображения - быстрый доступ) и на закладке «Отбор»:
Вариант 2. Отбор добавлен в настройках и включен в пользовательские настройки как отдельный элемент:
ОтборНастройки = Отчет.КомпоновщикНастроек.Настройки.Отбор;
ЭлементыПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
ОтборПоСкладу = Неопределено;
ПолеКомпоновкиСклад = Новый ПолеКомпоновкиДанных("Склад");
Для каждого ЭлементОтбора Из ОтборНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
и ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновкиСклад Тогда
ОтборПоСкладу = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЦикла;
Если ОтборПоСкладу = Неопределено Тогда
ОтборПоСкладу = ОтборНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСкладу.ЛевоеЗначение = ПолеКомпоновкиСклад;
ОтборПоСкладу.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
//Создаем идентификатор пользовательской настройки, чтобы отбор добавился в пользовательские настройки
ОтборПоСкладу.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
СоздатьЭлементыФормыПользовательскихНастроек();
КонецЕсли;
//Находим отбор в пользовательских настройках по идентификатору
ОтборПоСкладуПользовательскиеНастройки = ЭлементыПользовательскиеНастройки.Найти(ОтборПоСкладу.ИдентификаторПользовательскойНастройки);
ОтборПоСкладуПользовательскиеНастройки.Использование = Истина;
ОтборПоСкладуПользовательскиеНастройки.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСкладуПользовательскиеНастройки.ПравоеЗначение = Склад;
В этом случае работа происходит с коллекцией «Элементы» раздела Настроек «Отбор». Нужно указать идентификатор пользовательской настройки, для добавления отбора в Пользовательские настройки. Далее выполняется поиск добавленного отбора в Пользовательских настройках и настройка параметров отбора: использование, вид сравнения и правое значение.
В пользовательском режиме отбор будет виден только на первой закладке настроек. На закладке «Отбор» его не будет:
Отбор может быть изменен пользователями только при корректировке варианта отчета
ОтборНастройки = Отчет.КомпоновщикНастроек.Настройки.Отбор;
ОтборПоСкладу = Неопределено;
ПолеКомпоновкиСклад = Новый ПолеКомпоновкиДанных("Склад");
Для каждого ЭлементОтбора Из ОтборНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
и ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновкиСклад Тогда
ОтборПоСкладу = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЦикла;
Если ОтборПоСкладу = Неопределено Тогда
ОтборПоСкладу = ОтборНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСкладу.ЛевоеЗначение = ПолеКомпоновкиСклад;
КонецЕсли;
ОтборПоСкладу.Использование = Истина;
ОтборПоСкладу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСкладу.ПравоеЗначение = Склад;
Собственно это второй вариант из предыдущего пункта, только без включения в пользовательские настройки (не указывается идентификатор пользовательской настройки).
Здесь есть один важный момент. Вся закладка отборы не должна быть включены в пользовательские настройки. Иначе отбор работать не будет, так как он будет «перебиваться» отбором в Пользовательских настройках, который не установлен.
В пользовательском режиме отбор будет доступен только при корректировке варианта отчета:
А что же будет, если режим отображения отбора сделать недоступным?
Судя по логике, отбор не должен быть виден в пользовательских настройках, даже если вся закладка с отборами в пользовательские настройки включена…
Но это не так. Более того, если назначить уникальный идентификатор у созданного отбора он будет включен в Пользовательские настройки как отдельный элемент и его поведение никак не будет отличаться от отбора с видом отображения «Обычный».
Но отличие все-таки есть. Как уже было написано выше, отборы из Настроек с режимом отображения «Недоступный», не замещаются Пользовательскими настройками. То-есть если весь раздел «Отбор» включен в Пользовательские настройки, недоступный отбор в Настройках будет работать корректно.
Однако поступая таким образом можно ввести в заблуждение пользователей. Если они захотят добавить этот же отбор в Пользовательские настройки, отборы будут соединены по логическому «И». И никакой информации о том, что отбор по этому полю уже есть, пользователь не увидит.
Отбор не может быть изменен пользователями:
ОтборНастройки = Отчет.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
ОтборПоСкладу = Неопределено;
ПолеКомпоновкиСклад = Новый ПолеКомпоновкиДанных("Склад");
Для каждого ЭлементОтбора Из ОтборНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
и ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновкиСклад Тогда
ОтборПоСкладу = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЦикла;
Если ОтборПоСкладу = Неопределено Тогда
ОтборПоСкладу = ОтборНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСкладу.ЛевоеЗначение = ПолеКомпоновкиСклад;
КонецЕсли;
ОтборПоСкладу.Использование = Истина;
ОтборПоСкладу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСкладу.ПравоеЗначение = Склад;
Этот вариант работы с Фиксированными настройками используется в тех случаях, когда не предполагается, что пользователи будут изменять установленный отбор, и отбор должен выполняться для всех вариантов отчета. Сам отбор не будет виден в пользовательском режиме ни в настройках ни при редактировании варианта отчета. При попытке использования этого же отбора будет выдано исключение:
БСП нам в помощь
В современных конфигурациях можно использовать типовую процедуру из БСП:
КомпоновкаДанныхКлиентСервер.ДобавитьОтбор(
НастройкиКомпоновки,
Новый ПолеКомпоновкиДанных("Склад"),
Склад,
ВидСравненияКомпоновкиДанных. Равно,
Использование,
Новый Струкура("ВПользовательскиеНастройки, ЗаменятьСуществующий", Истина, Истина);
Параметр «НастройкиКомпоновки» может принимать значение следующих типов:
- КомпоновщикНастроекКомпоновкиДанных,
- НастройкиКомпоновкиДанных,
- ОтборКомпоновкиДанных.
В случае, если передан компоновщик настроек, есть возможность добавить отбор как в Настройки так и в Пользовательские настройки.
К сожалению нет возможности добавить добавленный отбор в быстрый доступ или сделать отбор недоступным.
Работа с остальными настройками
Работа с параметрами, порядком и условным оформлением аналогична работе с отборами. Настройки объединяются по таким же принципам, как и отборы. Программный код для их формирования я приводить не буду, так как публикаций на эту тему достаточно много.
А вот работа с группировками (структурой) несколько отличается. Это связано с тем, что группировки в Настройках представлены в виде иерархической структуры, как мы ее видим при интерактивном редактировании. А в Пользовательских настройках, группировки выглядят в виде линейного списка. По этой причине и программная работа со структурой в этих двух случаях отличается.
Добавление группировок в Настройки:
Группировки = Список.КомпоновщикНастроек.Настройки.Структура;
Группировки.Очистить();
Группировка1 = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Группировка1");
//Создание второй группировки в структуре первой
Группировка2 = Группировка1.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка2.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Группировка2");
Добавление группировок в Пользовательские настройки:
СтруктураНастройки = Отчет.КомпоновщикНастроек.Настройки.Структура;
//Поиск элемента пользовательских настроек по уникальному идентификатору раздела настроек
СтруктураПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(СтруктураНастройки.ИдентификаторПользовательскойНастройки);
Группировки = СтруктураПользовательскиеНастройки.Структура;
Группировки.Очистить();
Группировка1 = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Группировка1");
Группировка2 = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка2.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Группировка2");
Что же касается Фиксированных настроек, описание на этот счет никакого нет. Опыты показывают, что группировки добавленные в фиксированные настройки никак не влияют на результирующую структуру.
На этом все, спасибо за внимание. Успехов Вам в программной работе с СКД!
Для ознакомления с предыдущими моими статьями по СКД можно перейти по ссылкам ниже: