Публикация

Формирование печатных форм Excel по шаблону. Для версии ТС 3.4 [Продолжение]

Используя посты 7302 и 8466 на форуме Terrasoft подкорректировал и доработал функционал создания отчета Excel с использованием шаблона.
Мои основные доработки касались реализации функционала вставки табличной части отчета (например, для возможности вывода детали продукты документа), остальные изменения касались исправлений ошибок и совершенствования кода для версии 3.4. Ниже я опишу как формируется табличная часть отчета.
Тестировалось пока только на MS Excel 2003.
В качестве основы бралась базовая конфигурация Terrasoft XRM 3.4.0.130.

Форма добавления отчета Excel в системе была доработана с возможностью указания шаблона 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. [Added/Edited]
........
// * ExcelTemplate

Список измененных сервисов прикреплен ниже (см. exceltemplate.rar).

Как и писалось ранее в родительских постах, перед "накатыванием" этих сервисов настоятельно рекомендуется сделать бэкап базы.
Функционал предоставляется как есть и используется пользователем без каких-либо претензий к тем, кто участвовал в разработке этого функционала :smile:

Можно перед загрузкой сервиса сравнить его с текущим сервисом вашей конфигурации используя утилиту сравнения, например, WinMerge (бесплатная).

В скриптах используется функция вызова функций из скрипта, который не подключен (я разместил ее в scr_Utils):

function ExecuteScriptMethod(ScriptName, MethodName) {
     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);
}

Дальнейшая доработка приветствуется :wink:

Даром получили, даром давайте :twisted: (с) Христос

Нравится

Поделиться

1 комментарий

"Кошкаров Андрей" написал:Даром получили, даром давайте (с) Христос

Спасибо огромное за то что поделились опытом, я буду переносить решение на 3.3.2 и заодно расскажу про подводные камни. Вы сделали отличную работу - спасибо вам еще раз!

Показать все комментарии