Добрый день, коммьюнити,

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

Например, define("EmailFileDetailV2", ["ModalBox", "ServiceHelper",  "ProcessModuleUtilities", "css!UsrFileDetailCSS"]



Сегодня обнаружил, что неправильный порядок кроме undefined может вызвать ошибку "X is not a function". Ломал голову полдня, а в итоге обнаружил, что зависимости в детали были прописаны не в том порядке. Оставлю это здесь, на случай если кто-то так же не будет понимать причину ошибки)



Я правильно понимаю, что вызов "родителей" осуществляется в таком же порядке, в котором они прописаны? И в случае если имя метода/css-стиля совпадает в нескольких "родителях", то вызывается первый из них? 

Нравится

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

Обратите внимание на статью:

Загрузчик выполняет загрузку всех модулей-зависимостей, переданных в качестве аргументов в define(). Модули загружаются асинхронно, при этом фактически порядок их загрузки определяется загрузчиком произвольно.

Но при этом (там же ниже) 

dependencies

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

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

function(dependencies)

Анонимная функция-фабрика, которая инстанцирует сам модуль. Обязательный параметр.

В качестве аргументов в функцию передаются объекты, которые ассоциируются загрузчиком с модулями-зависимостями, перечисленными в аргументе dependencies. Через эти аргументы осуществляется доступ к свойствам и методам модулей-зависимостей внутри создаваемого модуля. Порядок перечисления модулей в dependencies должен соответствовать порядку аргументов функции-фабрики.

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

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

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

Добрый день!

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

Нравится

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

Доброе утро!

На тестовой среде редактировал раздел через мастер раздела, добавив новое поле справочника(возможен конфликт с другим полем из той же таблицы(Продукт)), после сохранения документа, потерял возможность редактирования страницы. "Невозможно настроить страницу.Для данной страницы нет возможности выполнить настройку при помощи мастера. Обратитесь к администратору системы" в чем может быть проблема и как можно ее исправить? через конфигуратор изменить\удалить поле не могу, может если удалить данное поле из таблицы в БД я верну возможность редактировать страницу?

Версия:7.10.2.1416

Нравится

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

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

Например diff должен выглядеть так:

diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/

а не так:

diff: []

Пример карточки контакта:

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

Например diff должен выглядеть так:

diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/

а не так:

diff: []

Пример карточки контакта:

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

Добрый день, коллеги. Необходимо добавить кнопку на панель визирования (помимо approve и reject).

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

Нравится

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

Замещать как и расширять модули можно, если делать это правильно.

Вот пример замещения модуля BaseCommunicationViewModel.

Создаем новый модуль, в данном случае будем замещать (override, можно использовать расширение extend(вместо override заменить)). Затем, где нужно, вызываете реализованный вами модуль.

Например в детали: 

