Изначально создал web service с методом POST, для передачи данных на локальной машине. Из visual studio создавал подключение к rest сервису, авторизовался, после чего вызвал метод - данные передались. Аналогично сделал для GET: вызвал из вижлы метод - данные пришли.
Но потом, была необходимость перенести код на облако [site].bpmonline.com, закинул туда код сервиса.

Метод GET - данные возвращает, все работает.
Но вот метод пост, при попытке его вызова, сервер возвращает ошибку: ЗАПРЕЩЕНО. С чет это связано, как это фиксить?

Уже проверки ради, создал пустой метод (без какой-ибо логики) и все равно сервер возвращает ошибку "Запрещено":

[OperationContract]
            [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
                BodyStyle =WebMessageBodyStyle.Wrapped)]
            public void ExportFromJson(string input)
            {
}

Нравится

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

Добрый день, Илья.

Ознакомьтесь с следующей статьей на академии. https://academy.terrasoft.ru/documents/technic-sdk/7-10/zashchita-ot-cs…

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

Добрый день, Илья.

Ознакомьтесь с следующей статьей на академии. https://academy.terrasoft.ru/documents/technic-sdk/7-10/zashchita-ot-csr...


Спасибо, помогло. В заголовок запроса добавил это:

CookieCollection cookieCollection = authCookie.GetCookies(new Uri(authServiceUri));
                string csrfToken = cookieCollection["BPMCSRF"].Value;
                request.Headers.Add("BPMCSRF", csrfToken);
Показать все комментарии

В мастере "бизнес-правил" (новые, в 7.10)

По какой-то причине недоступен пункт "Добавить действие", т.е. условия можно добавлять не ограничено, а вот действие - только одно. Промелькнула мысль, что "оно так устроено", но само наличие, пускай и не активного, пункта "Добавить действие" косвенно говорит о том, что действий может быть несколько на один набор условий (что вполне логично).
Я что-то делаю не так ?

Нравится

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

Это нормально, вам нужно под каждое действие сделать отдельное БП. Так же работали и рукописные БП, посмотрите на академии.

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

PS: мы понимаем что тут необходимо повесить требуемые конечные свойства видимость/доступность/обязательность - на атрибут и управлять его состоянием в логике.
Но, ИМХО, в бизнес-правилах, такой кейс очень будет "к месту".

и еще...

само собой тут не хватает "противоположенных" действий:
Если есть действие "Сделать поле редактируемым", то по идее должно быть и "Сделать поле недоступным"
Если есть действие "Скрыть поле", то должно быть и "Показать поле"
и так далее...

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

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

Илья,

все Ваши замечания резонны, думаю, что они будут реализованы в ближайших релизах. То, что сейчас есть в версии 7.10 - это реализация в первом приближении.

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

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

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

Илья, здравствуйте!

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

Вопрос...
Так а каким образом согласуются/конкатенируются/мержатся несколько бизнес-правил, которые ориентированы на одно и то же поле, в рамках одной сущности.
Логическое "И" или логическое "ИЛИ"
или там вообще особая схема ?

Добрый день, Илья!

По моим наблюдениям, если написать такую логику, когда правило 1 противоречит правилу 2, то применится случайное. Не думаю, что на этот случай есть какие-то правила мержа, ведь непонятно зачем вообще такое делать.)

"Мотков Илья" написал:Не думаю, что на этот случай есть какие-то правила мержа, ведь непонятно зачем вообще такое делать.)

В пределах одного бизнес-правила можно использовать только группу "И" или группу "ИЛИ",
т.е. нельзя развернуть такую логику в пределах одно правила:
"Если поле X содержит Z или W, и поле Y равно Q, то делать поле N обязательным"
Такое в текущем положении вещей можно организовать только двумя бизнес-правилами:
1)"Если поле X содержит Z, и поле Y равно Q, то делать поле N обязательным"
2)"Если поле X содержит W, и поле Y равно Q, то делать поле N обязательным"
И вот теперь вступает в силу мой вопрос.
Так как же они конкатенируются объединяются.

