Top.Mail.Ru
Шаблоны печати — ADMINMED.ru

Шаблоны печати

Общие принципы

»’Шаблон»’ — это текст, состоящий из двух «компонент» — обычного html-я, и специальных вставок в {}. Кодировка текста может быть utf-8 или cp1251; если во вставках нужны строки, то независимо от кодировки нужно использовать префикс unicode — типа u’привет’. Вставки «равнодушны» к синтаксису окружающего html. В процессе обработки шаблона html превращается в операторы печати, вставки — в соотв. фрагменты программы на python. В случае успеха компиляции полученная программа выполняется — а результат выводится в окно просмотра.
Вставки имеют следующий синтаксис:
*'{‘<ключевое слово>’:'<выражение>’}’
*'{‘<выражение>[‘:'[формат]]’}’
<ключевое слово> ::= ‘if’ | ‘elif’ | ‘else’ | ‘for’ | ‘end’ | ‘ ‘ ;
Поскольку в python используются отступы, а в шаблоне печати отступы не так удобны как в программе, мы добавили ключевое слово end, ключевые слова if, elif и else, for увеличивает отступ, а end уменьшает. Пустое ключевое слово { : setPageSize(‘A4’) } приводит к генерации соотв. выражения как оператора. Вторая форма (без ключевого слова) приводит к генерации оператора печати значения выражения. Образцы применения будут дальше по тексту. <выражение> — выражение на python, его необходимость и смысл определяется ключевым словом. <формат> := ‘h’|’n’| ‘ ‘; — применяется для «пост-обработки» полученного в процессе вычисления выражения значения. Если двоеточие пропущено, то формат считается пустым. • ‘h’: считается, что выражение содержит фрагмент не требующий обработки • ‘ ‘: производится замена символов типа ‘<‘ на ‘<‘ • ‘n’: в дополнение к предыдущему добавляется замена \n на
так
—-
{‘[1]\n[2]\n[3]\n[<]\n[»’bold»’]’:h}
—-
{‘[1]\n[2]\n[3]\n[<]\n[»’bold»’]’}
—-
{‘[1]\n[2]\n[3]\n[<]\n[»’bold»’]’:n}
{{begDate} — значение параметра «Дата начала» (или «На дату» для вкладки Состоят), CDateInfo
{endDate} — значение параметра «Дата окончания», CDateInfo
{orgStructureId} — значение параметра «Подразделение врача», COrgStructureInfo
{specialityType} — значение параметра «Специальность», определение типа отбора, 0 — «Отбор по ИЛИ», 1 — «Отбор по И»
{for: spec in specialityId}{spec.code} {spec.name} {end:} — значение параметра «Специальность», CSpecialityInfo
{personId} — значение параметра «Врач», CPersonInfo
{MKBFilter} — значение параметра «Коды диагнозов по МКБ», определение типа фильтра, 0 — «Игнор.», 1 — «Интервал»,
{MKBFrom} — значение параметра «Коды диагнозов по МКБ», определение первого значения диапазона, CMKBInfo
{MKBTo} — значение параметра «Коды диагнозов по МКБ», определение последнего значения диапазона, CMKBInfo}}
превратится в
________________________________________
• [1] [2] [3] [<] [bold]
________________________________________
• [1] [2] [3] [<] [»’bold»’]
________________________________________
• [1]
• [2]
• [3]
• [<]
• [bold]
________________________________________
»’Параметры печати»’
• Формат бумаги А3/А4/А5/A6 {: setPageSize(‘A4’)} или размеры в мм: A3 — 297×420, A4 — 210×297, A5 — 148×210, A6 — 105×148 {: setPageSize(‘210×297’) }
• Ориентация Книжный-P/Альбомный-L {: setOrientation(‘L’)}
• Поля:
1. все {:setMargins(5)}
2. правое {:setLeftMargin(150)}
3. верхнее {:setTopMargin(5)}
4. нижнее {:setBottomMargin(5)}
5. левое {:setRightMargin(5)}
• Наименование подписываемого файла:
{:documentName = (action.endDate.toString(‘dd.MM.yyyy’) +u’ ‘+ action.title)
setDocumentName(documentName)}
Подписанный и прикрепленный документ будет иметь имя вида — «01.01.2022 Осмотр врача.pdf».

________________________________________
»’Поиск по тексту шаблона»’
Реализована возможность поиска текста в выведенном шаблоне печати.
ПКМ — Найти (или Ctrl+F) — в верхней части окна шаблона появится окно для ввода запроса.
Переход между найденными результатами осуществляется с помощью кнопок «Следующее» и «Предыдущее».
Если больше совпадений нет — появится надпись «Поиск не дал результатов».
Данным нововведением особенно удобно пользоваться в шаблонах Логи ИЭМК, Логи УО и других подобных.

Оперативный ввод переменных (Диалоги)

dialogs (CDialogsInfo) — мастер диалогов. Содержит список диалогов, по которому можно перемещаться вперёд и назад и вводить простейшие данные. Каждый диалог имеет тип CSimplePrintDialog и содержит метод getVar(), позволяющий извлекать эти данные. Кнопка «OK» — переход к следующему диалогу. Кнопка «Отмена» — также переход к следующему диалогу, при этом считается, что в диалог введено значение по умолчанию default. Но, если при создании диалога значение default не указано, getVar() возвращает None.

Мастер диалогов содержит методы:
*dialXXX(title, …) — создать, добавить в конец списка и запустить диалог ввода простейших данных.
*createDialXXX(title, …) — создать и добавить в конец списка диалог ввода простейших данных.
*activate(dialog) — запустить диалог

Методы, запускающие диалоги ввода простейших данных:
• dialInt(title, min, max, step=1, default=min) — диалог ввода целого числа с заголовком title. Число — от min до max, меняется с шагом step, начальное значение default
• dialFloat(self, title, min, max, step, decimals, default=min) — диалог ввода вещественного числа с заголовком title. Число — от min до max, меняется с шагом step, начальное значение default, отображается decimals знаков после запятой
• dialBool(self, title, name, default=False) — диалог ввода логического значения (CheckBox) с заголовком title. name — текст, который будет написан рядом с CheckBox. default — начальное состояние CheckBox (True — нажата, False — нет)
• dialDate(self, title, default=currentDate) — диалог ввода даты с заголовком title.
• dialTime(self, title, default=’00:00′) — диалог ввода времени с заголовком title.
• dialString(self, title, default=»») — диалог ввода строки с заголовком title.
• dialList(self, title, lst=[], default=0) — диалог выбора строки из списка lst с заголовком title. default — начальный номер текущего элемента. Для диалога getVar() возвращает номер выбранной строки в списке, getListValue() — саму выбранную строку.
• dialMultiList(self, title, lst=[] [, select]) — диалог выбора нескольких строк из списка lst с заголовком title. Пераметр select задает выбор элементов списка: 0-не выбраны, 1-выбран первый элемент (по умолчанию), 2- выбраны все элементы. Для диалога getVar() возвращает массив номеров выбранных строк в списке, getListValues() — сами выбранные строки.
»Пример 1:»
{dialogs.dialString(u»Введите имя врача», «»).getVar()} — отображает строку, введённую в диалоге
»Пример 2:»
{: dial1 = dialogs.dialString(u»Введите строку», «default string» ) }
{: str = dial1.getVar()}
{: dial2 = dialogs.dialList(u»Выберите элемент», [«first», «second», str], 1) }
{:dial2m = dialogs.dialMultiList(u»Выберите элементы», [«first», «second», str], 1) }
{: dial3 = dialogs.dialInt(u»Введите целое число», 66, 78, 3, 70) }
{: dial4 = dialogs.dialFloat(u»Введите вещественное число», -2, -1.5, 0.11, 2)}
{: dialb = dialogs.dialBool(u»Введите логическое значение», u»Я хочу продолжить», True)}
{: yes = dialb.getVar() }
{if: yes}
{: dial5 = dialogs.dialDate(u»Введите дату» ) }
{: dial6 = dialogs.dialTime(u»Введите время», ’00:00′ ) }
{: dat = dial5.getVar() }
{: tim = dial6.getVar() }
{end:}
{: str = dial1.getVar() }
{: value = dial2.getListValue()}
{: values = dial2m.getListValues()}
{: integ = dial3.getVar() }
{: flo = dial4.getVar() }

  • Выводится диалог ввода строки. Затем диалог выбора элемента из списка, в котором данная строка — третья по счёту. Затем диалог выбора нескольких элементов из такого же списка. При возвращении назад и вводе новой строки диалоги выбора из списка не изменятся — они уже созданы и запущены! Затем диалог ввода целого числа от 66 до 78 с начальным элементов 70 и шагом 3. Затем — диалог выбора вещественного числа от -2 до -1.5 с начальным элементом -2 и шагом 0.11. Затем диалог с CheckBox, рядом с которым написано «Я хочу продолжить». Если пользователь не снял CheckBox, отображается диалог ввода даты и времени. Между всеми этими диалогами можно двигаться вперёд-назад. Выбранные значения сохраняются, соответственно, в переменных str, value, values, integ, flo, yes, dat, tim.

Вывод диалогового окна подтверждения

В шаблоне печати есть возможность вывести диалоговое окно с подтверждением действия. В случае нажатия «Да» произойдет дальнейшее формирование шаблона печати. В случае нажатия «Нет» шаблон печати сформирован не будет.
Пример:
{if: currentPerson.post.identify(‘urn:oid:1.2.643.5.1.13.13.11.1002’) not in ( ‘4’, ‘5’, ‘427’, ‘428’, ‘6’, ‘7’, ‘429’, ‘430’, ‘431’, ‘432’, ‘433’, ‘434’, ‘435’, ‘436’, ‘437’, ‘438’, ‘8’)}
{:from PyQt4.QtGui import QMessageBox as mb }
{if: mb.critical(None, u’Проверка должности’, u’ВНИМАНИЕ!\nДолжность текущего пользователя\nне соответствует требованиям ЕГИСЗ!\nВсе равно продолжить?’,
mb.Yes|mb.No, mb.No) != mb.Yes }
{ exit(0) }
{end:}

  • {end:}

Определение числа дней в периоде дат

Для объекта типа CDateInfo (в том числе, currentDate), есть свойство date типа QDate. У QDate, в свою очередь, есть метод daysTo и workDaysTo.
»Примеры:»
{:from PyQt4.QtCore import QDate}
{:from library.PrintInfo import CDateInfo}
{:begDate = CDateInfo(QDate(2022, 1, 1))}
{:endDate = CDateInfo(QDate(2022, 2, 1))}
{begDate.daysTo(endDate)}
{begDate.workDaysTo(endDate)}
action.begDate.date.daysTo(action.endDate.date) — дней от начала действия до конца

  • event.execDate.date.daysTo(currentDate.date) — прошло со времени события

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

»Пример 1:»
{:seconds = action.begDate.time.secsTo(action.endDate.time)}
{:minutes, seconds = divmod(seconds, 60)}
{:hours, minutes = divmod(minutes, 60)}
{hours}:{minutes}:{seconds}
»Пример 2:»
{:x = action.begDate.time}
{:y = action.endDate.time}

  • {(x.addSecs(x.secsTo(y) — (x.second() + x.minute()*60 + x.hour()*60*60))).toString(‘HH:mm:ss’)}

Определение возраста на определенную дату

При необходимости определить возраст пациента на конкретную дату можно использовать функцию ageOnDate:
{client.ageOnDate(event.setDate)}
Если необходимо определить, например, не точный возраст, а возрастную категорию, то можно использовать следующий пример:
{:from library.Utils import calcAgeTuple}

  • {:isChildren = calcAgeTuple(client.birthDate.date, event.setDate.date)[-1] < 18} {int(isChildren)} В примере выше если на дату начала случая обслуживания пациенту меньше 18 лет, то isChildren будет равна 1, иначе 0. Пример определения возраста пациента в годах на конец года: {:QDate = type(event.client.birthDate.date)} {:endY = int(((event.client.ageOnDate(QDate(event.execDate.year, 12, 31))).split(‘ ‘))[0])}

Полезные функции Python

*Функция позволяет узнать, есть ли какой-либо атрибут у объекта:
hasattr(объект, ‘имя_аттрибута’)
»Пример использования:» {if: hasattr(diagnosis, u’MKBEx’)}
*dir(объект) — список всех полей(переменных) объекта
»Пример использования:» {dir(arr[0])}
*Функция amountToWords преобразует число в сумму прописью
»Пример использования:» {amountToWords(account.sum)}
*{:exit()} — функция прерывает выполнение шаблона печати (без показа диалогового окна).
»Пример использования:»
{:from PyQt4.QtGui import QMessageBox}
{:buttons = QMessageBox.Yes | QMessageBox.No}
{:reply = QMessageBox.question(None, », u’Показать окно шаблона?’, buttons)}
{if: reply == QMessageBox.Yes}
<h2>Текст шаблона</h2>
{else:}
{:exit()}
{end:}
*{break:}
Прерывает выполнение текущего цикла.
*{continue:}
В цикле переходит к следующей записи.
»Ключевые слова break и continue должны быть указаны внутри цикла.»
*Следующая конструкция позволяет вызывать в печать один шаблон из тела другого шаблона:
»Пример использования:»
{:from library.PrintTemplates import applyTemplate}
{:applyTemplate(None, 72, globals())}
В печать будет вызван шаблон с id=72 (rbPrintTemplate)
*Конструкция, которая выводит данные из свойства с переносами строк и пробелами:
»Пример использования:»
{action[…].value.replace(‘\n’, ‘

  • ‘).replace(‘ ‘, ‘ ‘) :h}

Другие полезные ключевые слова

В связке с атрибутом href элемента `a` HTML в шаблонах печати могут быть использованы следующие ключевые слова:
*karta_
Позволяет выполнить открытие регистрационной карты пациента, которому соответствует указанный идентификатор, пример:
`a href=»karta_21″` Открыть карту пациента — `/a`
При нажатии на ссылку в шаблоне выполнится открытие регистрационной карты пациента с идентификатором 21, если пациента с таким идентификатором нет в БД, то ничего не произойдет.
*event_
Позволяет выполнить открытие случая обслуживания пациента, которому соответствует указанный идентификатор, пример:
`a href=»event_198198″` Открыть случай обслуживания `/a`
При нажатии на ссылку в шаблоне выполнится открытие случая обслуживания пациента с идентификатором 198198, если случая обслуживания с таким идентификатором нет в БД, то ничего не произойдет.
Также результат выполнения шаблона печати с сгенерированными ссылками на регистрационную карту пациента и/или случай обслуживания может быть скопирован и вставлен «как есть» в новое сообщение информатора и в таком случае пользователю будет доступны аналогичные функции из окна сообщения информатора
*medKarta_
Позволяет выполнить переход в мед.карту пациента, которому соответствует указанный идентификатор, пример:
`a href=»medKarta_21″` Открыть мед.карту пациента `/a`
При нажатии на ссылку в шаблоне выполнится поиск пациента и переход на вкладку «Мед.карта» в интерфейсе «Обслуживание пациентов», если пациента с таким идентификатором нет в БД, то ничего не произойдет.
*browser
Позволяет вызвать браузер и выполнить переход по указанной ссылке, пример:
`a href=»browser://ya.ru»` Перейти по ссылке `/a`
*openTemplate_
Позволяет выполнить другой шаблон печати, которому соответствует указанный идентификатор, пример:
`a href=’openTemplate_809’`Выполнить шаблон `/a`
Дополнительно из основного шаблона можно передавать один или несколько параметров в вызываемый шаблон.
Пример 1:
{if: not params}
{:params = {«number»: 1}}
{end:}
`a href=’openTemplate_809_{params}’` Выполнить шаблон `/a`
Пример 2:
{:example = [1,2]}
`table border=1 cellpadding = 3`
{for: el in example}
`tr`
`td`{el}`/td`
`td`док_1`/td`
`td`{:params = {«number»: el}} `a href=’openTemplate_809_{params}’` Выполнить шаблон `/a` `/td`
`/tr`
{end:}
`/table`
В данном примере сформируется две ссылки для вызова шаблона печати и для каждой из них будет передано свое значение в params — для первой 1, для второй 2.
*loadTemplate()
Позволяет загрузить шаблон печати и выполнить его код в рамках текущего шаблона печати.
В качестве аргумента необходимо указывать идентификатор вызываемого шаблона печати (rbPrintTemplate.id).
Ниже приведен пример, где в вызываемом шаблоне печати заложена проверка наличия СНИЛС у пациента, а в качестве результата выполнения основного шаблона печати ожидается либо вывод номера СНИЛС, либо выполнение шаблона печати будет прервано.
Основной шаблон печати:

