Перейти к содержанию

Модуль взаимодействия с ядром ЛИС

Модуль @chemsof/chemic дает доступ к ядру ЛИС из node, по сути являясь оберткой над chemic.dll, обращаясь к его методам через Chemic API. Модуль поделен на пространства имен и классы.

Принятые обозначения в заголовках и оглавлении:

Something(): метод, функция, что-то, что можно вызвать, сигнатура может не совпадать EXP: Фича с экспериментальной поддержкой

READONLY: свойство только для чтения

Быстрый старт

Установка

Настроить подключение npm-registry из GitLab (для инструкций см. сам репозиторий npm-registry)

После этого для Установка модуля пишем

npm i @chemsoft/chemic

Подключение

Модуль подключается из кода следующим образом:

const chemic = require('@chemsoft/chemic')

Теперь обращаясь к chemic можно взаимодействовать с ядром ЛИС

Инициализация ядра

Подключение к БД

По умолчанию строка подключения БД считывается из реестра ветки ЛИС (\HKCU\SOFTWARE\НИИ ВН\АРМ «Химик-аналитик»\Connect или аналогичный ключ в HKLM).

Для изменения строки подключение можно передать кастомную через переменную среды CONNECTION_STRING.

Например:

set CONNECTION_STRING=Provider=SQLNCLI11.1;Password=1;User ID=ch_ttg2_barabinsk;Data Source=MSSQL08;Application Name=LISChemic;MARS Connection=True

# Тепер можно запускать скрипт

Пользовательская часть

  • По идентификатору

  • Передача переменных среды

set LIS_USER_ID=777

# Тепер можно запускать скрипт
  1. Установка значений в глобальном объекте
global.LIS_USER_ID = 777;

const chemic = require("@chemsoft/chemic");
  • По логину и паролю

При инициализации по логину и паролю существует два варианта аутентификации:

  • Прямой (raw) - в данном случае при аутентификации сверяется только пароль и никакие доп. проверки не осуществляются;
  • Стандартный (default) - стандартный способ аутентификации, аналогичный входу в ЛИС через обычный лаунчер.

  • Передача переменных среды

# Вариант аутентификации
set LIS_CREDENTIAL_INITIALIZE_MODE=raw
# set LIS_CREDENTIAL_INITIALIZE_MODE=raw

# Учетные данные
set LIS_USER_LOGIN=test_user
set LIS_USER_PASSWORD=1
# Пароль также может быть пустым или не указан (эквивалент пустому)
# set LIS_USER_PASSWORD=

# Тепер можно запускать скрипт
  1. Установка значений в глобальном объекте
global.LIS_CREDENTIAL_INITIALIZE_MODE = "default";
global.LIS_USER_LOGIN = "test_user_simple";
global.LIS_USER_PASSWORD = ""; // Пустой пароль

const chemic = require("@chemsoft/chemic");

Пространство имен Session

Пространство имен Session дает доступ к текущей сессии пользователя.

Вложенное пространство имен Session.user

Внутри Session.user хранится информация о пользователе текущей сессии

Session.user.name хранит в себе строку с ФИО пользователя

Session.user.id идентификатор пользователя

Session.user.roles.id идентификатор роли пользователя

Session.user.roles.name название роли

Session.user.roles.banned флаг бана роли

Свойство Session.labId

Session.labId идентификатор лаборатории

Пространство имен User

User.hasRole()

Проверка на то, имеет ли пользователь указанную роль

param: idOrName Идентификатор или имя роли

param: ignoreBanned Игнорирует при рассмотрении заблокированные роли

return: boolean Возвращает true, если пользователь имеет указанную роль, false - если нет

User.hasRole(idOrName: number | string, ignoreBanned?: boolean): boolean;

Пространство имен SecurityStorage

Пространство имен SecurityStorage дает доступ защищенному хранилищу пользователя. Защищенное хранилище место где пользователь может хранить какую-то чувствительную информацию в словарном представлении (ключ-значение).

SecurityStorage.isPathExist()

Проверка существования файла по пути из защищенного хранилища (ЗХ), также можно задать имя файла, которое добавится к директории из ЗХ

param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории

param: filename Имя файла (необязательно)

return: boolean Результат проверки существования пути

SecurityStorage.isPathExist(pathKey: string, filename?: string): boolean

SecurityStorage.readFileContent()

Синхронное чтение данных из файла по пути из ЗХ, также можно задать имя файла, которое добавится к директории из ЗХ

param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории

param: filename Имя файла (необязательно)

return: string | null Содержимое файла

SecurityStorage.readFileContent(pathKey: string, filename?: string): string | null;

SecurityStorage.writeFileContent()

Синхронная запись данных в файл по пути из ЗХ, также можно задать имя файла, которое добавится к директории из ЗХ

param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории

param: filename Имя файла (может быть null)

param: content Данные для записи в файл

SecurityStorage.writeFileContent(pathKey: string, filename: string | null, content: string): void;

SecurityStorage.copyFile()

Копирование файла по пути из ЗХ

param: srcPath Путь к файлу

param: dstPathKey Ключ из ЗХ, по которому хранится полный путь к директории

SecurityStorage.copyFile(srcPath: string, dstPathKey: string): void;

SecurityStorage.moveFile()

Перемещение файла по пути из ЗХ

param: srcPath Путь к файлу

param: dstPathKey Ключ из ЗХ, по которому хранится полный путь к директории

SecurityStorage.moveFile(srcPath: string, dstPathKey: string): void;

SecurityStorage.getKeyValue()

Получение значение из защищенного хранилища пользователя

param: key Ключ

return: string | null Значение (если есть)

SecurityStorage.getKeyValue(key: string): string | null;

Пространство имен Documents

Пространство имен Documents позволяет работать с документами ЛИС: создавать и экспортировать.

Documents.exportToPdf()

Экспортирует готовый документ в pdf

param: documentId Идентификатор готового документа (таблица dFormsDOX)

param: filePath Полный путь к файлу для экспорта (расширение .pdf)

Documents.exportToPdf(documentId: number, filePath: string): void;

Documents.exportToPdfAsync()EXP

Асинхронно экспортирует готовый документ в pdf

param: documentId Идентификатор готового документа (таблица dFormsDOX)

param: filePath Полный путь к файлу для экспорта (расширение .pdf)

param: callback Обработчик завершения операции

Documents.exportToPdfAsync(documentId: number, filePath: string, callback: (err?: Error) => void): void;

Documents.exportToPdfSecure()

Экспортирует готовый документ в pdf, в качестве пути используя значение из защищенного хранилища ЛИС

param: documentId Идентификатор готового документа

param: pathSecureKey Ключ защищенного хранилища, по которому хранится путь

param: fileName Имя файла для сохранения (расширение .pdf)

Documents.exportToPdfSecure(documentId: number, pathSecureKey: string, fileName: string): void;

Documents.exportToPdfSecureAsync() EXP

Асинхронно экспортирует готовый документ в pdf, в качестве пути используя значение из защищенного хранилища ЛИС

param: documentId Идентификатор готового документа

param: pathSecureKey Ключ защищенного хранилища, по которому хранится путь

param: fileName Имя файла для сохранения (расширение .pdf)

param: callback Обработчик завершения операции

Documents.exportToPdfSecureAsync(documentId: number, pathSecureKey: string, fileName: string, callback: (err?: Error) => void): void;

Documents.exportToXml();

Экспортирует готовый документ в файл XML (win1251)

param: id Идентификатор документа

param: path Путь к сохраняемому файлу

Documents.exportToXml(id: number, path: string): void;

Documents.extractToXml();

Экспортирует готовый документ в строку XML

param: id Идентификатор документа

Documents.extractToXml(id: number): string;

Класс Documents.Generator

Базовые типы, которыми оперирует класс

type GeneratorParameterType = null | number | string | { type: 'time' | 'date', value: Date };

interface GeneratorParameter {
  readonly type?: 'number' | 'string' | 'date' | 'time';
  readonly name: string;
  readonly isComboBox: boolean;
  readonly isReadOnly: boolean;
  readonly value: number | string | Date;
  readonly availableValues?: string[]; // Только для комбо (isComboBox === true)
  readonly meta: {
    readonly min?: number; // Минимальное значение числа (для type === 'number')
    readonly max?: number; // Максимальное значение числа (для type === 'number')
    readonly stringMaxLength: number;
  },
}

Статические методы (методы класса)

Documents.Generator.create()

param: formId Идентификатор формы документа

Documents.Generator.create(formId: number): Generator;

Documents.Generator.createAsync() EXP

Асинхронное создание документа

param: formId Идентификатор формы документа

param: callback Обработчик завершения операции

Documents.Generator.createAsync(formId: number, callback: (err?: Error, generator?: Generator) => void): void;

Методы экземпляра (ex)

ex.getParameters()

Возвращает список параметров документа и информацию о них

ex.getParameters(): GeneratorParameter[];

ex.setParameter()

Устанавливает значение параметра для текстового поля ввода документа

param: parameterNumber Номер параметра

param: parameter Значение параметра

ex.setParameter(parameterNumber: number, parameter: GeneratorParameterType): Generator;

ex.setParameterByIndex()

Устанавливает значение параметра для выпадающего списка по индексу из списка доступных значений (GeneratorParameter.availableValues)

param: parameterNumber Номер параметра

param: valueIndex Индекс значения

ex.setParameterByIndex(parameterNumber: number, valueIndex: number): Generator;

ex.saveInDatabase()

Сохраняет документ в базе данных

return: number Идентификатор сохраненного документа

ex.saveInDatabase(): number;

ex.toPdf()

Экспортирует документ в формат pdf

param: filePath Путь к экспортируемому документу

ex.toPdf(filePath: string): Generator;

ex.toPdfAsync() EXP

Асинхронно экспортирует документ в формат pdf. Недоступно для вызова из планировщика.

param: filePath Путь к экспортируемому документу

param callback Обработчик завершения операции

ex.toPdfAsync(filePath: string, callback: (err?: Error, generator?: Generator) => void): void;

ex.toXlsx()

Экспортирует документ в формат xlsx

param: filePath Путь к экспортируемому документу

ex.toXlsx(filePath: string): Generator;

ex.toXlsxAsync() EXP

Асинхронно экспортирует документ в формат xlsx. Недоступно для вызова из планировщика (пока не обновлен экспорт до новой версии)

param: filePath Путь к экспортируемому документу

param: callback Обработчик завершения операции

ex.toXlsxAsync(filePath: string, callback: (err?: Error, generator?: Generator) => void): void;

ex.destroy()

Удаляет экземпляр документа, желательно вызывать, чтобы не занимать зря память.

ex.destroy(): void;

ex.toXml()

Экспортирует документ в файл XML (win1251)

param: filePath Путь к экспортируемому документу

ex.toXml(filePath: string): Generator;

ex.getXml()

Экспортирует документ в строку XML

ex.getXml(): string;

Пространоство имен Container

Входной параметр для исполняемой задачи элемента контейнера

interface InputParameter {
  name: string;
  value: null | number | boolean | string | Date;
}

Container.createRecord()

Создает экземпляр класса Record

recordName: string Имя основной записи

recordColumnsName: string[] Имена колонок для таблицы основных записей

Container.createRecord(recordName: string, recordColumnsName: string[]): Record;

Container.log()

Запись сообщения в журнал действий контейнера (QT_LOG)

messageData Контент для записи

Container.log(messageData: any): void;

Класс Container.Record

constructor()

recordName: string Имя основной записи в контейнере задач

recordColumnsName: Array<string> Имена колонок для таблицы элементов контейнера

new Container.Record(recordName: string, recordColumnsName: Array<string>);

ex.setExecutedTask()

Устанавливает задачу на исполнение для элементов основной записи контейнера

name: string Имя задачи (из дизайнера задач) для исполнения при выборе элемента

ex.setExecutedTask(name: string): void;

ex.setName()

name: string Имя задачи (из дизайнера задач) для исполнения при выборе элемента

ex.setName(name: string): void;

addItem()

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

columnsValue: Array<null | number | boolean | string | Date> Значение колонок таблицы добавляемого элемента

inputParameters:Array<InputParameter> | null Значение входных параметров для исполняемой задачи

ex.addItem(columnsValue: Array<null | number | boolean | string | Date>, inputParameters?: Array<InputParameter> | null): void;

save()

Производит сохранение сформированной записи в базу данных

return: boolean Результат сохранения (успешно или нет)

ex.save(): boolean;

Пространство имен Scheduler

Scheduler.evalTask()

Исполняет задание планировщика по его имени

name: string Имя задачи

Scheduler.evalTask(name: string): void;

Пространство имен Forms

Даёт доступ к различным частям ЛИС, в основном позволяет открыть какой-либо журнал или калькулятор.

Базовые типы, принятые в пространстве имен

enum CalculatorFormType {
  /**
   * Стандартный калькулятор
   */
  DEFAULT,
  /**
   * Табличный калькулятор
   */
  TABLE,
}
type Names =
  'ЛЖ' |
  'ОА' |
  'ЖРО1' |
  'ЖРО2' |
  'Химпосуда 2.0' |
  'Методы' |
  'Методики' |
  'КонтрольныеТочки' |
  'Лаборатории' |
  'УнивСправочник' |
  'ВЛК2Алгоритмы' |
  'ВЛК2Процедуры' |
  'ХимВ-ва2' |
  'КаталогРеактивов2' |
  'РеактивыФирм2' |
  'ЖУХР2' |
  'Растворы2' |
  'ЖурналПриготовленияРастворов2' |
  'КГ' |
  'ГХ' |
  'СМК2_Документ';

Forms.openContainer()

Открывает контейнер задач ЛИС

Forms.openContainer(): void;

Forms.openForm()

Открывает указанную форму ЛЖ на конкретной записи

formName: string Имя формы для открытия

recordId: number Идентификатор записи (0 для открытия последней записи)

Forms.openForm(formName: Names, recordId: number | 0): void;

Forms.openSmkJournal()

Открывает указанный журнал СМК на указанной записи

usId: number Идентификатор универсального справочника для журнала СМК

recordId: number Идентификатор записи в данном журнале СМК

    function openSmkJournal(usId: number, recordId: number): void;

Forms.openLj()

Открывает указанный ЛЖ на последней записи

journalName: string Имя лабораторного журнала

Forms.openLj(journalName: string): void;

Forms.openLjRecord()

Открывает ЛЖ на основе записи из Journal_table_r

recordId: number Идентификатор записи ЛЖ

Forms.openLjRecord(recordId: number): void;

Forms.openCalculator()

Открывает калькулятор параллельного определения результата ЛЖ

parallelResultId: number Идентификатор параллельного определения

return: number Результат вычислений калькулятора

Forms.openCalculator(parallelResultId: number, calculatorFormType: CalculatorFormType): number;

Forms.openIndicatorsDistributionDialog()

Открывает диалог распределение показателей для записи в ЛЖ

journalRecordId: number Идентификатор записи ЛЖ

return: {isDialogCanceled: boolean, indicators: Indicator[]} Возвращает статус закрытия диалога (был ли отменен) и список показателей

Forms.openIndicatorsDistributionDialog(journalRecordId: number): { 
      isDialogCanceled: boolean;
      indicators: Indicator[];
    }

Forms.showPopup()

Выводит всплывающее уведомление в нижней правой части экрана

content: any Данные для вывода в всплывающем сообщении

options: PopupOptions Параметры всплывающего сообщения

interface PopupOptions {
  showingTimeMs: number;
}
Forms.showPopup(content: any, options?: PopupOptions): void;

Пространство имен ProbeDivider

Предоставляет функционал для работы с Делителем проб.

ProbeDivider.run()

Вызывает заданный делитель проб ЛИС для указанной записи в журнале

sourceRecordId: number Идентификатор записи в журнале (таблица Journal_table)

dividerName: string Имя делителя

return: number Идентификатор созданной записи

ProbeDivider.run(sourceRecordId: number, dividerName: string): number;

ProbeDivider.countDone()

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

sourceRecordId: number Идентификатор записи в журнале (таблица Journal_table)

dividerName: string Имя делителя

return: number Количество готовых записей

ProbeDivider.countDone(sourceRecordId: number, dividerName: string): number;

Пространство имен Calculator

Простой и быстрый доступ к калькулятору результата (создает новый)

Calculator.init()

Инициализация калькулятора

journalResultId: number Идентификатор результата в ЛЖ

Calculator.init(journalResultId: number): void;

Calculator.set()

Установка переменной калькулятора

variableName: string Имя переменной калькулятора

value: number | string | Date | TypedValue Устанавливаемое значение

Calculator.set(variableName: string, value: number | string | Date | TypedValue): void;

Calculator.flush()

Утверждение изменений

throws {CalculationError}

Calculator.flush(): void

Calculator.partialFlush()

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

Calculator.flush(parallelId: number, useCustomParallelValue: boolean, customParallelValue: number): void

jrParallelId - [jrparallel].[num_rec]. Если такого значения нет у результата анализа - добавляется новое параллельное.
useCustomParallelValue - признак использования пользовательского значения параллельного измерения
customParallelValue - пользовательское значение параллельного измерения

Независимо от значения useCustomParallelValue будет выполнен расчет выражения формулы - для заполнения значениями левых переменных. Если useCustomParallelValue, то ошибки при расчете формулы игнорируются.

Пространство имен Round

Округляет числа в соответствии с методикой

Round.byMethodicAsNumber()

Производит округление по методике (возвращает число)

value: number Округляемое значение

methodicId: number Идентификатор методики

return: number | null; Возвращает округленный результат

Round.byMethodicAsNumber(value: number, methodicId: number): number | null;

Round.byMethodicAsString()

Производит округление по методике

value: number Округляемое значение

methodicId: number Идентификатор методики

return: string | null; Возвращает округленный результат

Round.byMethodicAsString(value: number, methodicId: number): string | null;

Класс Lj

Методы экземпляра (ex)

constructor()

journal: string | number Имя формы журнала или идентификатор журнала (не формы!)

constructor(journal: string | number);

ex.id READONLY

Идентификатор журнала

ex.id: number;

ex.recordsByCipher()

Идентификаторы записей с указанным шифром

cipher: string Шифр пробы

return: number[] Идентификаторы записей с указанным шифром

ex.recordsByCipher(cipher: string): number[];

ex.addRecord()

Создает новую запись в журнале и возвращает её идентификатор

controlPointId Идентификатор контрольной точки

isProtected В данный момент неизвестно, уточнить

indicators Информация о принудительно выставляемых показателях

date Дата и время отбора пробы

isSpecial В данный момент неизвестно, уточнить

return: number Идентификатор записи журнала

ex.addRecord(controlPointId: number, isProtected?: boolean, indicators?: Indicator[], date?: Date, isSpecial?: boolean): RecordManager;

Статические методы (методы класса)

Lj.getIdByName()

Возвращаем идентификатор журнала (для базовой лаборатории пользователя) по его имени

name: string Имя журнала

return: number Идентификатор журнала

Lj.getIdByName(name: string): number;

Класс RecordManager

Методы экземпляра (ex)

recordId: number Идентификационный записи в журнале (таблица journal_table)

ex.constructor(recordId: number);

ex.id READONLY

Идентификатор текущей записи

ex.id: number;

ex.cipher

Установка и получение шифра пробы

ex.cipher: string;

ex.takingDate

Установка и получение даты отбора пробы

ex.takingDate: Date;

ex.takingTime

Установка и получение времени отбора пробы

ex.takingTime: Date;

ex.setProperty()

Устанавливает значение в указанное поле информации о пробе

propertyName: string Имя поля

value: null | undefined | number | boolean | string | Date Значение

ex.setProperty(propertyName: string, value: null | undefined | number | boolean | string | Date): void;

ex.getProperty()

Возвращает значение указанного поля из информации о пробе

propertyName: string Имя поля

return: null | undefined | number | boolean | string | Date Значение

ex.getProperty(propertyName: string): null | undefined | number | boolean | string | Date;

ex.getMeasureManager()

Возвращает объект для работы с показателем с заданным именем в установленной записи ЛЖ

indicatorName: string Имя показателя

return: MeasureManager Объект для работы с показателем

ex.getMeasureManager(indicatorName: string): MeasureManager;

ex.setRawField()

Изменяет поле информации о пробе (напрямую в таблице journal_table)

name: string Имя поля для модификации из таблицы journal_table

value: null | undefined | number | boolean | string | Date Устанавливаемое значение

ex.setRawField(name: string, value: null | undefined | number | boolean | string | Date): void

ex.setControlPoint()

Смена контрольной точки

controlPointId: number Идентификатор контрольной точки

indicators: Indicator[] Информация о принудительно выставляемых показателях

ex.setControlPoint(controlPointId: number, indicators?: Indicator[]): void;

ex.remove()

Удаляет текущую запись

ex.remove(): void;

Класс MeasureManager

constructor()

measureId: number Идентификатор результата

constructor(measureId: number);

ex.takingDateBegin

Дата начала анализа

ex.takingDateBegin: Date;

ex.takingDateEnd

Дата окончания анализа

ex.takingDateEnd: Date;

`ex.takingTimeBegin

Время начала анализа

ex.takingTimeBegin: Date;

ex.takingTimeEnd

Время окончания анализа

ex.takingTimeEnd: Date;

ex.id READONLY

Содержит идентификатор результата

ex.id: number;

ex.executor

Имя исполнителя анализа

ex.executor: string;

ex.methodicName READONLY

Содержит идентификатор результата

ex.methodicName: string;

ex.calculateAverage()

Пересчитать средний результат в ЛЖ

parametersRecount: ParametersRecount Параметры для расчета среднего результата в ЛЖ

interface ParametersRecount {
  calculateMedian: boolean;
  checkAcceptability: boolean;
}
ex.calculateAverage(parametersRecount?: ParametersRecount): void;

ex.setParallel()

Установка параллельного измерения

value: number Значение

throws {CalculationError}

ex.setParallel(value: number): void;

ex.setParallels()

Установка нескольких параллельных измерений

values: number[] Массив значений

rewrite: boolean Необходимость удалить старые измерения

throws {CalculationError}

ex.setParallels(values: number[], rewrite?: boolean): void;

ex.setParallelAsync()

Асинхронная установка Установка параллельного измерения

value: number Значение результата

callback Обработчик завершения операции

ex.setParallelAsync(value: number, callback: (err?: CalculationError | Error) => void): void;

ex.updateParallel()

Замена существующего значения параллельного измерения

parallelNum - [jrparallel].[n]

value - значение параллельного измерения

ex.updateParallel(parallelNum: number, value: number): void;

Обновляет journal_result.jtxt и journal_result.cdesc После установки выполняется попытка(!) расчета среднего. Ошибки расчета среднего игнорируются и не возвращаются!

ex.setAverage()

Установка определенных полей записи результата анализа (journal_result) с логированием

interface AverageParam {
  name: 'string';           // имя поля journal_result
  value: string | number;  // значение (если null - то значение поля в БД тоже сбрасывается в null)
}
ex.setAverage(params: AverageParam): void;

Доступны поля:

  • «Норматив сходимости» - Journal_result.Dabs
  • «Норматив сходимости (относительное значение)» - Journal_result.Drel
  • «Фактическая сходимость» - Journal_result.Razmah
  • «Результаты анализа»
  • «Среднее значение показателя (безусловно)» - Journal_result.CasIs -> в параллельное, если их нет
  • «Значение показателя (среднее)» - Journal_result.C
  • «Значение показателя (среднее, округлённое)» - Journal_result.StrC
  • «Среднее значение показателя или мин.» - Journal_result.xom - CFT_REAL
  • «Среднее значение показателя или 0, если \<мин.» - Journal_result.Cnu - CFT_REAL
  • «Погрешность»
  • «Погрешность» - Journal_result.dc
  • «Погрешность (округлённая)» - Journal_result.StrD

Если указано значение поля из группы «Результаты анализа» - проверяется наличие параллельных измерений.
Если параллельных нет: если передается значение CasIs - то оно добавляется в параллельные, иначе ошибка.
Если передается значение CasIs то дополнительно рассчитывается норма.

ex.getAverageResult()

Получение среднего результата измерения

ex.getAverageResult(): void;

ex.getCalculator()

Инициализация калькулятора

return: MeasureCalculator

ex.getCalculator(): MeasureCalculator;

ex.setAnalysisState()

Меняет состояние анализа (таблица journal_result, поле state)

analysisState: AnalysisState Состояние анализа

ex.setAnalysisState(analysisState: AnalysisState): void

ex.setRawField()

Изменяет поля результата анализа (напрямую в таблице journal_result)

name: string Имя поля для модификации из таблицы Journal_result

value: null | undefined | number | boolean | string | Date Устанавливаемое значение

ex.setRawField(name: string, value: null | undefined | number | boolean | string | Date): void
value: 0 | 1 | 2 Состояние измерения
0 - выполняется
1 - готово
2 - невозможно
ex.setRawField(name: 'state', value: 0 | 1 | 2): void

ex.linkEquipmentToResult()

Привязывает оборудование ко вкладке "Ресурсы" для выбранного показателя

equipment: number[] Массив с id оборудования

1. ex.linkEquipmentToResult(equipment: number[]): void

ex.unlinkEquipmentFromResultAll()

Отвязывает оборудование ко вкладке "Ресурсы" для выбранного показателя

  • ```ts ex.unlinkEquipmentFromResultAll(): void
    ## Класс `ParallelMeasurementManager`
    
    ### `constructor()`
    
    `parallelId: number` Идентификатор параллельного измерения
    
    ```ts
    constructor(parallelId: number);
    

ex.id READONLY

Идентификатор параллельного измерения

ex.id: number;

Рассчитать результат с уже имеющимися показателями.

calculatorVariables: CalculatorVariable[] перезаписать значения выбранных полей

calculatorFormType: Forms.CalculatorFormType тип калькулятора

ex.calculateParallel(calculatorVariables: CalculatorVariable[], calculatorFormType: Forms.CalculatorFormType): void;