Пытаюсь перенести раздел без пакета кусками. Сущности типа "Объект" перенеслись. А сущности типа "Клиентский модуль" хоть и сообщают что перенеслись в списке в управлении конфигурацией не появляются. И в мастере настройки рабочих мест раздел не виден. Что сделал не так?

 

Вот список на сервере источнике.

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

 

Вот список на сервере приемники

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

Нравится

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

По второму скриншоту вижу, что вы настроили отображение реестра схем типа "объект", поэтому у вас отображаются только объекты. Выберете как на первом скриншоте тип "Все элементы" и увидите клиентские схемы.

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

Для пробы сделал раздел без ссылок на другие разделы или справочники. Это имелось ввиду?

 

Или что-то другое имелось ввиду?

Рашид Еркиналиев,

Нет, не совсем.

Посмотрите эту тему https://community.terrasoft.ru/questions/poryadok-sozdaniya-razdela-vru…

Правильно ли я понял:

1. Чтобы перенести раздел частями надо еще в базе сделать нужные апдейты. (для чего тогда нужна такая выгрузка объектов раздела?)

2. Корректно раздел с сервера на сервер можно перенести только в составе пакета, механизма для корректного переноса раздела (без ручного вмешательства в БД) не существует

Перенос изменений системами осуществляется с помощью выгрузки пакетов и их установки на другую систему это для продуктивной и тестовой сред.

Между средами разработки изменения переносятся с помощью свн.

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

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

Когда раздел привязывают к пакету, туда добавляют схемы и данные с записями в служебных таблицах. При установке пакета на новом месте создадутся схемы и раздел зарегистрируется.

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

Спасибо, Александр, примерно понятно.

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

Добрый день!

 

Подскажите как правильно организовать распределение входящих Лидов между операторами если каждый оператор привязан к своему региону и набору каналов(e-mail, звонки, лэндинги)?  Возникла идея организовать распределение через очереди, но в стандартной реализации Тип очереди "Лид" отсутствует. На сколько реализуемо? Какие есть альтернативные варианты? 

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

 

 

Нравится

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

Максим, попробуйте настраивать не в справочнике, а отсюда:

Откроется окно с аналогом старого интерфейса:

Максим, добавьте Лид в справочнике [Объекты очередей] и он появится в списке.

Сидоров Александр Валерьевич,

Так уже пробовал, не работает. Обратил еще внимание, что в данном справочнике есть поле с UID объекта. Оно не доступно для редактирования, но даже если SQL-скриптом в него записать UID таблицы "Лид", то  все равно выбрать его не получается.

Максим Румский,

а у вас какая версия? на 7.17.0 у меня другой интерфейс добавления записи для этого справочника и там UID нет. Просто добавляешь и работает.

 

Сидоров Александр Валерьевич,

 

версия 7.17.1 с новым интерфейсом раздела "Конфигурация". Видимо при переезде на новый интерфейс что-то потерялось. Написал в тех.поддержку.

 

Просьба еще проверить какое у Вас значение указано в  свойствах справочника "Страница реестра":

Максим, попробуйте настраивать не в справочнике, а отсюда:

Откроется окно с аналогом старого интерфейса:

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

Спасибо! Так все работает.

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

1)Мне нужно взять ответ функции SetHelloAttribute() и назначить в поле UsrTypeSale. Не могу понять реализацию, так как недавно начал изучать данный продукт. Буду признателен за помощь.

 

 

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

Нравится

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

Ислам. судя по приведенному фрагменту, эта функция не возвращает значения, но в процессе работы заполняет атрибут HelloAttribute. Вы можете её изменить, чтобы она писала сразу в нужное Вам поле UsrTypeSales, а затем просто запустить в нужном месте, либо же оставить функцию без изменений и в Вашей функции calculateBalance сначала вызывать её, а затем копировать из атрибута в поле.

А где у "SetHelloAttribute" return?

Александр Тыра,

Нет. Я копирую пример из документации. 

Ислам. судя по приведенному фрагменту, эта функция не возвращает значения, но в процессе работы заполняет атрибут HelloAttribute. Вы можете её изменить, чтобы она писала сразу в нужное Вам поле UsrTypeSales, а затем просто запустить в нужном месте, либо же оставить функцию без изменений и в Вашей функции calculateBalance сначала вызывать её, а затем копировать из атрибута в поле.

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

Спасибо, решил вопрос.

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

Добрый день!

 

Коллеги, помогите найти решение:

 

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

Может у кого была подобная задача, есть чем поделиться?

Спасибо!