define("AppFormCommunicationDetail", ["ScBaseCommunicationViewModel"],



Реализация модуля:

define("ScBaseCommunicationViewModel", ["BaseCommunicationViewModel"],
function() {
	Ext.define("Terrasoft.ScBaseCommunicationViewModel", {
		override: "Terrasoft.BaseCommunicationViewModel",
		alternateClassName: "Terrasoft.ScBaseCommunicationViewModel",
		getLinkUrl: function(value) {
			//нужная реализация метода
		}
	});
	return Terrasoft.ScBaseCommunicationViewModel;
});

 

Замещать как и расширять модули можно, если делать это правильно.

Вот пример замещения модуля BaseCommunicationViewModel.

Создаем новый модуль, в данном случае будем замещать (override, можно использовать расширение extend(вместо override заменить)). Затем, где нужно, вызываете реализованный вами модуль.

Например в детали: 

define("AppFormCommunicationDetail", ["ScBaseCommunicationViewModel"],



Реализация модуля:

define("ScBaseCommunicationViewModel", ["BaseCommunicationViewModel"],
function() {
	Ext.define("Terrasoft.ScBaseCommunicationViewModel", {
		override: "Terrasoft.BaseCommunicationViewModel",
		alternateClassName: "Terrasoft.ScBaseCommunicationViewModel",
		getLinkUrl: function(value) {
			//нужная реализация метода
		}
	});
	return Terrasoft.ScBaseCommunicationViewModel;
});

 

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

Добрый день!

Дергаю свой собственный конфигурационный сервис. В один поток проблем нет никаких. Если одновременно шлю несколько запросов ошибка.

let authErrorExceptions = Terrasoft.AuthErrorExceptions = {};

authErrorExceptions[4] = 'Доступ запрещен. Обратитесь к системному администратору';

authErrorExceptions[5] = 'Срок действия Вашего пароля истек. Введите новый пароль';

authErrorExceptions[10] = 'Неправильный часовой пояс.';

authErrorExceptions[0] = 'Ошибка авторизации';

При чем не всегда. 

4 запроса одновременно, как то мало на мой взгляд. Может быть можно что то настроить в конфиге?

Нравится

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

Вам же в ошибке ясно Написано же в ошибке AuthErrorExceptions!!!!!

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

Вам же в ошибке ясно Написано же в ошибке AuthErrorExceptions!!!!!

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

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

Возможно ли в раздел по api подтянуть список из другой системы и потом через карточку с виртуальными полями получать данные так же через api. Смысл в том что нужно сделать управление другим сервисом через фронтэнд Creatio.

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

 

Нравится

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

Можно варианты реализации множество навскидку 1) получать данные из сервиса (по аналогии с DataService) 

2) Использовать интеграцию на уровне БД (Linked Servers) и создать виртуальный объект на основе представления. Обсуждалось тут и тут и тут

В общем вариантов много, почитайте все ветки и документацию по интеграции с другими системами.

 

Вариант dblink не подходит так как есть доступ только по webapi.

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

пишет:

Можно варианты реализации множество навскидку 1) получать данные из сервиса (по аналогии с DataService) 

2) Использовать интеграцию на уровне БД (Linked Servers) и создать виртуальный объект на основе представления. Обсуждалось тут и тут и тут

В общем вариантов много, почитайте все ветки и документацию по интеграции с другими системами.

 

Вариант dblink не подходит так как есть доступ только по webapi.

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

Можно на сервере БД создать view, получающую информацию от стороннего веб-сервиса и туда же отправляющую в instead-триггерах.

Но обращаться с ней с точки зрения производительности нужно очень осторожно.

Зверев Александр пишет:

Можно на сервере БД создать view, получающую информацию от стороннего веб-сервиса и туда же отправляющую в instead-триггерах.

Но обращаться с ней с точки зрения производительности нужно очень осторожно.

Это выходит что нужно создать или сервис на c# или на уровне базы http клиентом. А можно ли переопределить логику получения списка не из базы данных а по webapi? И наверно резонно подумать что если можно, на сколько это может быть проблематично с дальнейшими обновлениями системы что бы не вышло конфликта так как я понимаю прийдеться  замещать довольно глубокий код. Другими словами стоит ли игра свеч и порванного бубна?

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

Также посмотрите статью, где обсуждают нечто подобное, хоть и без интеграции.

Зверев Александр пишет:

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

Также посмотрите статью, где обсуждают нечто подобное, хоть и без интеграции.

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

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

Добрый день.

Можете помочь, и подсказать почему не активна поле Родитель в иерархии, и как сделать что бы оно было активна

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

Нравится

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

Добрый день.

Данный вопрос уже обсуждался в этом посте.

Добрый день.

Данный вопрос уже обсуждался в этом посте.

Алла Савельева,

 

Спасибо!

Добрый день.

Можете помочь, как сделать так, что бы он, отфильтровал по всем записям а не только по тем которые находится выше в иерархии?

Владимир, не вижу в системе такого справочника, он самодельный? Есть какой-то стандартный справочник с аналогичным поведением?

Нужно смотреть, как накладывается фильтр, может, потребуется доработка LookupPage, как её делают, обсуждают тут и тут.

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

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

