CopyFile
GetFileSystemObject
Скрипты
Разработка

Через GetFileSystemObject делаю CopyFile. На мой локальный диск копирует, все хорошо. При копирование на сетевой, вылетает ошибка: "Разрешение отклонено". Если копирую в сетевую папку через проводник, то прав у меня хватает. При этом создает папку в сетевом окружение то же без проблем, но в созданную папку не может сохранить. Скорей всего объекту ActiveXObject('Scripting.FileSystemObject') неполно передаются мои права, что делать, куда смотреть?

Нравится

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

В конце пути у Вас стоит слеш (\)?

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("c:\test.txt")
objFile.Copy "c:\temp\"

Дмитрий, не стоит. Проблема была в этом, спасибо. А на локальную машину сохраняло потому что тестировал "C:\"."

Показать все комментарии
onDatasetChangeDataField
onDatasetDataChange
неопределённость.
события DataSet
туман
Скрипты
Разработка

Buenas tardes!

Вся философия - знать то, как думает компилятор.
Уважаемые знатоки, внимание вопрос.
Поясните пожалуйста момент срабатывания события onDatasetChangeDataField(Dataset, DataField); (Событие, генерируемое при изменении активного поля записи набора данных. Активное поле набора данных определяется наличием фокуса в соответствующем визуальном элементе управления (IDataControl). При изменении фокуса генерируется данное событие.
), в чём его принципиальная особенность и отличие от onDatasetDataChange(DataField); (Событие, генерируемое при изменении значения поля набора данных.)

На сколько я понял, события наступают одновременно. Первое после изменения отдельного IDataControl, и снятия с него фокуса, второе ... после изменения Dataset('Field');. Что, подозреваю одно и тоже.

Абстракция Por examplo:
Есть форма на которой есть поле связанное с набором данных. Есть пользователь, который хочет отредактировать это поле, изменив данные и сохранив изменения в базе.

Прошу провести связь в абстракции от момента взаимодействия пользователя с формой, до момента возникновения данных событий чтобы ясно представлять себе конвейер в работе, и ликвидировать просветы в понимании механизма TerraSoft.

Буду очень благодарен за объяснение философии TerraSoft.

С уважением Ваш коллега.

Нравится

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

честно говоря, ни разу не пользовался onDatasetChangeDataField и не нашел ни одного использования в конфигурации. Рискну предположить, что это артефакт для обратной совместимости.

"Litvyakov Yegor Vladimirovich" написал:второе ... после изменения Dataset('Field')

при любом изменении любого поля в наборе данных (например, ввод очередного символа в строковое/числовое поле или выбор из справочника, или исполнение Dataset('Date') = new Date(System.Now()).getVarDate())

я тоже пытался выяснить этот вопрос, хотя с другой стороны немного
философия Террасофт заключается в том, что есть объекты Window, DatasetLink (обычно зовется dlData), Control, DataField, Dataset все связи между ними описаны в SDK. Что срабатывает первое - вопрос, оставшийся открытым. Но вроде как всегда сначала срабатывает событие на Dataset'e (но не уверен)

"Андросов Дмитрий" написал:при любом изменении любого поля в наборе данных

Дмитрий, получается - когда пользователь только ввёл символ в поле редактирование, dataset уже изменил соответствующее своё поле, текущего картежа, и готов к Post() для сохранения в базе?