{:a = loadTemplate(815)}

{if: a == u» }
{exit(0)}
{end:}

{a}
Вызываемый шаблон печати:

{if: not client.SNILS}
{: from PyQt4.QtGui import QMessageBox as mb}
{mb.critical(None, u’Проверка заполнения данных’, u’
ВНИМАНИЕ! Обнаружены ошибки:
‘ + u’
— не указан СНИЛС у пациента’, mb.Ok, mb.Ok)}
{exit(0)}
{else:}
{client.SNILS}
{end:}

  • Поддержана передача переменных из основного шаблона печати в вызываемый.

Визуализация отметки об электронной подписи документа(ЭЦП)

Для визуализации отметки об электронной подписи в документе используется:
{userCertPlate():h}.
Рекомендуется использовать в связке с условием проверки соответствия СНИЛС исполнителя действия и текущего пользователя:
{if:userCertPlate() == u’ ‘}
{action.person.post}:____________________/{action.person.shortName}
{elif: action.person.SNILS == currentPerson.SNILS}
{userCertPlate():h}
{else:}
{action.person.post}:____________________/{action.person.shortName}
{end:}
Такая конструкция позволяет решить ситуацию, когда у пользователя на рабочем месте настроен сертификат электронной подписи, но ему требуется распечатать осмотр другого пользователя.
Также существует возможность обратиться к СНИЛС непосредственно в сертификате электронной подписи:
{:from PyQt4 import QtGui}
{:from library.MSCAPI import MSCApi}
{:snils = QtGui.qApp.getUserCert(MSCApi(QtGui.qApp.getCsp())).snils()}
При необходимости изменить размер отметки об электронной подписи можно воспользоваться одним из следующих вариантов:
1) Изменить ширину и длину изображения электронной цифровой подписи:
{:s = userCertPlate()}{s[:5] + ‘width=»384″ height=»114″ ‘ + s[5:] :h}.
2) Изменить семейство шрифта, его размер и масштаб изображения электронной цифровой подписи:

  • {userCertPlate(fontFamily=’Times New Roman’, fontSize=12, scale=1.0) :h}.

Проверка валидности СНИЛС

Проверка валидности СНИЛС
В шаблонах печати можно использовать соответствующие функции для проверки валидности указанного СНИЛС. Пример использования:
{:from library.Utils import checkSNILS, fixSNILS, formatSNILS}
{if: not checkSNILS(client.SNILS)}
СНИЛС указан с ошибкой
Правильный СНИЛС: {formatSNILS(fixSNILS(client.SNILS))}
{end:}

  • При этом вместо client.snils, например, можно указать непосредственно номер СНИЛС в кавычках — ‘ХХХ-ХХХ-ХХХ ХХ’.

Встраивание штрих-кодов

В шаблонах печати можно использовать как одномерные — [[Code 39]] и [[Code 128]], так и двумерные штрих-коды — [[Data Matrix]], [[PDF417]] и [[QR-код]]. Одномерные у нас реализованы с привлечением подходящих шрифтов, двумерные создаются как растровые изображения.

Кодирование в base64

Cтроки имеют метод .encode(<кодировка>)
Обычные 8-битные строки можно кодировать с указанием ‘base64’ в качестве кодировки.
Пример:
>>> ‘Hello world!’.encode(‘base64’)
‘SGVsbG8gd29ybGQh\n’

Для строк содержащих помимо латиницы еще и кириллицу в САМСОН обычно используются юникодные строки и для таких строк кодирование в base64 не определено. Поэтому сначала нужно перевести в подходящую случаю 8-битную кодировку, а потом уже — в base64.
>> u’Привет от Петрова и Бaширова!’.encode(‘utf-8’).encode(‘base64’)
‘0J/RgNC40LLQtdGCINC+0YIg0J/QtdGC0YDQvtCy0LAg0Lgg0JFh0YjQuNGA0L7QstCwIQ==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16’).encode(‘base64’)
‘//4fBEAEOAQyBDUEQgQgAD4EQgQgAB8ENQRCBEAEPgQyBDAEIAA4BCAAEQRhAEgEOARABD4EMgQw\nBCEA\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16be’).encode(‘base64’)
‘BB8EQAQ4BDIENQRCACAEPgRCACAEHwQ1BEIEQAQ+BDIEMAAgBDgAIAQRAGEESAQ4BEAEPgQyBDAA\nIQ==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16le’).encode(‘base64’)
‘HwRABDgEMgQ1BEIEIAA+BEIEIAAfBDUEQgRABD4EMgQwBCAAOAQgABEEYQBIBDgEQAQ+BDIEMAQh\nAA==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘cp1251’).encode(‘base64’)
‘z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘cp866’).encode(‘base64’)
‘j+CooqXiIK7iII+l4uCuoqAgqCCBYeio4K6ioCE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘koi8-r’).encode(‘base64’)
‘8NLJ18XUIM/UIPDF1NLP18EgySDiYdvJ0s/XwSE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘iso8859-5’).encode(‘base64’)
‘v+DY0tXiIN7iIL/V4uDe0tAg2CCxYejY4N7S0CE=\n’
Обращаем внимание на переводы строк, encode(‘base64’) по непонятной причине не только перекодирует, но ещё добавляет переводы строк — в примере с ‘utf-16’ их два, они обозначены как \n. Можно использовать замену переноса строк на пустые строки:
>>> u’Привет от Петрова и Баширова!’.encode(‘cp1251’).encode(‘base64’).replace(‘\n’, »)
‘z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE=’

Кодирование в base64

Cтроки имеют метод .encode(<кодировка>)
Обычные 8-битные строки можно кодировать с указанием ‘base64’ в качестве кодировки.
Пример:
>>> ‘Hello world!’.encode(‘base64’)
‘SGVsbG8gd29ybGQh\n’

Для строк содержащих помимо латиницы еще и кириллицу в САМСОН обычно используются юникодные строки и для таких строк кодирование в base64 не определено. Поэтому сначала нужно перевести в подходящую случаю 8-битную кодировку, а потом уже — в base64.
>> u’Привет от Петрова и Бaширова!’.encode(‘utf-8’).encode(‘base64’)
‘0J/RgNC40LLQtdGCINC+0YIg0J/QtdGC0YDQvtCy0LAg0Lgg0JFh0YjQuNGA0L7QstCwIQ==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16’).encode(‘base64’)
‘//4fBEAEOAQyBDUEQgQgAD4EQgQgAB8ENQRCBEAEPgQyBDAEIAA4BCAAEQRhAEgEOARABD4EMgQw\nBCEA\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16be’).encode(‘base64’)
‘BB8EQAQ4BDIENQRCACAEPgRCACAEHwQ1BEIEQAQ+BDIEMAAgBDgAIAQRAGEESAQ4BEAEPgQyBDAA\nIQ==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘utf-16le’).encode(‘base64’)
‘HwRABDgEMgQ1BEIEIAA+BEIEIAAfBDUEQgRABD4EMgQwBCAAOAQgABEEYQBIBDgEQAQ+BDIEMAQh\nAA==\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘cp1251’).encode(‘base64’)
‘z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘cp866’).encode(‘base64’)
‘j+CooqXiIK7iII+l4uCuoqAgqCCBYeio4K6ioCE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘koi8-r’).encode(‘base64’)
‘8NLJ18XUIM/UIPDF1NLP18EgySDiYdvJ0s/XwSE=\n’
>>> u’Привет от Петрова и Бaширова!’.encode(‘iso8859-5’).encode(‘base64’)
‘v+DY0tXiIN7iIL/V4uDe0tAg2CCxYejY4N7S0CE=\n’
Обращаем внимание на переводы строк, encode(‘base64’) по непонятной причине не только перекодирует, но ещё добавляет переводы строк — в примере с ‘utf-16’ их два, они обозначены как \n. Можно использовать замену переноса строк на пустые строки:
>>> u’Привет от Петрова и Баширова!’.encode(‘cp1251’).encode(‘base64’).replace(‘\n’, »)
‘z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE=’

Подстановка данных в шаблон

Текущая дата: {currentDate}
Текущее время: {currentTime}
Текущий населенный пункт (Предпочтения): {defaultKLADR[:2]}
Текущая область (Предпочтения): {provinceKLADR[:2]}
Текущее подразделение: currentOrgStructure (COrgStructureInfo), имеет свойства:
• Сокращенное название:{name} (строка),
• {infisInternalCode} (строка),
• {infisDepTypeCode} (строка),
• Полное название:{fullName} (строка)
• Организация, к которой принадлежит подразделение:{organisation} (COrgInfo),
• Родительское подразделение:{parent} (COrgStructureInfo)
• Адрес:{address} (строка)
• Начальник подразделения: {chief} (типа CPersonInfo)
• Старшая мед.сестра подразделения: {headNurse} (типа CPersonInfo)
• Поле «Примечания»: {note}
Текущий пользователь: currentPerson (CPersonInfo)

Пациент: client (CClientInfo)

• код: {client.id}
• код ЛПУ + код пациента: {‘*’+currentOrganisation.miacCode+’.’+client.id+’*’}
• штрих код: *{client.id}*
• ФИО: {client.fullName} (строка)
• Фамилия И.О.: {client.shortName} (строка)
• Фамилия: {client.lastName} (строка)
• Имя:{client.firstName} (строка)
• Отчество: {client.patrName} (строка)
• Дата Рождения: {client.birthDate} (CDateInfo)
• Время Рождения: {client.birthTime}
• Дата смерти: {client.deathDate}
• Возраст: {client.age} (строка)
• Пол: {client.sex} (‘М’/’Ж’)
• СНИЛС: {client.SNILS} (строка)
• Документ: {client.document} (CClientDocumentInfo)
• Тип документа: {client.document.type}
• Серия документа: {client.document.serial}
• Номер документа: {client.document.number}
• Кем выдан: {client.document.origin}
• Код подразделения: {client.document.originCode}
• Дата выдачи документа: {client.document.date}
• Полис: {client.policy} (CClientPolicyInfo)
• Адрес регистрации: {client.regAddress} (CClientAddressInfo)
• Адрес проживания: {client.locAddress} (CClientAddressInfo)
• Занятость: {client.work} (CClientWorkInfo)
• Группа крови: {client.bloodType} (строка)
• Дата определения группы крови: {client.bloodDate}
• Примечания по группе крови: {client.bloodNotes}
• Аллергии: {client.allergies} (CClientAllergyInfoList)
• Лекарственные непереносимости: {client.intolerances} (CClientIntoleranceMedicamentInfoList)
• Факторы риска: {client.riskFactors}
• Телефоны: {client.phones} (строка) . Также в данном блоке содержится информация об эл.почте пациента
• Дата и время добавления в БД пациента(таблица Client): {client.createDatetime}
• Автор добавления в БД пациента(таблица Client):{client.createPerson}
• Дата и время изменения регистрационной карточки пациента:{client.modifyDatetime}
• Автор изменения регистрационной карточки пациента:{client.modifyPerson}
Пример печати телефона и эл.почты пациента:
{:contact1=[]}
{:contact2=[]}
{if: len(client.phones)}
{:phones = client.phones.split(‘, ‘)}
{for: phone in phones}
{:items = phone.replace(‘:’,’ ‘).split(‘ ‘)}
{if: items[1]==u’телефон’ and items[3]!=»»}»
{:contact1.append(items[3])}
{end:}
{if: items[1]==u’почта’ and items[3]!=»»}»
{:contact2.append(items[3])}
{end:}
{end:}
{end:}
Телефон: {if: contact1}{for: item in contact1}{item}, {end:}{else:}______________________{end:}
Электронная почта: {if: contact2}{for: item in contact2}{item} {end:}{else:}_________________________{end:}
• Телефоны(2): {client.contacts} (массив) . Выводится массив, у которого в каждом элементе по 3 параметра: тип контакта, контакт и примечание.
Пример:
{for: contact in client.contacts}
Тип контакта: {contact[0]}
Контакт: {contact[1]}
Примечание: {contact[2]}
{end:}
• Постоянное прикрепление: {client.permanentAttach} (CClientAttachInfo)
• Временное прикрепление: {client.temporaryAttach} (CClientAttachInfo)
Для новорождённых и маленьких пациентов
*Рост при рождении {client.birthWeight}
*Вес при рождении {client.birthHeight}

Вкладка картотека (контекст token)

Доступна печать информации из фильтров.
*Прикрепление «по заявлению» {isStatement}
clientsList — Отфильтрованный список пациентов
Пример вывода списка из «Картотеки»:
{for: c in clientsList}
{c}
{end:}
selectedClientsList — Печать произвольно выделенных пациентов в списке.
Пример вывода списка из «Картотеки»:
{for: selectedClient in selectedClientsList}
{selectedClient}
{end:}

Согласия пациента: (client.consents} (CClientConsentInfo)

Класс CClientConsentInfo (Данные о согласиях пациента):
*id — идентификатор согласия пациента
*code — код типа согласия
*name — наименование типа согласия
*value — значение согласие числом (0-отказ, 1-согласен)
*strValue — значение согласия строкой («Да», «Нет»)
*date — дата регистрации согласия
*endDate — дата окончания действия согласия
*representerClientId — идентификатор подписавшего согласия, если это не сам пациент
*representer — ФИО подписавшего согласия, если это не сам пациент
При этом код:
{for: consent in client.consents}
{consent}
{end:}
в шаблоне печати выдаст все согласия пациента в виде
»код_типа_согласия: значение_строкой»

Квоты пациента: (client.quotas} (CClientQuotaInfo)

