Коллеги, привет)
Подскажите, каким образом можно реализовать многострочный тип строки в моб.приложении? Базовая многострочная колонка отображается в моб.приложении так же. А кастомная нет.

Нравится

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

Здравствуйте, Виктория!

 

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

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "Title", {
    isMultiline: true
});

Для этого нужно просто знать название колонки и группу колонок, в которой размещена колонка (второй параметр в примере выше).

Пример реализации:

1. Создать в конфигурации модуль http://prntscr.com/pgj6cm  в пакете Custom 
2. Называем его UsrMobileActivityModuleConfig  и пишем в схеме код: 
 

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "DetailedResult", {
    isMultiline: true
});

https://prnt.sc/q0zgem

3. Сохраняем схему 
4. В MobileApplicationManifestDefaultWorkplace в пакете Custom добавляем созданную схему https://prnt.sc/q0zh0l
Как это правильно делать также описано на Академии https://academy.terrasoft.ru/documents/technic-sdkmob/7-14/kak-dobavit-standartnuyu-detal-s-kolonkami
https://academy.terrasoft.ru/documents/technic-sdkmob/7-15/sdk-reestra
5. Сохраняем манифест 
6. Компилируем измененное.
 

Здравствуйте, Виктория!

 

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

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "Title", {
    isMultiline: true
});

Для этого нужно просто знать название колонки и группу колонок, в которой размещена колонка (второй параметр в примере выше).

Пример реализации:

1. Создать в конфигурации модуль http://prntscr.com/pgj6cm  в пакете Custom 
2. Называем его UsrMobileActivityModuleConfig  и пишем в схеме код: 
 

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "DetailedResult", {
    isMultiline: true
});

https://prnt.sc/q0zgem

3. Сохраняем схему 
4. В MobileApplicationManifestDefaultWorkplace в пакете Custom добавляем созданную схему https://prnt.sc/q0zh0l
Как это правильно делать также описано на Академии https://academy.terrasoft.ru/documents/technic-sdkmob/7-14/kak-dobavit-standartnuyu-detal-s-kolonkami
https://academy.terrasoft.ru/documents/technic-sdkmob/7-15/sdk-reestra
5. Сохраняем манифест 
6. Компилируем измененное.
 

Мотков Илья,

большое спасибо!

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

Может данную колонку нужно добавить в коллекцию первичных колонок?

Viktoriya Abysova,

вопрос уже не актуален, разобралась, спасибо!

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

Здравствуйте, в детали [Амбулаторная карточка] есть поле [ФИО Врача] и поле [Специализация Врача]. Нужно вывести [Специализацию Врача] из установленного поля [Фио Врача]. Врач-это контакт и у него уже есть поле Специализации. Везде описывают кейс с числовыми значениями, но вывод из БД нигде нет. Буду очень благодарен, если подскажите.

Нравится

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

Все можно проще сделать укажите чтоб для доктора вычитывались колонки ФИО и Специлизация и используйте их!

"UsrDoctor": {
  lookupListConfig: {
   columns: ["FIO","UsrDoctorsSpecialization"]
  }
 },

После єтого можно обращатся к полю как UsrDoctor.UsrDoctorsSpecialization

Если я правильно понял, то надо сделать вот так:

attributes: {
//Здесь мы "смотрим" внутрь справочного поля [UsrDoctor], которое ссылается на раздел [Контакты]
//и ищем там специализацию [UsrDoctorsSpecialization]
 "UsrDoctor": {
  lookupListConfig: {
   columns: ["UsrDoctorsSpecialization"]
  }
 },
//Здесь мы вызываем метод, который будет устанавливать специализацию, когда пользователь 
//внесет изменения в поле [UsrDoctor]
 "UsrDoctorsSpecialization": {
  dependencies: [
   {
    columns: ["UsrDoctor"],
    methodName: "setDoctorsSpecializtion"
   }
  ]
 }
},
methods: {
//собственно метод, который устанавливает специализацию в нужное поле
//условие можно и изящней написать. Сделал так, чтобы было понятно.
 setDoctorsSpecializtion: function() {
  var doctor = this.get("UsrDoctor");
  if (doctor) {
   if (doctor.UsrDoctorsSpecialization) {
    this.set("UsrDoctorsSpecialization", doctor.UsrDoctorsSpecialization);
   }
   else {
    this.set("UsrDoctorsSpecialization", null);
   }
  } 
  else {
   this.set("UsrDoctorsSpecialization", null);
  }
 }
},

 

Все можно проще сделать укажите чтоб для доктора вычитывались колонки ФИО и Специлизация и используйте их!

"UsrDoctor": {
  lookupListConfig: {
   columns: ["FIO","UsrDoctorsSpecialization"]
  }
 },

После єтого можно обращатся к полю как UsrDoctor.UsrDoctorsSpecialization

Григорий Чех,

Вау, почему в документации еще нет этого способа?:)

Есть:

lookupListConfig — свойство, отвечающее за свойства поля-справочника. Подробнее об использовании данного параметра можно узнать из статьи "Применение фильтрации к справочным полям". Это конфигурационный объект, который может содержать в себе следующие опциональные свойства:

  • сolumns — массив имен колонок, которые будут добавлены к запросу дополнительно к колонке Id и первичной для отображения колонке.
  • orders — массив конфигурационных объектов, которые определяют сортировку данных при отображении.
  • filter — метод, возвращающий объект класса Terrasoft.BaseFilter или его наследника, который, в свою очередь, будет применен к запросу. Не может использоваться совместно со свойством filters.
  • filters — массив фильтров (методов, возвращающих коллекции класса Terrasoft.FilterGroup). Не может использоваться совместно со свойством filter.
Показать все комментарии

возник вопрос, как отслеживать изменения в текстовом поле карточки.
а именно, в зависимости от введенного [Числа] в определенное текстовое поле нужно изменять значение справочного поля. подобные изменения необходимо выполнять каждый раз, когда [Число] изменяется.
подскажите, как привязать к текстовому полю событие onChange (если таковое имеется), или каким образом вообще можно решить эту задачу.

заранее благодарен

Нравится

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

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

Есть два варианта решения:
1) На странице редактирования
2) На стороне сервера по событию изменения записи бизнес-процессом

Пример реализации на стороне страницы редактирования Вы можете посмотреть в схеме OrderProductPageV2:

"PrimaryPrice": {
	dependencies: [
		{
			columns: ["Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount"],
			methodName: "calculatePrimaryValues"
		}
	]
}

Значение поля PrimaryPrice изменяется методом calculatePrimaryValues при изменении полей "Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount".

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

благодарю за ответ. попробую сделать так.

Сделал по первому способу. Поля устанавливаются, но при нажатии на "Сохранить" значения остаются прежними. Если устанавливать значение справочного поля вручную, то все сохраняется.

Беда, как говорится, не приходит одна.

Приведу примерный механизм изменения данных:

var UsrL = this.get("UsrL");

далее идет поиск нужного значения справочника и установка этого значения в справочное поле

var n =  item.get("Name");
var t = {
	displayValue: n,
	value: UsrLoial.value
};
this.set("UsrL", t);

Для справочника есть следующий метод для установки значения:

this.loadLookupDisplayValue("ИмяСправочника", значение);

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

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

Нравится

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"
};

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

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

Добрый день!

Столкнулся со следующей проблемой. На гриде детали добавил поле числового типа с названием "MinPurchaseAmountEdit". Мне необходимо при переходе на эту страницу детали этому полю задавать некоторое значение. Делаю я это в событии "PageLoadComplete" (пробовал также в "Init"):

0

Код следующий:

Page.MinPurchaseAmountEdit.Value = 10m;

Компилируется всё отлично. Дебажится тоже. Присваиваемое значение "10" в формате "decimal" присваивается! Но, на самой странице в консоли возникает странное уведомление:

Uncaught ReferenceError: PageContainer_DetailGridContainer8021c0aacccf410e8f1da5c600f5d6ad_MinPurchaseAmountEdit is not defined

Насколько я понял, то система не видит это поле. Собственно, по этой причине карточка моей детали не открывается, т.е. она пустая:

2

Я так ранее делал - всё получалось без проблем. Сейчас - не понятно поведение системы. Прошу помощи!

Нравится

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

Можно ещё попробовать присваивать значение контролу при помощи метода:

Page.MinPurchaseAmountEdit.SetValue(10m);

Или же писать в поле источника данных:

Page.DataSource.ActiveRow.SetColumnValue("MinPurchaseAmount", 10m);

Спасибо, Александр, что подсказали, но:
- в первом варианте ошибка та же: система не видит контрола на странице (та же ошибка в консоли браузера);
- во втором случае даже страница не открылась, а система выдала ошибку:

Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.NullReferenceException
Exception Source: TSBpm

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

3

Возможно, дело в том, что это деталь с гридом, а не карточка.
И на момент PageLoadComplete её источник данных ещё не привязан к конкретной записи. А поле привязано к источнику.

Не знаю, что именно хотите сделать, но, может, надо было вязать к событию смены записи на самом гриде (детали) DataSourceActiveRowChanged или событию смены записи в основном реестре (разделе) GridPageRefreshRow.

У меня задача в том, чтобы заполнять это поле "MinPurchaseAmountEdit" данными из БД, и заполняться она должна в момент первого обращения к странице детали, а именно в момент перехода на неё после открытия карточки, к которой привязана деталь. Здесь событие смены записи на самом гриде или в основном реестре точно не подойдут.