поле можно изменить, если Dataset в состоянии dstInsert или dstEdit см SDK
в тех же состояниях он готов к Post() опять-таки см SDK (там правда опечатка должно быть:

1. 
Если набор данных находится в состоянии добавления или редактирования записи (значение свойства IDataset::State не равно "dstInsert" или "dstEdit"), то вызывает событие IDatasetEvents::OnDatasetBeforePost. Иначе метод завершает работу. 

"Litvyakov Yegor Vladimirovich" написал:dataset уже изменил соответствующее своё поле

если Control и DataField связаны и действие не отменено где-нибудь (например в событии OnKeyPress у Control'a), то да

Огромное спасибо за пояснение, есть просвет)

Здравствуйте, коллеги!
По поводу onDatasetChangeDataField Дмитрий правильно предположил, это артефакт, и следует пользоваться событием onDatasetDataChange. Единственная разница между этими событиями - это то, что onDatasetChangeDataField не работает с BLOB полями.
По поводу вопроса, кто первый Control, DataField или Dataset сказать сложно. Обработка событий происходит в порядке подписки. Подписка выполняется ядром во время десериализации сервисов, а порядок подписки может быть разным, в зависимости от того, в какой момент устанавливается связь между объектами.
Например, для dlData может быть определен DataSet как в скрипте, так и с помощью установки соответсвующего свойства из интерфейса и т.д.

"Андрей Каспаревич" написал:По поводу вопроса, кто первый Control, DataField или Dataset сказать сложно.

Можно в обработчик каждого события впихнуть

 Log.Write(1,"текст сообщения");

и посмотреть, кто за кем.

Показать все комментарии
выделенная запись
Технические вопросы
Разработка

Если на любой странице выбрать команду "Выделить все" (Ctrl + А) и дальше производить какие-либо действия с этими записями (например, перетащить в другую группу, или изменить), то эти действия выполняются только с теми записями, которые видны на данной страничке, т. е. 40 шт. Как можно сделать так, чтобы действия выполнялись применительно КО ВСЕМ!!!!?

Нравится

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

нужно делать отдельную кнопку (по аналогии с "Удалить все"), которая будет выполнять выбранное действие со всеми записями датасета

Добрый день!

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

Показать все комментарии
Append()
Dataset
Error: Dataset not in edit or insert mode
Скрипты
Разработка

Salud los colegas!

Товарищи, продолжаю погружаться в дебри Terrasoft, собирая все грабли на этом тернистом пути.
Играя с SDK, решил налить Dataset, несколькими записями, и посмотреть на метод Append() в действии.
Дано:
tbl + sq + ds
scr

function Main() {
    var Dataset = Services.GetNewItemByUSI('ds_DBDataset');
    Dataset.Open();
    var String = 'Some text ';
    var i;
    for (i = 0; i 5; i++) {
        Dataset.Append();
        Dataset('String') = String + i;
        Dataset.Post();
    }
    MessageBox(Dataset.RecordCount);
    Dataset.Close();

Найти:
В результате выполнения скрипта имею ошибку Terrasoft - Dataset not in edit or insert mode (Dataset.Edit(); - совершенно иная конструкция) Вот здесь шаблоны рушатся.
Возможно я не верно понимаю логику инструкции Append().

В ожидании луча света, и с уважением
Ваш коллега.

Нравится

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

Yegor, проверила Ваш код - работает корректно.
Только подправила

Dataset.RecordCount

на

Dataset.RecordsCount

Тестировала на версии 3.4.1
Результаты тестирования во вложенных скриншотах (1 - до записи в БД, после записи БД).

На какой версии Вы работаете?

У меня тоже работает, не считая того, что вместо MessageBox надо писать

System.MessageDialog('Hello world', mdtInformation, mdbOK, 0);

или обёртку из scr_WindowUtils

ShowInformationDialog('Hello world')

"Бондарь Наталия" написал:На какой версии Вы работаете?

Версия - 3.3.2.222
В строке

Dataset('String') = String + i;

ругается.
Я задумываться начинаю, может собака глубже зарыта, и своими неопытными ручками я tbl + sq + ds не по человечески связал :confused:?
Здесь всё просто (на сколько понял) Одна таблица с полем String (остальные по дефолту). Select Query завязанный на таблицу с селектами по ID и String. Ну и Dataset завязанный на Select Query с ключевым полем ID.
Ударьте по рукам пожалуйста если что не так :neutral:

Александр, прошу Вас, дабы полностью разрушить мои стереотипы пояснить моменты по поводу окон сообщений.
Привычного alert() декларированного в ECMAScript я не обнаружил. Случайно наткнувшись на MessageBox('Text'), ужаснулся и стал ностальгировать о Delphi (синтаксис идентичен)

  1. 1. Данные методы являются глобальными встроенными методами Terrasoft ( кроме ShowInformationDialog('Text') явно не глобальный :smile:)?
  2. 2. И в чём принципиальная разница каждого? Только в гибкости настроек вывода (доп. кнопки, выбор иконки и т.п.) или что-то ещё?

Егор, покажите скриншоты всех трёх сервисов.

Идеология конфигурации Terrasoft 3.X такова, что методы встроенных глобальных объектов стараются использовать минимально. Взамен им в скриптах-библиотеках scr_Utils, scr_WindowUtils и других написаны функции-обёртки, часто с дополнительными возможностями или скрытием ненужных обычно параметров. Например, одному методу System.MessageDialog с кучей параметров соответствует семейство ShowInformationDialog, ShowErrorDialog, ShowWarningDialog с одним параметром — текстом сообщения.

Аналогично, вместо Services.GetNewItemByUSI лучше использовать функцию GetSingleItemByCode (она уже есть в какой-то библиотеке), не создающую лишних сущностей без необходимости.

"Зверев Александр" написал:Егор, покажите скриншоты всех трёх сервисов.




Спасибо, уяснил момент.
Только под резюмирую - исторически сложилось, что MessageBox('Text') не является правилом хорошего тона, верно?

Метод MessageBox является одной из обёрток, о которых писал Александр. Его использование вполне уместно.

Ошибка говорит о том, что свойство Dataset.State != dstInsert(dstEdit).
Это значит, что метод

Dataset.Append();

не отработал.

Поставьте галочку в сервисе датасета "Добавление", а также определите первичное поле для отображения.

Hallelujah

Дмитрий, благодарю! +1 к Dataset :smile:
Всех благодарю за уделённое внимание!
С уважением Ваш коллега

Показать все комментарии
Выполнение скрипта
глобальные переменные
тестирование кода
Скрипты
Разработка

Buenos Dias, Amigos!

Господа, я человек новый, и ранее опыта работы с системой Terrasoft не имел, поэтому вопрос может быть через чур тривиальный (не судите строго).

Дано:
Таблица + select query + dataset
Скрипт

Найти:
Из скрипта хочу получить доступ к dataset'у через метод глобального объекта Services.GetNewItemByUSI('')*, дабы в нём поковыряться и в конечном итоге запустить код прямо из Дизайнера скрипта.

Имеем: ошибку выполнения jscript 5009 Undefined identifier в строке с инструкцией * (переменная Services в которой априори является глобальной) при сохранении файла.

Прошу пролить луч света и поделиться опытом в данных вопросах.

С уважением
Ваш коллега.

Нравится

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

"Litvyakov Yegor Vladimirovich" написал:пролить луч света

http://msdn.microsoft.com/en-us/library/vstudio/6a8k3cz9

"Litvyakov Yegor Vladimirovich" написал:поделиться опытом

проверьте код. если не сохраняет сервис - 99% ошибка в синтаксисе кода

Благодарю, но первая ссылка в никуда. О чём говорит ошибка я знаю - переменная не объявлена а точнее равна undefined. Services - является глобальной переменной, сравни window в DOM верно? Соответственно, по логике, объявляться не должна. Вопрос был в этом.

"Андросов Дмитрий" написал:проверьте код. если не сохраняет сервис - 99% ошибка в синтаксисе кода

Это тоже ясно, я же написал что за ошибка.

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

"Litvyakov Yegor Vladimirovich" написал:первая ссылка в никуда

приведите проблемный код с контекстом

Покажите фрагмент кода, на который ругается.

В информативном плане, на вопрос ссылка не отвечает.

var Dataset = Services.GetNewItemByUSI('<Здесь код моего dataset>'); // как раз на этой строчке компилятор выдаёт ошибку 5009
...

А что вместо многоточия?

"Зверев Александр" написал:А что вместо многоточия?

Может быть ошибаюсь, интерпретатору JS должно быть всё равно.

    Dataset.Open(); 
    Dataset.Edit();
    var Name = 'Hello World';
    Dataset('String') = Name;
    Dataset.Close();

Возможно здесь собака не глубоко зарыта. В большей степени я взаимодействовал с клиентским JS (ECMAScript).
В terrasoft объектная модель, стандартные функции и переменные, плохо документированы, хорошее представление сложно получить.
Поэтому рассчитываю на Вашу квалифицированную помощь, господа.

вообще-то компилятор может и неправильно строчку указывать

ради интереса попробуйте подключить скрипт scr_Utils и попробуйте использовать

var Dataset = GetSingleItemByCode('Здесь код моего dataset', 'любая строка (в т.ч. пустая)');

а еще - укажите версию бинарников

"Litvyakov Yegor Vladimirovich" написал:В большей степени я взаимодействовал с клиентским JS

эта фраза наводит на мысль, что взаимодействовали вы не из приложения Terrasoft...
а вы где пишете код, если не секрет?

"Андросов Дмитрий" написал:вообще-то компилятор может и неправильно строчку указывать
тоже верно
"Андросов Дмитрий" написал:а вы где пишете код, если не секрет?

В приложении Terrasoft CRM Administrator.

"Андросов Дмитрий" написал:ради интереса попробуйте подключить скрипт scr_Utils и попробуйте использовать var Dataset = GetSingleItemByCode('Здесь код моего dataset', 'любая строка (в т.ч. пустая)');

Выдаёт другую ошибку 5007 Объект отсутствует.(

если вы это сделали

"Litvyakov Yegor Vladimirovich" написал:попробуйте подключить скрипт scr_Utils

тогда не знаю - видимо у вас какая-то проблема все-таки с Services.

Попробуйте перерегистрировать библиотеки
если не знаете как:
http://www.community.terrasoft.ru/forum/topic/8497#comment-35568
http://www.community.terrasoft.ru/forum/topic/6512
http://www.community.terrasoft.ru/forum/topic/10311

ДА И СКАЖИТЕ ВЕРСИЮ БИНАРНИКОВ - это может быть важно

Благодарю за внимание и помощь господа!
Луч света упал на глобальные переменные - обращение к ним должно идти из функции, не как у меня.

"Андросов Дмитрий" написал:ДА И СКАЖИТЕ ВЕРСИЮ БИНАРНИКОВ - это может быть важно

Был бы признателен за подсказку, где, что и для чего и как)
Из дизайнера скрипт не запустил пока( на другой камень наткнулся.
Очень благодарен за поддержку!

запустить скрипт прямо в TSAdmin (и в его контексте), причем можно и не сохранять сам сервис
добавить function Main() {} и нажать

да, вне функций глобальные переменные не работают (не знаю уж почему)

версии бинарников (но они все же тут ни при чем):

Понял, больше спасибо!

Кстати, чтобы данные сохранились в БД, надо перед

 Dataset.Close(); 

делать

Dataset.Post();

Да, спасибо. Это тоже проследил.

Показать все комментарии
Утилита создания реестров
Скрипты
Разработка

При выборе дефолтного пункта детализации в утилите создания реестров: Файлы, создает новую вкладку, добавляет нужный шаблон окна и на этом работа заканчивается. Не создает перекрестную таблицу "Файл-Новый реестр", всю сопутствующую обвязку sq_, ds_, не пытается прописать автобидинг вкладки Файлы и выбранной записи реестра. Доделывать руками или не работает корректно?

Нравится

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

День добрый Михаил!!!

уточните пожалуйста вопрос по Созданию новых реестров и Деталей вы Адресовываете для какой Платформы для Terrasoft 3.X или BPMOnline 7.X? Если для Террасофт 3.Х, пожалуйста уточните о какой обработки (скрипте) идет речь? Спасибо!!!

Террасофт 3.Х. По мимо не создавшихся tbl_, sq_ и ds_ сервисов предполагаю, что должно дописываться обработчик закладки детали код аналогичный этому:

	if (pcDetails.ActivePage.Name == pgFilesDetail.Name) {
		RefreshFilesDetail(BaseWorkspace, wndFilesDetail, 'AccountID',
			'tbl_FileInAccount', 'iq_FileInAccount', "контрагента");
	}

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

если у вас трудности при создание разделов или деталей, так скажите в чем я вам помогу.

Михаил, редактор разделов разрабатывался для старых версий. Сейчас судя по обратной связи, оказалось, что функционал не особо востребован, поэтому не актуализировался довольно давно.
По факту, мастер для редактирования деталей сейчас не подходит и чтобы привести в рабочий вид деталь Файлы придется создать таблицу развязки и дописать фильтрацию.

Максим за все то время, что программирую в террасофте я никогда и не пользовался данным мастером создания. знаю и знал, что он есть. Пару раз на вебинарах видел, что показывали как с помощью данного мастера можно с легкостью создать раздел. Для меня если честно это было дико. Так как для меня даже приятнее было всегда с нуля создать раздел, детали, группы, фильтрацию и так далее. И уже точно знать, что все будет работать так как я хочу, что в разделе или детали ничего лишнего нет. поэтому и спрашивал у Михаила чем ему помочь при создание раздела или детали.

Максим, неправильно, что разработчики заливают в релиз сырую реализацию, которая почти не тестировалась (3 ошибки сразу как попробовал). После отсутствия обратной связи, не убирают ее или хотя бы не делают заглушки с предупреждениями. Поддержка ни как не реагирует, что мастером пошли пользоваться и не отговаривают или это знают единицы?
P. S. Повеселила кнопка "Пыщь", в другой утилите, ей не стал пользоваться. -)

Михаил, да придётся вдумчиво кликать мышкой и создавать цепочки сервисов самостоятельно, хотя нынешние продукты CRM как раз стараются освободить от этой деятельности. Спасибо за предложенное помощь.

Михаил, вопрос: утащил себе шаблон wnd_FilesDetail и RefreshFilesDetail не работает. Методом дебага понял, что как минимум нужно инициализировать шаблон так:

wnd_FilesDetail.Window.Attributes('TableUSI')='tbl_FileInLRequirement';
wnd_FilesDetail.Window.Attributes('InsertLinkUSI')='iq_FileInLRequirement';
wnd_FilesDetail.Window.Attributes('ParentItemID')=ID;
wnd_FilesDetail.Window.Attributes('ParentItemFieldName')='LRequirementID';
var GridWindowFilesDetail = wnd_FilesDetail.Window; 
GridWindowFilesDetail.Prepare();

Окошко открывается и ничего не отображает перед добавлением файла, сохраняет нормально и даже делает отметку в перекрестной таблице tbl_FileInLRequirement. Единственно чего не хватает, что бы работало отображение. Не знаю куда фильтр применить в духе:

ApplyDatasetFilter(GridWindowFilesDetail.ComponentsByName('dlData').Dataset, 'LRequirementID', ID, true);

То что в 'dlData' DataSet= ds_Files и никаких 'LRequirementID' нету уже увидел. dlLink после Prepare();
пустой. Куда передавать ID не понятно.

"Борисов Михаил Евгеньевич" написал:

Максим, неправильно, что разработчики заливают в релиз сырую реализацию, которая почти не тестировалась (3 ошибки сразу как попробовал). После отсутствия обратной связи, не убирают ее или хотя бы не делают заглушки с предупреждениями.


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

Ответ на последний вопрос, не забыть проверить открыт ли DataSet.
Не понятно почему шаблон этого не делает, если Prepare() без всех атрибутов все равно не работает. Конечный вариант:

wnd_FilesDetail.Window.Attributes('TableUSI')='tbl_FileInLRequirement';
wnd_FilesDetail.Window.Attributes('InsertLinkUSI')='iq_FileInLRequirement';
wnd_FilesDetail.Window.Attributes('ParentItemID')=ID;
wnd_FilesDetail.Window.Attributes('ParentItemFieldName')='LRequirementID';
var GridWindowFilesDetail = wnd_FilesDetail.Window; 
GridWindowFilesDetail.Prepare();
GridWindowFilesDetail.ComponentsByName('dlData').Dataset.Open();

Почти все хорошо, но:


При DoNotSendNotify=null проходит в условие, подозрительно. Ошибка неинформативна, после нее все отрабатывает штатно. В Result true возвращается. Можно ли дописать

if (!DoNotSendNotify && DoNotSendNotify!=null)

так?

При инверсии null в JS возвращаемым значением является true, так что так и должно быть. То есть без четкого указания о неотправке при вызове функции будет соблюдаться условие.

Я пользовалась этой обработкой для версии 3.3.2 и в 3.3.1, нормально все создавалось.
Поэтому я бы не стала говорить, что обработка не работает.

Показать все комментарии
Бизнес-процессы
Разработка

Добрый день!

TS 3.4.0.180

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

Нравится

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

Добрый день Андрей!!!

по умолчанию в конфигурациях Terrasoft CRM, XRM 3.4 таблица tbl_Workflow не "Администрируется по полям", т.е по умолчанию пользователи системы видят все процессы без ограничения. Максимум, что Администрируется это Только раздел "Процессы", т.е кому разрешено видеть данный раздел, а кому запрещено.

пожалуйста через посмотрите в таблице tbl_Workflow случайно не включена опция "Администрируется по записям". если включена я расскажу как в раздел Процессы добавить новую деталь. Если у вас не дорабатывались сервисы, то и поделюсь уже доработанными 2-мя сервисами. Спасибо!!!

У меня, к сожалению, не XRM версия, а CRM. Там есть настройка для администрирования записей - Права доступа по умолчанию. Я выделил группу процессов и сделал доступ на всех пользователей, тем не менее, каждый видит только свои процессы, кроме админов.
А насчет этого

"Власов Михаил Викторович" написал:пожалуйста через посмотрите в таблице tbl_Workflow случайно не включена опция "Администрируется по записям".
я не понял где это смотреть.

Требуется открыть Террасофт Администратор, в Реестре Модулей открыть: "Workflow --> General --> Main Grid". В открывшейся ветви находим таблицу tbl_Workflow, Открываем ее и смотрим установлена голочка или нет "Администрируется по полям". Если установлена и вам действительна нужна данная деталь, тогда да пожалуйста я вам расскажу как ее добавить. Только прежде всего Андрей вы для себя определитесь действительно ли вам требуется, чтобы каждый сотрудник видел только свои процессы. Если да тогда еще раз повторюсь помогу вам создать в Разделе "Процессы" деталь "Доступ". Но если вам не требуется Чтобы каждый пользователь видел только свои "Процессы", то мой вам совет снимите галочку с "Администрируется по полям" в таблице tbl_Workflow и после сохраните и обновите Таблицу.

Во вложение прилагаю Скриншот таблицы tbl_Workflow где вы сможите найти Опцию "Администрируется по полям"

Провел ряд экспериментов. В сервисе таблицы tbl_Workflow ни одна галочка не установлена, тем не менее я вижу только свои процессы, под Админом вижу все процессы. То есть такая ситуация

"Власов Михаил Викторович" написал:по умолчанию в конфигурациях Terrasoft CRM, XRM 3.4 таблица tbl_Workflow не "Администрируется по полям", т.е по умолчанию пользователи системы видят все процессы без ограничения.

не воспроизводится. Тем не менее мне нужно дать доступ на процессы, чтобы часть пользователей видела все процессы в системе, а часть нет. Поможет ли в этой ситуации деталь Доступ? И почему в моей конфигурации все пользователи не видят всех, если не установлено администрирование по записям?

"Рябенко Андрей" написал:

Тем не менее мне нужно дать доступ на процессы, чтобы часть пользователей видела все процессы в системе, а часть нет. Поможет ли в этой ситуации деталь Доступ? И почему в моей конфигурации все пользователи не видят всех, если не установлено администрирование по записям?

Отвечая на вопрос "почему пользователи не видят всех бизнес-процессов"?
в скрипте scr_WorkflowWorkspace есть функция

function ApplyWorkflowsWorkspaceFilter() {
...
	ApplyDatasetFilter(BaseWorkspace.GridDataset, 'OwnerID', 
		Connector.CurrentUser.ContactID, !Connector.CurrentUser.IsAdmin);
}

из кода по данной функции видно, что идет наложение фильтра на таблицу tbl_Workflow по полю "OwnerID". В связи с этим каждый пользователь видет только свои Бизнес-процессы, но при этом - это не разграничение прав по пользователям. Это просто фильтрация. Разграничивать по правам если честно я бы не стал и не советую этого делать, так как еще не известно какие в будущем у вас будут задачи с бизнес-процессами и Разграничение для вас создаст только дополнительную трудность.

Но к примеру если у вас стоит задача увидеть Пользователю1 бизнес-процессы пользователя2, я бы решил данную задачу путем добавление в раздел "бизнес-процессы" нового Lookup поля. Если интересно как это реализовать, то как пример реализации можно подсмотреть в разделе "Задачи".

А можно ли сделать это через деталь доступ, как в остальных реестрах? Чтобы гибко настраивать права на записи в реестре процессов?

Да безпроблем все это сделать можно. Только вот проблема которая у вас возникнет Андрей - это разграничение прав Одного бизнес-процесса на разное количество пользователей. К примеру вы создали бизнес-процесс. Внутри бизнес-процесса разрисовали логику в которой будут взаимодействовать 3 разных отдела и вам заранее будет требоваться разграничить права на отделы, на отдельных пользователей. И к примеру вы доработали этот бизнес-процесс и забыли включить права для новых групп и пользователей и ваша работа бизнес-процесса встала. Поэтому если вас это не пугает что я разрисовал, то я готов для вас поделиться доработанными скриптами.

Мне интересен этот вариант, хотелось бы посмотреть на скрипты. А фильтр в этом случае нужно вообще отключить,

function ApplyWorkflowsWorkspaceFilter() {
...
        ApplyDatasetFilter(BaseWorkspace.GridDataset, 'OwnerID', 
                Connector.CurrentUser.ContactID, !Connector.CurrentUser.IsAdmin);
}

как я понял?

"Рябенко Андрей" написал:А фильтр в этом случае нужно вообще отключить

Чтобы выводились БП не только текущего пользователя - нужно отключить.

Показать все комментарии
MS Outlook
Интеграция и импорт данных
Разработка

Оформленные письма в Outlook, приходят клиентам без правок, в виде обычного текста. Подскажите пожалуйста как сохранить настройки оформления, не потерять их в процессе рассылки?

Нравится

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

Шаблон в HTML формате или Plain Text?

1

делаем в HTML формате , а клиенту приходит Plain Text (Outlook 2010, TS 3.4.1.153)

Т.е. в карточке шаблона у Вас отображается HTML? Дайте скрин :)

А в общем, формат текста письма устанавливается в function CreateOutlookMessage(Params) тут:

if (Params.BodyFormat) {
			Message.BodyFormat = Params.BodyFormat;
		} else if (!Params.Template) {
			Message.BodyFormat = 1;
		}

Проверьте, если в итоге письмо уходит с форматом HTML - значит проблема в клиенте, который отображает Ваше письмо у получателя. Мне кажется, в таком случае даже если просто из Outlook отправить письмо в HTML этому же получателю - будет такая же ситуация.

PS: перед return Message в этой же функции, можете проверить свойство Message.HTMLBody.
PSS: вот константы

olFormatHTML	2
olFormatPlain	1
olFormatRichText	3
olFormatUnspecified	0

Нет возможности редактирования

Ну вот в этом и проблема - формат не определился. Попробуйте сохранить шаблон на HDD, а затем в параметрах шаблона загрузить шаблон из файла.
Вариант "времени нет, а надо срочно":

update tbl_MailTemplate set BodyFormatID = '{40C0699C-583A-4BBA-9F67-868F101B5B53}'
WHERE ID = '{some_id}'

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

Должно всё работать :)

