Платформа на момент разработки: 1С:Предприятие 8.3 (8.3.19.1467)
Конфигурация: Управление холдингом, редакция 3.1 (3.1.16.5)
Версия БСП: 3.1.5.306
Понадобилось написать отчет на СКД.
Было решено использовать формы отчета, предоставляемые БСП ("ФормаОтчета", "ФормаНастроекОтчета", "ФормаВариантаОтчета"). Это удобно и для разработчика, и для пользователя - в большинстве случаев достаточно создать основную схему компоновки данных, задать параметры и отборы - и удобный отчет с развитым функционалом готов. Он позволит пользователю задавать всевозможные отборы, сохранять и редактировать свои варианты отчета, просматривать, распечатывать и отправлять результат на почту. При этом, помимо того, что не нужно создавать свои формы отчета - зачастую можно вообще обойтись без написания какого-либо программного кода, за исключением текста запроса в наборе данных схемы компоновки отчета. Удобно со всех сторон.
Формы отчета, предоставляемые БСП, указаны в палитре свойств для корня конфигурации:
Для того, чтобы задействовать их в своем отчете, в свойствах отчета просто не нужно указывать никаких форм - тогда платформа применит формы от БСП, указанные в корне конфигурации:
Но, как это часто бывает - есть и нюансы).
На практике достаточно часто встречается ситуация: в запросе СКД один из параметров - список значений. В моем случае это список с элементами типа "СправочникСсылка.СтатьиЗатрат", причем статьи затрат - не предопределенные, а созданные пользователями в режиме 1С:Предприятие. А это значит, что непосредственно задать их в редакторе схемы компоновки не получится:
Таким образом,
Задача выглядит так: при первоначальном открытии список статей затрат должен быть по умолчанию заполнен определенным набором, а у пользователя должна быть возможность редактировать этот список.
Есть два способа решения задачи.
Первый способ (сохраняя и загружая настройки в xml)
На первый взгляд, очевидный, но с некоторыми лишними телодвижениями.
Вариант А.
Пробуем решить "в лоб", сохраняя и загружая настройки в xml из БСП форм. Забегая вперед - получим ошибку "Ошибка преобразования данных XDTO", но её можно обойти.
Краткую видеоинструкция на эту тему видел по адресу https://youtu.be/HnIErIECLeM
Сохраняем настройки в xml из отчета в режиме 1С:Предприятие, предварительно заполнив параметр "Статьи затрат" нужным списком статей:
При загрузке настроек xml в Конфигураторе получаем ошибку преобразования типов:
В моем случае платформа почему-то ругалась на документ ПоступлениеДопРасходов, хотя нигде в запросе и настройках он не упомянут:
Скорее всего, это связано с внутренней реализацией механизма выгрузки настроек СКД в БСП, в результате которой генерится невалидный xml (или процедура загрузки настроек схемы из файла в платформе требует доработки?..).
Решается проблема достаточно просто - редактированием xml файла.
Если в редакторе XML (я пользуюсь старым добрым XML Notepad 2007, который можно бесплатно скачать с сайта Microsoft), то надо удалить ветку с тэгом additionalProperties:
Если в Блокноте, то надо найти открывающий тэг <additionalProperties> и удалить все до закрывающего тэга </additionalProperties> включительно:
После сохранения отредактированный файл настроек без проблем загрузился в Конфигуратор:
Вариант Б.
Если не хотите заморачиваться с редактированием xml-файла настроек.
Сначала в Конфигураторе надо создать свои форму отчета и форму настройки отчета, используя автоматически создаваемые формы при нажатии на значок лупы:
Для чистоты эксперимента создадим все три формы (ФормаОтчета, ФормаНастроекОтчета, ФормаНастроекВарианта), хотя форму настроек варианта можно и не создавать - настройки сохранялись корректно и из БСП формы, я проверял.
Сохраняем, в результате отчет будет пока использовать собственные формы.
Далее в режиме 1С:Предприятие, нужно открыть отчет, зайти в "Еще\Изменить вариант...":
В открывшемся окне на закладке "Параметры" заполнить параметр "Статьи затрат" списком нужных статей, сохранить настройки схемы в xml и загрузить их в Конфигураторе:
Ну и наконец в Конфигураторе загружаем настройки из xml:
Мы видим, что параметр "Статьи затрат" заполнился списком значений (где каждая статья затрат представлена в виде ГУИДа).
Теперь удаляем привязку к созданным формам в палитре свойств отчета, чтобы отчет стал использовать формы БСП, и сохраняем:
В результате в режиме 1С:Предприятие наш отчет откроется с уже заполненным списком статей затрат, который можно редактировать, и будет доступен весь функционал формы "ФормаОтчета" из БСП.
Второй способ.
Здесь нам не понадобится ни загружать/выгружать настройки в xml, ни редактировать полученный xml-файл настроек.
Используем механизм БСП - создадим процедуру в модуле объекта нашего отчета:
// Остальные настройки см. в описании функции в общем модуле ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию()
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПередЗаполнениемПанелиБыстрыхНастроек = Истина;
КонецПроцедуры
И опишем саму процедуру-обработчик, в которой заполним нужный нам параметр списком значений:
Процедура ПередЗаполнениемПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
ЗначениеПараметраНастроекКомпоновкиДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СтатьиЗатрат"));
Если ЗначениеПараметраНастроекКомпоновкиДанных <> Неопределено Тогда
Идентификатор = ЗначениеПараметраНастроекКомпоновкиДанных.ИдентификаторПользовательскойНастройки;
ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
Если ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных <> Неопределено Тогда
Если
(ТипЗнч(ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных.Значение) = Тип("СписокЗначений") и ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных.Значение.Количество() = 0)
Или Не ЗначениеЗаполнено(ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных.Значение)
Тогда
СтатьиЗатратСписок = ИходныйСписокСтатей();
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СтатьиЗатрат", СтатьиЗатратСписок);
ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных.Значение = СтатьиЗатратСписок;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этой процедуре мы ищем параметр данных "СтатьиЗатрат", заданный в СКД на закладке "Параметры", берем из него
ИдентификаторПользовательскойНастройки
по которому находим
ЗначениеПараметраПользовательскихНастроекКомпоновкиДанных
и присваиваем значение (список значений) обязательно и параметру данных, и соответствующему ему пользовательскому параметру.
Функция ИсходныйСписокСтатей() возвращает список значений, заполненный нужными статьями затрат. Я реализовал ее через ЗначениеВСтрокуВнутр (в приложенном примере). В общем случае можно просто создавать список значений и каждый элемент списка искать например по коду, ГУИД, или каким-либо другим способом.
В целом, этот подход начального заполнения параметра списком значений можно использовать при разработке отчетов на СКД в любых конфигурациях, использующих указанную версию БСП. Предполагаю, что и на других версиях БСП 3.х.х.х это также возможно, главное - чтобы в корне конфигурации были описаны формы отчета, настроек и варианта (опционально) и были соответствующие общие модули.
Полный пример внешнего отчета по этому способу - прикладываю.
Надеюсь, статья будет полезна, и кому-то не придется тратить время на изобретение велосипеда)
Буду рад комментариям.