Дело в том, что для всех записей этого грида значение "MinPurchaseAmountEdit" одинаково и мне нужно выводить это значение (если оно отлично от нуля!) и присваивать это значение контролу. Это всё при первом переходе на грид детали. Непонятно, почему кнопки, которые на этой детали находятся ("Добавить", "Изменить" и др.) обнаруживаются и на них система не ругается, а при добавлении контрола в этот же контейнер к кнопкам BPM его (контрол) не видит...

Кроме того, "на момент PageLoadComplete её источник данных ещё не привязан к конкретной записи" - тут дело даже не в источнике данных, т.к. я просто работаю с элементами на странице:

Page.MinPurchaseAmountEdit.SetValue(10m);

Здесь событие смены записи на самом гриде или в основном реестре точно не подойдут.

Всё же лучше и их попробовать, они могут вызываться и при первом выборе записи.

Ещё непонятно, зачем Вы привязываете поле ввода к полю датасорса (вероятно, датасорса детали), если оно никак не связано с выбранной записью. На скриншоте свойств это видно. Если это просто программно наполняемый элемент, то этой связи и не нужно.

"они могут вызываться и при первом выборе записи." - но ведь поле должно обновляться при первичном открытии страницы этой детали. Неужели такой возможности нет в функционале BPM?

Сделал поле без привязки к БД:

4

Ошибка та же самая - система не видит моего контрола. Куда ещё "копать"?

P.S.: Значение "UId" на скринах разное, т.к. я удалял элемент, компилировал и добавлял новый такой же, чтобы убрать его привязку к БД, иначе система ругается - NullReferenceException...

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

Странно... Просто возникает тогда другой вопрос: если после события завершения загрузки страницы (см. скрин бизнес-процесса) система не видит все контролы на этой странице, то...... когда же они там инициализируются? Вопрос, видимо, философский((

Всё равно спасибо, Александр, что поучаствовали в обсуждении. Хорошего Вам дня!

Да, действительно странно. А Вы пробовали именно с полем ввода, если выводить в название кнопки или простой надписи, то отрабатывает нормально?

Попробовал добавить надпись с названием "Label1" и заголовком "Надпись 1", предварительно удалив поле ввода дробного числа и скомпилировав модуль. После этого в то же событие "PageLoadComplete" добавил код:

Page.Label1.Caption = "etqtert";

Когда скомпилировал модуль и открыл страницу детали, она открылась!!!! Но:

5

Вопрос: откуда там взялся контрол, который я до этого удалил - непонятно... И в структуре он тоже был. Но самое приятное то, что "Caption" у надписи поменялся (заметить по картинке трудно, но возможно)! При этом код:

Page.MinPurchaseAmountEdit.SetValue(10m);

был закомментирован.

Я удалил поле ввода дробного числа снова, удалил надпись, закомментировал код по переприсвоению "Caption" в надписи и раскомментировал код по установке значения в "MinPurchaseAmountEdit". Скомпилировал. Страница детали не открылась... :cry: Ошибка та же.

ВЫВОД: Изменение поля ввода дробного числа нельзя изменять ни в одном событии страницы до того пока она хотя бы один раз не прорисуется (ну или лыжи не едут...). Но это не применимо к остальным контролам. К сожалению(

А для поля ввода строки такое же самое поведение, что и для поля ввода числа?

Да, эти контролы ведут себя одинаково: поле ввода строки тоже не определено в событии "MinPurchaseAmountEdit". Ошибка та же.

Судя по сообщению:

Uncaught ReferenceError: PageContainer_DetailGridContainer8021c0aacccf410e8f1da5c600f5d6ad_MinPurchaseAmountEdit is not defined

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

Контрол идентифицируется браузером как:
http://i.piccy.info/i9/d0f1d2f7db16bc88df4890afcb8e71e5/1458115070/2764…

ПРИ ЭТОМ! Если никаких обращений к этому контролу ни в каком событии не писать, типа:

Page.MinPurchaseAmountEdit.SetValue(10m);

то, контрол система обнаруживает НОРМАЛЬНО! А если написать к нему обращение в виде предыдущего кода, то система разводит руками и говорит, что не знает, чего я от неё хочу. Похоже, она женского пола...

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

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

Что нужно добавить в код чтобы строковое поле стало многострочным.
В объекте галочку поставил.

код:

{
    type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
    name: 'UsrComment',
    columnPath: 'UsrComment',
    dataValueType: Terrasoft.DataValueType.TEXT,
    visible: true
}

Нравится

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

Здравствуйте, Василий:

{
	type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
	name: 'UsrComment',
	columnPath: 'UsrComment',
	dataValueType: Terrasoft.DataValueType.TEXT,
	visible: true,
	customConfig: {
		className: 'Terrasoft.controls.MemoEdit',
		height: '100px'
	}
}

Спасибо!!!

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