Хаутушки https://gglp.ru/home/howto Mon, 26 Oct 2026 18:35:48 +0300 Joomla! - Open Source Content Management ru-ru Остановка ранее запущенных экземпляров процесса https://gglp.ru/home/howto/21-ostanovka-ranee-zapushchennykh-ekzemplyarov-protsessa https://gglp.ru/home/howto/21-ostanovka-ranee-zapushchennykh-ekzemplyarov-protsessa Зачастую процессы, запускаемые по таймеру, обрабатывает множество записей и в некоторых случаях их количество настолько велико, что процесс не успевает завершиться до запуска следующего экземпляра. Это чревато нестабильным поведением системы, т.к. фильтры на процессах одинаковые, может запуститься обработка одной и той же записи, могут сбиться счётчики и возникнуть прочие проблемы.

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

Задача

Принудительно завершить ранее запущенные экземпляры процесса при запуске текущего процесса

Решение

  1. Ожидание требования остановки
    1. Одновременно с запуском процесса запускаем ветку ожидания сигнала прерывания. Называть сигнал лучше по названию процесса. Например, процесс называется ProcessImportOrdersUpdateOpen, тогда сигнал назвать StopProcessImportOrdersUpdateOpen
    2. Ставим таймер задержки прерывания, чтобы процесс не остановил сам себя;
  2. Генерация требования остановки
    1. Добавляем генерацию сигнала по всей системе на остановку прочих экземпляров

Описание

Процесс идёт по всем безусловным веткам управления одновременно. А дальше останавливается на элементе, который необходимо выполнить. Если это системное действие, оно будет выполнено автоматически, если пользовательское, процесс на нём остановится в ожидании реакции пользователя. На ожидании промежуточного сигнала процесс тоже остановится. Как только в системе будет сгенерирован нужный промежуточный сигнал, продолжит выполняться параллельная ветка процесса и процесс перейдёт к сигналу завершения. В результате процесс будет завершён вне зависимости от статуса выполнения прочих шагов (они будут отменены).

Обсудить в Telegram

]]>
Хаутушки Wed, 18 Aug 2021 09:14:22 +0300
Как сделать кликабельной ссылку в текстовом поле https://gglp.ru/home/howto/12-kak-sdelat-klikabelnoj-ssylku-v-tekstovom-pole https://gglp.ru/home/howto/12-kak-sdelat-klikabelnoj-ssylku-v-tekstovom-pole Если на карточке в текстовом поле вставить ссылку на веб-страницу, она будет отображаться как обычный текст. Чтобы сделать ссылку кликабельной, надо добавить несколько блоков кода в схему карточки (подразумеваем, что текстовое поле уже добавлено в объект и выведено на карточку).

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

Задача

Кликабельная ссылка в текстовом поле

Решение

  1. Добавить поле на карточку через мастер раздела. Для примера пусть это будет поле gglpZoomLink
  2. Добавить следующий код в блок кода values нашего поля:
    "showValueAsLink": true,
    "href": {
        "bindTo": "UsrUrlFieldName",
        "bindConfig": {"converter": "getLinkFormat"}
    },
    "controlConfig": {
        "className": "Terrasoft.TextEdit",
        "linkclick": { bindTo: "onLinkClick"}
    }
  3. Добавить следующий код в блок кода methods:
    getLinkFormat: function(value) {
        return {
            "url": value,
            "caption": value
        };
    },
     
    onLinkClick: function(url) {
        var link = document.createElement("a");
        link.href = url;
        link.target = "_blank";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        return false;
    }

Объяснение

Итоговый вид кода страницы получился примерно такой:

Из метода getLinkFormat возвращаются значения двух переменных (можно задавать отдельно ссылку и текст ссылки), но мы используем ссылку для отображения без преобразований.

В методе onLinkClick использовано динамическое формирование элемента <a>, чтобы избежать блокировки всплывающих окон браузером.

Что интересно, если указывать ссылку без протокола (https://), она будет отображаться как относительная, добавляя в начале адрес приложения.

Оригинал решения: How to Format a URL as a Clickable Link in a Text Field in Creatio

Обсудить в Telegram

]]>
Хаутушки Tue, 20 Jul 2021 18:06:30 +0300
Отключение процессов на системе заказчика https://gglp.ru/home/howto/3-otklyuchenie-protsessov-na-sisteme-zakazchika https://gglp.ru/home/howto/3-otklyuchenie-protsessov-na-sisteme-zakazchika В проектах бывает необходимость отключить штатный ("коробочный") процесс - заменить его на свой или перенести функциональность в Кейс. Есть варианты быстрый и правильный:

  1. Быстрый - это в дизайнере процессов выключить процесс (снять признак Активный). Однако это надо будет делать на каждом окружении (и клиентских тоже), что само по себе уже неудобно. К тому же со временем необходимость выключения процесса забывается и можно получить нестабильное поведение системы при отработке сигнала.
  2. Правильный - это создать замещающий процесс и заменить в нём стартовый сигнал на обычный.

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

Задача

Автоматически отключить штатный процесс на всех окружениях.

