Коллеги, здравствуйте.

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

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

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



Спасибо!

Нравится

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

Добрый день, Роман!

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

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

Обойти эту логику, к сожалению, нельзя, и пока у нас нет в планах менять эту логику. По сути это вопрос не по ошибке поиска дублей, а по особенностям администрирования прав доступа.

Могу посоветовать несколько вариантов:

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

2. При массовом поиске можно учитывать, что сам поиск может запускать любой менеджер с любыми правами, но просматривать результаты поиска и сливать дубли может только тот пользователь, роль которого не ограничивает доступ к Контактам.

Хорошего дня!

Здравствуйте, Роман. Сейчас работаем над обновленной дедупликацией, в которой пользователь увидит, что есть похожие записи, даже если у него не было прав доступа на эти данные. Увидит он только ограниченную информацию (колонки, по которым система ищет дубли, а также ответственного по записи). Данные доработки будут доступны в ближайших релизах. Следите за обновлениями.

Татьяна Адамчук, прекрасная новость! До того приходилось реализовывать это дополнительными методами

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

Добрый день!

Есть активность, продукты в активности.

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

Пересчет общей стоимости происходит в объекте продукты в активности (событие после удаления, после сохранения) в событийном подпроцессе.

 

Общая стоимость пересчитывается, но для того, чтобы обновленное значение общей стоимости отобразилось на странице, приходится перегружать эту страницу(например, f5)

Подскажите, пожалуйста, как можно автоматическое обновление?

 

 

 

Нравится

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

"как можно автоматическое обновление?" это пять :)

обновление можно так:

1) поставить subscriber на деталь

2) делать loadEntity/или просто подгрузку единичного поля

подсмотреть пример - в реализации детали продуктов в заказе. (чтобы долго не искали: функция updateAmount вызывается в ProductEntryPageUtils)

Большое спасибо)

Варфоломеев Данила, сделал как в продуктах в заказе, при создании договора. При изменении продукта в детали сумма не меняется

Без конкретики сложно сказать. Если в оригинале меняется, а в Вашей копии — нет, значит, не всё скопировали.

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

Задача: пользователь вводит число в поле.

Система обрабатывает это число(применяет скидку) и записывает обратно в это же поле. Как сделать что бы все работало без зацикливания и ошибок?

Нравится

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

Добрый день, Виталий!

Если процессом с использованием элемента "Формула" пересчитывать, то лучше два поля, например 1 поле "скидка" и второе поле "итоговая сумма" и процесс стартовать по факту заполнения поля "скидка", формулой пересчитывать итоговую сумму и записывать значение в соответствующее поле. В итоге процесс не будет стартовать по факту изменения итоговой суммы, так как он завязан на поле "скидка", а скидка у нас остается неизменной.

Если же нужно именно через 1 поле, то логикой на странице  https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-vych…;

 

Адасюк Валерий Викторович, Это второй вариант, если поп простому: пользователь вводит значение в поле и система автоматом увеличивает это значение на 5. Тоесть Ф. подписки должна сработать только один раз

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

Печатные формы не сохраняются из Ворда в ВРМ.

В логах IIS вижу

PUT /0/ServiceModel/EntityDataService.svc/SysModuleReportCollection(guid'dba75638-ad82-4a16-a64b-60dad3243605')/File - 443 Supervisor 31.44.80.30 Microsoft+ADO.NET+Data+Services - 405 0 0 0

Гуид действительно мой.

Чего не хватает IIS-у?

Нравится

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

Алексей, здравствуйте!

Проблема может быть в том, что у Вас активна надстройка WebDAV. Для того, чтоб ее деактивировать, необходимо открыть Стартовое меню, найти "Включение или отключение компонентов Windows" ("Turn Windows features on or off"), в блоке IIS найти WebDAVPublishing и деактивировать.

Также рекомендуем проверить базу данных на наличие триггеров, которые запрещают сохранение ПФ. В базовой конфигурации они отсутствуют,но были кейсы, когда у пользователей они обнаруживались.

Одеяненко Юлия,

нужно ли после деактивации перезагружать сервер или сайт?

Алексей-Карягин, 

такой необходимости нет. Можно только переподключиться к приложению через плагин.

Одеяненко Юлия,

Оказалось что есть :) Но главное, что всё заработало, спасибо!

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

Здравствуйте. Добавила модуль AccountProfile в карточку раздела. Он не отображается. Подскажите что я не правильно сделала?

Ниже представлен код

