Добрый день!

Создал печатную форму, в нее добавил поля с дробными числами.

В bpm разделитель целой и дробной части является запятая.

Как сделать так, чтобы в печатной форме разделитель целой и дробной части была точка, а в самой системе оставалась запятая? 

Нравится

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

Александр, здравствуйте!

Так есть же базовый макрос [#NumberDigit#] (https://academy.terrasoft.ru/documents/technic-sdk/7-11/bazovye-makrosy…), который решит Вашу задачу. 

Если нужны дополнительные манипуляции, то только через создание своего макроса - https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-sozdat-makr…

Вильшанский Дмитрий,

Cпасибо! 

Чакур Александр

Александр, добрый день!

Я Вам ошибочно предоставил ответ не на тот вопрос.  Данный макрос разделаем "тысячные", но дробную часть не затрагивает. 

Базового макроса нет для решения вашей задачи.

День добрый. Вот пример моего решения. Использую 2 представления одних данных.

Amount[#NumberRU|Cent#].«Amount[#NumberRU|Cent#]»

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

Коллеги, здравствуйте.



Возможно ли реализовать печатную форму прайс-листа в объекте "продукты" в каталоге выбора продуктов?



К примеру не заходя на карточку продукта, а в продуктовом каталоге при нажатии на кнопку "выбрать все записи" или "несколько записей" выбрать интересующие нас продукты и по ним вывести печатную форму?



Заранее спасибо!

Нравится

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

Здравствуйте, Роман!

На данный момент, печатные формы работают таким образом, что документ формируется по наполнению одной или нескольких записей.

Если создавать печатную форму для раздела "Продукты", то вывести список продуктов таблицей не получится, так как можно будет только выгрузить по 1 файлу Word отдельно для каждого продукта (то есть, для каждой записи раздела).

Для того, чтоб выводить в печатную форму таблицу с названиями продуктов, можем предложить:

- добавить продукты на деталь какой-нибудь сущности (продажа/заказ/счет и т. п.), 

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

- в ПФ добавить табличную часть по тому объекту, на детали которого находятся продукты.

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

Коллеги, здравствуйте.

Возник вопрос по выводу печатных форм на странице при условии определённого типа значения в колонке.

К примеру, в объекте "договоры" в типе договора указано значение "доп.соглашение" и выводились печатные формы только с наименованием "доп.соглашение".

Заранее спасибо!

Нравится

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

Роман, здравствуйте!

На данный момент настроить нужную Вам фильтрацию печатных форм можно только доработкой. Детально этот вопрос рассматривался в другом посте  Community: https://community.terrasoft.ru/questions/filtr-pecatnyh-form

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

Здравствуйте! По поиску вопрос уже поднимался, но рабочего решения так и нашел.

Задача заключается в следующем. Есть карточка счета/договора/и т.д. В карточке заполнено какое-либо справочное поле. Так вот, необходимо в зависимости от этого справочного поля отображать разный список печатных форм.

Было выяснено, что список доступных для печати форм формируется в методе initCardPrintForms в миксине ["PrintReportUtilities"]

Соответственно, я этот метод переопределил.

Добавив туда после вызова метода 

this.preparePrintFormsMenuCollection(printFormsMenuCollection);

Вызов своего метода для скрытия формы:

this.hidePrintFormsMenuItem(printFormsMenuCollection);

В этом методе планировалось построчно проверять название (или id) отчета и в зависимости от этого скрывать конкретную форму из списка.

Планировалось использовать что-то типа такой конструкции:

hidePrintFormsMenuItem: function(printForms) {

    printForms.eachKey(function(key, item) {

      var formName = item.get("Caption");

        switch (ЗНАЧЕНИЕ_СПРАВОЧНИКА) {

        case value1:

        if (formName!="Отчет1") item.set("Visible", false);

        break;

        case value2:

        if (formName!="Отчет2") item.set("Visible", false);

        break;

        }    

    }, this);

},

Собственно вопрос в том, как получить значение нужного мне поля (справочника) в контексте текущего метода? А может есть готовое решение и не нужно изобретать велосипед? 

Нравится

8 комментариев

Хотел воспользоваться this.get("СПРАВОЧНИК").displayValue, но при первичной инициализации такого параметра еще нет. Вопрос остается открытым, как получить значение параметра с карточки раздела во время формирования списка печатных форм?

Добрый день, Павел!

Во-первых, нужно переопределить метод initCardPrintForms, в котором после вызова this.callParent(arguments) нужно забиндиться на видимость печатных форм. Сделать это можно так:

//получаем коллекцию всех печатных форм
var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);
printFormsMenuCollection.each(function(item) {
  item.set("Visible", {bindTo: "getPrintMenuItemVisible"});
}, this);

А уже в самом методе getPrintMenuItemVisible описать логику и возвращать true - для тех, которые отображать и false, для которых не отображать.

getPrintMenuItemVisible: function(reportId) {
  //логика и возврат true/false
}

Чтобы взять нужное вам поле и чтобы оно было инициализировано следует вызвать метод initCardPrintForms в самом конце onEntityInitialized (то есть после this.callParent(arguments)). 

Также не забудьте, что при изменении поля от которого зависит видимость должен обязательно вызывать после изменения getCardPrintButtonVisible

Золотарев Артем Андреевич, спасибо за ответ. Смысл понятен, но появились проблемы. Если следовать вашему совету, и переопределить метод initCardPrintForms таким способом

  initCardPrintForms: function(callback, scope) {
                this.callParent(arguments);
                //получаем коллекцию всех печатных форм
                var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);
                printFormsMenuCollection.each(function(item) {
                    debugger;
                    item.set("Visible", {bindTo: "getPrintMenuItemVisible"});
                }, this); 
            },