»’Класс CClientQuotaInfo (Данные о квотах пациента):»’
*identifier — идентификатор
*ticket — номер талона
*type — тип квоты
*stage — этап
*directionDate — дата направления
*freeInput — направившее ЛПУ (свободный ввод)
*org — направившее ЛПУ
*amount — количество квот
*MKB — шифр МКБ
*status — статус квоты
*request — обращение (0 — первичное, 1 — повторное)
*statement — показания к выделению квоты
*registrationDate — дата регистрации квоты
*endDate — дата окончания действия квоты
*orgStructure — подразделение базового ЛПУ
*regionCode — код направившего региона
*discussion — согласование предоставления квоты

Класс «Прикрепление» CClientAttachInfo

Пример: {client.permanentAttach.org}
*code: код прикрепления (строка)
*name: наименование прикрепления (строка)
*outcome: выбытие (логическое)
*begDate: начало прикрепления
*endDate: окончание прикрепления
*org (COrgInfo): организация прикрепления
*document (CClientDocumentInfo): документ подтверждающий прикрепление
*orgStructure (COrgStructureInfo): подразделение прикрепления
Пример обращения ко всем прикреплениям в карточке пациента:
{for: attach in client.getAttaches(temporary=True)}
{attach}
{end:}
*temporary=True: обращается к временным прикреплениям

Полис: client.policy (CClientPolicyInfo)

*тип: {client.policy.type}
*вид: {client.policy.kind}
*страхователь: {client.policy.insurer}
*КЛАДР-код зоны обслуживания страховой компании {client.policy.insurer.areaRaw}
*серия: {client.policy.serial}
*номер: {client.policy.number}
*название: {client.policy.name}
*начальная дата: {client.policy.begDate}
*конечная дата: {client.policy.endDate}
*примечания: {client.policy.note}
Для явно указания типа страхования полиса вместо client.policy следует использовать:
*client.compulsoryPolicy — полис ОМС
*client.voluntaryPolicy — полис ДМС

Адрес регистрации: {client.regAddress} (CAddressInfo)

*Рег-КЛАДР: {client.regAddress.KLADRCode}
*Рег-КЛАДР улицы: {client.regAddress.KLADRStreetCode}
*Рег-GUID FIAS улицы: {client.regAddress.FIASStreetGUID}
*Рег-город: {client.regAddress.city}
*Рег-улица: {client.regAddress.street}
*Рег-дом: {client.regAddress.number}
*Рег-корпус: {client.regAddress.corpus}
*Рег-квартира: {client.regAddress.flat}
*Рег-текст: {client.regAddress.freeInput}
*Рег-район: {client.regAddress.district}
*Рег-ОКАТО: {client.regAddress.ОКАТО}
*Рег-Индекс: {client.regAddress.index}

Адрес проживания: {client.locAddress}

*Прож-КЛАДР: {client.locAddress.KLADRCode}
*Прож-КЛАДР улицы:{client.locAddress.KLADRStreetCode}
*Прож-GUID FIAS улицы: {client.locAddress.FIASStreetGUID}
*Прож-город: {client.locAddress.city}
*Прож-улица: {client.locAddress.street}
*Прож-дом: {client.locAddress.number}
*Прож-корпус: {client.locAddress.corpus}
*Прож-квартира: {client.locAddress.flat}
*Прож-текст: {client.locAddress.freeInput}
*Прож-район: { client.locAddress.district}
*Прож-ОКАТО: { client.locAddress.ОКАТО}
*Прож-Индекс: {client.locAddress.index}

Адрес места рождения: {client.birthPlace}

*МРож-КЛАДР: {client.birthPlace.KLADRCode}
*МРож-КЛАДР улицы:{client.birthPlace.KLADRStreetCode}
*МРож-GUID FIAS улицы: {client.birthPlace.FIASStreetGUID}
*МРож-город: {client.birthPlace.city}
*МРож-улица: {client.birthPlace.street}
*МРож-дом: {client.birthPlace.number}
*МРож-корпус: {client.birthPlace.corpus}
*МРож-квартира: {client.birthPlace.flat}
*МРож-текст: {client.birthPlace.freeInput}
*МРож-район: {client.birthPlace.district}
*МРож-Индекс: {client.birthPlace.index}

Определение местности

Для определения местности в шаблоне печати можно применить следующее: 6. Местность: {:incity = (str(client.regAddress.KLADRCode)[8:11] == ‘000’)} {if: incity} городская {else:} сельская{end:}
Принадлежность адреса к региону РФ: {client.regAddress.mainRegion}, {client.locAddress.mainRegion}

«Разделение» адреса на город, улицу, дом, квартиру

{client.regAddress.town + u», » + client.regAddress.street + u», д.» + client.regAddress.number + u», корп.» + client.regAddress.corpus + u», кв. » + client.regAddress.flat }

Занятость: {client.work}

*занятость-орг.: {client.work.shortName}
*занятость-должность по справочнику: {client.work.postId}. Код должности: {client.work.postId.code}. Название должности: {client.work.postId.name}
*занятость-должность: {client.work.post}
*занятость-ОКВЕД: {client.work.OKVED}

Идентификация: {client.identification} ( CClientIdentificationInfo )

*client.identification.byUrn[‘1’] — вернёт идентификатор по коду из rbAccountingSystem
или пустую строку
*str(client.identification) — вернёт строку с разными идентификаторами (типа Единый полис (1): 7801983056802872, Идентификатор ЕИС РПФ (2): 18951363 )
*{for: code, ident in client.identification.iteritems()} … {:end} — цикл по парам (код, идентификатор)
*client.identification.byCode — вернёт словарь с отображением код->идентификатор (этот словарь лежит в основании client.identification)
*client.identification.nameDict — вернёт словарь с отображением код->название,может быть полезно для заголовков.
Такой же механизм можно использовать для классов »’COrgIdentificationInfo и CPersonIdentificationInfo»’.
Вывод определенного кода идентификации (01)
{if: client.identification.byCode[’01’]}
{client.identification.byCode.get(’01’, »)}
{end:}
Если не знаем кода, но знаем urn:
{for: (code, urn) in currentOrganisation.identification.byUrn.items()}
{if: urn == u’urn:oid:1.2.643.5.1.13.2.1.1.178′}
{code}
{end:}
{end:}
Второй способ получения идентификатора по »’urn»’ из rbAccountingSystem
*.identify
Пример получения идентификатора по справочнику должностей oid:1.2.643.5.1.13.13.11.1002:
{action.person.post.identify(‘urn:oid:1.2.643.5.1.13.13.11.1002’)
Работает для следующих объектов и классов:
*rbBloodType »’CBloodTypeInfo»’
*rbContainerType »’CContainerTypeInfo»’
*rbDiagnosticResult »’CDiagnosticResultInfo»’
*rbDiseaseCharacter »’CCharacterInfo»’
*rbDispanser »’CDispanserInfo»’
*rbDocumentType »’CDocumentTypeInfo»’
*rbEventTypePurpose »’CPurposeInfo»’
*rbFinance »’CFinanceInfo»’
*rbHospitalBedProfile »’CHospitalBedProfileInfo»’
*rbMedicalAidProfile »’CMedicalAidProfileInfo»’
*rbMedicalAidType »’CMedicalAidTypeInfo»’
*rbMetastasis »’CMetastasisInfo»’
*rbNodus »’CNodusInfo»’
*rbNomenclature »’CNomenclatureInfo»’
*rbPost »’CPostInfo»’
*rbService »’CServiceInfo»’
*rbSocStatusType »’CSocStatusType»’,»’CClientSocStatusInfo»’
*rbSpeciality »’CSpecialityName»’
*rbSpecimenType »’CSpecimentTypeInfo»’
*rbTNMphase »’CTNMphaseInfo»’
*rbTempInvalidReason »’CTempInvalidReasonInfo»’
*rbTempInvalidResult »’CTempInvalidResultInfo»’
*rbTissueType »’CTissueTypeInfo»’
*rbTraumaType »’CTraumaTypeInfo»’
*rbTumor »’CTumorInfo»’
*rbUnit »’CUnitInfo»’
*rbVisitType »’CVisitTypeInfo»’
*rbRelationType »’CRelativeIdentificationInfo»’
*rbNomenclatureActiveSubstance »’CNomenclatureActiveSubstanceInfo»’
*rbNomenclatureUsingType »’CNomenclatureUsingTypeInfo»’

Связи пациента: {client.relations} (список)

*rel. client (CClientInfo) связанный пациент
*rel. relative (CClientInfo) сам пациент
*rel. identification (CRelativeIdentificationInfo) Идентификация связи
*rel.role: Строка, leftName или rightName в зависимости от «направления» связи
*rel.otherRole: Строка, «другое» имя
*rel.name: Строка, role -> otherRole; добавлено для «совместимости» с интерфейсом
*rel.other: ClientInfo связанного клиента
*rel.code: Строка, соотв. коду из rbRelationType
*rel.regionalCode: Строка, regionalCode или regionalReverseCode из rbRelationType смотря по направлению связи
*rel.isDirectGenetic: Логическое, isDirectGenetic или isBackwardGenetic из rbRelationType смотря по направлению связи
*rel.isBackwardGenetic: Логическое, аналогично
*rel.isDirectRepresentative: Логическое, аналогично
*rel.isBackwardRepresentative: Логическое, аналогично
*rel.isDirectEpidemic: Логическое, аналогично
*rel.isBackwardEpidemic: Логическое, аналогично
*rel.isDirectDonation: Логическое, аналогично
*rel.isBackwardDonation: Логическое, аналогично
Например. Связи:
{if: client.relations}
rel
rel.role
rel.otherRole
rel.name
rel.other
rel.code
rel.regionalCode
rel.isDirectGenetic
rel.isBackwardGenetic
rel.isDirectRepresentative
rel.isBackwardRepresentative
rel.isDirectEpidemic
rel.isBackwardEpidemic
rel.isDirectDonation
rel.isBackwardDonation
{for: rel in client.relations}
{rel}
{rel.role}
{rel.otherRole}
{rel.name}
{rel.other}
{rel.code}
{rel.regionalCode}
{rel.isDirectGenetic}
{rel.isBackwardGenetic}
{rel.isDirectRepresentative}
{rel.isBackwardRepresentative}
{rel.isDirectEpidemic}
{rel.isBackwardEpidemic}
{rel.isDirectDonation}
{rel.isBackwardDonation}
{end:}
{else:}
связей нет
{end:}

Аллергия: (CClientAllergyInfo)

{for: allergy in client.allergies}
*Название: {allegy.name} (строка)
*Сила: {allergy.power} (число)
*Дата: {allergy.date} (CDateInfo)
*Примечания: {allergy.notes} (строка)

Лекарственная непереносимость: (CClientIntoleranceMedicamentInfo)

{for: intolerance in client.intolerances}
*Название: {intolerance.name} (строка)
*Сила: {intolerance.power} (число)
*Дата: {intolerance.date} (CDateInfo)
*Примечания: {intolerance.notes} (строка)

Факторы риска: (client.riskFactors)

{for: riskFactor in client.riskFactors}
*Идентификатор записи в справочнике «Факторы риска»: {riskFactor.id}
*Идентификатор записи из таблицы ClientRiskFactor: {riskFactor._clientRiskFactorId}
*Код: {riskFactor.code} (строка)
*Региональный код: {riskFactor.regionalCode} (строка)
*Наименование: {riskFactor.name} (строка)
*МКБ: {riskFactor.MKB} (строка)
*Степень: {riskFactor.power} (строка)
*Примечание: {riskFactor.note} (строка)
*Дата начала: {riskFactor.begDate} (CDateInfo)
*Дата окончания: {riskFactor.endDate} (CDateInfo)

Вредность и факторы

{if:client.work.hurts}
{for: i, hurt in enumerate(client.work.hurts)}
Вредность номер {i+1}: код: {hurt.code}, наименование: {hurt.name}, стаж: {hurt.stage}, строка: {hurt},
{if: hurt.factors}
{for: j, factor in enumerate(hurt.factors)}
фактор № {j+1}, код:{factor.code}, наименование:{factor.name}
{end:}
{else:}
факторов нет
{end:}
{end:}
{else:}
вредности нет
{end:}
Аналогичным образом можно получить информацию об идентификации типов и факторов вредности (например, для формирования в СЭМД):
{if: client.work.hurts}
{for: hurt in client.work.hurts}
code=»{hurt.identify(‘urn:oid:1.2.643.5.1.13.13.11.1060’).value}» codeSystemVersion=»2.1″ displayName=»{hurt.name}»
{if: hurt.factors}
{for: factor in hurt.factors}
code=»{factor.identify(‘urn:oid:1.2.643.5.1.13.13.11.1060’).value}» codeSystemVersion=»2.1″ displayName=»{factor.name}»
{end:}
{end:}
{end:}
{end:}
С ревизии клиента 33840 и выше обращение к факторам было изменено.
{: j = 0}
{if: client.work.hurtFactors}
{for: i, factor in enumerate(client.work.hurtFactors)}
фактор № {j+1}, код: {factor.code}, наименование: {factor.name}, идентификатор по справочнику с OID 1.2.643.5.1.13.13.11.1060: {factor.identify(‘urn:oid:1.2.643.5.1.13.13.11.1060’)}
{end:}
{else:}
факторов нет
{end:}

Соц.статусы: {client.socStatuses}

client.socStatuses (CClientSocStatusInfoList) — массив соц. статусов. Элемент соц.статуса (CClientSocStatusInfo) имеет параметры:
*code
*name
*document
*begDate
*endDate
*classes — массив классов элемента соц. статуса (CSocStatusClassInfoList)
*identify(‘urn справочника’)
Элемент класса соц.статуса (CSocStatusClassInfo) имеет параметры:
*code
*name
*group

*Список статусов
{if:len(client.socStatuses)}
{for: s in client.socStatuses}
{s.code} {s.name} {s} {s.identify(‘urn:oid:1.2.643.5.1.13.13.11.1050’)}
код имя всё идентификатор по справочнику 1.2.643.5.1.13.13.11.1050
{end:}
{end:}
*Проверка наличия соц.статуса
{if:len(client.socStatuses)}
Л
{else:}
Х
{end:}
*Выбор кода соц.статуса
1. последний в списке {client.socStatuses[-1].code} 2. первый в списке {client.socStatuses[0].code}
»’Документ подтверждающий соц.статус:»’
*client.socStatuses[i].document (CClientDocumentInfo):
*type — тип документа (CDocumentTypeInfo)
*serial — серия документа
*number — номер документа
*date — дата выдачи документа
*origin — орган выдавший документ

Прививочная карта пациента.

{for: vaccination in client.vaccinations}
*{vaccination} — прививка
*{vaccination.vaccine} — описание вакцины
*{vaccination.datetime} — дата вакцинации
*{vaccination.dose} — доза
*{vaccination.seria} — серия
*{vaccination.person} — исполнитель
*{vaccination.reaction} — реакция
*{vaccination.transitionType} — тип перехода/дополнительно
*{vaccination.relegateOrg} — направитель
*{vaccination.infections} — список инфекций
*{vaccination.vaccineationType} — тип вакцинации
*{vaccination.vaccine.identify(‘urn:oid:номер справочника’)} — идентификация вакцины
*{vaccination.vaccine.identify(‘urn:oid:номер справочника’).vaccinationType} — тип вакцины на вкладке идентификация
{end:}

{for: vaccineProbeItem in vaccineProbeList}
*{vaccineProbeItem.probe.name} — наименование пробы
*{vaccineProbeItem.date} — дата пробы
*{vaccineProbeItem.reaction} — реакция
*{vaccineProbeItem.result} — результат
{end:}

Данные о событии пациента

Существует параметр »’clientEvents»’ — это массив из событий. По каждому элементу массива можно получить все данные о событии

Эпидемиологичеcкий случай пациента

Класс »’CClientEpidCaseInfo»’ содержит следуюшие элементы:
*id — идентификатор
*MKB — шифр МКБ
*number — эпид. номер
*redDate — дата присвоения эпид. номера
*regPerson — лицо, зарегистрировавшее эпид. номер
*endDate — дата завершения эпид. случая
*note — примечание
В класс CClientInfo добавлено свойство epidCases.
Пример использования:
{for: case in client.epidCases}
{case.number}
{end:}

Сотрудник person (CPersonInfo)

*код: {person.code} (строка)
*какой-то федеральный код: {person.federalCode} (строка)
*какой-то региональный код: {person.regionalCode} (строка)
*фамилия: {person.lastName} (строка)
*имя: {person.firstName} (строка)
*отчество: {person.patrName} (строка)
*фамилия, имя, отчество: {person.longName} (строка)
*фамилия и.о.: {person.shortName} (строка)
*кабинет: {person.office} (строка)
*должность: {person.post} (CPostInfo)
*специальность: {person.speciality} (CSpecialityInfo)
*место работы: {person.organisation} (COrgInfo)
*организационная структура: {person.orgStructure} (COrgStructureInfo)
*имя для входа в систему: {person.login} (строка)
*список кадровых перемещений: {person.orders} (CPersonOrderInfo)
*ученая степень сотрудника {person.academicDegree}
Например: начальник подразделения в котором работает сотрудник
{person.orgStructure.chief}
{person.orgStructure.chief if person.orgStructure else None}

Класс «Кадровые перемещения сотрудника» CPersonOrderInfo

*date — дата перемещения
*type — тип перемещения
*typeAsString — название типа перемещения
*documentDate — дата документа о перемещении
*documentNumber — номер документа о перемещении
*documentType — тип документа о перемещении (HL7)
*validFromDate — дата начала действия перемещения
*validToDate — дата окончания действия перемещения
*orgStructure — подразделение
*post — должность
Доступен механизм подстановки замещающих в шаблонах печати. Пример:

{def: getSubstitutionChief(actionInfo)}
{:orgStr = actionInfo.person.orgStructure}
{while: not orgStr.chief.id}
{:orgStr = orgStr.parent}
{end:}
{for: order in orgStr.chief.orders}
{if: order.type in (3,4,5,6) and actionInfo.endDate.date >= order.validFromDate.date and actionInfo.endDate.date <= order.validToDate.date} {if: order.substitutionPerson.id} {:return order.substitutionPerson} {else:} {:return orgStr.chief} {end:} {end:} {end:} {:return orgStr.chief} {end:} {def: getSubstitutionPerson(actionInfo)} {for: order in actionInfo.person.orders} {if: order.type in (3,4,5,6) and actionInfo.endDate.date >= order.validFromDate.date and actionInfo.endDate.date <= order.validToDate.date} {if: order.substitutionPerson.id} {:return order.substitutionPerson} {else:} {:return actionInfo.person} {end:} {end:} {end:} {:return actionInfo.person} {end:}
Заведующий отделением: {getSubstitutionChief(action)}
Врач исполнитель: {getSubstitutionPerson(action)}

Класс «Квалификация сотрудника» (CEducationInfoList)

У person (CPersonInfo) есть параметр {educations}, с помощью которого можно получить информацию по квалификации сотрудника. Пример использования:
{for: education in event.setPerson.educations}
{education.documentType} — тип документа (CDocumentInfo)
{education.serial} — серия
{education.number} — номер
{education.date} — дата
{education.origin} — организация
{education.status} — статус
{education.validFromDate} — действительно с даты
{education.validToDate} — действительно по дату
{education.speciality} — специальность (CSpecialityInfo)
{end:}

Класс «Вид деятельности сотрудника»

{for: activity in person.activities}
{activity.code}
{activity.name}
{activity.regionalCode}
{activity.note}
{end:}

Справочник «Старые фамилии»

Для шаблонов печати реализован доступ к справочнику старых фамилий, через внешнюю учетную систему «Старые фамилии», с кодом «OldSurname». Данные указываются на вкладке Идентификация в карте сотрудника.
{getShortName(byDate=None, code=’OldSurname’)}
{getFullName(byDate=None, code=’OldSurname’)}
Параметр byDate может принимать значения:
{event.execDate} — дата выполнения события
{action.begDate} — дата начала действия
{action.endDate} — дата окончания действия
{action[u’Name’].value} — дата из свойства с именем Name

Контактные данные сотрудника

Сведения о контактных данных сотрудника представлены в виде массива, который выводится при помощи {person.contacts}.
Работа с массивом контактов сотрудника идентична работе с массивом контактов пациента.

Услуга (профиль оплаты) service (CServiceInfo)

Элемент справочника, имеющий свойства code и name и, кроме того, свойства:
*унаследовано из ЕИС: {service.eisLegacy} (логический); пример: {visit.service.eisLegacy}
*признак необходимости лицензии: {service.license} (строка)
*ИНФИС-код: {service.infis} (строка)
*дата начала: {service.begDate} (CDateInfo)
*дата окончания: {service.endDate} (CDateInfo)

Посещение (визит)

visit (CVisitInfo), имеет свойства:
*Тип визита: {visit.type} (справочник CVisitTypeInfo)
*Назначенная дата: {visit.date} (CDateInfo)
*Врач: {visit.person } (CPersonInfo)
*Место выполнения визита: {visit.scene} (справочник CSceneInfo)
*Признак первичности: {visit.isPrimary} (1 — первичный, 2 — повторный)
*Источники финансирования: {visit.finance} (справочник CFinanceInfo)
*Услуга (профиль ЕИС): {visit.service} (CServiceInfo)
*Флаги финансирования: {visit.payStatus} (целое число)

Вкладка визиты (контекст visitsList)

Доступна печать фильтров информации из фильтров. Пример:
Дата визита:
с {if: filterVisitBegDate}{filterVisitBegDate}{end:} {if: filterVisitBegTime}{filterVisitBegTime}{end:}
по {if: filterVisitEndDate}{filterVisitEndDate}{end:} {if: filterVisitEndTime }{filterVisitEndTime}{end:}
Подразделение исполнителя: {if: filterVisitExecSetOrgStructure}{filterVisitExecSetOrgStructure}{end:}
Специальность исполнителя: {if: filterVisitExecSetSpeciality}{filterVisitExecSetSpeciality}{end:}
Исполнитель: {if: filterVisitExecSetPerson }{filterVisitExecSetPerson}{end:}
Ассистент: {if: filterVisitAssistant }{filterVisitAssistant}{end:}
Тип финансирования: {if:filterVisitFinance }{filterVisitFinance}{end:}
Услуга: {if: filterVisitService}{filterVisitService}{end:}
Место: {if: filterVisitScene}{filterVisitScene}{end:}
Автор: {if: filterVisitCreatePersonEx}{filterVisitCreatePersonEx}{end:}
Дата создания:
с {if: filterVisitBegCreateDateEx}{filterVisitBegCreateDateEx}{end:}
по {if :filterVisitEndCreateDateEx}{filterVisitEndCreateDateEx}{end:}
Автор последнего изменения: {if: filterVisitModifyPersonEx }{filterVisitModifyPersonEx}{end:}
Дата последнего изменения:
c {if: filterVisitBegModifyDateEx }{filterVisitBegModifyDateEx}{end:}
по {if: filterVisitEndModifyDateEx}{filterVisitEndModifyDateEx}{end:}
Оплата: {if: filterVisitPayStatusCodeEx}{filterVisitPayStatusCodeEx}{end:} {if: filterVisitPayStatusFinanceEx}{filterVisitPayStatusFinanceEx}{end:}

Обращение {event} (CEventInfo)

*Тип обращения: {event.eventType} (CEventTypeInfo)
*Идентификация типа события: {event.eventType.identify(‘urn:oid:1.2.643.5.1.13.13.99.2.726’)}
*Назначение типа обращения; цель: {event.eventType.purpose} (CPurposeInfo)
*Тип финансирования: {event.eventType.finance} (CFinanceInfo)
*Базовый сервис ОМС: {event.eventType.service} (CServiceInfo)
*Имя контекста печати: {event.eventType.printContext} (строка)
*Внешний идентификатор/Номер документа: {event.externalId} (строка)
*Организация: {event.org} (COrgInfo)
*Клиент: {event.client} (CclientInfo)
*Код карточки: {event.id} (строка)
*Контракт: {event.contract} (CContractInfo)
*Дата предыдущего обращения: {event.prevEventDate} (CDateInfo)
*Дата назначения: {event.setDate} (CDateInfo)
*Кем назначен: {event.setPerson} (CPersonInfo)
*Дата выполнения: {event.execDate} (CDateInfo)
*Выполнил: {event.execPerson} (CPersonInfo)
*Признак первичности: {event.isPrimary} (1-первичный, 2-повторный, 3-активное посещение, 4-перевозка)
*Порядок наступления: {event.order} (0-плановый, 1-экстренный, 2-самотёком, 3-принудительный) и т.д.
*Результат обращения: {event.result} (CResultInfo)
*Дата следующего обращения: {event.nextEventDate} (CDateInfo)
*Флаги финансирования: {event.payStatus} (целое)
*Тип актива: {event.typeAsset} (CEmergencyTypeAssetInfo)
*Примечания: {event.note} (строка)
*Куратор: {event.curator} (CPersonInfo)
*Ассистент: {event.assistant} (CPersonInfo)
*Мероприятия: {event.actions} (CActionInfoList)
*Диагнозы: {event.diagnosises} (CDiagnosticInfoList)
*Описание диагноза: {event.diagnosises.freeInput} Для вывода описания каждого диагноза необходимо использовать цикл по {event.diagnosises}
*Посещения: {event.visits} (CVisitInfoList)
*Листы временной нетрудоспособности с begDate по endDate: {event.getTempInvalidList(begDate, endDate)} (CTempInvalidListInfo)
*МЭС: {event.mes} (CMesInfo )
*Особенности выполнения МЭС: {event.mesSpecification} (CMesSpecificationInfo )
*Модель пациента: {event.patientModel} (строка)
*Лицо по уходу, объект CClientInfo (доступны данные, которые есть у пациента): event.relative
*Тип квоты модели пациенты {event.patientModel.quotaType} (CQuotaTypeInfo )
*Вид лечения: {event.cureType} (строка)
*Метод лечения: {event.cureMethod} (строка)
*Вид медицинской помощи {event.eventType.medicalAidKind}
*Профиль медицинской помощи {event.medicalAidProfile}
*Предшествующее событие — {event.prevEvent} (CEventInfo)
*Автор записи: {event.createPerson} {CPersonInfo}
*Автор изменений: {event.modifyPerson} {CPersonInfo}
*Неделя беременности (стат.учёт): {event.pregnancyWeek}
*Имеются ли не сохраненные изменения в Событии: {event.isDirty}
*Направитель (организация) (вкладка Примечания): {event.relegateOrg}
*Номер направления(вкладка Примечания): {event.srcNumber}
*Дата направления(вкладка Примечания): {event.srcDate}
*Длительность (стат.учет) {:ED = event.execDate if event.execDate else currentDate()}
{:delta = ED.date.toJulianDay() — event.setDate.date.toJulianDay()} {:duration = str(delta).split()[0]}

Параметры требования МЭС

*Код — {event.mes.code}
*Наименование — {event.mes.name}
*Описание — {event.mes.descr}
*Сервис — {event.mes.service}
*Признак активности — {event.mes.active}
*Признак внутренний это МЭС или нет — {event.mes.internal}
*Группа — {event.mes.group}
*Минимальная длительность — {event.mes.min}
*Максимальная длительность — {event.mes.max}
*Средняя длительность — {event.mes.avg}
*Модель пациента — {event.mes.patientModel}
*Норматив визитов — {event.mes.norm}
*Периодичность в днях — {event.mes.periodicity}
*Группа КСГ- {event.mes.ksg}
*Дата окончания действия — {event.mes.endDate}
*Признак Политравма — {event.mes.isPolyTrauma}
*Заболевания, входящие в МЭС (в формулировках МКБ):
{for: i, mkb in enumerate(event.mes.MKB)}
{mkb.code} — код диагноза по МКБ
{mkb.name} — наименование МКБ
{mkb.exCode} — код доп. диагноза по МКБ
{mkb.exName} — наименование доп. диагноза по МКБ
{mkb.grouping}
{mkb.blending} — сочетаемость (0-основной и дополнительный,1-основной,2-дополнительный)
{end:}
*Оказанные услуги (мероприятия):
{for: i, serviceType in enumerate(event.mes.serviceTypes)}
{serviceType.groupCode} — код группировки услуг
{serviceType.groupName} — наименование группировки услуг
{serviceType.code} — код услуги
{serviceType.name} — наименование услуги
{serviceType.doctorWTU} — УЕТ врача
{serviceType.paramedicalWTU} — УЕТ средний
{serviceType.averageQnt} — среднее кол-во предоставления услуги (кратность) пациенту за период госпитализации
{serviceType.necessity} — частота предоставления услуги (потребность) в рамках настоящего стандарта
{serviceType.binding} — признак объединения услуг в единую технологическую совокупность
{serviceType.sex} — пол (0-не определено, 1-М, 2-Ж)
{serviceType.begAgeUnit} — применимо для минимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{serviceType.minimumAge} — минимальный возраст (yy-mm-dd)
{serviceType.endAgeUnit} — применимо для максимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{serviceType.maximumAge} — максимальный возраст (yy-mm-dd)
{serviceType.controlPeriod} — период контроля (0-Текущая дата, 1-Конец текущего года, 2-Конец предыдущего года)
{end:}
*Услуги лечащего и консультирующего врача (ВИЗИТЫ):
{for: i,visit in enumerate(event.mes.visitTypes)}
{visit.name} — наименование
{visit.specialityName} — наименование специальности
{visit.serviceCode} — услуга
{visit.additionalServiceCode} — дополнительный код услуги
{visit.altAdditionalServiceCode} — альтернативный доп. код
{visit.groupCode} — группировка визитов
{visit.averageQnt} — среднее кол-во визитов (кратность) за период госпитализации
{visit.sex} — пол (0-не определено, 1-М, 2-Ж)
{visit.begAgeUnit} — применимо для минимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{visit.minimumAge} — минимальный возраст (yy-mm-dd)
{visit.endAgeUnit} — применимо для максимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{visit.maximumAge} — максимальный возраст (yy-mm-dd)
{visit.controlPeriod} — Период контроля (0-Текущая дата, 1-Конец текущего года, 2-Конец предыдущего года)
{end:}

Вкладка Обращение (контекст печати eventsList)
На вкладке реализована возможность выводить в шаблон печати данные полей фильтра. Сейчас доступны для печати следующие поля:
{filter.eventType} — тип события
{filter.eventBegSetDate} — начальная дата периода назначения
{filter.eventBegSetTime} — начальное время периода назначения
{filter.eventEndSetDate} — конечная дата периода назначения
{filter.eventEndSetTime} — конечное время периода назначения
{filter.eventBegExecDate} — начальная дата периода выполнения
{filter.eventBegExecTime} — начальное время периода выполнения
{filter.eventEndExecDate} — конечная дата периода назначения
{filter.eventEndExecTime} — конечное время периода назначения
{filter.eventOrgStructure} — подразделение
{filter.eventSpeciality} — специальность
{filter.eventPerson} — врач.
Данных по тарифу КСГ:
{for: csg in event.csgList}
{:csg.service.prepareTariff(event.contract.id, event.client.id)}
{csg.service.tariff}
{end:}

Вызов зубной формулы (CTeethEventInfo) (для формы ввода ф.043)

*{ write(event.stomat) } — нарисовать стоматологическую таблицу
*{ write(event.parodent) } — нарисовать пародентологическую таблицу
Так как стоматологическая таблица для детей имеет меньше значений то, чтоб не печатать лишних пустых граф существуют следующие подстановки:
*{write(event.stomatchildfull)} — нарисовать стоматологическую таблицу для ребенка
*{write(event.parodentchildfull)} — нарисовать пародентологическую таблицу для ребенка

Вызов скорой помощи event (CEmergencyEventInfo)

Имеет те же свойства, что и CEventInfo и, кроме того, свойства:
*Номер карты вызова: {event.numberCardCall} (строка)
*Номер бригады: {event.brigade} (CEmergencyBrigadeInfo)
*Повод к вызову: {event.causeCall} (CEmergencyCauseCallInfo)
*Кто вызывал: {event.whoCallOnPhone} (строка)
*Телефон: {event.numberPhone} (строка)
*Время начала: {event.begDate} (CDateTimeInfo)
*Время передачи бригаде: {event.passDate} (CDateTimeInfo)
*Время выезда: {event.departureDate} (CDateTimeInfo)
*Время прибытия: {event.arrivalDate} (CDateTimeInfo)
*Время окончания обслуживания: {event.finishServiceDate} (CDateTimeInfo)
*Время возвращения на станцию: {event.endDate} (CDateTimeInfo)
*Место получения вызова: {event.placeReceptionCall} (CEmergencyPlaceReceptionCallInfo)
*Вызов получен: {event.receivedCall} (CEmergencyReceivedCallInfo)
*Причина задержки: {event.reasondDelays} (CEmergencyReasondDelaysInfo)
*Результат: {event.resultCall} (CEmergencyResultInfo)
*Несчастный случай: {event.accident} (CEmergencyAccidentInfo)
*Смерть: {event.death} (CEmergencyDeathInfo)
*Опьянение: {event.ebriety} (CEmergencyEbrietyInfo)
*Больной: {event.diseased} (CEmergencyDiseasedInfo)
*Место вызова: {event.placeCall} (CEmergencyPlaceCallInfo)
*Способ транспортировки: {event.methodTransport} (CEmergencyMethodTransportInfo)
*Транспортировку перенес: {event.transfTransport} (CEmergencyTransferTransportInfo)
*Отказ от госпитализации: {event.renunOfHospital} (логический)
*Лицо отказа от госпитализации: {event.faceRenunOfHospital} (строка)
*Заболевание: {event.disease} (логический)
*Роды: {event.birth} (логический)
*Патология беременности: {event.pregnancyFailure} (логический)
*Примечание: {event.noteCall} (строка)

Констатация смерти event

Имеет те же свойства, что и CEventInfo и, кроме того, свойства:
*Смерть наступила: {event.deathPlaceType} (CDeathPlaceTypeInfo, есть поля code и name)
*Смерть произошла: {event.deathCauseType} (CDeathCauseTypeInfo, поля code и name)
*Причины смерти установлены: {event.employeeTypeDeterminedDeathCause} (CEmployeeTypeDeterminedDeathCauseInfo, поля code и name)
*Основание: {event.groundsForDeathCause} (CGroundsForDeathCauseInfo, поля code и name)
*Адрес места смерти (КЛАДР): {event.deathAddress} (CAddressInfo)
*Адрес места смерти (свободный ввод): {event.deathAddressFreeInput } (строка)

Диагноз (ЛУД)

Представляется экземплярами CDiagnosisInfo. У экземпляра CDiagnosisInfo есть свойства:
*type (CDiagnosisTypeInfo) — тип диагноза,
*MKB (CMKBInfo) — диагноз,
*MKBEx (CMKBInfo) — классификация по 5-му знаку,
*exSubclassMKB (CDiagnosisInfo и CDiagnosticInfo) — расширенная субклассификация МКБ,
*character (CCharacterInfo) — характер,
*dispanser (CDispanserInfo) — диспансерное наблюдение,
*traumaType (CTraumaTypeInfo) — травма,
*person (CPersonInfo) — врач,
*setDate (CDateInfo) — дата начала,
*endDate (CDateInfo) — дата окончания
*CDagnosisTypeInfo, CCharacterInfo, CDispanserInfo, CTraumaTypeInfo — суть представление элементов различных справочников, и предоставляют свойства code и name (оба — строки). Когда значение приводится к строке используется свойство name.
*CDispanserInfo также предоставляет свойство observed (boolean)
*CMKBInfo — есть свойства code, morphologyMKB, descr (строки) и VIMISList (список из CVIMISInfo). Когда значение приводится к строке, используется свойство code. morphologyMKB
При работе с отношением кода МКБ к ВИМИС возможно использование функции .hasVIMIS():
*{for: ds in event.diagnosises} … {if: ds.MKB.hasVIMIS(u’Онкология’)} …

Диагноз (Случай обслуживания)

{event.diagnosises}. У экземпляра diagnosises есть те же свойства, что у диагноза ЛУД и, кроме того:
*stage (CStageInfo)
*sanatorium (boolean),
*hospital (boolean),
*speciality (CSpecialityInfo),
*healthGroup (CHealthGroupInfo),
*result (CResultInfo),
*phase
*notes (строка)
*CStageInfo, CHealthGroupInfo — суть также представление элементов различных справочников, которые предоставляют свойства code и name.
*TNMS
*MKBAdditional (CMKBAdditionalInfo) — Дополнительная субклассификация МКБ. Имеет свойства: code, name

Журнал хранения учетных документов

Информация о текущем местонахождении учетного документа {event.documentLocation}:
*location
*docDate
*docTime
*person
*note

Журнал отложенной записи

Контекст печати: suspendedAppointmentList.
*data = { ‘suspendedAppointmentList’: suspenedAppointmentInfoList; ‘suspendedAppointment’ : suspenedAppointmentInfo }
*Классы контекста: CSuspendedAppointmentInfoList, CSuspendedAppointmentInfo, CScheduleItemInfo, CScheduleInfo.

Тип действия (статус, мероприятие, диагностика, лечение, и.т.п.)

action (CActionTypeInfo), имеет свойства:
*класс: {action.class_} (0 — статус, 1 — диагностика, 2 — лечение, 3 — прочие мероприятия)
*группа типов: {action.group} (CActionTypeInfo)
*код мероприятия: {action.code} (строка)
*уникальный «плоский» код мероприятия: {action.flatCode} (строка)
*название мероприятия: {action.name} (строка)
*название мероприятия для печати: {action.title} (строка)
*услуга: {action.service} (CServiceInfo)
*имеет ли значение время мероприятия: {action.showTime} (логический)
*подразделения за которыми закреплено действие {action.orgStructure} (список из COrgStructureInfo)
*PACS: {for: e in action.equipmentList} {e.name} {end:} (список оборудования)

Действие (статус, мероприятие, диагностика, лечение, и.т.п.)

action (CActionInfo), имеет те же свойства, что и CActionTypeInfo и, кроме того, свойства:
*статус выполнения: {action.status} (0 — начато, 1 — ожидание, 2 — закончено, 3 — отменено, 4 — Без результата, 5 — Назначено)
*дата направления: {action.directionDate} (CDateTimeInfo)
*дата начала: {action.begDate} (CDateTimeInfo)
*плановая дата выполнения: {action.plannedEndDate} (CDateTimeInfo)
*дата выполнения: {action.endDate} (CDateTimeInfo)
*исполнитель: {action.person} (CPersonInfo)
*ученая степень врача, выполнившего действие {action.person.academicDegree}
*назначивший: {action.setPerson} (CPersonInfo)
*ученая степень врача, назначившего действие {action.setPerson.academicDegree}
*кабинет: {action.office} (строка)
*тип финансирования: {action.finance } (CFinanceInfo)
*цена: {action.price} (вещественное число)
*количество: {action.amount} (вещественное число)
*примечание: {action.note} (строка)
*имя контекста печати для действия: {action.getPrintTemplateContext(…)} (строка)
*свойство: {action[…]} (CPropertyInfo); пример: {action[u’рост’]}
*имеются ли не сохраненные изменения в Действии: {action.isDirty}
*Количество процедур: {action.quantity}
*Длительность: {action.duration}
*Интервал: {action.periodicity}
*Кратность: {action.aliquoticity}
*Особенность выполнения действия: {action.specification.code}, {action.specification.name}

*У экземпляра действия также есть параметр serviceType {action.serviceType} — вид услуги (например, первичный осмотр, лабораторные исследования, операция и тд)
Выводит целочисленное значение от 0 до 11, соответствующее виду услуги. Расшифровка значений: 0-Прочие, 1-первичный осмотр, 2-повторный осмотр, 3-процедура/манипуляция, 4-операция, 5-исследование, 6-лечение, 7-профилактика, 8-анестезия, 9-реанимация, 10-лабораторное исследование, 11-опрос’
*Вывод данных о настройке идентификации Типа Действия выполняется путем указания urn внешней учетной системы следующими способами:
{action.identify(‘urn’)} или {action.identify(‘urn’).value} — вывод значения идентификатора для последней в списке записи по внешней учетной системе с указанным urn;
{action.identify(‘urn’).note} — вывод значения поле «Примечание» для последней в списке записи по внешней учетной системе с указанным urn;
{action.identify(‘urn’).urn} — вывод значения urn внешней учетной системы для последней в списке записи по внешней учетной системе с указанным urn.
{action.identifyAll(‘urn’)} — вывод списка значений идентификаторов Типа Действия по указанному urn внешней учетной системы.
Также к идентификации можно обратиться циклом:
{for: identification in action.identifyAll(‘urn:oid:1.2.643.2.69.1.1.1.195.Cda’)}
{identification.value}: {identification.note} ({identification.urn})
{end:}

Свойства действия

*рост: { action[u’Рост’] }/{ action[u’Рост’].value }/{ action[u’Рост’].unit }/{ action[u’Рост’].norm }
*вес: { action[u’Вес’] }/{ action[u’Вес’].value }/{ action[u’Вес’].unit }/{ action[u’Вес’].norm }
*{action.name} — цикл по свойствам
{for: prop in action}
{prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}
*{action.name} — цикл по номерам свойств
{for: i in xrange(len(action))}
{if: i == action.currentPropertyIndex} {end:}
{i+1}) {action[i].name}: {action[i].value}/{action[i].unit}/{action[i].norm}
{if: i == action.currentPropertyIndex} {end:}
{end:}
*{action.name} — цикл по свойствам с фильтром
{:l = [x for x in action if x.value]}
{for: i,prop in enumerate(l)}
{i}) {prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}
{for: i,prop in enumerate([x for x in action if x.value])}
{i}) {prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}
*количество действий: { len(actions)}
{for: i,a in enumerate(actions)}
{if: i == currentActionIndex}{end:}
{i}/{a.code}/{a.name}/{len(a)}
{if: i == currentActionIndex}{end:}
{end:}

