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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

fixin

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

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

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

  1. rzd:

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

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

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

Добавить комментарий для fixin Отменить ответ

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