Прошу помочь с проблемой. Может быть кто-то сталкивался. На одной клиентской машине при запуске клиента Террасофт версии 3.3.2.252 появляется ошибка Runtime error 216 at 40005CDE (на других компах ошибок нет). Т.е. щелкаем на ярлык для запуска ПО - окно авторизации не появляется, появляется сразу сообщение об ошибке. При нажатии на ОК в ошибки, окно ошибки закрывается и далее ничего не происходит.
Пробовали переустановить клиентскую часть. При удалении клиента опять появилась эта же ошибка. Пробовали установить клиента заново (поверх старого, не до конца удаленного), при установке - на этапе Регистрации файлов опять появляется ошибка Runtime error 216 at 40005CDE. Скриншот прилагаю.
ОС компьютера: Windows 7 Корпоративная SP1.

Нравится

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

Добрый день Татьяна!!!

перекопируйте вручную с рабочей машины полностью папку Terrasoft, установленну в Programm Files на тот компьютер, где у вас не может пройти инсталяция, создайте вручную ярлык для запуска клиента. Исполняемый файл для запуска клиента "TSClient.exe". На него и создаем ярлык. После запуска программы клиента, произойдет регистрация всех библиотек и запустится клиент.

Добрый день!

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

"Алексеева Татьяна" написал:При запуске вообще ничего не происходит

Запуск строго с правами администратора для нормальной регистрации библиотек.

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

Добрый день!

Есть задача с вложенными файлам, отправляем E-mail либо через кнопку "Добавить связанную активность", либо из вкладки "E-mail", надо, чтобы вложенные файлы подтягивались в E-mail из задачи.

Нравится

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

Добрый день Евгений!!!

данную задачу решить можно, но есть сразу несколько вопросов. Файлы каждой сущности в BPMOnline хранятся в отдельных таблицах. Это один момент. Второй момент когда к примеру создаешь Контрагента и при создание загружаешь Файл (на закладке Файлы и примечания), то автоматически происходит сохранение карточки Контрагента, так как Связь в таблице AccountFile с таблицей Account, по полю AccountId имеет "1 ко многим" и следовательно на момент Добавление записи в таблицу AccountFile, запись в Таблице Account должны быть создана.

Так же и с вложением файлов в Емайлы, данную задачу можно решить, но запись в таблице Активности при создание Емайла и добавление в него Файла будет уже сохранена. И здесь сразу появляется вопрос а Если пользователь сначало захотел направить письмо с Вложением а потом отказался, а запись в таблице, при нажатие Отмены, уже будет создана. Поэтому у меня вопрос вас такая ситуация устроит? если да то тогда подскажу как выполнить вашу задачу. Спасибо!!!

Добрый день, Михаил!
В целом устроит, т.к. достаточно редко происходит отмена писем.

Еще один момент: как я понимаю функционал существует и он работает при пересылке письме - появляется сообщение с вопросом: "Скопировать вложения из оригинального письма?" Остается только применить этот функционал между задачей и e-mail

Добрый день Евгений!!!

весь механизм копирования вложения реализован на C# и вызывается на клиенте следующим кодом:

var requestConfig = {
     serviceName: "EntityUtilsService",
     methodName: "CopyEntities",
     data: {
          sourceEntityId: forwardEmailId,
          recipientEntityId: this.get("Id"),
          columnName: "Activity",
          entitySchemaName: "Activity",
          sourceEntitySchemaNames: ["ActivityFile"]
     }
};

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

Добрый день, Михаил!
Куда правильнее вставить данный код?

Добрый день Евгений!!!

самое интересное заключается в том, что меню "Связанная активность" формируется (генерируется) автоматически в Миксине "QuickAddMixin", результат формирования помещается в "QuickAddMenuItems". И далее результат мы видим на экране. После того как пользователь в меню "Связанной активности", выбрал какую связанную активность он хочет добавить, отрабатывается метод "onQuickAddRecord", данный метод отрабатывается в схеме BaseSectionV2 и далее по подписки возвращается обратно в Миксин. Если идти далее по цепочки то последний метод, что открывает страницу редактирования - это метод "openQuickActivityPage". Вот его я думаю и требуется изменить. Но здесь нужно не забыть, что нам нужно передать через подписку "sourceEntityId", т.е Id родительской задачи и далее уже вставить тот код что я писал ранее. Вставлять код лучше в цикл:

this.Terrasoft.chain(
  ....
);

что есть в методе "openQuickActivityPage", миксина "QuickAddMixin"

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

Здравствуйте, коллеги.

В карточке договора "отвалилось" поле, где можно было выбрать и Контакт и Контрагент.

При выборе вкладки контакта, карточка работает корректно, а при выборе вкладки Контрагент - ничего не выбирается, а в консоли пишет:

в самой карточке поля проставлены так:

diff: /**SCHEMA_DIFF*/[
...
  {
    "operation": "insert",
    "name": "Client",
    "values": {
      "layout": {
        "column": 0,
        "row": 5,
        "colSpan": 24,
        "rowSpan": 1
      },
      "tip": {
        "content": {
          "bindTo": "Resources.Strings.ClientCaption"
        }
      },
      "controlConfig": {
        "enableLeftIcon": true,
        "leftIconConfig": {
          "bindTo": "getMultiLookupIconConfig"
        }
      }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 7
  },
...
],
attributes: {
...
  "Client": {
    "caption": {"bindTo": "Resources.Strings.ClientCaption"},
    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
    "multiLookupColumns": ["Contact", "Account"],
    "isRequired": true
  },
...
}

В объекте Договор эти поля есть.

Если поставить отдельно выбок Контакта и Контрагента - то они работают.

Нравится

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

Добрый день Евгений!!!

а какие доработки и с какими схемами выполняли за последнее время?

Так. С объектом Договор: удалил 2 неиспользуемых поля. (та добавили ранее лишнюю дату и лишний контакт, которые не нужны там)
С объектом Контрагент - снял аттрибут обязательного заполнения для одного поля.

Поля абсолютно с этим не связнаны, к тому же Contact и Account это наследуемые поля. С ними по моему и при желании ничего бы не получилось

Сейчас открыл Дефолтную конфигурацию BPMOnline, карточку редактирования Договоры, и там я не увидел MultiLookup поля Клиент. Данные поля есть на странице редактирования Заказы, Счета. Но в договорах данного поля нет. Я думаю чтобы разобраться вам Евгений, нужно посмотреть код к примеру схемы страницы редактирования Счета, как там идет формирование и вывод данного поля на экран, и сравнить со своим кодом. А вообще MultiLookup поле в Договоре и не требуется, так как Договор заключается с Контрагентом, у которого есть Контактное лицо по данному договору. Вот почему изначально данные поля не объеденили как это сделано в счете к примеру. Так как там логика что Счет можно выставить как на Контрагента, так и на Физическое лицо в виде Контакта.

К сожалению задача была поставлена так, чтобы иметь возможность выбора или Контакта или Контрагента (типа ФизЛицо и ЮрЛицо).

Михаил, Вы там и не найдете. Потому что я ее переносил сам, по моему из карточки заказа.

Открыл. Посмотрел. Кардинальных отличий не нашел.

Сделал ресерч в своей карте: поменял местами "Contact" и "Account" в аттрибуте.

Работать карта стала еще интереснее. Она выборку контрагентов производит. Но, если уйти на Контакт и вернуться на Контрагент - то опять валится с этой ошибкой.

Евгений день добрый!!!

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

Добрый день, Михаил.
Валится непосредственно на запросе к серверу. Чуть позже скину лог.

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

Здравствуйте!
1. Добавил с помощью простого бизнес-процесса права доступа для определенных контрагентов.
В таблице SysAccountRight появились записи, но поле SourceId значение = NULL.
При добавлении прав доступа через карточку контрагента или по умолчанию, то поле SourceId заполняется определенными ID.
За что отвечает поле SourceID, из какой таблицы туда подставляются ID?
И почему при добавлении через БП SourceId =NULL?

2. На картинке синим подчеркнута ДатаСоздания, но на самом деле дата создания на 3 часа позже. Причем, если обновить права, то в ДатеИзменения стоит правильная дата.
Где можно настроить дату?

Нравится

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

"Alex GF" написал:В таблице SysAccountRight появились записи, но поле SourceId значение = NULL.

поле SourceId - это ссылка на таблицу "SysEntitySchemaRecRightSource" в которой хрянятся следующие значения (константные)

- Владелец
- Автор
- Ручное управление
- По умолчанию

"Alex GF" написал:На картинке синим подчеркнута ДатаСоздания, но на самом деле дата создания на 3 часа позже.

Проверьте часовой пояс в ОС где развернут SQL сервер и в ОС компьютера пользователя. Предполагаю, что разница между ними будет 3 часа.

"Зарицкий Олег Васильевич" написал:
Alex GF пишет:

На картинке синим подчеркнута ДатаСоздания, но на самом деле дата создания на 3 часа позже.

Проверьте часовой пояс в ОС где развернут SQL сервер и в ОС компьютера пользователя. Предполагаю, что разница между ними будет 3 часа.


И там и там время одинаковое.
Может есть настройки времени в админке BPM?

"Alex GF" написал:Может есть настройки времени в админке BPM?

В Админки BPMOnline установки времени нет. Есть в профиле пользователя установка часового пояса.

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

Подскажите пожалуйста, как возмоно при выполнении

ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled);

захватить SQL - запрос.

т.е. не данную информацию: имя запроса и т.д.

?SelectQuery
{...}
Caption: "sq_XXX"
CoClassGUID: "{2E5AFA6A-F672-4BAA-891C-6E699C6D36E3}"
Columns: {...}
Connector: {...}
Description: ""
ID: "{C9814440-69B1-4682-8B37-DFDE4A134EEA}"

а сам запрос со всеми параметрами, чтобы работать с этим запросом уже в SQL_редакторе.

Спасибо!!!

Нравится

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

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

на платформе Terrasoft 3.X на сколько я помню, написав в тексте кода "debagger" происходила точка останова. И в Админке (в отладчике) можно полностью развернуть весь SQL текст запроса.

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

debugger;

либо sql server profiler вам в руки на сервере

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

Если Вам нужен запрос с передаваемыми параметрами, тогда отловить его можно в SQL Profiler.

Также есть возможность запустить TSClient с ключом Profiler, как это сделать можно ознакомиться по ссылке.

"Савельева Алла" написал:Если Вам нужен запрос с передаваемыми параметрами, тогда отловить его можно в SQL Profiler.

См. SelectQuery.SQLText (скрин в файле)

А вот сами значения параметров да, в profiler

Здравствуйте Алла, Михаил и Александр. Спасибо вам большое!

Подключила SQL Server Profiler и отловила запрос.

Попробовала так же написав "debagger" в тексте кода, но не нашла SQLText.
Есть ли какие-то различия между версиями? У меня версия 3.2.0.90

На картинке, которую я прикрепила, между двумя красными линиями должен быть SQLText, но у меня нет.

"Марина Карапетян" написал:3.2.0.90

Версия уже "ретро", там возможно все :)
Этот реквизит появился, скорее всего, в 3.3.2

Хорошо Александр. Спасибо.

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

чтобы получить SQL запрос, используйте следующий код:

Connector.DBEngine.GetSelectQuerySQLText(Dataset.SelectQuery)

Спасибо Павел, получилось.

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

Добрый день!

В базовой версии время реакции отсчитывает от принятия кейса в работу после нажатия кнопки "Take it"
А если надо сделать по другому событию (обработка диспетчером и назначение ответственного), то где искать существующий функционал установки этого поля?

Нравится

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

Добрый день.

Обработка нажатия кнопки "Take it" происходит в Case.CaseSection.onResolvedButtonMenuClick(), где через sandbox публикуется сообщение OnResolvedButtonMenuClick.
Далее это сообщение обрабатывается в Case.CasePageV2.onResolvedButtonMenuClick().
После прохождения валидации в CasePageV2.asyncValidate(), непосредственное сохранение карточки осуществляется в CasePageV2.saveCard().

Самым простым вариантом решения Вашего случая будет:
1) добавить обработчик для требуемого изменения состояния;
2) реализовать публикацию и подписку нового сообщения для вызова CasePageV2.onResolvedButtonMenuClick().

Стоит обратить внимание на входящий параметр config метода CasePageV2.onResolvedButtonMenuClick(),
который в базовой реализации берется из атрибута ResolvedButtonMenuItems:

var resolvedButtonMenuItems = this.get("ResolvedButtonMenuItems");
config = resolvedButtonMenuItems.collection.items[0].values.Tag;
Показать все комментарии

В bpmonline 7.7/7.8 Customer Service не могу вывести поле email в реестре контрагентов. Подскажите - что определяет "видимость" поля в визуальном редакторе страницы реестра? Например, Web и Телефон там есть, а email - нет.

Нравится

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

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

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

Я понимаю про связь "1 ко многим", однако странно, что в настройке колонок списка доступны поля "основной телефон" и "дополнительный телефон", которые находятся в той же детали, а вот "Email" - недоступен.