PS: На самом деле два разработчика в разных схемах добавили свои бизнес-правила. пока у каждого было свое БП - все было нормально, после объединения в цепочку замещающих схем на тесте - правило ведет себя как-то странно, но оно точно не делает того чего от него ожидают :)
В итоге правила как-бы и не противоречат друг другу, и переписать его в одно правило тоже нет возможности. вот...

Добрый день, Илья!

Так ведь они никак не конкатенируются/объединяются. Если X содержит Z, отработает правило 1, если X содержит W, отработает правило 2. Так как они не противоречат друг-другу - все хорошо, сделать "более обязательным" поле Вы уже не сможете.

Не-а :)
В итоге не работают оба правила :) в этом то и кроется проблема понимания того как оно вообще должно работать в таком случае.
Результат для приведенного примера таков:
Имеем два правила:
1)"Если поле X содержит Z, и поле Y равно Q, то делать поле N обязательным"
2)"Если поле X содержит W, и поле Y равно Q, то делать поле N обязательным"

в итоге имеем следующее поведение:
правила вообще не работают - ни одно из них.

Если переписать правила иначе:
1)"Если поле X содержит Z или W, то делать поле N обязательным"
2)"Если поле Y равно Q, то делать поле N обязательным"

в итоге имеем следующее поведение:
Если поле X содержит Z или W, поле N становится обязательным
значение поля Y - вообще не играет ни какого значения.

Илья, здравствуйте.
Указанные Вами правила все же противоречат друг другу, так как если поле X содержит Z, то оно должно быть обязательным согласно 1 И не должно быть обязательным согласно 2. Возможно, более наглядным будет пример с правилом видимости. Поэтому работает только одно из них. Как уже указал мой коллега выше, добавили пожелание для реализации в будущих релизах - возможность создания сложных условий в бизнес-правилах с помощью дизайнера.

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

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

Версия 7.10.

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

Для примера на детали "Продукт в продаже" я хочу поменять правило, в соответствии с которым в случае, если для количества задано отрицательное значение в колонку выставлялось значение 0, а не 1, как сейчас + дополнительно, если для логической колонки UsrService "Услуга" выставлено значение true, то колонка Quantity выставлялась 0 и блокировалась для изменения.

Для этого я создал файл UsrMobileOpportunityProductInterestModelConfig в пакете Custom и добавил там следующий код по аналогии с оригиналом:

Terrasoft.sdk.Model.addBusinessRule("OpportunityProductInterest", {
        name: "UsrOpportunityProductInterestQuantityBelowZeroRule",
        ruleType: Terrasoft.RuleTypes.Custom,
        triggeredByColumns: ["Quantity"],
        events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
        executeFn: function(model, rule, column, customData, callbackConfig) {
                if (model.get("Quantity") 0) {
                        model.set("Quantity", 0, true);
                }
                Ext.callback(callbackConfig.success, callbackConfig.scope);
        }
});

Далее в файле MobileApplicationManifestDefaultWorkplace в том же пакете Custom в Models пытаюсь подключить созданный файл:

"OpportunityProductInterest": {
                        "ModelExtensions": [
                                "MobileOpportunityProductInterestModelConfig",
                                "UsrMobileOpportunityProductInterestModelConfig"
                        ]
                },

При синхронизации и загрузке один файл судя по всему добавился (вместо 232 стало 233). И всё равно при изменении в этом случае получаю в количестве 1 вместо 0.

Помимо этого, в браузерном эмуляторе приложения почему-то не доступно рабочее место "Полевые продажи", но это отдельно.

Нравится

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

Насколько я понимаю, бизнес-правило для блокировки поля Количество по условию UsrService == true должно выглядеть так:

Terrasoft.sdk.Model.addBusinessRule("OpportunityProductInterest", {
	name: "UsrOpportunityProductInterestQuantityBlockedRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["UsrService"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
	executeFn: function(model, rule, column, customData, callbackConfig) {
		var value = model.get("Quantity");
		if (model.get("UsrService")) {
			model.set("Quantity", 1, false);
		} else {
			model.set("Quantity", value, true);
		}
		Ext.callback(callbackConfig.success, callbackConfig.scope);
	}
});

Подключил также, как описывал выше - всё равно не срабатывает.

Денис,

Для активации/деактивации колонки можно использовать правило Terrasoft.RuleTypes.Activation.
Обратите внимание на пример:

Terrasoft.sdk.Model.addBusinessRule('OpportunityProductInterest', {
    ruleType: Terrasoft.RuleTypes.Activation,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: [UsrService],
    conditionalColumns: [
        {name: UsrService, value: false}
    ],
    dependentColumnNames: ['Quantity']
});
Показать все комментарии

Насколько я понимаю для синтаксического анализа JavaScript во встроенном редакторе используется ESLint
А где можно его конфигурационный файл найти (по идее должен быть *.eslintrc.json но ничего подобного среди загружаемых файлов не найдено, скорее всего он бандлится или минифицируется)?
Для того чтобы использовать его (конфиг) со сторонними редакторами/IDE (Atom/VSCode/WebStorm), и иметь в них такой же набор предупреждений и ошибок, а так же иметь возможность настройки автоматического форматирования в соответствии с требованиями линтера.

Нравится

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

Здравствуйте, Илья.

Во встроенном редакторе используется не ESLint, а JSHint, конфигурация которого не хранится в открытом виде. Для ее получения вам нелобходимо перейти по следующей ссылке: адрес_приложения/0/terrasoft.axd?rm=Terrasoft.UI.WebControls&r=jshintoptions.js

Здравствуйте, и большое спасибо Вам за исчерпывающие и оперативные ответы.

Сопутствующая информация, для соискателей по этой тематике:
Например, если очень сильно мешают некоторые замечания, которые прям пресекают использовать средства выразительности JS, например declare by lazy if syntax (присвоение значения переменной, по результату выполнения краткой формы записи оператора "Если")

var sameResultVariable = someReturnBooleanFunction() ? ifTrueFunction() : ifFalseFunction();


Оператор "?" (lazy if) предусматривает возвращение результата, это его особенность и присвоение его переменной, ну как-то сомнительно в качестве даже замечания (waring) но в данном контексте это вообще считается ошибкой (error)
Конкретно в этом случае, достаточно добавить комментарий "[color=green]/* jshint expr: true */[/color]" в начало вашей схемы:

/* jshint expr: true */
define("LeadPageV2", ["ProcessModuleUtilities"],
	function(UserUtilsMixin ...
Показать все комментарии

Добрый день. Помогите разобраться новичку с идиотской проблемой: в пакете Custom неактивна кнопка "Добавить". Следовательно -> не могу корректно создать свой пакет. Как это можно побороть?

Нравится

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

Здравствуйте, Алексей.

Чтобы добавить новый пакет в контекстном меню (не обязательно пакета Custom) на вкладке [Пакеты] раздела [Конфигурация] выбрать действие [Добавить] (во вложении скриншот). Подробнее с механизмом создания пользовательского пакета вы можете ознакомиться по данной ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-polzova….

"Мария Ватулина" написал:
Подробнее с механизмом создания пользовательского пакета вы можете ознакомиться по данной ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-polzovat....

Я наверное не совсем правильно изъяснил проблему... попытаюсь по пунктам:
1. Создал свой пакет.
2. Унаследовался от предпоследнего пакета из схемы зависимостей пакетов.
3. При попытке переопределить зависимость пакета Custom (я должен указать зависимость от своего, вновь созданного пакета), обнаружил, что не могу внести данное изменение т.к. кнопки "Добавить" и "Удалить" неактивны.
4. При осмотре других пакетов данный функционал так же неактивен.

P.S. Пакет, созданный мною в SVN зафиксирован.

"Терещенко Алексей" написал:"Добавить" и "Удалить" неактивны.

Следующая вкладка на вашем скриншоте)
Custom не зависит от пакетов.
Но у него есть зависимые пакеты

"Варфоломеев Данила" написал:

Следующая вкладка на вашем скриншоте)

