Добавляем пользователю вычислимые поля в СКД без программирования

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

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

Но зато есть возможность редактировать схему (в толстом клиенте):

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

Важно! При изменении схемы компоновки настройки отчета слетают и даже через файл их не подгрузить. Приходится устанавливать заново вручную.

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

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

В вычисляемые поля добавляю новое поле СуммаУпр по формуле:

РаботаСКурсамиВалют.ПересчитатьВВалюту(СуммаВалОборот, Валюта, УправлениеНебольшойФирмойПовтИсп.ПолучитьВалютуУчета(), &КонецПериода)

Однако при запуске наша формула не работает, выдает синтаксическую ошибку на название вызываемой функции.

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

Добавляем это разрешение с помощью расширения этого модуля:

&ИзменениеИКонтроль("ПриКомпоновкеРезультата")
Процедура дор_ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

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

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

	Если СтандартнаяОбработка Тогда 
		Возврат;
	КонецЕсли;

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
#Удаление	
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
#КонецУдаления
#Вставка
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, истина); //Разрешаем использовать функции общих модулей
#КонецВставки

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры

После этого отчет формируется. Теперь пользователь может использовать поле «Сумма упр», которое пересчитывает сумму в валюте по курсу валюты на конец периода отчета:

Среда: 1.6.27.167. Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

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

комментария 2

  1. rzd:

    1. Изменение схемы СКД
    2. Изменение кода

    Это без программирования, ага

    • Зри глубже в суть. Тут программист привлекается один раз, а потом пользователь может дополнительный параметр использовать далее. Не нужно писать отдельный отчет целиком, как я хотел уже предложить. И потом, код модуля тоже меняется лишь раз, чтобы поправить недостаток 1С, которая не озаботилась разрешить использовать функции общего модуля.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *