Как из облачной версии sales получить id нужного значения поля из базы данных?

Нравится

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

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

Как вариант Вы можете извлечь значения поля через бизнес процесс.

Можно отдебажить клиентскую часть и получить значение справочника через this.get("YourColumnName") - свойство value (если справочник)
или this.get("Id") - если нужно Id записи.

ещё где-то в Комьюнити был *.md файл SQLPageExecutor, он позволяет делать SQL запросы к БД

"Сергиенко Николай Петрович" написал:

Как из облачной версии sales получить id нужного значения поля из базы данных?

Подписаться на обновления этого материала


Николай, немного непонятна формулировка "id значения поля", но возможно вот это вам поможет:
SQLExecuterPage

Спасибо Евгений!

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

Добрый день!
3.4.0
В разделе E-mail есть кнопка "Показать связи" - при нажатии на которое открывается
окно

Скажите, пожалуйста, как называется это окно?
хотелось бы внести в него изменения, но не можем найти его в администраторе...

Нравится

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

Спасибо, вопрос отменен - форма этого окна формируется динамически

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

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

Добрый день!
Как можно выгрузить все файлы из детали файлы и ссылки в сетевую папку на диск?
Сделать это нужно программно.

Нравится

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

Добрый день, Александр!

bpmonline не предполагает таких операций. Тем не менее данную задачу можно попробовать реализовать через бизнес процесс. Вам необходимо перебрать все записи в соответствующей таблице (объекте). Для каждого раздела объект "Файлы и ссылки" свой (как и таблица в базе данных).

1) Начальный элемент
2) Получение данных о файле элементом "Чтение данных"
3) "Исключающее ИЛИ" с двумя условными потоками (если файлов для выгрузки больше нет, то конец процесса), иначе идем дальше.
4) Элемент "Задание-сценарий" с приблизительным кодом:

   public static string SaveDecompressFile(string FileName, SqlBytes CompressedFile)
    {
        if (CompressedFile.IsNull)
        return "Error";
 
        DeflateStream decompress = new DeflateStream(CompressedFile.Stream, CompressionMode.Decompress, true);
 
        try
        {
 
            FileStream file = File.Create(FileName);
 
            int sourcebyte = decompress.ReadByte();
            while (sourcebyte != -1)
            {
                file.WriteByte((byte)sourcebyte);
                sourcebyte = decompress.ReadByte();
            }
 
            file.Close();
        }
 
        catch (Exception)
        {
            return "Error";
        }
 
        finally
        {
            decompress.Close();
            decompress = null;
        }    
 
        return "OK";
    }

(источник)

Далее возвращаемся на элемент "Чтение данных".

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

Все оказалось даже проще.
Может кому-то пригодится
Для работоспособности в using нужно добавить System.IO

//получаем stream из Entity 
MemoryStream ms=documentFile.GetStreamValue("Data");
//записываем его в файл
ms.SaveToFile(dir+name);  

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

 [OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
    RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public void fileUnloadling(
	string documentId, //Id докумена
	string documentNumber
	)
{
	if (System.Diagnostics.Debugger.IsAttached)
	{
	    System.Diagnostics.Debugger.Break();
	}
	var UserConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
	var dir=Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SxFilePathForUnloading")+documentNumber+"\\";
	EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("DocumentFile");
    EntitySchemaQuery esq = new EntitySchemaQuery(schema);
    esq.AddAllSchemaColumns();
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Document", documentId));
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", "529BC2F8-0EE0-DF11-971B-001D60E938C6")); //тип файл
 
    EntityCollection documentFileEntities = esq.GetEntityCollection(UserConnection);
    foreach (Entity documentFile in documentFileEntities  )
    {
        var name=documentFile.GetTypedColumnValue<string>("Name");
		MemoryStream ms=documentFile.GetStreamValue("Data");
        try
		{
			if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }
			ms.SaveToFile(dir+name);  
		}
		catch (Exception e) 
		{
 
		}
    }
 
}    }

Пащенко Александр Сергеевич

а как мы определяем из детали какого объекта файлы и ссылки и какой именно записи это объекта забираем файлы?

Сафронов Иван Александрович,

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

Какая у Вас задача?

Пащенко Александр Сергеевич,

После завершения активности хотелось бы выгружать все приложенные файлы на детали Файлы и ссылки в отдельную папку в хранилище.

Сафронов Иван Александрович,

Тогда можете в БП отловить сигналом завершение активности, а дальше скриптом выгружать из ActivityFile.

Учтите, что в детали еще могут быть ссылки. Нужно в запрос добавить фильтр по типу

Схемы файлов обычно называются по шаблону [название раздела] + "File"

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

В BPMonline 7.6 я создал страницу, унаследованную от "Схема отображения карточки контакта ( UIv2 )" и поместил в неё поле Name - ФИО из объекта Contact (Base) и кнопку. Ниже привожу код модуля этой страницы на Java Script. Он небольшой. Я занимаюсь Java Script всего-навсего с понедельника. Пожалуйста, посмотрите - всё ли я написал в своём коде правильно?

define("RIBClientSearchModule", [],
        function() {
                return {
                        methods: {
                               
                                OnClientSearchButtonClick: function() {
                                        this.showInformationDialog("Вызов метода OnClientSearchButtonClick модуля RIBClientSearchModule.");
                                }
                        },
                        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                        // Настройка визуализации кнопки на нашей странице.
                        diff: [{
                        // Метаданные для добавления поля [ФИО]:
                                // Указать на то, что выполняется операция добавления элемента на страницу.
                                "operation": "insert",
                                "parentName": "Header",
                                "propertyName": "items",
                                // Имя добавляемого полоя.
                                "name": "Name",
                                // Дополнительные свойства поля:
                                "values": {
                                        // Настройка расположения поля на странице.
                                        "layout": { "column": 0, "row": 5, "colSpan": 15}
                                }
                        },
                        {
                        // Метаданные для добавления кнопки [Найти клиента для консультации]:
                                // Указать на то, что выполняется операция добавления элемента на страницу.
                                "operation": "insert",
                                // Указать имя системного контейнера на странице, в который будет добавлена кнопка.
                                "parentName": "LeftContainer",
                                // Указать, что кнопка добавляется в коллекцию элементов управления в контейнере,
                                // имя которого указано в parentName.
                                "propertyName": "items",
                                // Мета-имя добавляемой кнопки.
                                "name": "SearchContactButton",
                                // Дополнительные свойства кнопки:
                                "values": {
                                        // Тип добавляемого элемента - кнопка.
                                        itemType: Terrasoft.ViewItemType.BUTTON,
                                        // Привязка заголовка кнопки к локализуемой строке схемы.
                                        caption: { bindTo: "Resources.Strings.ClientSearchButtonCaption"},
                                        // Привязка метода-обработчика нажатия кнопки.
                                        click: { bindTo: "OnClientSearchButtonClick"},
                                        // Настройка расположения кнопки на странице.
                                        "layout": { "column": 5, "row": 10, "colSpan": 1}
                                }
                        }
                        ]
                };
        });

По крайней мере компилируется без ошибок.
Заранее благодарен

P.S. Я не задал entitySchemaName потому что не знаю какое значение нужно, в моём случае, для его задавать.

Нравится

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

Евгений, если Вы унаследовались от карточки контакт, то логично указывать в entityschemaname "Контакт". Или как вариант указывать объект, который унаследует контакт.
Если Вы не уверены в работоспособности кода, то можно осуществлять отладку. Информация есть на SDK (http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0).

Спасибо.

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

Здравствуйте.
В SDK есть статья "Пример реализации добавления кнопки на страницу редактирования". В ней описывается добавление кнопки на замещающую страницу. А можно точно таким же образом добавить кнопку на страницу, которая просто наследуется? Например, на страницу, которую я просто наследую от страницы "Схема отображения карточки контакта"? Ответьте, пожалуйста.