Custom не зависит от пакетов.

Но у него есть зависимые пакеты

Согласно обучению, которое было проведено ранее и зафиксировано в видео уроках, пакет Custom ВСЕГДА должен находится последним в цепочке зависимостей пакетов и принимать наследование, например, от моего, вновь созданного, ПРЕДПОСЛЕДНЕГО. В противном случае могут возникнуть ряд непредвиденных проблем в работе всего функционала данного продукта.
На вкладке "Зависит от пакетов" - как раз таки это и отображено. а вкладка "Зависимые пакеты" - всегда будет пустой для Custom - такова логика построения пакетов данного продукта со слов тренера по обучению.

"Терещенко Алексей" написал:такова логика построения пакетов данного продукта

Согласен, был не прав. Уже сам запутался в зависимостях.
Сейчас создал свой пакет, унаследовался от SalesEnterpriseSoftkeyRus и он автоматом перенёсся в "зависит от пакетов" Custom'а. Раньше вроде как надо было вручную указывать.

Отредактировать пакет Custom нельзя, если вы поменяли системную настройку "Издатель". Измените её обратно на Customer и отредактируйте то, что нужно. Если я правильно понял проблему.

"Сидоров Александр Валерьевич" написал:Отредактировать пакет Custom нельзя, если вы поменяли системную настройку "Издатель"

Тут я не могу ничего сказать. В работу получил систему с уже рядом внесенных изменений. Возможно Вы и правы. Но тут возникает вполне логичный вопрос: где это правится?

"Терещенко Алексей" написал:Но тут возникает

Так я и говорю - измените системную настройку Издатель на Customer

"Сидоров Александр Валерьевич" написал:измените системную настройку Издатель на Customer

Название = Издатель
Тип = Строка (500 символов)
Знач. по ум. = Customer
Код = Maintainer

это настройки по умолчанию - 100%. Т.е. они не правились.

Здравствуйте, Алексей.

После создания и сохранения вашего пакета пакет Custom должен автоматически добавиться на вкладку Зависимые пакеты вашего пакета. Откройте ваш пакет на изменение и проверьте данную вкладку. На ней должен отображаться пакет Custom (скрин 1). Также, откройте на изменение пакет Custom и проверьте вкладку Зависит от пакетов. В списке должен присутствовать ваш созданный ранее пакет (скрин 2).

"Мария Ватулина" написал:После создания и сохранения вашего пакета пакет Custom должен автоматически добавиться на вкладку Зависимые пакеты вашего пакета

Пробовал... пробовал как с фиксацией в SVN, так и без... Данного волшебства не происходит.

Алексей, проверьте в БД для пакета Custom поле Maintainer в таблице SysPackage. Возможно, что в поле указано значение от значения в системной настройке Maintainer.

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

"Мария Ватулина" написал:Возможно, что в поле указано значение от значения в системной настройке Maintainer.

"Terrasoft"

"Мария Ватулина" написал:Для более подробного рассмотрения проблемы рекомендуем обратиться в Техническую поддержку Terrasoft

Победил!!!
"Управление конфигурацией" -> "Конфигурация" -> Вкладка "Действия" -> "Компилировать все".
После чего зависимости пакетов приобрели правильную схему.
Однако, я не увидел скомпилированных исходников C#... Но это уже тема следующего поста...

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

Коллеги, привет!

Поступил вопрос от разработчика одного из наших партнеров, можете подсказать решение?

