Для переноса данных из формы завершения на форму заявки, необходимо:
**Шаг 1.** Под выбранной формой завершения в типе действия **Работа по форме** перейти во вкладку **"Настроить сопоставления"**
**Шаг 2.** В открывшемся модальном окне настроить сопоставления **откуда** и **куда** необходимо перенести данные.
* В поле слева отображается выпадающий список полей формы завершения
...
...
@@ -463,326 +464,32 @@
**Выход** - заявка со статусом "в работе"
Смена статуса выполняется автоматически с помощью скрипта интерпретатора, запускаемого этапом маршрута типа **«Блокирующий процесс»**.
.. note:: **Скрипт интерпретатора** - это программный код на JavaScript внутри системы Synergy, который выполняется без компиляции и позволяет автоматизировать логику работы системы.
Он используется для расчетов, обработки данных форм и карточек, а также для реакции на внутренние события системы.
Скрипт выполняется сразу при запуске или событии и возвращает результат выполнения системе.
Подробнее о том, что такое скрипт интерпретатора http://rtd.lan.arta.kz/docs/guide/ru/minsky/interpreter.html
Создание скрипта интерпретатора
^^^^^^^^^^^^^^^^^^^^^^^^^^
**Шаг 1.** В дереве приложения выбираем папку для хранения скриптов.
Для удобства это может быть:
* папка integrations,
* либо можно создать отдельную папку block_processes.
**Шаг 2.** Кликаем по папке правой кнопкой мыши → Добавить → Интеграция → Скрипт интерпретатора.
**Шаг 3.** В открывшемся окне редактирования кода указываем:
* Наименование - Система автоматически задаёт базовый префикс ``event.blocking.interpreter``
Необходимо дополнить наименование и код, используя латинские буквы и отражая логику работы скрипта. Например ``event.blocking.interpreter.change.status_work``
* Код - формируется автоматически из наименования
* Описание - добавляется при необходимости для пояснения логики работы скрипта
* Комментарий по умолчанию - обязательная настройка, это сообщение которое система выведет после выполнения скрипта. (например "ОК" или "Статус изменен")
* Авторизация - скрипту для срабатывания необходимы права доступа. Здесь имеется два варианта
* По логину и паролю - понадобится логин и пароль учетной записи с правами администратора
* По ключу - понадобится ключ администратора
**Шаг 4.** Выбираем тип авторизации **"По логину и паролю"** и указываем учетную запись администратора
.. important:: При смене логина и пароля учетной записи администратора логин и пароль нужно будет обновить во всех скриптах интерпретатора, использующих эту учетную запись
**Шаг 5.** В редактор кода вставляем стандартный скрипт для смены статуса
.. code-block:: javascript
var result = true;
var message = 'Смена значения статуса';
try {
var form = platform.getFormsManager().getFormData(dataUUID);
form.load();
form.setValue('код справочника', 'код значения');
form.save();
} catch (e) {
result = false;
message = e.message;
}
**Шаг 3.** Вместо слов:
* **"код справочника"** - указываем код поля в котором находится выпадающий список статусов, например у нас это ``listbox_status``
* **"код значения"** - значение, на которое должен смениться статус, согласно справочнику у нас это значение 4 ("В работе")
.. figure:: ../resources/img/listbox_status.jpeg
Если все сделано правильно, код будет выглядеть так:
Теперь когда мы умеем добавлять блокирующий процесс в маршрут, создаем еще один скрипт интерпретатора для переноса данных из формы завершения этапа 4 в основную форму.
**Шаг 1.** Для начала добавляем на основную форму заявки поле **«Исполнитель»** из формы завершения. Поле должно иметь аналогичный код.
for (let key in fieldData) field[key] = fieldData[key];
return field;
},
getValue: function (data, cmpID) {
data = data.data ? data.data : data;
for (let i = 0; i < data.length; i++) {
if (data[i].id === cmpID) return data[i];
}
return null;
},
setValue: function (asfData, cmpID, data) {
let field = this.getValue(asfData, cmpID);
if (field) {
for (let key in data) {
if (key === 'id' || key === 'type') continue;
field[key] = data[key];
}
return field;
} else {
asfData = asfData.data ? asfData.data : asfData;
field = this.createField(data);
field.id = cmpID;
asfData.push(field);
return field;
}
}
};
function processesFilter(processes) {
let result = [];
function search(p) {
p.forEach(function (x) {
if (x.typeID == 'ASSIGNMENT_ITEM' && x.finished) result.push(x);
if (x.subProcesses.length > 0) search(x.subProcesses);
});
}
search(processes);
return result.sort(function (a, b) {
return new Date(b.finished) - new Date(a.finished);
});
}
try {
let processes = processesFilter(getProcesses(documentID));
if (!processes.length) throw new Error('Не найденно завершенной работы');
let resultFormWork = getWorkCompletionData(processes[0].actionID);
if (!resultFormWork || !resultFormWork.result.hasOwnProperty('dataUUID')) {
throw new Error('Не найдена форма завершения');
}
let completionFormData = getFormData(resultFormWork.result.dataUUID);
let newFormData = [];
let matching = [];
// поля для сопоставления с фз на основную форму
matching.push({ from: 'поле на форме завершения', to: 'поле основной формы' });
matching.forEach(function (id) {
let fromData = UTILS.getValue(completionFormData, id.from);
if (fromData) UTILS.setValue(newFormData, id.to, fromData);
});
mergeFormData(dataUUID, newFormData);
} catch (err) {
message = err.message;
}
.. figure:: ../resources/img/meme_script.jpg
**Шаг 5.** Находим в скрипте блок сопоставления полей matching и заменяем текст внутри кавычек
* from - код поля "Исполнитель" в форме завершения
* to - код поля "Исполнитель" в осноной форме, куда переносим значение
Пример:
До:
**Шаг 1.** В маршруте добавляем новый этап
.. figure:: ../resources/img/matching_before.jpeg
**Шаг 2.** Выбираем тип действия "Смена значения справочника"
После:
**Шаг 3.** В настройках этапа:
.. figure:: ../resources/img/matching_after.jpeg
**Шаг 6.** Присваиваем скрипту интерпретатора наименование, например ``event.blocking.interpreter.completion_form_responsible``
**Шаг 7.** При необходимости добавляем описание и указываем авторизационные данные как мы это делали ранее
**Шаг 8.** После того как все готово, сохраняем сущность и переходим к добавлению этапа в маршрут.
Добавление дополнительного шага для этапа 4
------------------------------------------
**Шаг 1.** Добавляем этап с типом действия "Блокирующий процесс":
* Наименование - перенос данных с формы завершения
* Событие - вставляем код созданного нами скрипта интерпретатора для переноса данных из формы завершения (``event.blocking.interpreter.completion_form_responsible``)
.. figure:: ../resources/img/step4.jpeg
**Шаг 2.** Сохраняем этап и переходим к формированию правильного порядка этапов. Нам необходимо передвинуть этап с переносом формы завершения непосредственно под этап с формой завершения.
**Шаг 3.** Для переноса этапа зажимаем кнопку переноса этапа рядом с цифрой этапа
.. image:: ../resources/img/button_dragndrop.jpeg
и двигая строку в нужное место
.. figure:: ../resources/img/steps.jpeg
Теперь все этапы располагаются в правильном порядке.
* указываем наименование этапа (например, «Смена статуса на "В работе"»);
* в поле **«Компонент»** выбираем код компонента из поля "Статус заявки"
* в поле **"Значение"** выбираем значение справочника на которое он должен смениться после прохождения этапа, в нашем случае "В работе"