то this.get(this.moduleCardPrintFormsCollectionName); возвращает undefined

И как я понимаю, в следующей строке, где происходит перебор коллекции нужно обращаться к printMenuItems, а не к printFormsMenuCollection?

Попробуйте вызывать initCardPrintForms в конце onEntityInitialized, тогда коллекция должна подтянуться.

Да, нужно обращаться к printMenuItems, опечатался

Золотарев Артем Андреевич, 

Дело в том, что, если initCardPrintForms добавить в конце onEntityInitialized, то initCardPrintForms выполняется два раза. А при повторном выполнении список отчетов уже сгенерирован на странице и получается, что толку смысла видимость строки уже нет. Нужно каким-то образом сгенерировать меню печати повторно.

сгенерировать меню печати повторно можно вызвав

this.getCardPrintButtonVisible()

У меня все равно не получилось добиться результата.

Если попытаться загрузить коллекцию печатных форм через 

this.get(this.moduleCardPrintFormsCollectionName);

в методе initCardPrintForms после this.callParent(arguments), то коллекция не подгружается.

Если скопировать код метода initCardPrintForms и изменить видимость элементов непосредственно в printFormsMenuCollection, то во время второго вызова initCardPrintForms (когда уже прошла инициализация onEntityInitialized), новое меню не формируется и в консоль падает ошибка Uncaught TypeError: callback.call is not a function. Это на строке callback.call(scope || this); в методе initCardPrintForms.

Попробуй тогда использовать просто переопределенные методы либо initCardPrintForms, либо getCardPrintButtonVisible, там по идее уже должны быть доступны поля объекта.

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

Коллеги, здравствуйте.

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

Кто нибудь сталкивался с такой задачей? Как это возможно реализовать?

Заранее спасибо!

Нравится

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

Роман, здравствуйте!

В базовой версии такой возможности нет.

Вы можете реализовать свой собственный макрос - https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-sozdat-makr…

Либо попробовать использовать стороннее решение - https://marketplace.terrasoft.ru/app/declension-names-printable-forms-b…

И подключить к этому Machine Learning

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

Добрый день!
Возник такой вопрос - после нажатия на кнопку Печать в Счете система просит открыть или сохранить печатную форму Счет на оплату, имея определенное название (смотреть вложенный файл). Как можно изменить название печатной формы при сохранении документа?

Нравится

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

Здравствуйте, Александр!

Если в настройках браузера активна функция "Спрашивать куда сохранять файл перед скачиванием", то при скачивании ПФ у Вас будет появлятся окно, где Вы указываете путь сохранения файла и можете изменить его название (см. скриншоты). Также, Вы можете изменить название ПФ в справочнике "Печатные формы".

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

Добрый день.
В договоре у меня 2 печатных формы, и в карточке договора при нажатии на кнопку печать, должна подставляться печатная форма по условию, то есть при определённом значении справочника "лицензия" в к карточке договора.

Это можно реализовать? Если да то желательно пример.
За ранее спасибо.