Попробуйте отладить function SaveMessageTemplateToDataset(Message, RecordID) а именно var EnumItem = BodyFormatEnum.ItemsByCode(BodyFormatList[GetMailItemBodyFormat(Message)]);

"Костыль" не помог..Параметр шаблона изменился (Рис. 1), но настройки оформления по прежнему пропадают..Ниже приведены примеры того что хотим видеть и того, что получается( Рис.2, Рис.3)

День добрый!!!

я такое в своей практике встречал, когда между Terrasoft и Outlook нет интеграции, т.е связки. Т.е наверника шаблон на редактирование вызывали из Клиента Террасофта и после его создания сохраняли. Да он в террасофте сохранялся, но когда нет связки он почему то сохраняется но без всех параметров заполненных. Да первый вариант это загрузить шаблон вручную, т.е сохранить его на Жесткий диск и загрузить повторно. Но я бы пошел по пути запустил бы исполняемый файл TSMSOfficeLibraryConfigurator.exe, что лежит в каталоге Bin Террасофта, убедился что установлена Галочка напротив "Microsoft Outlook" если установлена, снял бы ее и после еще раз бы запустил программу и установил бы ее и нажал ОК. Конечно во время всех этих манипуляций Outlook должен быть закрыт. Открыл бы Outlook и убедился что появилась надстройка Террасофта, выполнил "Соединить", и только после этого еще раз из Террасофта открыл бы Шаблон и выполнил его сохранение. Думаю должно помочь. А так мне помница ранее у технической поддержки была инструкция красивая по настройки Интеграции Outlook и Террасофта. Поделитесь с девушкой пожалуйста.