Столкнулся со следующей проблемой: пытаюсь создать новый объект детали по инструкциям со страницы https://academy.terrasoft.ru/documents/technic-sdk/7-10/sozdanie-detali-... . На этапе заполнения свойств создаваемого объекта в дизайнере объектов нужно выбрать в качестве родительского объекта Базовый Объект (Base), но он отсутствует в выпадающем списке вариантов выбора. Также я пытался создать объект через Мастер Деталей, однако там в выпадающем списке выбора аж 3 записи "Базовый объект", что немного вводит в заблуждение.
Так же интересует такой вопрос: является ли критичным удаление пакета Сustom? На странице в Академии, посвященной данному пакету об удалении информации нет,
Буду очень признателен за помощь.

Нравится

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

Здравствуйте, Алексей.

Отвечаю на ваши вопросы:

1. В случае если в списке объектов поля Родительский объект не отображается наименование нужного объекта, вам необходимо проверить зависимости пакетов. Подобное поведение возникает если не установлена зависимость между пакетом, в котором создается объект, и пакетом, в котором создан родительский объект.

2. Если при создании объекта через Мастер деталей в списке отображается Три объекта с наименованием Базовый объект, то вероятно, что кастомные объекты имеют название Базовый объект. вам нужно в конфигурации найти все объекты по названию Базовый объект и кастомные переимновать - изменить значение поля Заголовок.

3. Пакет Custom мы не рекомендуем удалять! Его удаление может привести к проблемам в работе системы. Помимо кастомных доработок, в пакет Custom автоматически сохраняется информация по настройке прав доступа и журналированию. Вы можете создать свой пользовательский пакет и вести разработку в нем.

Обращаю ваше внимание, что устанавливать вместо пакета [Custom] любой другой пакет в качестве корневого крайне не рекомендуется!

"Орлов Алексей" написал:Также я пытался создать объект через Мастер Деталей, однако там в выпадающем списке выбора аж 3 записи "Базовый объект", что немного вводит в заблуждение.

А у вас какая версия? Кажется, этот баг в какой-то проскакивал, но потом исправили

"Владимир Соколов" написал: однако там в выпадающем списке выбора аж 3 записи "Базовый объект"

С такой проблемой Вы можете столкнуться не только в конкретно этом месте, а в принципе в интерфейсе приложения, в мастерах в частности во всех выпадающих списках, по вашему личному недосмотру/ошибке или иногда бывает и в типовых решениях - могут быть дублирующиеся записи,
которые на первый взгляд невозможно различить, кроме как "методом тыка" (поскольку как правило там фигурируют только заголовки которые не требуют уникальности в отличии от имен сущностей и полей (и это является "сомнительным решением" и зачастую создает проблемы на всех уровнях))
но выход имеется:
Если речь идет о списках в граф.интерфейсе приложения (мастера и т.д.)
то можно изучить инспектором элементов (панель разработчика) открытый список с дублирующимися записями:

в данном случае следует обратить внимание на аттрибут элемента списка "data-value" оно содержит уникальный идентификатор объекта (UId)
следует открыть конфигуратор, осуществить поиск элементов по имени (которое дублируется),
потом изучив их "мета-данные" определить "кто есть кто"

вот так.

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

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

Возникла проблема с деталями.

  1. Создала 2 объекта через конфигурацию, наследованные от базового объекта.
  2. а) Внешний объект с полем -ссылкой на Контакт
    b) Внутренний объект с полем ссылкой на Внешний объект

  3. Создала 2 детали. Внешняя деталь и внутренняя деталь.
  4. Добавила внешнюю деталь на страницу Контакта
  5. Добавила внутреннюю деталь на страницу Внешней детали

Когда из страницы Контакта нажимаем + и создаем внешний объект, то все работает корректно, ссылка на контакт прописывается. Когда дальше из внешнего объекта нажимаем на + и создаем внутренний, то поле - ссылка не заполняется и появляется ошибка.

"NullOrEmptyException"
"У схемы "ICLOuterEntity" не указана первичная отображаемая колонка"
Также показалось странным, что у обеих созданных сущностей(внешний объект и внутренний объект) папка Inherited Columns пустая, хотя в БД все стандартные колонки есть(дата создания. создал и пр) и при настройке страницы мастером разделов их можно вывести на форму .

В чем может быть дело?