*отображение значения свойства с типом html с обработкой тегов (может потребоваться для вывода таблицы)
{prop.value:h}
*параметр «Пол» свойства Действия, настраиваемый в типе действия {prop.sex}
*параметр «Тест» свойства Действия, настраиваемый в типе действия {prop.test}
*для ряда свойств, ссылающихся на записи в справочниках МИС, добавлена возможность отобразить в шаблоне печати данные таких записей
тип «Действующее вещество ЛСиИМН» (CNomenclatureActiveSubstanceInfo):
{prop.value.code} — код действующего вещества ЛСиИМН (далее — ДВ)
{prop.value.name} — наименование ДВ
{prop.value.unit} — единица измерения ДВ (CUnitInfo)
{prop.value.identify(‘urn справочника’)} — идентификатор ДВ по справочнику с указанным urn
тип «Способ применения ЛСиИМН» (CNomenclatureUsingTypeInfo):
{prop.value.code} — код способа применения ЛСиИМН (далее — СП)
{prop.value.name} — наименование СП
{prop.value.identify(‘urn справочника’)} — идентификатор СП по справочнику с указанным urn

КСГ, применённая в действии

Печать данных по КСГ, применённой в действии, возможна из действия или из события с помощью цикла по действиям, из форм ввода и из вкладок Обращение и Обслуживание
У действия (CActionInfo) есть параметр csg, у которого, в свою очередь, есть следующие параметры:
*{action.csg.begDate} — дата начала
*{action.csg.endDate} — дата окончалия
*{action.csg.MKB} — код МКБ
*{action.csg.CSGCode} — код КСГ
*{action.csg.amount} — количество
*{action.csg.payStatus} — статус оплаты

Биоматериал, связанный с действием

{action.takenTissueJournal} (CtakenTissueJournalInfo):
*datetimeTaken — дата забора биоматериала
*execPerson (CPersonInfo) — регистратор забора
*tissueType — тип биоматериала:
*externalId — идентификатор в журнале(суточный)
*amount — количество биоматериала
*note — примечание

Класс «Услуги/Квотирование» — справочник Типы действий/вкладка Услуги/Квотирование:

{for: action in event.actions}
{for: quotaType in action.quotaType}
{quotaType.quotaClass}
{quotaType.quotaType.name}
{quotaType.quotaType.code}
{quotaType.financeId}
{end:}
{end:}

Печать шаблона в редакторе действия

В случае, когда из редактора действия необходимо распечатать шаблон, содержащий обращение к другим действиям события, необходимо в шаблоне заменить все «event.actions» на «actions» и добавить в начало шаблона следующий код:
{:from PyQt4 import QtGui}
{:from library.PrintInfo import CInfoContext}
{:from Events.ActionInfo import CActionInfo}
{:records = QtGui.qApp.db.getRecordList(‘Action’, ‘id’, ‘Action.event_id = %d’ % action.event.id)}
{:context = CInfoContext()}
{:actions = [CActionInfo(context, r.value(‘id’).toInt()[0]) for r in records]}

Вкладка Обслуживание (контекст печати actionsList)

Для шаблонов печати, использующих контекст actionsList, существует возможность вывода данных полей фильтра.
{filter.actionType.name} — тип действия
{filter.actionBegSetDate} — начальная дата периода назначения
{filter.actionEndSetDate} — конечная дата периода назначения
{filter.actionBegExecDate} — начальная дата периода выполнения
{filter.actionBegExecTime} — начальное время периода выполнения
{filter.actionEndExecDate} — конечная дата периода выполнения
{filter.actionEndExecTime} — конечное время периода выполнения
{filter.actionExecOrgStructure} — подразделение исполнителя
{filter.actionExecSpeciality} — специальность исполнителя
{filter.actionExecSetPerson} — исполнитель
{filter.actionExecSetAssistant} — ассистент

