В разделе заявки при создании заявки при заполнении полей, например, партнёра - автоматически заполняется описание в соответствии с макросом.

Где расположен этот макрос?

Нравится

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

Там, как оказалось, в локализованных строках он лежит. А логика - hard code)

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

Добрый день.

Возможно кто-то разбирался, как реализован вызов нужного метода по указанному названию класса макроса в шаблоне email сообщения?

Хотелось бы разобраться, так как бизнес-задача - создавать черновики email сообщений по шаблону с макросами без отправки, что приходится делать через код (low код тут не помогает), и никаких примеров я не нашла ни на академии, ни в сообществе.

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

Буду благодарна за помощь, спасибо!

Нравится

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

Надежда, добрый день!

Не совсем понимаю о каком вызове нужного метода по указанному названию класса макроса в шаблоне email сообщения вы говорите.

Речь о подстановке макроса при его выборе в меню отправки сообщений обращения?

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

Добрый день. Подскажите почему может не работать пользовательский макрос в email рассылке, который делаю согласно по образу и подобию статьи на академии https://academy.terrasoft.ru/docs/developer/elements_and_components/ema…

Нравится

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

Добрый день. 



Предоставьте макрос и выгрузку из таблицы EmailTemplateMacros для данного макроса.

Mykhailo Storozhuk, 

using System;
using Terrasoft.Core;
 
namespace Terrasoft.Configuration
{  
    /// <summary>
    /// Макрос, возвращает текущую дату +n дней от текущей.
    /// </summary>
    public class NrbEmailCurrentDatePlusMacros : IMacrosInvokable
    {
 
		public UserConnection UserConnection
        {
            get;
            set;
        }
 
        public string GetMacrosValue(object arguments)
        {
            var date = DateTime.Today;
 
            if(!arguments.Equals(null))
			{
                var days = Convert.ToInt32(arguments.ToString());
                date = date.AddDays(days);
            }           
 
            return date.Date.ToString("dd.MM.yyyy");
        }
    }
}

 

Кириллов Игорь,

 

При работе с макросом возникает ошибка "Input string was not in a correct format." на этапе конвертации Convert.ToInt32(arguments.ToString()); ,так как в строке возвращается объект и id записи, которые не преобразовать в число.

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

Добрый день!

Подскажите, пожалуйста, возможно ли передавать дополнительные параметры в макрос, вызываемый в email-шаблоне через [#@Invoke.MyMacros#] ?

Например, нужно реализовать конвертацию значения поля типа boolean из true/false в "да"/"нет". Или преобразовать дату в специальный формат.

Метод GetMacrosValue(object arguments) интерфейса IMacrosInvokable принимает объект с аргументами, но по умолчанию в нем - только идентификатор текущей записи.

Нравится

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

Стандартно в системе есть макрос EstimateLinksGenerator для голосования за оценку, он находится в одноимённой схеме. Но там тоже получают Id и далее работают с ним. Если дата или логическое значение находятся в полях этой записи, то к ним можно получить доступ по её Id.

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

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

Может, есть какой-то альтернативный вариант решения проблемы?

Нужно смотреть в MacrosHelper, который это всё обрабатывает, как там устроено и есть ли возможность для расширения.

Добрый день, подскажите, может кто нашел решение данной задачи?

Можно добавить в объект дополнительные текстовые поля, куда при изменении основных (логических или дат) формировать текст нужного вида.

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

Доброго времени суток, дорогое сообщество!

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

Изображение удалено.

Нравится

2 комментария
Лучший ответ

Это ошибка в версии 7.12.2. Напишите в поддержку - они предоставят Вам патч) или обновляйтесь на 7.12.3.

Это ошибка в версии 7.12.2. Напишите в поддержку - они предоставят Вам патч) или обновляйтесь на 7.12.3.

Алла Савельева,

Спасибо!

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

Добрый День.
Проблема состоит в том, что при создании запроса с помощью мастера(не имеет значения), нету такой колонки как "Текущий пользователь"(ее просто не существует в таблице).Но при построении отчета нужно в поле "User" добавлять имя "Текущего пользователя"...Где-то на форуме я читал что такое возможно сделать макросом через Коннектор, но автор не расписал как...если кто то знает как можно определять какие то основные поля через макросы, то прошу вашей помощи...
Версия Террасофта - 3_4

Нравится

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

Вашу задачу можно реализовать используя отчет FastReport. Для этого, в датасет который используется для построения MasterDetail добавьте вычисляемое поле CurrentUser, например. На событие этого датасета "OnDatasetCalcFields" реализуйте функцию, котороая будет помещать в поле CurrentUser значение Connector.CurrentUser.ContactName:

Dataset.Values('CurrentUser') = Connector.CurrentUser.ContactName;

Далее, используйте поле CurrentUser для вывода необходимой Вам информации в отчете.

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

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

После того, как добавите строковое поле CurrentUser в сервисы tbl_Contract, sq_Contract и ds_Contract, измените и запрос данных, который производит выборку для отчета - это запрос Договор. Добавьте в него поле CurrentUser в основную деталь. У меня получилось так: Договор.Current User. Соответсвенно макрос для подстановки в шаблон WORD (в моем случае): <#Договор.Current User>