Версия 7.10.0.1742

Нравится

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

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

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

Насчет того, что в Inherited Columns не отображаются системные колонки дата создания, создал и прочее, - это нормально, если Вы наследовались от Base Object.
А, если сделать наследника от Вашей схемы, тогда системные колонки уже в наследнике появятся)

Добрый день, Любовь!

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

Илья,

в дополнение: группу полей, в которых указаны системные колонки, на мой взгляд, логичнее переименовать на "Системные колонки" вместо "Исторические колонки" :wink:

В английской версии аналогично.

"Алла Савельева" написал:

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

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

Насчет того, что в Inherited Columns не отображаются системные колонки дата создания, создал и прочее, - это нормально, если Вы наследовались от Base Object.

А, если сделать наследника от Вашей схемы, тогда системные колонки уже в наследнике появятся)

Life is better than you think :-)

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

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

Добрый день, Любовь!

Для того, чтобы увидеть InheretedColumns, необходимо в настройках объекта нажать галочку Показывать системные колонки - ведь у базовой сущности все колонки системные.

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

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

111.png
245.68 кб


Спасибо!

"Zaitova Liubov" написал:Большое спасибо! и правда, не была указана колонка, так как я и не знала про это свойство. Раз оно такое важное, может стоит его выносить в блок основных свойств?

Действительно, в большинстве случаев значение данного поля должно быть установлено.

Насчет вынесения в блок основных свойств - это вопрос к разработчикам платформы.

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

Карточки в типовой конфигурации, если какрточка сущности была открыта в chain
(или поправьте меня как это правильно называть, мое толкование проистекает от метода openCardInChain)
В таком режиме - определенные типовые действия: "Закрыть", "Сохранить", "Отмена", приводят к "шагу назад" в цепочке открытых карточек.
Иногда в бизнес-логике необходимо выполнить принудительное сохранение карточки, для этого очень удобно использовать методы распостраняемые BasePageV2, и расширяемые на уровне сущностей в соответствии с их особенностями, в частности this.save()
Вопрос:
Можно ли принудительно изменить, в данном случае "прервать" поведение которое осуществляет закрытие карточки и возврат к предыдущей карточке в chain, после вызова this.save() ?

Нравится

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

Сам спросил, сам ответил

var config = {
    isSilent: true,
};
this.save(config)

метод принимает конфигурационный объект, в котором предусмотрен соответствующий флаг.
isSilent

так... сей фокус не работает если это целевой режим создания или копирования. (т.е. если это карточка новой записи - она все равно закрывается)

Вообщем итоговый "трюк" таков.
Если вам нужно вызвать this.save() и избежать закрытия карточки:

if (this.isAddMode() || this.isCopyMode()) {
	//сохраняем значения для восстановления их далее
	var operation = this.get("Operation");
	var isChain = this.get("IsInChain");
	//подменим целевой режим
	this.set("Operation", "edit");
	//подменим флаг присутствия в chain, елси он установлен
	if (isChain) {
		this.set("Operation", false);
	}
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
	//Восстановим подмененные значения
	this.set("Operation", operation);
	if (isChain) {
		this.set("Operation", isChain);
	}
} else {
	//Если карточка открыта в целевом режиме "Редактировать запись" 
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
}
Показать все комментарии

После создания замещающего клиентского модуля карточка редактирования превращается в пустой лист и удаление модуля уже не имеет действия

Нравится

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

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

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

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

Ошибки в коде нет
Пересохранение другой схему ничего не дало
Консоль указывает на ошибку в /combined/all-combined.js
message: Uncaught Terrasoft.ItemAlreadyExistsException: Элемент с ключом "ProductsTab" Уже существует
Связи с элементом нет, т.к. на разных сайтах падает эта ошибка с указанием разных элементов

Произведите так называемый "эталонный чистый старт":
1) В конфигураторе

  • Сгенерируйте исходные коды для всех элементов
  • Компилировать всё

