Добавляем пользователю вычислимые поля в СКД без программирования
Пользователь настроил отчет по движению денег на базе универсального отчета, но хотел пересчитывать валютную сумму оборота по валюте по курсу на конец отчета.
В пользовательских полях, к сожалению, нельзя использовать функции общего модуля.
Но зато есть возможность редактировать схему (в толстом клиенте):
В схеме настройка пользователя выглядит так:
Важно! При изменении схемы компоновки настройки отчета слетают и даже через файл их не подгрузить. Приходится устанавливать заново вручную.
В принципе, можно подгрузить настройки как настройки по умолчанию для СКД (схемы) этого отчета. Если отчет достаточно сложный.
Если попробовать выгрузить настройки в ZIP-файл, 1С загружает их в новую настройку почему-то, а не заменяет в текущей. Долго я с этим не разбирался, т.к. отчет простой.
В вычисляемые поля добавляю новое поле СуммаУпр по формуле:
РаботаСКурсамиВалют.ПересчитатьВВалюту(СуммаВалОборот, Валюта, УправлениеНебольшойФирмойПовтИсп.ПолучитьВалютуУчета(), &КонецПериода)
Однако при запуске наша формула не работает, выдает синтаксическую ошибку на название вызываемой функции.
Отладка показывает, что вызов процессора компоновки универсального отчета осуществляется в модуле отчета УниверсальныйОтчет без разрешения использования функций общего модуля:
Добавляем это разрешение с помощью расширения этого модуля:
&ИзменениеИКонтроль("ПриКомпоновкеРезультата") Процедура дор_ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) Настройки = КомпоновщикНастроек.ПолучитьНастройки(); Отчеты.УниверсальныйОтчет.ВывестиКоличествоПодчиненныхЗаписей(Настройки, СхемаКомпоновкиДанных, СтандартнаяОбработка); Если СтандартнаяОбработка Тогда Возврат; КонецЕсли; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; #Удаление ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки); #КонецУдаления #Вставка ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, истина); //Разрешаем использовать функции общих модулей #КонецВставки ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры
После этого отчет формируется. Теперь пользователь может использовать поле «Сумма упр», которое пересчитывает сумму в валюте по курсу валюты на конец периода отчета:
Среда: 1.6.27.167. Объем: 1 час.
1. Изменение схемы СКД
2. Изменение кода
Это без программирования, ага
Зри глубже в суть. Тут программист привлекается один раз, а потом пользователь может дополнительный параметр использовать далее. Не нужно писать отдельный отчет целиком, как я хотел уже предложить. И потом, код модуля тоже меняется лишь раз, чтобы поправить недостаток 1С, которая не озаботилась разрешить использовать функции общего модуля.