Нравится

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

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

Можно попробовать реализовать через бизнес-процесс с помощью элементов 'Автогенерируемая страница' и 'Преднастроенная страница'.

Для последовательного заполнения можно использовать несколько элементов подряд.

Подробнее о работе с этими элементами можно почитать Элемент процесса [Автогенерируемая страница] и Элемент процесса [Преднастроенная страница].

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

Можно попробовать реализовать через бизнес-процесс с помощью элементов 'Автогенерируемая страница' и 'Преднастроенная страница'.

Для последовательного заполнения можно использовать несколько элементов подряд.

Подробнее о работе с этими элементами можно почитать Элемент процесса [Автогенерируемая страница] и Элемент процесса [Преднастроенная страница].

Можете использовать Terrasoft.utils.inputBox, в нем поместить Ваши поля

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

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

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

Нравится

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

Думаю, заказчику лучше обратиться с вопросом к тому, кто разрабатывал сценарий. Без подробностей сложно сказать, что именно он делает в системе. Например, если каждый раз сохранять запись о новом обращении с одним и тем же Id (а при нормальной работе он уже есть в запросе к /0/DataService/json/SyncReply/InsertQuery), то не создастся много записей, а будут ошибки.

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

Добрый день!

 

Пытаюсь создать Лид из коммуникационной панели(email-сообщения).

Создается пустая запись, заполняется только поле "ФИО Контакта" (даже адрес email не заполняется)

 

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

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

Нравится

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

Максим, эта логика реализована в схеме EmailItemSchema пакета UIv2. Там есть функции addEmailRelation и getRelationValuePairs, которые готовят открытия окна и предзаполняют значения полей.

Стандартно эти функции такие:

/**
 * Handles "Add relation" menu item click.
 * @protected
 * @param {String} columnName Connection column name.
 */
addEmailRelation: function(columnName) {
	this.set("EntityRelationColumnName", columnName);
	var moduleStructure = this.Terrasoft.configuration.ModuleStructure;
	var schemaName = this.getSchemaNameByRelationColumnName(columnName);
	var schemaModuleStructure = moduleStructure[schemaName];
	var schemaPages = schemaModuleStructure.pages;
	var cardSchema = schemaModuleStructure.cardSchema;
	var defaultValues = this.getRelationValuePairs(columnName, schemaName);
	if (this.Ext.isArray(schemaPages)) {
		var cardInfo = this.Terrasoft.findWhere(schemaPages, {name: schemaName});
		cardSchema = cardInfo.cardSchema;
		if (schemaModuleStructure.attribute && cardInfo.UId) {
			defaultValues.push({
				name: schemaModuleStructure.attribute,
				value: cardInfo.UId
			});
		}
	}
	var moduleId = "AddEmailRelation_" + cardSchema + this.Terrasoft.generateGUID();
	this.sandbox.subscribe("CardModuleResponse", this.cardModuleResponseHandler, this,
		[moduleId]);
	var openCardConfig = {
		schemaName: cardSchema,
		operation: this.Terrasoft.ConfigurationEnums.CardOperation.ADD,
		moduleId: moduleId,
		defaultValues: defaultValues,
		renderTo: "centerPanel",
		keepAlive: true
	};
	this.openCardInChain(openCardConfig);
},
...
/**
 * Returns default value array for relation entity.
 * @protected
 * @param {String} columnName Connection column name.
 * @param {String} schemaName Connection schema name.
 * @return {Object[]} Default value array for relation entity. Array element contains
 * column name and its value.
 */
getRelationValuePairs: function(columnName, schemaName) {
	var contact;
	var valuePairs = [];
	var entitySchema = this.entitySchema;
	if (entitySchema.name === schemaName) {
		valuePairs.push({
			name: entitySchema.primaryDisplayColumnName,
			value: this.get("MailTitleText")
		});
	}
	if (this.get("Contact")) {
		contact = this.get("Contact");
		if (this.get("Account")) {
			contact.Account = {
				value: this.get("Account").value,
				displayValue: this.get("Account").displayValue
			};
		}
	}
	var account = this.get("Account");
	if (!contact && account) {
		valuePairs.push({
			name: "Account",
			value: this.getEntityDefaultValueColumnValue(schemaName, account)
		});
		return valuePairs;
	}
	if (!contact) {
		contact = this.get("SenderContact");
	}
	if (contact && contact.value) {
		valuePairs.push({
			name: this.getSchemaDefaultValueColumnName("Contact", schemaName),
			value:  this.getEntityDefaultValueColumnValue(schemaName, contact)
		});
		var senderAccount = contact.Account;
		if (senderAccount) {
			valuePairs.push({
				name: this.getSchemaDefaultValueColumnName("Account", schemaName),
				value: this.getEntityDefaultValueColumnValue(schemaName, senderAccount)
			});
		}
	}
	if (columnName === "Contact" && this.isAutoBindingContactEmailNeeded()) {
		this.addSenderInfo(valuePairs);
	}
	return valuePairs;
},