2) Разлогиньтесь в приложении
3) Очистите куки и кеш Вашего браузера
4) Очистите Redis-хранилище
5) Перезапустите пул приложений и сам сайт в IIS

После чего попробуйте воспроизвести проблему.

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

Булат, добрый день!

Ошибка указывает на то, что Вы повторно пытаетесь добавить вкладку ProductsTab в своем замещающем клиентском модуле. Убедиться в этом можно закомментировав весь diff и осуществив публикацию. Скорее всего, подобная ошибка возникла в результате того, что после создания замещающего клиентского модуля Вами был перенесен код из родителя, в котором есть insert данной вкладки - соответственно, система 2 раза пытается добавить элемент с одинаковым идентификатором и сваливается с ошибкой.

Илья,

насчет "чистого старта" - это нужно выносить в отдельный блог "Магия да и только" :wink:

От меня дополнение.
Если у Вас on-demand, то попробовать выполнить, как минимум, первые 3 пункта, если не поможет, тогда дергать поддержку.

Хотя в данном случае, всё-таки похоже, что ошибка в коде)

"Алла Савельева" написал:"чистого старта" - это нужно выносить в отдельный блог "Магия да и только"

немножко "магии" никогда не помешает :)

PS: А если серьезно, то это действительно уже такая "проходка" сформировалась у нас, когда ситуация выглядит прям "магией", т.е. проблема есть, но никаких предпосылок, всё перепроверили по 100500 раз. Причем, опытным путем, выяснили, что такие "магические" проблемы возникают, чаще всего, когда что-то, кто-то пытается удалить.
Из последнего:
1) по непонятным причинам наблюдалась загрузка замещающей схемы - которая была удалена. т.е. после чистки кеша браузера и redis-а, в отладчике все равно в итоговом файле схемы присутствовал код схемы которая была удалена из конфигрурации. "чистый запуск" - полет нормальный
2) в схему был внесен код, код загружается на клиент в рамках агрегированного исходника включающего в себя все замещающие схемы, это код - в нем присутствует, но не выполняется - никогда :)
ставим точку останова прямо на "define" того участка который отвечает за нашу схему.
Исполнение просто туда не передается. Перезагружали безсчетное количество раз, отлаживались вплоть до all-combined.js
"чистый старт" - полет нормальный.
Вот как-то так

"Севостьянов Илья Сергеевич" написал:Произведите так называемый "эталонный чистый старт"

Чистый старт не помог

"Мотков Илья" написал:Ошибка указывает на то, что Вы повторно пытаетесь добавить вкладку ProductsTab в своем замещающем клиентском модуле

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

Так же попробовал накатить рабочий backup, не помогло,
backup сел данные обновились, ошибка осталась

Решил проблему следующим образом
1) Открыл мастер раздела
2) Оттуда перешёл к редактированию проблемной страницы
3) Внёс косметическое изменение
4) Сохранил
5) Ошибка ушла

Всем спасибо за помощь и по меньше "магии"

"Хусаинов Булат" написал:Всем спасибо за помощь и по меньше "магии"

самая что ни на есть "магия" :)
"Хусаинов Булат" написал:Решил проблему следующим образом
1) Открыл мастер раздела
2) Оттуда перешёл к редактированию проблемной страницы
3) Внёс косметическое изменение
4) Сохранил
5) Ошибка ушла

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

Встроенный редактор кода JavaScript поддерживает некоторые полезные сочетания клавиш,
например мультикурсорность через Ctrl+click, стало быть должна быть и функциональность поиска паттерна и установки мультикурсора (так называемая "Select Next Occurrence" в большинстве редакторов и IDE)
Где-то можно посмотреть исчерпывающий перечень поддерживаемых "шоткатов" ?

Нравится

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

Здравствуйте, у нас используется aceEditor, и следовательно его шорткаты можно использовать, ищите больше информации на сайте ace:
https://ace.c9.io/
или:
https://ace.c9.io/demo/keyboard_shortcuts.html

в дополнение темы
Станица документации по сочетаниям клавиш на GitHub

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