Нравится

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

Здравствуйте, Максим!

За функционал печатных форм отвечает миксин PrintReportUtilities. Генерация коллекции печатных форм происходит в методах initCardPrintForms и initSectionPrintForms. События клика на печатных формах в секции и карточке редактирования обрабатываются в методах generateCardPrintForm и generateSectionPrintForm. Для изменения логики стандартных печатных форм необходимо заместить данные методы с добавлением пользовательской логики(фильтрации).

Как альтернативное решение, Вы можете добавить пользовательскую кнопку печати и при клике обращаться к вэб сервису напрямую. Реализацию обращения к вэб сервису для печати "Печатных форм", Вы можете посмотреть в методе generatePrintForm схемы PrintReportUtilities (NUI).

Также вопрос обсуждался здесь:
http://www.community.terrasoft.ru/forum/topic/11555.

"Мотков Илья" написал:

Здравствуйте, Максим!

За функционал печатных форм отвечает миксин PrintReportUtilities. Генерация коллекции печатных форм происходит в методах initCardPrintForms и initSectionPrintForms. События клика на печатных формах в секции и карточке редактирования обрабатываются в методах generateCardPrintForm и generateSectionPrintForm. Для изменения логики стандартных печатных форм необходимо заместить данные методы с добавлением пользовательской логики(фильтрации).

Как альтернативное решение, Вы можете добавить пользовательскую кнопку печати и при клике обращаться к вэб сервису напрямую. Реализацию обращения к вэб сервису для печати "Печатных форм", Вы можете посмотреть в методе generatePrintForm схемы PrintReportUtilities (NUI).

Также вопрос обсуждался здесь:

http://www.community.terrasoft.ru/forum/topic/11555.

Прошу прощения, а не подскажите где это делать?

rules: {}
или
metods: {}

Добрый день, Максим!

Методы нужно добавить в methods, миксин подключить в mixins. Более подробно можете прочитать здесь: https://academy.terrasoft.ua/documents/technic-sdk/7-9/klientskie-shemy…

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

Добрый день, Коллеги!
Возникла проблема с сортировкой записей в печатной форме.