Добрый день!
Выложил руководство по интеграции сюда: http://tsrdp.tscrm.com/support/pub/Adasyuk/outlook_integration.zip без пароля.

И еще не верю я этому mail.ru... А если открыть тоже письмо но в Outlook'e?

"Жаворонкова Татьяна Сергеевна" написал:

"Костыль" не помог..Параметр шаблона изменился (Рис. 1), но настройки оформления по прежнему пропадают..Ниже приведены примеры того что хотим видеть и того, что получается( Рис.2, Рис.3)

со фотографиями, что Татьяна предоставила тоже ознакомился и протестировал Татьянин случай. Создал шаблон в формате HTML, сохранил его в Террасофте. После выполнил отправку письма на mail.ru ящик. Письмо отображается корректно. Но когда в Outlook-e на закладке "Фомат текста" установил "Формат RTF" и отправил на mail.ru вот здесь да письмо в mail.ru открылось как текст. с чем конечно связано так и не понял. Хотя как и писал Дмитрий и предлагал открыть в Outlook-e да там письмо отображается корректно.

посмотрите пожалуйста Татьяна на закладке "Формат текста" в Outlook-e что у вас установлено. Спасибо!!!

Друзья, Спасибо за ответы! Есть ещё такой нюанс , в Outlook 3го года всё отправляется как следует, а в 10м всё по прежнему. На предмет формата проверила, стоит HTML.