Это доступны поля Основных сущностей, у вас может быть N-ное количество основных телефонов или дополнительных но в карточке контрагента будет храться только первый введенный, если мне память не изменяет, то это по такому алгоритму работает. Я вам предлагаю для поля E-mail в своей базе сделать именно такую же реализацию. Как говорят по образу и подобию.

Штатно вытащить в реестр Email Не получится, увы.
Оставшиеся поля средств связи в основной таблице это рудимент...
Я бы сделал view с текстовым полем Email (запросом собираем все email контрагента в строку через запятую например, или первое попавшееся берем) и AccountId, а потом из нее подтягивал в реестр (колонка через связи штатно выберется)

"Alex22" написал: настройке колонок списка доступны поля "основной телефон" и "дополнительный телефон", которые находятся в той же детали, а вот "Email" - недоступен.

По логике, email'а у контрагента нет. Они есть у контактов, с которыми идёт общение. А даже если email есть, то никто на него не пишет

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

Коллеги, добрый день!
В лид-форме помимо стандартных полей, которые есть у Лида, есть поле Вопрос, куда посетитель сайта пишет текст. Вроде бы понятен механизм передачи данных с заполненных полей, но как и куда передать содержимое поля Вопрос? Это нужно создавать новое поле в Лид - История?

Нравится

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

Добрый день!

Вам необходимо создать пользовательское поле с типом "Строка" на странице Лида, после чего замапить поля как указано ниже:

var config = {
fields: {
"Name": "#AjaxFormModel_name", // Name of a visitor, submitting the page
"Email": "#AjaxFormModel_email", // Visitor's email
"MobilePhone": "#AjaxFormModel_phone", // Visitor's phone number
},
landingId: "6bd7ca2a-4d27-4305-92a6-0afc7ad0b86e",
serviceUrl: "https://ts1-8wyg9-0301897.bpmonline.com/0/ServiceModel/GeneratedWebForm…",
redirectUrl: "http://test.olegzaharov.ru/index10.php"
};

Илья, спасибо!

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

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

Подскажите возможно ли отключить события на объекте при сохранении (аналог DisableEvents на датасете в TS). Как пример добавляю запись вот так:

EntitySchema schema = _userConnection.EntitySchemaManager.GetInstanceByName("Account");
Entity entity = schema.CreateEntity(_userConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("Name", "Контрагент");
entity.Save();

Спасибо.

Нравится

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

"Дашкевич К." написал:entity.Save();

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

для отключения событий выполните:

   entity.Save(false);

а лучше пользоваться в данном случае конструктором

new Update()

entity.Save(false); - по документации это отключение проверки заполнения обязательных значений.
Проверил события не отключает.

"Власов Михаил Викторович" написал:а лучше пользоваться в данном случае конструктором
new Update()
- можно пожалуйста подробнее.

вот пример использование Update

var update = new Update(UserConnection, "Invoice")
	.Set("Number", Column.Parameter(code))
	.Where("Id").IsEqual(Column.Parameter(Entity.PrimaryColumnValue));
update.Execute();

выполняется обновление Номера в таблице Счета

Добрый вечер.

Можно сделать так, чтобы событие в родительском объекте не вызывалось.

Например, в базовом пакете есть объект Account, для которого в процессе объекта реализована некая логика после сохранении записи.

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

Для "отключения" запуска обработчика родительского события можно в конце задания-сценария Вашего обработчика в процессе замещающего объета, перед return true, дописать:

ActivatedEventElements.Remove("Имя стартового сообщения в родителе")

Имя стартового сообщения в родителе - название элемента стартового сообщения в родительском пакете, вызывающего AccountSaved. Обращаю внимание, что это именно название элемента в Вашем процессе, а не события.

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

а как себя будет вести система если Замещающие схемы таблиц построены Именно Иерархически, и по иерархии родительская схема таблицы не главная, а уже замещаем к примеру замещенную схему. Ведь и такая ситуация возможна. И еще вопрос возможно отключение не конкретно события, а конкретного элемента процесса, так как в замещающей логики он и не нужно чтобы уже отрабатывался. Это я говорю если переопределяется не своя логика, а базовая логика системы. Спасибо!!!

Михаил,

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

По поводу Вашего второго вопроса - подскажите, правильно ли я понял кейс.
Допустим, в процессе объекта есть стартовый сигнал обработчика какого-то события. После стартового сигнала идет Чтение данных, затем Изменение данных.
Суть вопроса в том, как отключить вызов изменения данных?

Да Андрей все верно поняли, по второму кейсу. Именно это я хотел уточнить. Спасибо!!!

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

Спасибо Андрей за информацию. Ну тогда только совет для ваших разработчиков, чтобы всю C# логику выносить в Методы бизнес-процесса а не оставлять в Скриптах бизнес-процесса, чтобы можно было легко ее переопределять, а не придумывать как ее обойти. Это я говорю про стандартные схемы таблиц, во многих именно с# логика хранится в Скриптах бизнес-процесса, а не в методах бизнес-процесса

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

Здравствуйте, коллеги.

Есть вопрос:

Есть объект Договор. Есть печатная форма. Произвели настройки полей, для формы. В Worde, используя плагин, накидали поля на шаблон и сохранили.

При печати, заполнило только треть данных и только там, где были данные латиницей. Даты тоже не попали.

Что мы сделали не так?

Нравится

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

Добрый день Евгений!!!

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

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

1. Версия 7.7.0.2881.
2. Да, объект договора был перенаследован в нашем локальном пакете. добавлены новые поля.
3. шаблон testcontract.docx

Поля выложены тупо списком, для теста

Результат с этим тестом

1.	
2.	
3.	
4.	
5.	
6.	
7.	
8.	Test
9.	
10.	
11.	8-Test
12.	Test user
13.	
14.	Test user
15.	
16.	
17.	
18.	
19.	0,0
20.	Test user
21.	
22.	
23.	
24.	
25.	
26.	
27.	
28.	
29.	
30.	
31.	
32.	
33.	
34.	
35.	
36.	
37.	
38.	
39.	
40.	
41.	
42.	
43.	
44.	
45.	
46.	
47.	
48.	
49.	
50.	
51.	
52.	
53.	
54.	
55.	
56.	
57.	
58.	
59.	
60.	Договор 
61.	Лицензия

Обекты "Клиент1" и "Клиент2" настраивал через "Табличные части печатной формы". Связь 1 к 1.

Добрый день Евгений!

какие значения полей из данного списка вы не видите? перечислите пожалуйста. спасибо!!!

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

Здесь лежит печатная форма с полями

Настройка "Контакт1"

Настройка "Контакт2"

Шаблон в Ворде

А какие поля не вsвелись - просто сравните по номерам в Шаблоне и результат

Несовсем понятно зачем Таблицу "Контакты" добавлять в табличную часть. Табличные части используются если у договора есть Множество, именно Множество, "Продуктов". Вот продукты и добавляются в Табличную часть и выполняется соединение "1 ко многим". Далее непонятно что вы вообще желаете Евгений вывести в договор. Может чтобы у вас все получилось для начало вы опишите поля что желаете разместить в Печатной форме договора и к примеру опишите проблему тех полей, что вы не можете штантыми средствами получить. и тогда будет хоть ясная картина.

еще раз в завершение повторю Что табличные части используются для извлечения данных из таблиц со связью "1 ко многим"

Честно говоря, этот вариант дали как возможное решение по подтягиванию полей. Я понимаю, что это костыль.
Насчет полей, мне нужны практически все. Там документ сложный и двуязычный.

Так зачем Евгений Таблицу "Контакты" добавляете в Табличную часть? какую цель преследуете.

Я преследую цель, чтобы как-то подтянуть данные контакта, для начала.)
А оно хоть так, хоть эдак не тянет данные.

Я вот думаю, что проблема может состоять в том, что объекте Контакт, сделано два поля с наименованием Клиент (так получилось, это еще надо разрулить через удаление лишнего), а Плагин "теряется" какой ему подогнать..

"Фролов Евгений" написал:(так получилось, это еще надо разрулить через удаление лишнего)

Чтобы Евгений не разруливать лишнего, сначало нужно 7 раз подумать и 1 раз сделать. Это касается всего и проектирование Новых или Замещающих схем Таблиц. Это касается и программирования. Рекомендую лучше сначало рисовать на бумаге, доске. Чтобы именно наглядно вы видели свой конечный результат и только после этого начинать проектирование и программирование

Ну, с этим согласен. Но что делать, если такое "чудо" тебе попадает по наследству? Приходится разруливать..

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

Разрулилось заданием уникальных названий полям.

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