Во второй функции есть специальная логика для полей контактов и контрагентов. Вы можете переопределить в своём пакете и добавить в эту функцию для своего раздела получение и внесение через valuePairs.push ещё нескольких полей.

Максим, эта логика реализована в схеме EmailItemSchema пакета UIv2. Там есть функции addEmailRelation и getRelationValuePairs, которые готовят открытия окна и предзаполняют значения полей.

Стандартно эти функции такие:

/**
 * Handles "Add relation" menu item click.
 * @protected
 * @param {String} columnName Connection column name.
 */
addEmailRelation: function(columnName) {
	this.set("EntityRelationColumnName", columnName);
	var moduleStructure = this.Terrasoft.configuration.ModuleStructure;
	var schemaName = this.getSchemaNameByRelationColumnName(columnName);
	var schemaModuleStructure = moduleStructure[schemaName];
	var schemaPages = schemaModuleStructure.pages;
	var cardSchema = schemaModuleStructure.cardSchema;
	var defaultValues = this.getRelationValuePairs(columnName, schemaName);
	if (this.Ext.isArray(schemaPages)) {
		var cardInfo = this.Terrasoft.findWhere(schemaPages, {name: schemaName});
		cardSchema = cardInfo.cardSchema;
		if (schemaModuleStructure.attribute && cardInfo.UId) {
			defaultValues.push({
				name: schemaModuleStructure.attribute,
				value: cardInfo.UId
			});
		}
	}
	var moduleId = "AddEmailRelation_" + cardSchema + this.Terrasoft.generateGUID();
	this.sandbox.subscribe("CardModuleResponse", this.cardModuleResponseHandler, this,
		[moduleId]);
	var openCardConfig = {
		schemaName: cardSchema,
		operation: this.Terrasoft.ConfigurationEnums.CardOperation.ADD,
		moduleId: moduleId,
		defaultValues: defaultValues,
		renderTo: "centerPanel",
		keepAlive: true
	};
	this.openCardInChain(openCardConfig);
},
...
/**
 * Returns default value array for relation entity.
 * @protected
 * @param {String} columnName Connection column name.
 * @param {String} schemaName Connection schema name.
 * @return {Object[]} Default value array for relation entity. Array element contains
 * column name and its value.
 */
getRelationValuePairs: function(columnName, schemaName) {
	var contact;
	var valuePairs = [];
	var entitySchema = this.entitySchema;
	if (entitySchema.name === schemaName) {
		valuePairs.push({
			name: entitySchema.primaryDisplayColumnName,
			value: this.get("MailTitleText")
		});
	}
	if (this.get("Contact")) {
		contact = this.get("Contact");
		if (this.get("Account")) {
			contact.Account = {
				value: this.get("Account").value,
				displayValue: this.get("Account").displayValue
			};
		}
	}
	var account = this.get("Account");
	if (!contact && account) {
		valuePairs.push({
			name: "Account",
			value: this.getEntityDefaultValueColumnValue(schemaName, account)
		});
		return valuePairs;
	}
	if (!contact) {
		contact = this.get("SenderContact");
	}
	if (contact && contact.value) {
		valuePairs.push({
			name: this.getSchemaDefaultValueColumnName("Contact", schemaName),
			value:  this.getEntityDefaultValueColumnValue(schemaName, contact)
		});
		var senderAccount = contact.Account;
		if (senderAccount) {
			valuePairs.push({
				name: this.getSchemaDefaultValueColumnName("Account", schemaName),
				value: this.getEntityDefaultValueColumnValue(schemaName, senderAccount)
			});
		}
	}
	if (columnName === "Contact" && this.isAutoBindingContactEmailNeeded()) {
		this.addSenderInfo(valuePairs);
	}
	return valuePairs;
},

Во второй функции есть специальная логика для полей контактов и контрагентов. Вы можете переопределить в своём пакете и добавить в эту функцию для своего раздела получение и внесение через valuePairs.push ещё нескольких полей.

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

Добрый день, решил посмотреть приложение: https://marketplace.terrasoft.ru/app/loyalty-vouchers-marketing-campaig…