Сам использую 2010 - всё ок. 2010 запущен? Plug-in подключен? Если запустить рассылку не в фоне, а чтобы письмо перед оправкой отображалось - формат корректен?

Дмитрий, 2010 запущен, Plug-in подключен. А как запустить рассылку не в фоне?Как отобразить перед отправкой?

Просто зайдите в раздел имейл, и выберите "Новое по шаблону". Должно отобразится новое письмо с вашим шаблоном (макросы, конечно, работать не будут, но не суть - главное проверить формат).

Спасибо ещё раз за ответы. Решили остановиться на Outlook 2003, а во избежание сообщений системы безопасности, установили программу Advanced Security.

Показать все комментарии
Бизнес-процессы
Разработка

Добрый день!
Ситуация такая, есть задача в БП, в которой есть 3 результата задачи: результат1, результат2, результат3. Мне надо сделать чтобы если параметр диаграммы БП flag = true, то в этом случае в задаче показывало только результат1 и результат2. Результат3 в этом случае надо скрыть. Как это можно сделать?

Нравится

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

Здравствуйте, Андрей!
На уровне БП сделать это не получится, но можно скрывать какие-то результаты на уровне страницы редактирования в функции edtResultOnPrepareSelectWindow.

"Андрей Каспаревич" написал:На уровне БП сделать это не получится, но можно скрывать какие-то результаты на уровне страницы редактирования в функции edtResultOnPrepareSelectWindow.