Нравится

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

Евгений, да, можно. Разницы нет. При замещении или при унаследовании по факту создается вторая страница.

Спасибо. А скажите ещё, пожалуйста, следующее. Правила добавления поля на страницу тоже идентичны добавлению кнопки? Т.е. я имею ввиду, что можно добавить как поле замещающего объекта на замещающую страницу, так и поле какого либо базового объекта (например справочника Contact) на унаследованную страницу? Ответьте, пожалуйста.

Евгений:
1) Вы не сможете добавить поле, если оно добавлено в одном из подчиненных пакетов, а в Вашем пакете его нет.
2) Поле добавляется из последнего доступного в иерархии пакета.
3) Объект - это таблица в БД. Она одна. Если Вы заместили объект "Контакт", добавив несколько полей, то это всего лишь добавление новых колонок в таблицу dbo.contact, а не создание новой таблицы.

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

Спасибо большое, Алексей.

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

Добрый день.
Используя материалы статьи https://community.terrasoft.ru/blogs/8395
сделал нумерацию в раздела с использованием маски, однако при отображении реестра наблюдается не корректная сортировка по номеру (в следствие того, что номер является строкой) вида:

Есть ли способ исправить данную проблему с некорректной сортировкой?
Заранее спасибо.

Нравится

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

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

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

Таким образом, фильтрация будет производится по целочисленному полю.

"Демьяник Алексей Олегович" написал:Таким образом, фильтрация будет производится по целочисленному полю.

А как система узнает, что по именно по этому полю нужно сортировать?

Игорь, сортировать можно в реестре раздела по определенной колонке

"Мотков Илья" написал:Игорь, сортировать можно в реестре раздела по определенной колонке

Да это понятно.
Но как сделать сортировку по умолчанию по скрытому полю?

Игорь, уточню.
Есть два поля с идентичными заголовками, но с разными названиями:
Номер заявки (поле с типом целое число)
Номер заявки (поле с типом строка).

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

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

Игорь, Алексей имел ввиду убрать из реестра раздела.

Какая в таком случае польза от маски номера если её нельзя отобразить в реестре?
Я сделал целочисленное поле NumberDecimal, теперь мне нужно по нему отсортеровать реестр.
Подскажите как это сделать? При этом поле номер должно присутствовать в реестре.

Игорь, добрый день!

Насколько я понимаю, Вы хотите, чтобы реестр по умолчанию сортировался по добавленному Вами полю? Это можно реализовать переопределением метода getGridDataColumns в Вашем разделе:

getGridDataColumns: function() {
	var columnsConfig = this.callParent(arguments);
	columnsConfig.NumberDecimal = {
		path: "NumberDecimal",
		orderPosition: 10,
		orderDirection: 1
	};
	return columnsConfig;
}

В параметр orderPosition можно подставить любое число, главное, чтобы оно было больше максимально возможного количества колонок с сортировкой.

В результате, если в реестре не установлена другая сортировка, реестр всегда будет отсортирован по Вашему полю. Как только пользователь установит в реестре сортировку по другой колонке, система будет сортировать реестр сначала по установленной колонке, а уже потом по полю NumberDecimal.

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

Да, спасибо. Так и сделал

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

Необходимо переопределить несколько ф-ий мастера раздела. Создаю замещающий клиентский модуль, наследуюсь от Модуля мастера создания раздела. Что бы я не делал, получаю ошибки: cannot read property 'replace' of undefined, или cannot read property 'isDestroyed' of undefined. Подскажите как сделать правильно.

Нравится

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

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

Здравствуйте, Олег!

Мастер раздела - это не только конфигурация, а еще и ядро. Изменение конфигурации не повлияет на ядро. Исправлять ядро пользовательскими средствами нет возможности, соответственно изменения функций мастера раздела смогут его сломать.

Правильно будет не трогать мастер раздела.

"Мотков Илья" написал:

Олег, уточни, в каком момент возникает ошибка? при сохранении схемы?

А какие функции хотите переопределить? Может это не предусмотрено в bpm.


Ошибка возникает при открытии мастера раздела. Причем я ничего не менял. Просто создал замещающий модуль SectionDesigner. Пробовал с "пустым" кодом:

define("SectionDesigner", [],
	function() {});

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

"Сафонов Олег" написал:
Мотков Илья пишет:

Олег, уточни, в каком момент возникает ошибка? при сохранении схемы?

А какие функции хотите переопределить? Может это не предусмотрено в bpm.

Ошибка возникает при открытии мастера раздела. Причем я ничего не менял. Просто создал замещающий модуль SectionDesigner. Пробовал с "пустым" кодом:

define("SectionDesigner", [],

        function() {});

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

Олег, при замещении необходимо полностью замещать модуль (локал. стринги, месседжи, параметры и т.д.). Т.е. здесь работает базовая логика замещение модуля.
Но хотелось бы отметить, если Вы переопределяете базовые методы и если обновите приложение на новые бинари, то базовые изменения не вступят в силу.

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

Как в BPMonline 7.6 добавить на страницу, определённую как модуль Java Script, созданный в конфигурации как 'Добавить/Расширенные/Схема модели представления карточки' одно поле и одну кнопку ? Эта страница предназначена для последующего использования в элементе 'Преднастроенная страница' в составе бизнес-процесса. Помогите, пожалуйста.

Нравится

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

Используйте автогенерируемую страницу - так будет проще.

Нет, по заданию - мне надо сделать преднастраиваемую страницу. Мне нужно определить (в Java Script) страницу поиска клиента для консультации (поисковая страница) и добавить на неё поле и кнопку. А затем, подключить её к элементу "Преднастроенная страница", находящемуся в бизнес-процессе.
И второе - в SDK я нашёл статью по добавлению кнопки на страницу редактирования существующей записи и вторую статью - по добавлению кнопки на страницу редактирования в режиме добавления новой записи. Отличаются ли описанные там шаги добавления кнопки от шагов добавления кнопки на страницу поиска ?

Евгений, данную задачу все еще можно реализовать автогенерируемой страницей!

В случае, если Вам нужно создать свою преднастроенную страницу, рекомендую ознакомиться с видео.

Страницу поиска Вы будете создавать с нуля. Методы добавления кнопки будут те же.

Спасибо.

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

Добрый день.

Помогите разобраться, создан шаблон вида:
"Вы назначены ответсвенным по обращению № %Number% "%Subject%".
Суть обращения: %Symptoms%;
Автор обращения: %Contact.Name%"

Отправляем письмо и оно приходит уже таким:
"Вы назначены ответсвенным по обращению № Нет данныхidНет данных "Нет данных".
Суть обращения: Нет данных;
Автор обращения: Нет данных"

Как решить это?

Нравится

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

Алеся, а какая Вас версия системы?

Версия системы 7.5.0.1473

Алеся, подскажите, вы редактировали существующий макрос, или добавляли новый?

Шаблон создан новый, а макросы я брала существующие.
Хотя письма приходящие по "коробочным" шаблонам, поступают с данными.

А идентификатор объекта, данными которого нужно запомнить письмо Вы передаете?

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

Александр, большое спасибо за помощь, у меня "Идентификатор обращения" брался не из того элемента, поменяла и все заработало.

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

подскажите, пожалуйста, как сделать чтоб у разных пользователей после логина, открывались разные страницы?
например у Сотрудника A открывались "контакты" а у сотрудника B "Контрагенты"

Нравится

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

Добрый день!
Уточните, пожалуйста, версию Вашего продукта.

7.2

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

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

В карточку пользователя Вы можете перейти, зайдя в конфигурацию на вкладку "Администрирование:Пользователи".

Спасибо!

а как можно попасть в ViewModule.aspx#MainMenu ?

Главное меню является стандартной страницей при входе в систему.

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

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

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