Описание:
В разделе Заказ была добавлена Custom деталь с редактируемым реестром. На эту делать с помощью функционала импорта загружаем продукты из excel файла.
Во время импорта была реализована генерация порядкового номера продукта в соответствии с порядком записей в файле (Скриншот: "Порядок продуктов на детали с сортировкой по колонке порядковый номер".
Далее уже используем сортировку по колонке "Номер продукта" на детали для приемлемого вида.
Однако регистрация записей в базе происходит в произвольном порядке, и при печати файла продукты, в скачанном docx файле, не отсортированы (Скриншот: Порядок продуктов в распечатанном docx файле).

Вопрос: Как именно можно реализовать сортировку продуктов в распечатанном файле при его генерации по колонке "Номер продукта" детали, содержащей актуальную нумерацию? Возможно есть какой-то стандартный функционал сортировки при настройке печатной формы?

Заранее спасибо за помощь, Коллеги!

Нравится

17 комментариев

Здравствуйте,
Есть справочник «Печатные формы», там открываете вашу печатную форму. Там есть закладка «Табличные части», табличные части можно изменить, и нужному полю, установить нужную сортировку. См скр:

Максим, огромное спасибо! Глупая невнимательность

Добрый день!

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

Руслан, например, можно формировать Excel-отчёт и затем уже в Excel сортировать так, как нужно.

Как вариант, да. Но если это, допустим, коммерческое предложение, которое формируется в PDF?

Тогда либо сделать несколько копий отчёта с сортировкой по разным колонкам, либо переделывать механизм формирования отчёта. К тому же, это тема о старой версии системы, сейчас в PDF можно выводить только отчёты на движке FastReport.

Хорошо, отбросим формат вывода, интересует момент "переделать механизм формирования". На стороне клиента, вроде как, удалось получить сортируемые колонки, не понятно теперь куда их передать.

Нельзя просто так отбросить формат вывода, отчёты Word и PDF генерируются принципиально различно.

 

Если речь о Word, нужно смотреть ReportService, там направления определяют в коде функции GetAdditionalMacrosesData.

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false. Печатная форма разрабатывалась еще на версии 7.14.х. Новую версию построителя отчетов еще не пробовал, вы наверно его имеете ввиду упоминая принципиальные отличия.

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

 

Руслан Хасанов пишет:

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false.

Руслан, в более новых версиях вывод Word-отчёта в PDF отключили. На днях обсуждали. Тем, кто уже у себя использовали, пока оставили.

Руслан Хасанов пишет:

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

Либо же подойти с другой стороны и модифицировать саму информацию в базе о табличной части отчёта. Она хранится в таблице SysModuleReportTable в текстовом поле MacrosList структурами вроде:

  {
    "caption": "Активность.Фактическое завершение",
    "metaPath": "6d33ae9b-e8b1-46d0-bd42-b8a8ca3d4f6b.f944fa96-ddd0-4cb5-ab5b-19c08048beed",
    "metaPathCaption": "Активность.Фактическое завершение",
    "aggregationType": "",
    "subFilters": null,
    "dataValueType": "DateTime",
    "sort": "Descending"
  },

Модифицировали, выгрузили и вернули прежнее значение. Маловероятно, что будут несколько пользователь грузить одновременно. Хотя, может помешать кеширование в ESQ, нужно пробовать.

Зверев Александр,

Зверев Александр пишет:

Модифицировали, выгрузили и вернули прежнее значение. Маловероятно, что будут несколько пользователь грузить одновременно. Хотя, может помешать кеширование в ESQ, нужно пробовать.

Думал над этим. Но решил отказаться от такого способа, т.к. одновременно могут сформировать отчет несколько сотрудников и могут возникнуть вопросы почему сортировка не соответствует, тяжело будет объяснять и оправдываться.

Тогда проще всего без доработок логики насоздавать копий отчёта с разными настройками сортировки. Для ускорения, чтобы не вручную, сделать копирование записей о настройках в этих таблицах через базу.

Такой подход неудобен тем, что если надо внести корректировку в печатную форму, то это придется делать на всех формах и чем их больше, тем сложнее поддерживать. Поэтому решил переопределить логику ReportService, но столкнулся с проблемой - при запуске проекта в Visual Studio команда (оригинал инструкции из коробки, т.е. я ни чего еще не менял): 

var reportGenerator = ClassFactory.Get<IReportGenerator>("Word"); 

выбрасывается исключение:

Error creating an instance of the "Terrasoft.Configuration.IReportGenerator" class

Потыкался и обнаружил что инструкция: 

ClassFactory.Get<Terrasoft.Configuration.ReportService.ReportHelper>();

в Visual Studio выполняется без ошибок.

В чем разница? Почему первая инструкция вылетает с ошибкой? Из-за этого не могу продолжить работу. Кто нибудь знает как ее побороть?

Руслан, видимо, разница в том, что в во втором случае создают класс по названию, а в первом — по интерфейсу IReportGenerator и параметру. Может, такой способ при запуске не из системы не подходит?

 

Класс отчёта Word задан в схеме WordReportGenerator:

#region Class: WordReportGenerator
/// <summary>
/// Provides report generating functionality.
/// </summary>
[DefaultBinding(typeof(IReportGenerator), Name = "Word")]
public class WordReportGenerator : IReportGenerator
{

Видны те самые интерфейс, от которого наследуется класс, и параметр Word, который у Вас передаётся в ClassFactory.

 

Может, для целей отладки из Studio, создавать класс по полному названию, а уже потом, когда готовую логику будете размещать в схеме, напишете ClassFactory.Get<IReportGenerator>("Word"). Судя по схеме PdfAsyncReportGenerator, где использован именно этот вариант, он сам по себе допустим.

Спасибо, Александр, за помощь. Попробую пойти предложенным вами способом.

Удалось выполнить кастомную сортировку продукта в печатной форме, которая установлена у детали "продукт в продаже". Если деталь еще не загружена используется сортировка установленная в настройках отчета. Если у детали стоит сортировка и поле по которому выполнена сортировки имеется в печатной форме, то в печатной форме сортировка соответствует сортировке у детали. Спасибо, Александр, за оказанную помощь. 

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

Часто бывает необходимо отправить клиенту счет, коммерческое предожение и т.д. Как известно, базовая функциональность bpm´online предлагает это решать так:

  • Нажали на кпонку "Печать"
  • Сохранили документ (ну он сам в принципе сохранился)
  • Создали новый E-mail
  • Прицепили к нему этот файл и отправили

Ну способ, скажем так, далек от совершенства, а в ряде случаев еще и невыполним. Посему предлагается простой скрипт, генерирующий файл, с которым в последствии можно делать что угодно. У нас это реализуется так:

  • Создали новый заказ
  • Процессно создали событие E-mail
  • Сгерерировали и сохранили печатную форму заказа
  • Открыли окно события с вложением и отправили

Вот скрипт:

var RecordId = GetGuid>("OrderId"); // Id записи, для которой генерируем файл, параметр процесса
var ActivityId = GetGuid>("ActivityId"); // Id активности, к которой его цепляем, параметр процесса
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
ReportData data = new ReportData();
ReportService reportService = new ReportService();
var ReportSchemaId = "2fcb529e-e3a8-4926-85c6-585f53e25765"; // Id шаблона печатной формы отчета
data = reportService.GenerateMSWordReport(ReportSchemaId, RecordId.ToString(), true); //true - перевод в pdf, false - MS Word
var reportStream = new MemoryStream(data.Data);


var entityFileSchema = userConnection.EntitySchemaManager.GetInstanceByName("ActivityFile");
var entityFile = entityFileSchema.CreateEntity(userConnection);
entityFile.SetDefColumnValues();
entityFile.SetColumnValue("ActivityId", ActivityId.ToString());
entityFile.SetColumnValue("Name", "Poptavka.pdf");
entityFile.SetColumnValue("TypeId", "{529BC2F8-0EE0-DF11-971B-001D60E938C6}"); // - тип вложения файл, не менять
entityFile.SetColumnValue("Size", reportStream.Length);
entityFile.SetStreamValue("Data", reportStream);
entityFile.Save();
return true;

Usings:
Terrasoft.Reports
Terrasoft.Configuration.ReportService
System.IO
System.Web

В приципе это можно и в сервис легко переделать и генерировать все это по кнопке или по действию непосредственно из документа без использования процессов.

Удачи :)

Нравится

Поделиться

12 комментариев

Подскажите, а где можно увидеть Id шаблона печатной формы отчета?

когда открываете в конфигурации шаблон отчета (в справочнике), то адресная строка выглядит таким образом:

http://<адрес сайта>/0/ViewPage.aspx?Id=41899fab-093e-4808-86db-5794b9836745&recordId=0d8c28ce-9794-42be-8427-3d5d60e60c1f&entitySchemaUId=0a62cd3d-6541-4c5c-903f-e5b0fc665297&treeGridId=PageContainer_TreeGrid&SysModuleEditId=00000000-0000-0000-0000-000000000000&SelectedModuleId=00000000-0000-0000-0000-000000000000&ParentEntitySchemaId=00000000-0000-0000-0000-000000000000&typeColumnUId=%2294f2a9f755c74ecf9b6417583ddc058b%22&closeMessage=ReportEditPageClosed

вас интересует кусок recordId=0d8c28ce-9794-42be-8427-3d5d60e60c1f, где 0d8c28ce-9794-42be-8427-3d5d60e60c1f и есть наш id шаблона

Спасибо. Работает

ну я бы удивился, если бы нет :smile:

:) Ваш код работает, а вот открыть в БП потом письмо не получаеться, так как не корректно отрабатывает елемент "Страница редактирования" - открывает страцицу Задачи, а не письма. В техпотдержке уже взяли в работу

:) Ваш код работает, а вот открыть в БП потом письмо не получаеться, так как не корректно отрабатывает елемент "Страница редактирования" - открывает страцицу Задачи, а не письма. В техпотдержке уже взяли в работу

да не может быть! посмотрите картинку - так у вас? Вы там точно указали карточку email?

очень маленькая картинка. Можна немного больше?

очень маленькая картинка. Можна немного больше?

ну там смысл, что в элементе "Открыть преднастроенную страницу" надо выбрать Страница - Email (не страница Задача)

да так и выбрал. Все равно открывает задачу. Проверял и на других БП - это глюк елемента. Версия 7.8.0.1134

aaaaa....7.8... не проверял

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

В обучающем видеоролике "Настройка печатных форм MS Word" вы сможете узнать, как выгрузить из bpm'online любые данные в формате PDF или DOCX. Формируйте печатные формы MS Word и получите данные из системы в удобном для вас виде.
Видео доступно по ссылке:
Настройка печатных форм MS Word

Нравится

Поделиться

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