На уровне страницы редактирования, конечно, можно. Но такой подход, если его продолжить использовать, может привести к крайне запутанной логике БП.

А почему нельзя добавить в БП ветвление и разбить на 2 задачи с одинаковыми параметрами, но разными выходами?

Оказалось, что когда количество элементов БП достигает нескольких десятков, а кол-во связей под сотню, то работать с БП через графический интерфейс крайне неудобно, связи начинают сливаться друг с другом в одну сплошную линию и непонятно где какие связи проходят. Поэтому я стремлюсь к уменьшению элементов БП и количеству связей, а ведь разработка только началась. Чувствую, что через пару лет постороннему человеку вообще будет невозможно в БП разобраться. Можно же было сделать, чтобы линии были разного цвета, не накладывались друг на друга, было намного более четырех точек входа и выхода связей из элемента БП и т. д. А так похоже, что механизм БП создан для детских задач с несколькими элементами, а для серьезной разработки он не подходит. Использовать подпроцессы тоже не всегда получается. И, к примеру, если мне нужно ограничить кол-во результатов не в одном элементе, а в нескольких десятках, то я должен несколько десятков подпроцессов создавать? В этом плане преимущество кода очевидно.

Добрый день Андрей!!!

на платформе Terrasoft 3.X работа с Бизнес-процессами организована гибко и удобно. Мой вам совет если у вас огромный Бизнес-процесс старайтесь его разделить на подпроцессы, старайтесь рисовать свой процесс процесс осмысленно и разделяя его на логические единые сущности. Если к примеру идут обработка задач по договорам, там не должно быть сущностей от контрагентов.

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