фильтр из детали, указывается лишь кол-во и датаИзображение удалено.

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

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

Нравится

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

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Доброе утро.

Все верно, так и должно быть.

В колонке выбираете количество, после этого в самой области фильтра 'количество' можно сменить на 'существует' или 'не существует' и в области подфильтра уже работать с табличкой детали и настраивать нужные фильтры.

Более подробно о том, как построить exist-фильтр можно почитать на Академии по ссылке (подтема 'Установка агрегирующего фильтра').

Алла Савельева,

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

Касымов Сакен,

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

Нашел другой способ, создал вьюшку в БД и объект, поставил галочку в "Представление в БД"в этой вьюшке есть есть значения с "NULL" (это не проблема?)

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

Касымов Сакен,

А какой график нужно получить в итоге?

Возможно, неправильно сделали представление.

Посмотрите в SQL Management Studio, какие данные возвращает Ваше представление.

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

Превратить Null в пустую или какую угодно строку можно функцией IsNull со вторым параметром.

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

Зверев Александр пишет:

Также при создании пользовательских представлений для корректной их работы необходимо наследование от схемы BaseEntity, где есть стандартные колонки

Не согласна с этим утверждением.

Все зависит от того для реализации какой функциональности создается то или другое представление. 

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

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

Проблема в следующем:

1) У заказчика стоит политика безопасности, что блокируется доступ на почту в течении 30 минут при не успешной попытке входа на почту 5 раз подряд(если пароль не верный).

2) Creatio CRM синхронизируется по идее с определенной периодичностью без остановки.

3) В системе будет >300 пользователей, в связи с этим стоит проблема, что могут поменять пароль, а в Creatio CRM в течении определенного времени не успеть сменить вовремя, и работа пользователя будет фактически остановлена на минут 30, почта имеет важную роль.

Вопрос:

Возможно ли как-то поставить доп. логику обработки синхронизации с почтой, что в случае неверных попыток синхронизации с почтой, допустим 3 раза подряд, прерывалось для данного пользователя + уведомление приходило например сис. админу? Может кто сталкивался с такой ситуацией?

Нравится

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

Насколько мне известно, в базовой версии возможности для настройки такой функциональности нет.

CRM система не является почтовым сервером и возможности настройки дополнительных опций почтового ящика очень ограничены.

Думаю, что проще попробовать реализовать эту функциональность на стороне почтового сервера, если он поддерживает такую возможность.

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

Пишут, что такая логика появилась ещё в 7.11:

Коммуникационная панель будет сообщать о проблемах при загрузке писем с почтового сервера:

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

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

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

Визуально такая сработавшая проверка выглядит как розовая иконка письма на правой панели и при нажатии на неё в открывшейся панели с письмами плашка сверху: «Синхронизация остановлена, неверный пароль».

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

Добрый день, коллеги. Появилась необходимость добавить в Историю обращения логирование ещё одного типа сообщений, наравне с Email, Лентой и прочим. Для этого я, следуя образу подобных сообщений для Email, создал отдельный объект (Email же ссылаются, логично, на Activity), аккуратно скопировал схемы EmailMessageHistoryItemPage и EmailMessageHistoryItemStyle, внёс в таблицу MessageNotifier соответствующую запись, заполнив нужные поля и зарегистрировал связь Notifier с разделом Case в таблице MessageNotifierBySection. В итоге, пришёл к тому, что при загрузке страницы Обращения консоль выдаёт ошибку "e.on is not a function" и не загружает деталь Истории совсем. Подскажите, кто-либо сталкивался с подобной доработкой? Может я, разбирая notifier для email забыл что-то скопировать или пропустил?

Заранее спасибо

Нравится

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

Без отладки и сравнения кода сложно сказать.

Обратите внимание, что кроме EmailMessageHistoryItemPage есть ещё EmailMessageHistoryItemPageV2, а также отдельные схемы с CSS для обоих страниц.И обе страницы прописываются в полях записи MessageNotifier.

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

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