Отчет на СКД с использованием форм из БСП. Варианты передачи списка значений в параметр СКД

20.04.22

Разработка - БСП (Библиотека стандартных подсистем)

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример отчета на СКД с использованием форм отчета из БСП с программным первоначальным заполнением параметра СКД списком значений
.erf 9,91Kb
18
18 Скачать (1 SM) Купить за 1 850 руб.

Платформа на момент разработки: 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.х.х.х это также возможно, главное - чтобы в корне конфигурации были описаны формы отчета, настроек и варианта (опционально) и были соответствующие общие модули.

Полный пример внешнего отчета по этому способу - прикладываю.

Надеюсь, статья будет полезна, и кому-то не придется тратить время на изобретение велосипеда)

Буду рад комментариям.

ФормаОтчета ФормаНастроекОтчета ФормаВариантаОтчета БСП СКД Параметр СписокЗначений Программное заполнение параметра Ошибка преобразования данных XDTO

См. также

SALE! %

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

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

12000 10000 руб.

02.09.2020    161243    892    399    

872

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотеке стандартных подсистем. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП.

1800 руб.

21.11.2024    523    1    0    

3

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

3 стартмани

05.02.2024    7219    56    obmailok    21    

79

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Стажер Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    6543    mrXoxot    11    

112

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10963    24    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    8241    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cmapnep 19 21.04.22 12:19 Сейчас в теме
А почему выбрали именно событие ПередЗаполнениемПанелиБыстрыхНастроек?
Я использую ПередЗагрузкойВариантаНаСервере и там модифицирую КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы
Возможно ваш способ лучше, но хотелось бы понять чем)
2. eugene-p 54 21.04.22 16:55 Сейчас в теме
Потому что событие ПередЗагрузкойВариантаНаСервере вызывается при интерактивном выборе варианта отчета. При открытии формы оно не срабатывает. ПередЗаполнениемПанелиБыстрыхНастроек - срабатывает именно перед открытием формы, и пользователь видит уже заполненные как надо параметры. Каждый способ хорош для своих целей)
3. anflame 03.06.22 00:08 Сейчас в теме
Огромное спасибо! То, что искала!!!
4. eugene-p 54 03.06.22 05:44 Сейчас в теме
А вам - спасибо за обратную связь) Успехов!
5. SagittariusA 20.12.22 20:01 Сейчас в теме
А случаем не более корректно использовать "ПриОпределенииПараметровВыбора()"?

// Вызывается в форме отчета перед выводом настройки.
//            
//               // Параметры:
//               //   Форма - ФормаКлиентскогоПриложения, Неопределено - форма отчета.
//               //   СвойстваНастройки - Структура - описание настройки отчета, которая будет выведена в форме отчета.
//               //       * ОписаниеТипов - ОписаниеТипов - тип настройки.
//               //       * ЗначенияДляВыбора - СписокЗначений - объекты, которые будут предложены пользователю в списке
//               //         выбора. Дополняет список объектов, уже выбранных пользователем ранее.
//               //       * ЗапросЗначенийВыбора - Запрос - возвращает объекты, которыми необходимо дополнить ЗначенияДляВыбора.
//               //           Первой колонкой (с 0м индексом) должен выбираться объект,
//               //           который следует добавить в ЗначенияДляВыбора.Значение.
//               //           Для отключения автозаполнения
//               //           в свойство ЗапросЗначенийВыбора.Текст следует записать пустую строку.
//               //       * ОграничиватьВыборУказаннымиЗначениями - Булево - когда Истина, то выбор пользователя будет
//               //           ограничен значениями, указанными в ЗначенияДляВыбора (его конечным состоянием).
//               //
//               // См. также:
//               //   ОтчетыПереопределяемый.ПриОпределенииПараметровВыбора().
//               //
//               Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
//               	// Обработка события.
//               КонецПроцедуры
Показать
6. eugene-p 54 21.12.22 08:30 Сейчас в теме
Если честно, то уже не помню. Возможно, пробовал, но не взлетело. Если у вас есть возможность проверить - поделитесь пожалуйста потом результатами
7. Риник 15 17.01.23 15:04 Сейчас в теме
(6) проверил, работает:
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт 

	Если СвойстваНастройки.ДоступнаяНастройкаКД.Заголовок = "Этап" Тогда 
		
		СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
		
		СвойстваНастройки.ЗначенияДляВыбора.Добавить("лолои");
		СвойстваНастройки.ЗначенияДляВыбора.Добавить("лолоивыямавч");
		
	КонецЕсли;
	
КонецПроцедуры
Показать
8. eugene-p 54 17.01.23 18:45 Сейчас в теме
ок, спасибо, попробую при случае.
9. AlekSo 15 27.11.23 09:15 Сейчас в теме
Один маленький нюанс.
Параметр у меня - это массив.
Всё прекрасно заполняется, но на форме окошко остается пустым. Захожу внутрь по кнопке [...] там мой массив заполнен.
В моём случае это не мешает. Но может подскажите как исправить?
(использовал вариант с ПередЗаполнениемПанелиБыстрыхНастроек)
10. Serg2000mr 691 25.05.24 15:02 Сейчас в теме
Можно проще:
Процедура ПередЗаполнениемПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт

    Настройки = КомпоновщикНастроек.Настройки;
    ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;

    ПараметрКД = ОтчетыКлиентСервер.НайтиПараметр(
        Настройки,
        ПользовательскиеНастройки, 
        "СтатьиЗатрат");

    Если ПараметрКД <> Неопределено И ЗначениеЗаполнено(ПараметрКД.Значение) = Ложь Тогда
        ПараметрКД.Значение = ИходныйСписокСтатей();
    КонецЕсли;    
	
КонецПроцедуры
Показать
11. eugene-p 54 25.05.24 18:27 Сейчас в теме
Спасибо за вариант. Выглядит проще и лаконичнее. Единственное, в моем варианте не используются никакие функции общих модулей, которые могут быть подвержены внезапным переделкам/переименованиям)
Serg2000mr; +1 Ответить
12. user2095024 03.07.24 15:34 Сейчас в теме
Здравствуйте! Подскажите почему внешний отчет не реагирует на параметр периода при выгрузке данных по документу. Хотела выгрузить платежные поручения исходящие с расшифровками за определенный период, выгружаются все платежки. В параметрах указываю определенный период, не реагирует.
Оставьте свое сообщение