"Власов Михаил Викторович" написал:

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


Очень интересно. А можете подробнее расписать эти варианты, если не трудно, то с примерами?

Добрый день, Андрей!
Уточните, пожалуйтса, какие конкретно примеры Вас интересуют?

Добрый день!
Как переходить к элементам БП без рисования стрелок, как пишет Власов Михаил Викторович.

"Власов Михаил Викторович" написал: очень помогает когда в ветвление требуется по определенному событию вернуться назад, я для этого не стрелки рисую а выполняю Подписку на событие и при отработки события возвращаюсь к определенному месту в Бизнес-процессе

Здравствуйте, Андрей!
Подобных примеров предоставить не могу, так как никогда не использовался такой подход к управлению бизнес-процессом. Соответственно, и рекомендовать его использование я Вам не могу, так как организация ветвления бизнес-процесса с помощью подписки на события не является протестированным методом, хотя и имеет право на жизнь.
Если Михаил предоставит примеры, буду благодарен, но все же рекомендую использовать стандартный механизм ветвления с помощью управляющих потоков и максимально разбивать сложные процессы на подпроцессы.

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

Как задаётся атрибут детализирующего окна с перекрестной таблицей что бы при нажатие Добавить окно редактирования знало на какую запись надо ссылаться? В каждом реестре есть детализация, связанная с перекрестными таблицами. Например: инцидент и его задачи. Окно которое отображает задачи инцидента при вызове "Добавить ссылку на задачу" передает текущий id инцидента в окно выбора задачи. У меня окно детализации отображается в другом месте и при нажатие добавить->ok говорит, что поле инцидент обязательно.