Информация о лекарстве

value (CRLSInfo), имеет свойства:
*название вещества: {value.INPName} (строка); пример: {action[u»Выписано»].value.INPName}
*название вещества по-латыни: {value.INPNameLat} (строка)
*торговое название: {value.tradeName} (строка)
*торговое название по-латыни: {value.tradeNameLat} (строка)
*лекарственная форма: {value.form} (строка)
*доза в единице лекарственной формы: {value.dosage} (строка)
*фасовка: {value.filling} (строка)
*упаковка: {value.packing} (строка)
value (CLSiIMNInfo), имеет свойства:
*код: {value.code}
*наименование: {value.name}
*региональный код: {value.RegionalCode}
*тип: {value.type}, имеет параметры code и name. (CLSiIMNTypeInfo)
*наименование по МНН(Международное наименование ЛС): {value.internationalNonproprietaryName}
*Производитель: {value.producer}
*код по АТХ: {value.ATC}
*объем упаковки: {value.packSize}
*код по МНН(Международное наименование ЛС): {value.mnnCode}
*код по ТРН(Торговое наименование ЛС): {value.trnCode}
*дозировка: {value.dosageValue}
*единица изменения дозировки: {value.dosageUnit} (rbUnit)
*форма выпуска лекарственных препаратов: {value.lfForm} (rbLTForm)
*дата включения: {value.inDate}
*дата исключения: {value.exDate}
*комплектность: {value.completeness}
*Особенности ЛСиИМН: {features}. Представляет из себя словарь. Ключом словаря является name, значением — список value. (rbNomenclature_Feature)

Документ временной нетрудоспособности

tempInvalid (CTempInvalidInfo), имеет свойства:
*тип документа: {tempInvalid.doctype} (0-листок нетрудоспособности, 1-справка)
*причина нетрудоспособности: {tempInvalid.reason} (CRBInfo)
*cерия документа: {tempInvalid.serial} (строка)
*номер документа: {tempInvalid.number} (строка)
*дата выдачи документа: {tempInvalid.issueDate} (CDateInfo)
*пол: {tempInvalid.sex} (строка)
*возраст: {tempInvalid.age} (строка)
*продолжительность в днях: {tempInvalid.duration} (целое число)
*продолжительность в днях с учётом внешних периодов: {tempInvalid.externalDuration} (целое число)
*дата начала всего периода ВУТ: {tempInvalid.caseBegDate}
*дата начала ЛВН: {tempInvalid.begDate} (CDateInfo)
*дата окончания: {tempInvalid.endDate} (CDateInfo)
*код диагноза последнего периода: {tempInvalid.MKB} (строка)
*код доп. диагноза последнего периода: {tempInvalid.MKBEx} (строка)
*результат:{if: tempInvalid.state == 0}Открыт {elif: tempInvalid.state == 1}Закрыт {elif: tempInvalid.state == 2}Продлен {elif: tempInvalid.state == 4}Аннулирован {else:} Передан {end:} (0-Открыт, 1-Закрыт, 2-Продлён, 3-Передан)
*cтатус с точки зрения обмена с ФСС:
{if: blank.annulmentReason}Аннулирован
{elif: blank.fssStatus == ‘P0’}Открыт
{elif: blank.fssStatus == ‘P1’}Продлен
{elif: blank.fssStatus == ‘P2’}Продлен
{elif: blank.fssStatus == ‘R’}Закрыт
{elif: blank.fssStatus == ‘M’} отправлен на МСЭ
{else:}
{end:}
**Обращение к текущему ЛВН просто через {tempInvalid.<что-то>},
**обращение к предыдущему — {tempInvalid.prev.<что-то>}
*результат эпизода ВУТ — {tempInvalid.result}
*Подписан ли результат эпизода ВУТ: {tempInvalid.isSigned}
Случай подписан — {u’Да’ if tempInvalid.isSigned else u’Нет’}

CTempInvalidDocumentItemInfo, имеет свойства:
*подписан ли документ (bool): {isSigned}
*дата подписи: {signDate} (CDateInfo)
*подписавший: {signPerson} (CPersonInfo)
Пример использования:
{for: p in tempInvalid.periods}
<div>{p.begDate} {p.endDate} — {if: p.isSigned}»’Подписан»’ {p.signPerson} в {p.signDatetime} {else:}Не подписан{end:}</div>
{end:}

Информация о периодах ВУТ (CTempInvalidPeriodInfo)
{for: item in tempInvalid.periods}
{item.begDate}-дата начала периода нетрудоспособности
{item.endPerson}-врач
{item.endDate}-дата окончания периода нетрудоспособности
{item.isExternal} -флаг внешний
{item.regime} -режим
{item.chairPerson} — председатель ВК
{item.duration} — продолжительность периода в днях
{item.note} — примечание
{end:}
Список лиц по уходу «cares».
CTempInvalidDocumentCareInfo имеет свойства:
*idx (число)

*client (CClientInfo)

*begDate (дата)

*endDate (дата)

*regime (CTempInvalidRegimeInfo)

*MKB (строка)

*reason (CTempInvalidReasonInfo)
Пример вывода:
{for: item in tempInvalid.items}
{for: care in item.cares}
<div>{care.client}: {care.begDate} — {care.endDate}</div>
{end:}
{end:}

Врачебная комиссия и направление на МСЭ

medicalCommission, имеет свойства:
{for: mse in expertise}
*Дата начала действия: {mse.begDate}
*Код действия: {mse.code}
*Дата и время добавления создания действия: {mse.createDatetime}
*Пользователь создавший действие: {mse.createPerson}
*Дата назначения действия: {mse.directionDate}
*Дата окончания действия: {mse.endDate}
*Обращение к событию в котором находится действие: {mse.event} (CEventInfo)
*Уникальный «плоский» код действия: {mse.flatCode}
*Уникальный идентификатор документа в БД: {mse.id}
*Дата и время последнего изменения: {mse.modifyDatetime}
*Пользователь внесший последние изменения: {mse.modifyPerson}
*Название действия: {mse.name}
*Примечание действия: {mse.note}
*Исполнитель действия: {mse.person}
*Также можно обратиться к свойствам действия {for: prop in mse} (CPropertyInfo)

Выполнение работ

jobTickets (CJobTicketWithActionsInfo), элемент списка CJobTicket имеет свойства:
*список Действий Работы: actions (СActionInfo)
Например:
jobTickets[i].actions[0].event.client

Вывод параметров фильтра (jobTicket_list)

*Период c {filter.begDate} по {filter.endDate}
*Работы: {‘, ‘.join([unicode(i) for i in filter.jobTypeList])}
*Ожидающие: {filter.awaiting}
*В очереди: {filter.enqueued}
*Выполняемые: {filter.inProgress}
*Законченные: {filter.done}
*Только срочные: {filter.onlyUrgent}
*Подразделение: {filter.orgStructure}
*Специальность: {filter.speciality}
*Врач: {filter.person}
*Пол: {filter.sex}
*Возраст от {filter.ageFrom} до {filter.ageTo} лет

Номерок на Работу

Ticket (СTicketInfo), имеет свойства:
*datetime — дата и время номерка
*idx — порядковый номер
*jobType — (CjobTypeInfo) данные о типе Работы
*jobPurpose — наименование назначения Работы
*jobPurpose.code — код назначения Работы
*orgStructure — (CorgStructureInfo) данные о подразделение в котором запланирована Работа
*status — состояние Номерка
*label — отмека в Номерке
*note — примечание
*begDateTime — плановое начало Работы
*endDateTime — планове окончание Работы

Лист предварительной записи врача (График)

Вкладка «амбулаторный прием» контекст печати «ambQueue»
Вкладка «На дому» контекст печати «homeQueue»
В данных контекстах определены:
*person: CPersonInfo — врач
*{createPerson} — автор записи
*setPersonId: CPersonInfo — поставивший в очередь
*date: CDateInfo — дата на которую получаем список
*office: строка — кабинет
*timeRange: строка — период приёма
*queue: список элементов CQueueInfo (очередь)
CQueueInfo :
*time: CTimeInfo — время приёма (номерка)
*checked: логическое — отметка
*client: CClientInfo — пациент
*complaints: строка — жалобы
*recordDatetime: CDateTimeInfo — дата и время записи
Пример шаблона для вывода на печать текущего листа предварительной записи:
<html>
<body>
Врач:{person}
Дата:{date} Кабинет:{office} Время приёма:{timeRange}

время
отметка
пациент
примечание
{for: i,q in enumerate(queue)}
{i}
{q.time if q.time else ‘-/-‘}
{q.checked}
{q.client if q.client else ‘-/-‘}
{q.complaints}
{end:}
</body>

Журнал кассовых операций

(CCashOperationInfo). Контекст печати — cashOrder. Переменные:
*event: CEventInfo
*client: ClientInfo,
*date: CDateInfo (дата),
*cashOperation: CCashOperationInfo,
*sum: float,
*cashBox:строка
Режим «Расчет» — «Журнал кассовых операций» контекст печати (cashBook):
{for: item in cashBook}
{item.event}
{item.client}
{item.date}
{item.cashOperation}
{item.sum}
{item.cashBox}
{end:}

Класс «Тип финансирования»
CFinanceInfo
*code — код источника
*name- название источника

Класс «Контракт»(Договор)

CContractInfo
*finance (CFinanceInfo) — тип финансирования
*number — номер контракта
*date — дата заключения контракта
*recipient (COrgInfo) — получатель
*payer (COrgInfo) — плательщик
*resolution — основание
*note — примечание
*{contingent}- вкладка Контингент. Это список, у каждого элемента есть следующие параметры:
{for: cont in account.contract.contingent}
{cont.attachType} — Тип прикрепления (CAttachTypeInfo) (code/name)
{cont.attachOrg} — ЛПУ прикрепления
{cont.org} — Занятость (COrgInfo)
{cont.socStatusType} — Соц. Статус (CSocStatusType) (code/name)
{cont.insurer} — СМО (COrgInfo)
{cont.policyType} — Тип страхования (CRBPolicyTypeInfo) (code/name)
{cont.serviceArea} — Зона обслуживания
{cont.sex} — пол
{cont.age} — возраст
{end:}
*{tariffs}- вкладка Тариф. Это список, у каждого элемента есть следующие параметры:
{for: tariff in account.contract.tariffs}
{tariff.service} — Услуга (CServiceInfo)
{tariff.batch} — Группа
{tariff.price} — Цена
{tariff.vat} — НДС
{tariff.age} — Возраст
{tariff.sex} — Пол
{tariff.unit} — Единица учета (rbUnit)
{end:}

Класс «Статьи затрат»

CContractCompositionExpenseInfo
*percent — процент
*sum — сумма
*name — имя статьи затрат
*code — код статьи затрат
*isBase — является ли базовой статьей затрат
Пример:
<html>
<body>
{for: item in account.items}
<h1>{item}</h1>
<table border=»1″> <tr> <th>Затрата </th>
<th>Процент </th>
<th>Сумма </th>
</tr>
{for: expense in item.tariff.compositionExpenses}
<tr>
<td>{expense.name} ({expense.code}) </td>
<td&gt{expense.percent}% </td>
<td>{expense.sum} </td>
</tr>
{end:}
</table>
{end:}
</body>

Класс «МЭС»

CMesInfo
*code — код МЭС
*name — название МЭС
*descr

Класс «Особенности выполнения МЭС»

CMesSpecificationInfo
*code — код результата выполнения МЭС
*name — название результата выполнения МЭС
*done — флаг выполнения МЭС (логическое значение .T. соответствует выполнению МЭС)

Класс «КСГ»

Данные о КСГ можно выводить из форм ввода и контекста eventList.
{for: csg in event.csgList}
{csg.begDate} — дата начала
{csg.endDate} — дата окончалия
{csg.MKB} — код МКБ
{csg.CSGCode} — код КСГ
{csg.amount} — количество
{csg.payStatus} — статус оплаты
{end:}

Контекст «feed» (Порционник)

{recordList} — массив, каждый элемент содержит в себе:
*вид оплаты {finance}(CFinanceInfo)
*период питания {mealTime}(CMealTimeInfo)
*стол питания {diet}(CDietInfo)
*флаг патрона {isPatron} — 1, если запись о питании патрона, где каждый элемент соответствует активной галочке в графах питания пациента и патрона
{dietList}(СInfoList) — содержит в себе список всех возможных столов
{mealTimeList}(CInfoList) — содержит в себе список всех возможных периодов питания
{financeList}(CInfoList) — содержит в себе список всех возможных видов оплаты
{clientsCount} — число пациентов всего
{clientsWithFeed} — число пациентов с назначенным питанием
{patronsCount} — число патронов всего
{patronsWithFeed} — число патронов с назначенным питанием
{orgStructure} — текущее подразделение
{reportDate} — дата, выбранная в диалоге печати
{reportType} — тип порционника, выбираемый в диалоге печати

Печать из «Стационарного монитора»

В контексты печати передается rows, который является массивом, состоящим из CEventInfo и словаря с доп.данными (dop). Также передаются данные фильтра {filter}.
Фильтр — словарь, состоящий из:
*Дата начала — {filter.begDate}
*Время начала — {filter.begTime}
*Дата окончания — {filter.endDate}
*Время окончания — {filter.endTime}
*Поступили в — {filter.received}
*Тип финансирования — {filter.finance}
*Подразделение — {filter.orgStructure}
*Признак закрытого или открытого события — {filter.eventCloseType}
Далее представлены контексты печати с соответствующими им доп.данными.

Вкладка «Присутствующие»