Затем определите уникальный ID интересующего Вас отчет, я это сделал в SQL Management Studio простым запросом:  select * from tbl_Report where name = 'Печатная форма договора' (sq_Report требует дополнительных параметров, а создавать новый сервис запроса мне было лень :smile:). В используемой мною конфигурации, для отчета "Печатная форма договора" ID оказался равным "{288C8C1D-3722-434A-B010-92101BB1BEC7}".

Вооружившись этим знанием я пошел в сервис Common\Window Templates\BaseWorkspace\scr_BaseWorkspace, нашел там фнкцию function amiReportsOnPrepare(ActionMenuItem) и в цикл for (var i = 0; i < RootMenuItem.Count; i++) после var MenuIsVisible = true; вставил свое условие:

  if (MenuItem.Tag == '{288C8C1D-3722-434A-B010-92101BB1BEC7}') {	 //debugger;		
      		var ContractDataset = Services.GetNewItemByUSI('ds_Contract');
      		ApplyDatasetFilter(ContractDataset, 'ID', BaseWorkspace.GridDataset('ID'),true);
      		  ContractDataset.DisableEvents();
	          ContractDataset.Open();
      		  ContractDataset.Edit();
      		  ContractDataset.Values('CurrentUser') = Connector.CurrentUser.ContactName;
      		  ContractDataset.Post();
      		  ContractDataset.Close();
      		  ContractDataset.EnableEvents();
		}

Суть работы такова: при нажатии на контрол "Отчеты", система отрисовывает выпадающее меню со списком отчетов, закрепленных за данным разделом. Дойдя до нашего "Печатная форма договора" она открывает датасет выделенного в реестре записей договора и вписывает в поле CurrentUser его таблицы tbl_Contract имя текущего пользователя.

Возможно сюда еще нужно будет добавить проверку на наличие датасета Договора. Т.к. если по фильтру раздела не будет ни одной записи договра в реестре, на нашей логике может произойти "свал". Добавить внутрь условия if () {} конструкцию try() catch(e).

Успехов и приятной работы!

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

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

На основании этого пользовательского запроса в разделе "Шаблоны сообщений" есть шаблон письма Outlook с названием "Уведомление по задаче", в тексте которого используются ссылки на поля основной детали пользовательского запроса (в виде #Заголовок# и т.п.).

Вопрос - можно ли в шаблоне сообщения использовать поля из подчиненной детали запроса?

Нравится

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

Валерий, добрый день.

В шаблоне сообщений можно использовать поля только из основной детали. Возможность добавлять в шаблон письма поля подчинённых деталей необходимо реализовывать дополнительно. Но возникает вопрос в целесообразности. Реализация такого функционала достаточно сложная (фактически, для шаблонов сообщений придётся реализовать механизм, подобный механизму формирования отчётов Word). Мне кажется, проще и быстрее будет создать новый запрос, который содержал бы все необходимые данные в основной детали, и на его основании сформировать шаблон письма.

Добрый день, спасибо за ответ.
Этот запрос я привел просто в качестве примера. На самом деле не получается составить запрос для такой ситуации:
- шаблон письма для контакта, при этом в шаблон письма необходимо подставить факс ответственного за контакт.

Получается, что основная таблица пользовательского запроса - "Контакт". Оттуда выбираются разные поля, также выбирается его Ответственный, а вот у Ответственного может быть несколько средств связи, и факс может быть указан в любом из них (то есть нельзя выбрать как поле Ответственный.Средство связи 1, надо искать по детали Средства связи). Вот это и не получается сделать...

update:
В принципе можно так, как Вы ответили в этой теме, но это слегка избыточно:
http://community.terrasoft.ua/forum/topic/5023

Валерий, конкретно Вашу задачу можно решить так:

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

Тип средства связи факс равно факс или
Тип средства связи факс пусто

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

Спасибо, Олег!

Здравствуйте! Такой функционал уже доработан.
http://www.community.terrasoft.ua/blogs/7535

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

Здравстуйте!

Создаю email-шаблон.
Необходимо в зависимости от пола выбрать обращение. Пример просто скопипастил с руководства пользователя:
[#Пол;Мужской:Уважаемый;Женский:Уважаемая#]
Этот пример не работает. Запрос настроен, кажется, нормально. По крайней мере макрос #Пол# правильно подставляет значение пола.
Подскажите, пожалуйста, что я делаю не так?

Версия Террасофта 3.3.1.98

Нравится

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

Виталий, попробуйте следующий вариант макроса:

#[Пол;Мужской:Уважаемый;Женский:Уважаемая]#

Большое спасибо, работает :smile:.
Вот только интересно почему в руководстве дан неправильный пример...

Виталий, всегда пожалуйста!:)
Дело в том, что данный макрос ([#Пол;Мужской:Уважаемый;Женский:Уважаемая#])работал во всех версиях до 3.3.1.
Возможно, у Вас руководство более ранней версии.

Если мне не изменяет память, руководство от версии 3.3.1.40.

В 3.3.2.157 есть еще одна беда с использовании макросов. Если название колонки состоит с двух слов например "Тип элемента", то парсер (а именно в функции ParseConditionMacros скпирт scr_MacrosUtils) при анализе письма сделает с ее названием "типэлемента" и колонки такой не найдет. Короче говоря что бы использовать в запросе условия, нужно использовать колонки без пробелов т.е переименовать в конструкторе запросов "Тип элемента" -> "ТипЭлемента", после чего все работает корректно.

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