Решение: заполнить ParentItemID и ParentItemFieldName у окна с перекрестной таблицей перед нажатием добавить или воспользоваться RefreshCommonDetail, если стандартный реестр.

Нравится

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

Здравствуйте, Михаил.

В странице раздела при смене выделенной записи происходит RefreshDetails и, как правило, в нем RefreshCommonDetail.
RefreshCommonDetail передает название и значение основной колонки в WindowContainer детали, в атрибуты окна реестра.
Если окно реестра детали наследовано от wnd_BaseGridArea, то при инициализации в методе ReadParentAttributes будут вычитаны название и значение выделенной в разделе записи и записаны в глобальный объект окна реестра.
В wnd_BaseGridArea при нажатии на Добавить копируются атрибуты и передаются в окно карточки.
В окне карточки при нажатии на ОК, если окно унаследовано от wnd_BaseDBEdit, будет установлено значение выделенной в разделе записи в колонку датасета по названию из атрибутов.

В общем, суть в том, что достаточно указать корректное название колонки родителя в датасете детали при использовании RefreshCommonDetail.

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

"Maxim Gritsenko" написал:

В wnd_BaseGridArea при нажатии на Добавить копируются атрибуты и передаются в окно карточки.
В окне карточки при нажатии на ОК, если окно унаследовано от wnd_BaseDBEdit, будет установлено значение выделенной в разделе записи в колонку датасета по названию из атрибутов.


Вот я и хотел узнать какие атрибуты оно туда передает. Дефолтных их там 13, один из которых был ParentItemID. То что есть RefreshCommonDetail, которое знает о этих атрибутах я понимаю. Не работает у меня RefreshCommonDetail (пишет отсутствует объект):
SetDatasetAttributesForCall(Window.ComponentsByName('dlData').Dataset);
-не нашло или 'dlData'.

Передаются ParentItemID и ParentItemFieldName.

"Maxim Gritsenko" написал:

Передаются ParentItemID и ParentItemFieldName.


Огромное спасибо, то что нужно, теперь работает без костылей.

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