define("UsrTSiPO2Page", [], function() {

    return {

        entitySchemaName: "UsrTSiPO",

        details: /**SCHEMA_DETAILS*/{

            "AccountAddressDetailV210d08457": {

                "schemaName": "AccountAddressDetailV2",

                "entitySchemaName": "AccountAddress",

                "filter": {

                    "detailColumn": "UsrTS",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema7Detaila426f654": {

                "schemaName": "UsrSchema7Detail",

                "entitySchemaName": "UsrKontLic",

                "filter": {

                    "detailColumn": "UsrTS",

                    "masterColumn": "Id"

                }

            },

            "ActivityDetailV2c61ee416": {

                "schemaName": "ActivityDetailV2",

                "entitySchemaName": "Activity",

                "filter": {

                    "detailColumn": "UsrTSiliPR",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema10Detail2f193796": {

                "schemaName": "UsrSchema10Detail",

                "entitySchemaName": "UsrR",

                "filter": {

                    "detailColumn": "UsrTSiP",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema13Detail0d52d3c2": {

                "schemaName": "UsrSchema13Detail",

                "entitySchemaName": "UsrTSiPOFile",

                "filter": {

                    "detailColumn": "UsrTSiPO",

                    "masterColumn": "Id"

                }

            }

        },

        modules: /**SCHEMA_MODULES*/{

            // Модуль профиля контрагента.

            "AccountProfile": {

                // Конфигурация профиля.

                "config": {

                    // Название схемы.

                    "schemaName": "AccountProfileSchema",

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

                    "isSchemaConfigInitialized": true,

                    // Признак, сообщающий о том, что не используется HistoryState.

                    "useHistoryState": false,

                    // Параметры профиля.

                    "parameters": {

                        // Конфигурация модели представления.

                        "viewModelConfig": {

                            // Название колонки связанной сущности.

                            masterColumnName: "Account"

                        }

                    }

                }

            }, /**SCHEMA_MODULES*/

            diff: /**SCHEMA_DIFF*/[

                {

                    "operation": "insert",

                    "parentName": "LeftModulesContainer",

                    "propertyName": "items",

                // Название профиля.

                    "name": "AccountProfile",

                // Значения.

                    "values": {

                    // Тип элемента — модуль.

                        "itemType": Terrasoft.ViewItemType.MODULE

                    }

                }

            ]/**SCHEMA_DIFF*/

        }

    };

});

 

Нравится

5 комментариев
"viewModelConfig": {
   // ̶ ̶Н̶а̶з̶в̶а̶н̶и̶е̶ ̶к̶о̶л̶о̶н̶к̶и̶ ̶с̶в̶я̶з̶а̶н̶н̶о̶й̶ ̶с̶у̶щ̶н̶о̶с̶т̶и̶.̶
   //Теперь по-русски. Здесь прописывается колонка из ТЕКУЩЕГО объекта (у вас это UsrTSiPO), которая ссылается на справочник контрагентов. Я так подозреваю название колонки что-то вроде UsrAccount
   masterColumnName: "UsrAccount"
}

 

А в консоли отображаются какие-то ошибки?

Потому что написано все правильно. Возможно у вас в вашем пользовательском объекте нет связанной сущности "Account"?

Добавить комментарий

Золотарев Артем Андреевич,

 ошибок в консоли нет. карточку открываю там отображается только лента

Варфоломеев Данила,

 создала справочник контрагента, Назвала UsrAccount. Изменила в коде ничего не изменилась


 
UsrAccount

 

Трудно определить, что не так по той информации, которую вы предоставили. Попробуйте этот модуль использовать в каком-нибудь коробочном разделе, если сработает, значит что-то не так непосредственно с пользовательским разделом. Если так, то будем дальше смотреть, что можно сделать.

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

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

подключаю в схеме детали serviceHelper

и пытаюсь обратится к сервису через функцию serviceHelper.callService("s1","f1",function(response){},serviceparam,this);

 

но получаю ошибку что нет функции callServicce 

и в отладчике вижу что действительно обьект serviceHelper есть а функции callServicce в нем нет 

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

вопрос. как корректно из детали обратится к сервису?

Нравится

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

Возможно, у вас в функции callServicce лишняя буква c в конце

Кузнецов Сергей,

на стенде в коде нет опечаток, это я тут промахнулся, говорю этот код работает если он в схеме карточке обьекта а вот в схеме детали не работат. на сколько я понимаю окружение this отличается в схеме детали и в схеме реестра может в этом проблема ?.

Скорее всего не совпадает порядок параметров в функции-конструкторе модуля с порядок dependencies в define

define("...", ["module1", "module2", "serviceHelper"], function(module1, serviceHelper) {...})

В этом случае serviceHelper будет содержать "module2"

Артем Гура,

 

Cпасибо! Именно была нарушена последовательность.

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

Приветы,

 

Все методы работали. 

Разработка велась в "своем" пакете, а создавалось изначально поле в кастоме.

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

 

Есть описание

{

                    "operation": "insert",

                    "name": "BpSpeekAddr",

                    "parentName": "GeneralInfoGridLayout",

                    "propertyName": "items",

                    "values": {

                        "dataValueType": this.Terrasoft.DataValueType.ENUM,

                        "caption": "Адрес собеседования",

                        "controlConfig": {

                            "list": {

                                "bindTo": "SpeakAddressItems"

                            },

                            "prepareList": { bindTo: "initSpeakAddressItems" },

                            "placeholder": {

                                "bindTo": "Адрес собеседования"

                            }

                        },

                        "layout": {

                "colSpan": 12,

                "rowSpan": 1,

                "column": 12,

                "row": 4,

                        }

                    }

                },

Нравится

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

Возможно, одноврененно не перенесены какие-то вспомогательные сущности, например, схемы справочника, на которые ссылается поле. Если на старой базе они так и остались в Custom, то в перенос не попали.

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

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

Воплотил инструкцию https://academy.terrasoft.ru/documents/technic-sdk/7-6-0/kak-sozdat-svo…

всё работает, но есть вопрос - как передать в функцию более 1 параметра? Например, сумму и валюту?

Там есть параметр arguments - им можно воспользоваться?

Нравится

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

Даже если без arguments, можно формулой поместить 2 значения в одно текстовое поле через пробел или другой разделитель, а внутри функции разобрать обратно.

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

Это уж слишком костыльное решение :) Хочется нормальное.

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

Аргументы идут через символ «|» после названия макроса внутри его обрамления.

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

Спасибо! Однако, тут получается, что параметры константны.

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

Всем доброго времени суток. Версия 7.11

В рамках исполнения бизнес-процесса необходимо несколько раз открывать страницу записи разным пользователям. На странице есть деталь с редактируемым реестром.

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

При этом хотелось бы чтобы в разных случаях открытия на детали отображались разные колонки. По сути речь идёт об оценках по разным категориям, которые должны проставлять разные люди. Отобразить универсально все - не получится, их много.

По идее можно добавить на основную запись скрытую колонку, и как-то загружать деталь в зависимости от условий.. есть, например, решение как скрыть лишние записи - https://community.terrasoft.ua/node/26289

Но вот можно ли вообще реализовать показ разных колонок?

Нравится

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

чисто в теории:

колонки подтягиваются из профиля при загрузке грида. я бы расковырял метод initProfile(из BaseGridDetailV2) и в зависимости от условий подставлял нужную мне настройку реестра.

Данила, спасибо, интересная идея.

А можно ли подставлять настройки реестра на лету?

Как раз в сообщении Данила и написан примерный ход решения. Страница запрашивает Profile (для каждого пользователя свой) в котором храняться настройки отображения. Там и можно на лету подставить нужные настройки.

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

Всем доброго времени суток!

Столкнулся с проблемой передачи параметров из клиентского кода в БП

Вот код вызывающий мой БП и туда передаю 2 параметра, названия совпадают:

 

runProcessFormingAudience: function () {
				debugger;
				var folderFilters = this.get("SectionFiltersValue").collection.get("FolderFilters");
				var customFilters = this.get("SectionFiltersValue").collection.get("CustomFilters");
				if(folderFilters || (customFilters && customFilters.null != undefined)){
					var filters = (folderFilters != undefined && folderFilters.length > 0) ? folderFilters[0].filter : customFilters.null.filter;
				}
				var args = {
					sysProcessName: "AbCreatingSmsAudienceProcess",
					parameters: {
						EntitySchemaName: this.entitySchemaName,
						Filters: filters
					}
				};
				ProcessModuleUtilities.executeProcess(args);
			}

Принимаемые параметры - http://prntscr.com/j8wmeg

Далее смотрю что передалось в эти параметры и логирую:

 

var userConnection = Get<UserConnection>("UserConnection");
var log = new LogService(userConnection);
var filters = Get<string>("Filters");
var entitySchemaName = Get<string>("EntitySchemaName");
var smsServiceId = Get<Guid>("SmsServiceId");
var smsName = Get<string>("SmsName");
 
log.RecInfo(string.Format("smsName = {0}", smsName));
log.RecInfo(string.Format("smsServiceId = {0}", smsServiceId));
log.RecInfo(string.Format("entitySchemaName = {0}", entitySchemaName));
log.RecInfo(string.Format("filters = {0}", filters));
 
return true;

И в итоге данные не занеслись - http://prntscr.com/j8wnau

Подскажите из-за чего может вести себя так система? Вроде делаю все правильно.

Нравится

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

немного не понял смысла

customFilters.null

ну да и ладно...

Код актулен, если вы планируете поместить filters в string(по коду var filters = Get<string>("Filters"), я понимаю в этом план).

Варфоломеев Данила,

Благодарю, уже разобрался))

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