Формирование печатных форм Excel по шаблону. Для версии ТС 3.4 [Продолжение]
Используя посты 7302 и 8466 на форуме Terrasoft подкорректировал и доработал функционал создания отчета Excel с использованием шаблона.
Мои основные доработки касались реализации функционала вставки табличной части отчета (например, для возможности вывода детали продукты документа), остальные изменения касались исправлений ошибок и совершенствования кода для версии 3.4. Ниже я опишу как формируется табличная часть отчета.
Тестировалось пока только на MS Excel 2003.
В качестве основы бралась базовая конфигурация Terrasoft XRM 3.4.0.130.
Форма добавления отчета Excel в системе была доработана с возможностью указания шаблона Excel. Выглядит она вот так:
Чтобы использовать отчет Excel с шаблоном, в карточке отчета небоходимо проставить признак "Отчет по шаблону" и загрузить шаблон.
Excel шаблон можно добавить в отчет либо через окно редактирования отчета (Шаблон -> Изменить шаблон отчета), либо из окна Excel, используя панель инструментов Terrasoft.
Добавление шаблона из окна Excel:
1. Открыть сохраненную ранее заготовку Excel шаблона
2. Соединиться с Terrasoft, нажав кнопку "Соединить":
3. Далее меню "Операции" -> "Связать с отчетом":
4. Выбрать отчет Excel для связки:
5. Excel шаблон изменяется, сохраняется и при его закрытии Terrasoft задаст вопрос о сохранении этого шаблона в базу данных CRM:
Создание шаблона:
1. Для вставки поля используется кнопка "Вставить поле" панели инструментов Terrasoft:
2. Появляется окно с полями из запроса, которая содержит поля главной таблицы и поля деталей запроса:
3. В шаблон добавляются поля главной таблицы и добавляются поля деталей для вывода табличной части, например, продуктов.
Пример внешнего вида шаблона отчета:
(см. shablon.xls)
Краткий алгоритм формирования отчета Excel по шаблону:
1. Заполняются все поля, которые берутся из основной таблицы
2. Если в какой-либо строчке встречается использование поля из табличной части отчета, то эта строчка считается шаблонной.
2.1. Далее эта строчка копируется N раз и заполняется данными табличной части отчета, где N - количество записей табличной части
2.2. Для нумерации строк табличной части используется шаблон #NN>
3. Все вставки, где используется, #CuurentDate> заменяются текущей датой, например, 21.11.2012.
Пример полученного результата:
(см. rezultat.xls)
Все изменения, внесенные в стандартные скрипты авторами этой доработки, выделены такими блоками:
........
// * ExcelTemplate
Список измененных сервисов прикреплен ниже (см. exceltemplate.rar).
Как и писалось ранее в родительских постах, перед "накатыванием" этих сервисов настоятельно рекомендуется сделать бэкап базы.
Функционал предоставляется как есть и используется пользователем без каких-либо претензий к тем, кто участвовал в разработке этого функционала
Можно перед загрузкой сервиса сравнить его с текущим сервисом вашей конфигурации используя утилиту сравнения, например, WinMerge (бесплатная).
В скриптах используется функция вызова функций из скрипта, который не подключен (я разместил ее в scr_Utils):
var Script = GetSingleItemByCode(ScriptName);
var CodeObject = Script.ScriptControl.CodeObject;
var Arg;
var Args = new Array();
var FuncDict;
var CustomFunction;
if (Assigned(Connector.Attributes('FuncDict'))) {
FuncDict = Connector.Attributes('FuncDict');
} else {
FuncDict = GetNewDictionary();
}
if (FuncDict.Exists(ScriptName+'_'+MethodName)) {
CustomFunction = FuncDict(ScriptName+'_'+MethodName);
for (var i = 2; i arguments.length; i++) {
Args.push(arguments[i]);
}
} else {
var Code = 'return CodeObject.'+MethodName+'(';
for (var i = 2; i arguments.length; i++) {
if (i > 2) {
Code += ',';
}
Args.push(arguments[i]);
Code += 'Args['+(Args.length-1)+']';
}
Code += ');';
CustomFunction = new Function('CodeObject', 'Args', Code);
FuncDict(ScriptName+'_'+MethodName) = CustomFunction;
Connector.Attributes('FuncDict') = FuncDict;
}
return CustomFunction(CodeObject, Args);
}
Дальнейшая доработка приветствуется
Даром получили, даром давайте (с) Христос
"Кошкаров Андрей" написал:Даром получили, даром давайте (с) Христос
Спасибо огромное за то что поделились опытом, я буду переносить решение на 3.3.2 и заодно расскажу про подводные камни. Вы сделали отличную работу - спасибо вам еще раз!