Например, мы хотим отключить процесс дисквалификации Лида.

Решение

Опубликовать новую версию штатного процесса с привязкой его в проектный пакет:

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

Описание

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

Обсудить в Telegram

]]>
Хаутушки Mon, 19 Jul 2021 20:20:30 +0300
Деактивация имеющихся записей в справочниках https://gglp.ru/home/howto/8-deaktivatsiya-imeyushchikhsya-zapisej-v-spravochnikakh https://gglp.ru/home/howto/8-deaktivatsiya-imeyushchikhsya-zapisej-v-spravochnikakh

Задача

Сделать недоступными для пользователя (скрыть / удалить) на целевой системе существующие записи в справочнике.

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

Например, необходимо скрыть, показанные на скриншоте, коробочные значения:

  • 1. Оформление
  • 2. Согласование
  • 3. Исполнение
  • 4. Завершен
  • 5. Отменен

Так, чтобы остались и использовались только новые значения:

  • 1. Зарезервирован
  • 2. Упакован
  • 3. Отгружен
  • 4. Доставлен
  • 10. Отменен покупателем
  • 13. Возвращен покупателем

Решение

  1. Включаем в справочнике возможность деактивации записей
    1. Добавляем Замещающий объект
    2. Выбираем исходный объект
    3. Включаем для него возможность деактивации записей в блоке Поведение - Разрешить деактивацию записей
    4. Сохраняем, публикуем
  2. Деактивируем коробочные записи
    1. Выводим колонку Деактивирована в реестр значений справочника
    2. Устанавливаем значение поля = Да для лишних записей
  3. Привязываем данные к пакету

Объяснение

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

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

Деактивированные записи не появляются в фильтрах, их нельзя выбрать в выпадающих списках на карточках. Но в реестре записей справочника они отображаются.

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

Обсудить в Telegram

]]>
Хаутушки Tue, 20 Jul 2021 15:50:28 +0300
Локальное доменное имя https://gglp.ru/home/howto/7-local-domain-name https://gglp.ru/home/howto/7-local-domain-name  

Задача

Сделать так, чтобы локальное приложение работало по доменному имени, а не по IP-адресу + порту.

Например, чтобы приложение открывалось не по адресу http://192.168.1.1:81/ и не по адресу http://localhost:81/, а по адресу http://agile.bequiet.gglp.ru/

Решение

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

  1. Переходим в настройки сайта на IIS-сервере, кликаем на пункт Привязки в меню Изменение веб-сайта, добавляем доменное имя, по которому мы хотим обращаться к сайту (в нашем примере agile.bequiet.gglp.ru), без протокола http или https, указываем стандартный порт (80 - для http, 443 - для https). Сохраняем.
  2. Добавляем трансляцию доменного имени в локальный IP-адрес в файле hosts.
    Файл расположен по пути C:\Windows\System32\drivers\etc\hosts, открывать с правами администратора.
    В конец файла добавляем строку
    127.0.0.1  agile.bequiet.gglp.ru

Теперь приложение должно открываться по доменному имени. Будет работать только с локального компьютера.

Описание

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

IIS умеет проксировать запросы в рамках определённого доменного имени на нужный сайт. Достаточно настроить привязку имени к сайту.

Дополнительный плюс - на одном стандартном порту - 80 или 443, может работать любое количество сайтов / веб-приложений.

Чтобы открывать приложение с другого компьютера в локальной сети можно на другом компьютере в файле hosts указать не 127.0.0.1, а локальный IP-адрес компьютера, на котором развёрнуто приложение. В нашем примере это 192.168.1.1

Обсудить в Telegram

]]>
Хаутушки Tue, 20 Jul 2021 14:44:31 +0300
Как в процессе добавить несколько стартовых сигналов https://gglp.ru/home/howto/1-kak-v-protsesse-dobavit-neskolko-startovykh-signalov https://gglp.ru/home/howto/1-kak-v-protsesse-dobavit-neskolko-startovykh-signalov Бывает, что в бизнес-процессах необходимо выполнить одни и те же операции при получении разных сигналов от объекта - создание, изменение, удаление. Чтобы не создавать несколько разных бизнес-процессов, можно создать один процесс с несколькими стартовыми сигналами.

Схема бизнес-процесса с несколькими стартовыми сигналами

Задача

Учесть в бизнес-процессе несколько стартовых событийных сигналов.

Решение

  1. Добавляем нужные стартовые сигналы, заводим их в один шаг Читать данные
  2. В шаге Читать данные заполняем фильтры по Id равным Id записей в стартовых сигналах с группировкой в режиме ИЛИ

Объяснение

По умолчанию Id записей в обоих стартовых сигналах равны null. При срабатывании одного из сигналов в нём заполняется значение Id (например, 04f4707e-122b-4dc7-9c70-aaf8f1cbfe14), и при группировке ИЛИ в фильтре выбора нужной записи мы будем получать условие:

WHERE Id = '04f4707e-122b-4dc7-9c70-aaf8f1cbfe14' OR Id is null

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

Обсудить в Telegram

]]>
Хаутушки Fri, 16 Jul 2021 11:17:41 +0300