Но при установке оно свалилось, в логе ошибка: 2021-02-04 13:21:12,350 System.ApplicationException: Зависимый пакет "Consimple" не найден

 

Что очень странно, так как издатель DevLabs,  а не партнер Consimple. Просьба помочь с установкой. Спасибо.

Прикрепленные файлы

Нравится

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

Видимо так обеспечивается совместимость с Consimple Loyalty Creatio. Хотя странно. Писали бы не "совместимо", а приложение "расширяет вертикальное решение Consimple Loyalty Creatio"

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

 

приложение устанавливается только на Consimple Loyalty Creatio. Это небольшое дополнение, которое действительно реализовано на партнерском решении по лояльности.

Лазоренко Ирина,

Поправьте тогда описание приложения. Формулировка "

Дополнение совместимо с вертикальным решением Consimple Loyalty Creatio." подразумевает возможность установки как на чистую коробку, так и на вертикальное решение. Напишите, что "Дополнение расширяет вертикальное решение". А на вкладке установка укажите что только на Consimple Loyalty Creatio.

Алексей,

 

спасибо за уточнение. Обновили описание на маркетплейс.

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

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

Плагин для LibreOffice или FreeOffice

Нравится

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

Насколько помню создание печатных форм Word поддерживается только на .Net Framework. Плагинов для Linux нет. Т.е. разработать форму можно только в среде Windows

Алексей Следь,

спасибо :(

Обычно печатные формы можно отредактировать и вовсе без плагина, скачав, изменив вручную и загрузив файл в веб-интерфейсе. Другое дело, что файлы, изменённые не в Word, а в сторонних редакторах, могут иметь отличия в формате и макросы не факт, что обработаются корректно. Нужно тестировать работоспособность.

Идею по Вашей потребности завёл.

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

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

Нравится

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

Вы хотите добавлять в систему извне?

Это можно сделать или через OData отправкой PUT, либо разработкой своего веб-сервиса, подобного стандартному FileApiService, который используется для наполнения из браузера детали файлов.

Первый вариант обсуждался тут и тут, по работе с FileApiService см. темы.

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

Как работать с веб-сервисами в Node JS, лучше спросить на их форумах.

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

Добрый день

Имеется ли в црм облаке , способ получать файл напрямую к примеру document.docx

или это можно сделать только с помощью прикрепления на файлы и примечания

Если все таки только файлы и примечания, то как я могу прикрепить туда файл

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

Нравится

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

Если на карточке раздела есть деталь файлы и ссылки обычно это объект {SectionName}File. К примеру для активностей это ActivityFile. 

Вот пример создания записи на детали Файлы и ссылки. Вам необходимо получить поток с файлом и записать его в поле Data.

 

Stream stream = new MemoryStream(byteArray);

var size = Convert.ToInt32(stream.Length);

 

var insertActivityFile = new Terrasoft.Configuration.ActivityFile(context.UserConnection);

        insertActivityFile.Id = Guid.NewGuid();

        insertActivityFile.SetDefColumnValues();

        insertActivityFile.Name = "Name.txt";

        insertActivityFile.SetStreamValue("Data", stream);

        insertActivityFile.Size = size;

        insertActivityFile.TypeId = new Guid("529BC2F8-0EE0-DF11-971B-001D60E938C6");

        insertActivityFile.Version = 1;

        insertActivityFile.ActivityId = activityId;

        insertActivityFile.Save();

Через FileApiService можно скачивать и записывать файлы напрямую. Попробуйте поискать на комьнити похожие темы, где-то видел, что они проскивали.

 

Если на карточке раздела есть деталь файлы и ссылки обычно это объект {SectionName}File. К примеру для активностей это ActivityFile. 

Вот пример создания записи на детали Файлы и ссылки. Вам необходимо получить поток с файлом и записать его в поле Data.

 

Stream stream = new MemoryStream(byteArray);

var size = Convert.ToInt32(stream.Length);

 

var insertActivityFile = new Terrasoft.Configuration.ActivityFile(context.UserConnection);

        insertActivityFile.Id = Guid.NewGuid();

        insertActivityFile.SetDefColumnValues();

        insertActivityFile.Name = "Name.txt";

        insertActivityFile.SetStreamValue("Data", stream);

        insertActivityFile.Size = size;

        insertActivityFile.TypeId = new Guid("529BC2F8-0EE0-DF11-971B-001D60E938C6");

        insertActivityFile.Version = 1;

        insertActivityFile.ActivityId = activityId;

        insertActivityFile.Save();

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