Контекст печати «mPresence».
*Статус наблюдения пациента: код — {dop.observationCode}, имя — {dop.observationName}, цвет — {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Питание пациента: {dop.clientFeed} (номер стола)
*Питание Патрона: {dop.patronFeed}
*Комфортность: {dop.comfortableDate}
*Койка: код койки — {dop.bedCode}, название койки — {dop.bedName}
*Подразделение: {dop.orgStructure}

Вкладка «Поступили»

Контекст печати «mReceived».
*Статус наблюдения пациента: код — {dop.observationCode}, имя — {dop.observationName}, цвет — {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Койка: код койки — {dop.bedCode}, название койки — {dop.bedName}
*Питание пациента: {dop.clientFeed} (наличие или отсутствие)
*Дата госпитализации: {dop.setDate}
*Дата поступления: {dop.begDate}
*Дата выбытия: {dop.endDate}
*Подразделение: {dop.orgStructure}

Вкладка «Выбыли»

Контекст печати «mLeaved».
*Статус наблюдения пациента: код — {dop.observationCode}, имя — {dop.observationName}, цвет — {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Койка: код койки — {dop.bedCode}, название койки — {dop.bedName}
*Дата госпитализации: {dop.setDate}
*Дата поступления: {dop.begDate}
*Дата выбытия: {dop.endDate}
*Подразделение: {dop.orgStructure}
Пример:
{for: event, dop in rows}
{event.client.fullName}
{dop.orgStructure}
{end:}

Счета

*Плательщик по договору — {account.contract.payer}
*Номер договора — {account.contract.number}, {account.number}
*Дата договора — {account.contract.date}, {account.date}
*Основание договора — {account.contract.resolution}
*Реестр счёта (дата, пациент, стоимость) списком — {account.items}, {item.event}
*Элемент реестра счета {account.payedSum}
*Сумма по счёту — {account.sum}
*Cсылка на новый элемент перевыставленного счета — {item.reexposeItem}
*Ссылка из элемента перевыставленного счета на элемент предыдущего счета — {item.preexposeItem}
*Применённые коэффициенты к элементы реестра счёта .
Пример использования:
{for: item in account.items}
{for: i in item.usedCoefficients}
{i[0]} — {i[1]} — {i[2]}
{end:}
{end:}
При этом: {i[0]} — группа, {i[1]} — название коэффициента, {i[2]} — значение коэффициента.
Также для одной группы присутствует »’дополнительный коэффициент»’ с наименованием «__all__», значение которого соответствует значению всей группы.

Платные услуги (контекст localContract)

У localContract есть параметр payment (CEventPaymentInfo), который вытягивает следующие данные:
Пример использования: {for: payment in event.localContract.payment}
{payment.date} <— дата платежа —>
{payment.cashOperation} <— Кассовая операция {rbCashOperation} —>
{payment.sum} <— Сумма платежа —>
{payment.typePayment} <— Тип оплаты (наличный = 0, безналичный = 1) —>
{payment.settlementAccount} <— Расчетный счет —>
{payment.bank} <— Реквизиты банка (COrgInfo) —>
{payment.numberCreditCard} <— Номер кредитной карты —>
{payment.cashBox} <— идентификатор кассового аппарата —> {end:}

Журнал планирования профилактического наблюдения (контекст ProphylaxisPlanningList)

Текущая запись в журнале (CProphylaxisPlanningInfo):
*Код пациента: {ProphylaxisPlanning.clientId}
*Телефон: {ProphylaxisPlanning.contact}
*Пациент: {ProphylaxisPlanning.client) (CClientInfo)
*Дата и время добавления в БД: {ProphylaxisPlanning.createDatetime}
*Дата и время изменения: {ProphylaxisPlanning.modifyDatetime}
*Создал запись: {ProphylaxisPlanning.createPerson} (CPersonInfo)
*Изменил запись: {ProphylaxisPlanning.modifyPerson} (CPersonInfo)
*Дата начала (столбец «С»): {ProphylaxisPlanning.begDate}
*Дата окончания (столбец «По»): {ProphylaxisPlanning.endDate}
*Подразделение: {ProphylaxisPlanning.orgStructure} (COrgStructureInfo)
*Место: {ProphylaxisPlanning.scene} (CSceneInfo)
*Специальность: {ProphylaxisPlanning.speciality} (CSpecialityInfo)
*Врач: {ProphylaxisPlanning.person} (CPersonInfo)
*Диагноз: {ProphylaxisPlanning.diagnosis} (строка)
*Причина: {ProphylaxisPlanning.reason} (строка)
*Оповещен: {ProphylaxisPlanning.notified} (1-да, 0-нет)
*Отработан: {ProphylaxisPlanning.processed} (1-да, 0-нет)
*Талон на прием к врачу: {ProphylaxisPlanning.scheduleItem} (CScheduleItemInfo)
*Примечания: {ProphylaxisPlanning.note} (строка)
*Внешний пользователь: {ProphylaxisPlanning.externalUserId} (строка)
*Роль внешнего пользователя: {ProphylaxisPlanning.externalUserRole} (строка)
*Имя внешнего пользователя: {ProphylaxisPlanning.externalUserName} (строка)
*Удален: {ProphylaxisPlanning.deleted} (1-да, 0-нет)
*Тип планирования: {ProphylaxisPlanning.typeId} (CProphylaxisPlanningTypeInfo)
Список записей (CProphylaxisPlanningInfoList):
*Цикл по всем записям:
{for: planningInfo in ProphylaxisPlanningList}

{end:}
*Кол-во записей:
{len(ProphylaxisPlanningList)}

класс «Тип планирования» (CProphylaxisPlanningTypeInfo)

*Код: {code}
*Имя: {name}
*Дни до: {daysBefore}
*Дни после: {daysAfter}
Напечатать тип планирования для ProphylaxisPlanning:
{ProphylaxisPlanning.typeId}

Печать изображений

Свойства действия типа ActionProperty_Image и ActionProperty_ImageMap в качестве value возвращают CImageInfo.
с CImageInfo можно сделать: — преобразовано в строку (как сейчас) — возвращается HTML-тег <img …>
{prop.value:h}
— получить ширину и высоту:
Size: {prop.value.width} × {prop.value.height}
— получить отмасштабированный CImageInfo:
{ prop.value.scaled(100): h}
{prop.value.scaled(width=50, height=100) :h}
Scaled имеет четыре параметра (имя=значение_по_умолчанию # примечание):
* width=None # требуемая ширина, если 0 или None то ширина меняется сообразно масштабу
* height=None # требуемая высота, если 0 или None то высота меняется сообразно масштабу
* keepAspectRatio=False # если keepAspectRatio=True, то изображение масштабируется так, чтобы вбить картинку в новый прямоугольник без искажения пропорций; иначе картинка получает новый размер и искажается
* smoothTransformation=True # если smoothTransformation=True то при масштабировании используется сглаживание, иначе — быстрые и некрасивые вставка/пропуск пикселей.

Прививочная карта пациента

Пример текста шаблона печати из прививочной карты
{for: vaccineItem in vaccineList}
{vaccineItem.vaccine.name}
{vaccineItem.vaccinationType}
{vaccineItem.datetime}
{vaccineItem.dose}
{vaccineItem.seria}
{vaccineItem.person.shortName}
{vaccineItem.reaction.name}
{vaccineItem.transitionType.name}
{vaccineItem.relegateOrg.title}
{for: infectionItem in vaccineItem.infections}
{infectionItem.infection.code}
{infectionItem.name}
{end:}
{end:}
{for: medicalExemptionItem in medicalExemptionList}
{medicalExemptionItem.date}
{medicalExemptionItem.MKB}
{medicalExemptionItem.person.shortName}
{medicalExemptionItem.endDate}
{medicalExemptionItem.medicalExemptionType.name}
{for: infectionItem in medicalExemptionItem.infections}
{infectionItem.infection}
{end:}
{end:}

Режим «Диспансерное наблюдение»

Контекст печати surveillance.
»’Печать списка пациентов»’
{clientsInfo} — массив списка пациентов, можно пройти как по массиву, обратиться по индексу, элементы — CClientInfo
»’Печать параметров фильтров
»’
*Общие параметры отбора
{begDate} — значение параметра «Дата начала» (или «На дату» для вкладки Состоят), CDateInfo
{endDate} — значение параметра «Дата окончания», CDateInfo
{orgStructureId} — значение параметра «Подразделение врача», COrgStructureInfo
{specialityType} — значение параметра «Специальность», определение типа отбора, 0 — «Отбор по ИЛИ», 1 — «Отбор по И»
{for: spec in specialityId}
{spec.code} {spec.name}
{end:} — значение параметра «Специальность», CSpecialityInfo
{personId} — значение параметра «Врач», CPersonInfo
{MKBFilter} — значение параметра «Коды диагнозов по МКБ», определение типа фильтра, 0 — «Игнор.», 1 — «Интервал»
{MKBFrom} — значение параметра «Коды диагнозов по МКБ», определение первого значения диапазона, CMKBInfo
{MKBTo} — значение параметра «Коды диагнозов по МКБ», определение последнего значения диапазона, CMKBInfo
*Параметры отбора по пациенту
{accountingSystemId} — значение параметра «Пациент», выбор системы идентификации (может быть «не задано»), CAccountingSystemInfo
{filterClientId} — значение параметра «Пациент», информация о пациенте с выбранным идентификатором, CClientInfo
{sex} — значение параметра «Пол», пустое значение — «не задано», М, Ж
{ageFor} — значение параметра «Возраст с»
{ageTo} — значение параметра «Возраст по»
*Параметры отбора по летальности
{death} — значение параметра «Летальность», условие отбора, 0 — «не учитывать», 1 — «только живые», 2 — «только умершие»
{deathBegDate} — значение параметра «Летальность», дата начала периода отбора данных
{deathEndDate} — значение параметра «Летальность», дата окончания периода отбора данных
*Параметры отбора по прикреплению
{attachOrganisationId} — значение параметра «Прикрепление к ЛПУ», COrgInfo
{isNotAttachOrganisation} — значение параметра «Не имеет прикрепления к выбранному ЛПУ», false — имеет прикрепление к выбранному ЛПУ, true — не имеет прикрепления
к выбранному ЛПУ
{isFilterAddressOrgStructure} — значение параметра «По участку», активность фильтра, false — не отмечен, true — отмечен
{addressOrgStructureTypeId} — значение параметра «По участку», условие подбора участка, 0 — «регистрация», 1 — «проживание», 2 — «регистрация или проживание»,
3 — «прикрепление», 4 — «регистрация или прикрепление», 5 — «проживание или прикрепление», 6 — «регистрация, проживание или прикрепление»
{addressOrgStructureId} — значение параметра «По участку», подразделение прикрепления, COrgStructureInfo
*Параметры отбора по адресу
{isFilterAddress} — значение параметра «Адрес», активность фильтра, false — не отмечен, true — отмечен
{addressTypeId} — значение параметра «Адрес», условие подбора по типу адреса, 0 — «регистрации», 1 — «проживания»
{addressCityCode} — значение параметра «Адрес», населенный пункт, возвращается КЛАДР-код нас.пункта, если выбран нас.пункт
{addressCityName} — значение параметра «Адрес», населенный пункт, возвращается наименование нас.пункта и его тип, если выбран нас.пункт
{addressCitySOCR} — значение параметра «Адрес», населенный пункт, возвращается тип нас.пункта, если выбран нас.пункт
{addressOkatoCode} — значение параметра «Адрес», район, возвращается КЛАДР-код района, если выбран район
{addressOkatoName} — значение параметра «Адрес», район, возвращается наименование района, если выбран район
{KLADRStreetCodeList} — значение параметра «Адрес», список улиц, возвращается список КЛАДР-кодов улиц выбранного населенного пункта, если выбран нас.пункт
{addressStreetCode} — значение параметра «Адрес», улица, возвращается КЛАДР-код выбранной улицы, пусто — если улица не выбрана
{addressStreetName} — значение параметра «Адрес», улица, возвращается наименование выбранной улицы, пусто — если улица не выбрана
{addressStreetSOCR} — значение параметра «Адрес», улица, возвращается тип выбранной улицы, пусто — если улица не выбрана
{addressHouse} — значение параметра «Адрес», номер дома
{addressCorpus} — значение параметра «Адрес», номер корпуса
{addressFlat} — значение параметра «Адрес», номер квартиры
*Параметры отбора по соц.статусу
{isSocStatuses} — значение параметра «Соц.статус», активность фильтра, false — не отмечен, true — отмечен
{socStatusesBegDate} — значение параметра «Соц.статус», дата начала периода отбора, CDateInfo
{socStatusesEndDate} — значение параметра «Соц.статус», дата окончания периода отбора, CDateInfo
{socStatusesClass.code} — значение параметра «Соц.статус», код класса соц.статуса
{socStatusesClass.name} — значение параметра «Соц.статус», наименование класса соц.статуса
{socStatusesType.code} — значение параметра «Соц.статус», код типа соц.статуса
{socStatusesType.name} — значение параметра «Соц.статус», наименование типа соц.статуса
*Параметры отбора по обращениям
{isFilterEvent} — значение параметра «Обращения», активность фильтра, false — не отмечен, true — отмечен
{isEventVisitDiagnosis} — значение параметра «по Диспансерному наблюдению», активность фильтра, false — не отмечен, true — отмечен
{eventVisitType} — значение параметра «Обращения», условие отбора, 0 — «обращались», 1 — «не обращались»
{eventBegDate} — значение параметра «Обращения», дата начала периода отбора, CDateInfo
{eventEndDate} — значение параметра «Обращения», дата окончания периода отбора, CDateInfo

Режим «Централизованный учет»

Контекст печати »’CentralizedAccountingDialog»’
eventList — список всех событий пациентов, данные которых используются в окне «Централизованного учета» (далее — ЦУ).
selectedEvents — список всех событий выделенных пациентов, данные которых используются в окне ЦУ.
{for: ev in eventList/selectedEvents}
доступ ко всем атрибутам события, его действий и их свойств (CCentralizedAccountingEventInfo)
{ev.client} — данные о пациенте (CСlientInfo)
{ev.hospitalBedOrgStructure} — данные о подразделении пребывания пациента (COrgStructureInfo)
{end:}
actions — список действий одного выбранного пациента, которые отображаются в окне ЦУ.
{for: act in actions}
доступ ко всем атрибутам действий и их свойств (CActionInfo)
{end:}

Режим «Складской учет»

Вкладка «Движение» (контекст StockMotions)

*Вывод информации по всем документам в списке
{for: item in motionsList}
{item.type} — тип документа
{item.number} — номер документа
{item.date} — дата документа
{item.reason} — основание документа
{item.reasonDate} — дата основания
{item.receiver} — подразделение-получатель
{item.supplier} — подразделение-поставщик
{item.note} — примечание
{item.client} — пациент
{item.supplierPerson} — ответственный сотрудник от подразделения-поставщика
{item.receiverPerson} — ответственный сотрудник от подразделения-получателя
{item.supplierOrgPerson} — ответственный от внешнего постащика
{item.supplierOrg} — внешний поставщик
{for: it in item.items} — информация по каждой позиции в документе
{it.price} — цена
{it.sum} — сумма
{it.qnt} — количество
{it.batch} — серия
{it.isOut} — 0, если исходный материал, 1, если результат (для документов типа «Производство»)
{it.shelfTime} — годен до
{it.finance} — тип финансирования
{it.unit.code} — код ед.измерения
{it.unit.name} — наименование ед.измерения
{it.reason.code} — код причины утилизации (для документов типа «Утилизация»)
{it.reason.name} — наименование причины утилизации (для документов типа «Утилизация»)
{it.note} — примечание
{it.nomenclature.code} — код ЛСиИМН
{it.nomenclature.name} — ТН на русском ЛСиИМН
{it.nomenclature.RegionalCode} — региональный код ЛСиИМН
{it.nomenclature.type.code} — код типа ЛСиИМН
{it.nomenclature.type.name} — наименование типа ЛСиИМН
{it.nomenclature.internationalNonproprietaryName} — МНН на русском ЛСиИМН
{it.nomenclature.producer} — производитель ЛСиИМН
{it.nomenclature.ATC} — код по АТХ ЛСиИМН
{it.nomenclature.packSize} — объем упаковки ЛСиИМН
{it.nomenclature.mnnCode} — код по МНН ЛСиИМН
{it.nomenclature.trnCode} — код по ТРН ЛСиИМН
{it.nomenclature.dosageValue} — дозировка ЛСиИМН
{it.nomenclature.dosageUnit} — единица дозировки ЛСиИМН
{it.nomenclature.lfForm.code} — код формы выпуска ЛСиИМН
{it.nomenclature.lfForm.name} — наименование формы выпуска ЛСиИМН
{it.nomenclature.inDate} — дата включения ЛСиИМН
{it.nomenclature.exDate} — дата исключения ЛСиИМН
{it.nomenclature.completeness} — комплектность ЛСиИМН
{it.nomenclature.mnnLatin} — МНН на латинском ЛСиИМН
{it.nomenclature.originName} — ТН на латинском ЛСиИМН
{for: key in it.nomenclature.features} — характеристики ЛСиИМН
{key}
([for: data in it.nomenclature.features[key]}
{data}
{end:})
{end:}
{for: analog in it.nomenclature.analogues} — аналоги ЛСиИМН
{analog.name}
{end:}
{end:}
{end:}
{for: comp in it.nomenclature.composition} — состав ЛСиИМН
{it.idx}
{it.nomenclature.type}
{it.nomenclature.activeSubstance} (CNomenclatureActiveSubstanceInfo)
{end:}
*Вывод информации по выделенным документам в списке
{for: item in selectedMotionsList} — вывод информации по выделенным документам в списке

{end:}
*Документ «Внутреннее потребление» (контекст StockInternalConsumption)
{for: row in rows}
{row.sum} — сумма
{row.qnt} — количество
{row.nomenclature} — номенклатура
{row.batch} — серия
{row.isOut} — 0, если исходный материал, 1, если результат (для документов типа «Производство»)
{row.note} — примечание
{row.shelfTime} — годен до
{row.finance} — тип финансирования
{row.unit} — ед.измерения
{row.price} — цена
{row.medicalAidKind} — профиль медицинской помощи
{number} — номер документа
{date} — дата документа
{supplier} — подразделение-поставщик
{supplierPerson} — ответственный сотрудник от подразделения-поставщика
{note} — примечание
{end:}
*Документ «Утилизация» (контекст StockUtilization)
{for: row in rows}
<tr>
<td>{row.sum}</td> — сумма
<td>{row.qnt}</td> — количество
<td>{row.nomenclature}</td> — номенклатура
<td>{row.batch}</td> — серия
<td>{row.shelfTime}</td> — Годен до
<td>{row.finance}</td> — тип финансирования
<td>{row.unit}</td> — ед. учета
<td>{row.reason}</td> — причина утилизации
<td>{row.price}</td> — цена
<td>{row.medicalAidKind}</td> — вид медицинской помощи
<td>{row.disposalMethod.code}</td> — код способа утилизации
<td>{row.disposalMethod.name}</td> — наименование способа утилизации
<td>{number}</td> — Номер документа
<td>{date}</td> -Дата
<td>{time}</td> — время
<td>{supplier}</td> — Подразделение
<td>{supplierPerson}</td> — Ответственный
<td>{note}</td> — Примечания
</tr>
{end:}
* Сведения о составе комиссии для документа «Утилизация» (контекст StockUtilization)
{for: item in commission}
<td>{item.person} — Фамилия И.О. и специальность члена комиссии
<td>{item.postName} — Роль в комиссии (Председатель, Утверждающий, Член комиссии)
{end:}
*Документ «Производство» (контекст InventoryList)
*Документ «Инвентаризация» (контекст InventoryList)
{Inventory.number} — номер
{Inventory.date} — дата
{Inventory.reason} — основание
{Inventory.reasonDate} — дата основания
{Inventory.receiver}/{Inventory.supplier} — подразделение
{Inventory.receiverPerson}/{Inventory.supplierPerson} — ответственный
{Inventory.note} — примечания
{for: it in Inventory.items}
{it.nomenclature} — ЛСиИМН
{it.batch} — серия
{it.shelfTime} — годен до
{it.finance} — тип финансирования
{it.medicalAidKind} — вид медицинской помощи
{it.oldQnt} — кол-во по документам
{it.oldPrice} — цена по документам
{it.oldSum} — сумма по документам
{it.unit} — ед. учета
{it.qnt} — фактическое количество
{it.price} — фактическая цена
{it.sum} — фактическая сумма
{it.note} — примечание
{end:}
* Сведения о составе комиссии для документа «Инвентаризация»
{for: item in CommissionList}
<td>{item.person}</td> — Фамилия И.О. и специальность члена комиссии
<td>{item.postName}</td> — Роль в комиссии (Председатель, Утверждающий, Член комиссии)
{end:}
* Вкладка «Остатки» (контекст StockRemainings)
{remainingsFilterDate} — на дату
{for: item in remainingsList}
{item.orgStructure} — подразделение
{item.nomenclature._} — аналогично it.nomenclature._ на вкладке «Движение»
{item.batch} — серия
{item.qnt} — количество
{item.shelfTime} — годен до
{item.finance} — тип финансирования
{item.unit.code} — код ед.измерения
{item.unit.name} — наименование ед. измерения
{item.sum} — сумма
{end:}

Вкладка «Мои требования» (контекст StockMyRequisitions) и «Требования ко мне» (контекст StockRequirementsToMe)

*Вывод информации по всем документам в списке
{for: item in requisitionsList}
{item.number} — номер требования
{item.date} — дата требования
{item.deadline} — срок исполнения требования
{item.receiver} — подразделение-заказчик по требованию
{item.recipientPerson} — ответственный подразделения-заказчика по требованию
{item.supplier} — подразделение-поставщик по требованию
{item.note} — примечание
{agreementDate} — Дата согласования
{agreementPerson} — Кто согласовал
{agreementStatus} — Статус согласования (0-Не согласовано, 1-Согласовано, 2-Отклонено)
{agreementNote} — Примечание к согласованию
{for: it in item.items} — информация по каждой позиции в требовании
{it.nomenclature._} — аналогично it.nomenclature._ на вкладке «Движение»
{it.finance} — тип финансирования
{it.qnt} — затребованное количество
{it.satisfiedQnt} — отпущенное количество
{it.unit.code} — код ед.измерения
{it.unit.name} — наименование ед. измерения
{end:}
{end:}
*Вывод информации по выделенным документам в списке
{for: item in selectedRequisitionsList} — вывод информации по выделенным документам в списке

{end:}
*Связь с накладными по требованиям
{for: item in requisitionsList}
{for: motion in item.motions} — накладная по требованию (см. цикл по motionsList на вкладке «Движение»)
{for: pos in motion.items} — позиция накладной (см. цикл по item.items на вкладке «Движение»)

{end:}
{end:}
{end:}

Вкладка «Идентификация»

Вкладка идентификация присутствует в большинстве таблиц.
Используя функцию »’.identify»’ можно получить идентификатор по указанному в скобках справочнику.
Пример получения идентификатора по справочнику должностей oid:1.2.643.5.1.13.13.11.1002:
{action.person.post»’.identify»'(‘urn:oid:1.2.643.5.1.13.13.11.1002’)
Пример получения идентификатора подразделения по справочнику «Справочник МО» oid:1.2.643.2.69.1.1.1.64′:
{:urn = »}
{:currentOrgStr = event.execPerson.orgStructure}
{if: currentOrgStr}
{while: currentOrgStr.id}
{:urn = currentOrgStr.identify(‘urn:oid:1.2.643.2.69.1.1.1.64’)}
{if: urn}
{break:}
{else:}
{:currentOrgStr = currentOrgStr.parent}
{end:}
{end:}
{end:}
{urn}
Обратите внимание, что в данном примере если у подразделения лечащего врача случая обслуживания не выполнена настройка идентификации, то пытаемся определить идентификацию вышестоящего подразделения, а если у него нет, то у его вышестоящего и т.д.

Внешние учетные системы

При необходимости получить в шаблоне печати информацию о внешней учетной системе (например, версию для СЭМД) можно использовать следующую функцию:
{:from PyQt4 import QtGui}
{def: getLastVersion(urn)}
{:db = QtGui.qApp.db}
{:table = db.table(‘rbAccountingSystem’)}
{:version = db.getMax(table, ‘version’, table[‘urn’].eq(urn))}
{:return unicode(version.toString()) if version else u»}
{end:}
{getLastVersion(u’urn:oid:1.2.643.5.1.13.13.11.1060′)}
Если необходимо указать только «чистый» OID, то можно использовать .like():
{:from PyQt4 import QtGui}
{def: getLastVersion(urn)}
{:db = QtGui.qApp.db}
{:table = db.table(‘rbAccountingSystem’)}
{:version = db.getMax(table, ‘version’, table[‘urn’].like(urn))}
{:return unicode(version.toString()) if version else u»}
{end:}
{getLastVersion(u’%1.2.643.2.69.1.1.1.195%’)}
Для получение актуальной версии конкретной внешней учетной системы

Класс «Организация» COrgInfo

Текущая организация: {currentOrganisation} (COrgInfo) имеет свойства:
• Полное название:{currentOrganisation.fullName}
• Сокращенное название:{currentOrganisation.shortName}
• Для печати:{currentOrganisation.title}
• Сеть:{currentOrganisation.net}
• ИНФИС-код:{currentOrganisation.infisCode}
• ОКВЭД:{currentOrganisation.OKVED}
• ИНН:{currentOrganisation.INN}
• ОКПО:{currentOrganisation.OKPO}
• КПП:{currentOrganisation.KPP}
• ОГРН:{currentOrganisation.OGRN}
• ОКАТО:{currentOrganisation.OKATO}
• ОКФС:{currentOrganisation.OKPF}
• ФСС:{currentOrganisation.FSS}
• Регион:{currentOrganisation.region}
• Адрес (свободный ввод):{currentOrganisation.addressFreeInput}
• Код КЛАДР:{currentOrganisation.address.KLADRCode}
• Код КЛАДР улицы:{currentOrganisation.address.KLADRStreetCode}
• GUID FIAS улицы:{currentOrganisation.address.FIASStreetGUID}
• ФИО Шефа:{currentOrganisation.chief}
Теперь в COrgInfo есть два поля:
— chief (CPersonInfo)
— chiefFreeInput (строка)
А также функция formatChief().
Выводит chiefFreeInput, если нет Organisation.chief_id, а если есть, то выводит ФИО врача и должность.
Функция всегда возвращает строку.
Например: {currentOrganisation.formatChief()}
• Телефон:{currentOrganisation.phone}
• Адрес эл. почты:{currentOrganisation.email}
• ФИО Гл.бухгалтера:{currentOrganisation.accountant}
• примечание:{currentOrganisation.notes}

Вкладка «Лицензии» (контекст COrgLicenseInfo)

• Номер лицензии: {COrgLicenseInfo.number}
• Кем выдана: {COrgLicenseInfo.issuer}
• Дата выдачи: {COrgLicenseInfo.issueDate}
• Начало действия: {COrgLicenseInfo.begDate}
• Окончание действия: {COrgLicenseInfo.endDate}

Окно «Планирование профилактического наблюдения»

Контекст печати surveillancePlanning
*Сведения о пациенте: client(CClientInfo)
*Сведения о случае диспансерного наблюдения пациента (блок «Планирование профилактического наблюдения» в окне «Планирование профилактического наблюдения»)
planningSurveillances(CProphylaxisPlanningInfoProxyList):
{for: planningSurveillance in planningSurveillances}
{planningSurveillance.diagnosis} (CMKBInfo) — МКБ
{planningSurveillance.dispanser} — ДН
{planningSurveillance.takenDate} — Дата взятия
{planningSurveillance.person} (CPersonInfo) — Врач
{planningSurveillance.removeDate} — Дата снятия
{planningSurveillance.removeReason} — Причина снятия
{end:}
*Сведения о периодах случая диспансерного наблюдения пациента (блок «Планирование и контроль посещений» в окне «Планирование профилактического наблюдения»)
controlSurveillances(CProphylaxisPlanningInfoProxyList):
{for: controlSurveillance in controlSurveillances}
{controlSurveillance.diagnosis} (CMKBInfo) — МКБ
{controlSurveillance.plannedDate} — Дата планирования
{controlSurveillance.begDate} — Дата начала периода
{controlSurveillance.endDate} — Дата окончания периода
{controlSurveillance.person} (CPersonInfo) — Врач
{controlSurveillance.visit.date} (CVisitInfo) — Явился
{controlSurveillance.removeDate} — Дата снятия
{controlSurveillance.removeReason} — Причина снятия
{end:}

Окно «Контрольная карта»

Открывается по кнопке «Печать» в окне «Планирование профилактического наблюдения».
Контекст печати surveillancePlanningCard
*Сведения о пациенте: client(CClientInfo)
*Сведения о случае диспансерного наблюдения пациента (блок «Диагноз» в «Контрольной карте»)
planningSurveillances(CProphylaxisPlanningInfoProxyList):
{for: planningSurveillance in planningSurveillances}
{planningSurveillance.diagnosis} (CMKBInfo) — МКБ
{planningSurveillance.dispanser} — ДН
{planningSurveillance.takenDate} — Дата взятия
{planningSurveillance.person} (CPersonInfo) — Врач
{planningSurveillance.removeDate} — Дата снятия
{planningSurveillance.removeReason} — Причина снятия
{end:}
*Сведения о периодах случая диспансерного наблюдения пациента (блок «Контроль посещений» в «Контрольной карте»)
controlSurveillances(CProphylaxisPlanningInfoProxyList):
{for: controlSurveillance in controlSurveillances}
{controlSurveillance.diagnosis} (CMKBInfo) — МКБ
{controlSurveillance.plannedDate} — Дата планирования
{controlSurveillance.begDate} — Дата начала периода
{controlSurveillance.endDate} — Дата окончания периода
{controlSurveillance.person} (CPersonInfo) — Врач
{controlSurveillance.visit.date} (CVisitInfo) — Явился
{controlSurveillance.removeDate} — Дата снятия
{controlSurveillance.removeReason} — Причина снятия
{end:}
*Сведения о мероприятиях случая диспансерного наблюдения пациента (отмеченные мероприятия в блоке «Лечебно-профилактические мероприятия» в «Контрольной карте»)
measuresActionsSelected (CActionSelectedInfoProxyList, CActionInfo):
{for: action in measuresActionsSelected}
{action.name} — Наименование
{action.directionDate} — Назначено
{action.begDate} — Начато
{action.endDate} — Окончено
{action.person} (CPersonInfo) — Выполнил

{end:}

Формирование CDA документа

При необходимости после подписания и прикрепления документа также сформировать CDA документ в формате XML необходимо использовать функцию addSupplement:
{: addSupplement(‘xml’, formatByTemplate(‘CDA_CERT_NOT_INF’, ‘CDA’)) }
xml — формат документа
CDA_CERT_NOT_INF — имя соответствующего шаблона печати, по которому должен быть сформирован CDA документ
CDA — контекст соответствующего шаблона печати, по которому должен быть сформирован CDA документ
В случае, если при формировании СЭМД является критичным наличие в теле документа идентификатора случая обслуживания, то можно воспользоваться настройкой «Требует идентификатор события» шаблона печати, которая блокирует формирование превью шаблона до сохранения случая обслуживания в БД (т.е. до присвоения ему идентификатора).

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

© 2026 ADMINMED.ru

Login





Loading...

Top.Mail.Ru
👁 0
  Яндекс.Метрика