|
Шаблон медицинского документа | ☑ | ||
---|---|---|---|---|
0
1С-ница
21.07.14
✎
11:52
|
Платформа 8.3.4.465
Конфигурация 1С Медицина Поликлиника (1.3.1.3) ИТС нет, техподдержка не отвечает Есть Шаблон медицинского документа "Первичные прием терапевта", я его упр форму благополучно поменяла под нас, изменила макет (пока незначительно), не могу найти где заполняются параметры. Конфигурация специализированная, возможно кто то работал / работает с ней |
|||
1
1С-ница
21.07.14
✎
11:55
|
У медицинского документа, который формируется из этого шаблона, есть реквизит ТелоМедицинскогоДокумента, тип которого ХранилищеЗначения. В отладчике он представляет собой xml, в котором уже заполнены параметры (для первичного приема терапевта). Не могу найти, где этот xml заполняется.
|
|||
2
acsent
21.07.14
✎
12:01
|
Может "ОбработкаЗаполнения"
|
|||
3
Fish
21.07.14
✎
12:10
|
(1) Тут только отладчиком смотреть по шагам, где эти параметры появляются.
|
|||
4
1С-ница
21.07.14
✎
12:43
|
ТелоМД = ШаблоныМедицинскихДокументовПоликлиника.ПолучитьТелоМедицинскогоДокумента(МД)
Вот тут они уже заполнены. Откуда появляются не понятно (раньше ничего нет) |
|||
5
Fish
21.07.14
✎
13:43
|
(4) А что внутри этой функции?
|
|||
6
Фокусник
21.07.14
✎
13:45
|
(4) Заполняются в общем модуле:
ШаблоныМедицинскихДокументовПоликлиника в функции ПолучитьТелоМедицинскогоДокумента() ;) |
|||
7
f_vadim
21.07.14
✎
13:46
|
(4) Жать F12 на ПолучитьТелоМедицинскогоДокумента.
После получения тела - радоваться :) |
|||
8
1С-ница
21.07.14
✎
14:14
|
(7)
Функция ПолучитьТелоМедицинскогоДокумента(МедицинскийДокумент) Экспорт Возврат МедицинскийДокумент.ТелоМедицинскогоДокумента.Получить(); КонецФункции |
|||
9
f_vadim
21.07.14
✎
14:25
|
(8)
Отладчиком смотреть что такое МедицинскийДокумент и его ТелоМедицинскогоДокумента. |
|||
10
1С-ница
21.07.14
✎
14:48
|
Там еще есть Визуализаторы в xml, в них по ходу все и заполняется
|
|||
11
1С-ница
21.07.14
✎
15:08
|
(6) не подскажите где конкретно? не нашла
|
|||
12
1С-ница
21.07.14
✎
16:52
|
Ап
|
|||
13
f_vadim
21.07.14
✎
17:16
|
(11) нашла же. в (8)
получилось (9)? |
|||
14
Wobland
21.07.14
✎
17:20
|
(11) внезапно в МедицинскийДокумент.ТелоМедицинскогоДокумента.Получить();
|
|||
15
1С-ница
22.07.14
✎
09:56
|
(13) Я уже писала, что ТелоМедицинскогоДокумента это xml файл, в котором уже все параметры есть
|
|||
16
f_vadim
22.07.14
✎
10:00
|
(15) а МедицинскийДокумент? тип "ДокументСсылка"? Тогда нужно смотреть модуль и реквизиты документа.
|
|||
17
1С-ница
22.07.14
✎
10:15
|
(16) МедицинскийДокумент? тип "ДокументСсылка"? - да
Реквизит ТелоДокумента - тип Хранилище значения |
|||
18
f_vadim
22.07.14
✎
10:19
|
(17) вооот, теперь нужно найти кто его заполняет. Предположу, что в модуле документа (модуль объекта) есть некая процедура, которая пишет в тело заполненый xml. Возможно при записи.
|
|||
19
1С-ница
22.07.14
✎
10:23
|
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// если не указан текст документа, то читаем его из объекта (понадобится при перепроведении) Если НЕ ЭтотОбъект.ДополнительныеСвойства.Свойство("ТекстДокументаПрограммногоСобытия") Тогда ШаблоныМедицинскихДокументовПоликлиника.ОбъектМДДляПрограммныхСобытий( ЭтотОбъект, ЭтотОбъект.ТелоМедицинскогоДокумента.Получить() ); КонецЕсли; |
|||
20
f_vadim
22.07.14
✎
10:25
|
а дальше?
|
|||
21
1С-ница
22.07.14
✎
10:26
|
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Ответственный = Пользователи.ТекущийПользователь(); ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый()); ДополнительныеСвойства.Вставить("РежимЗаписи", РежимЗаписи); ДополнительныеСвойства.Вставить("УдаляемыеВыполненныеУслуги", Новый Массив); ДополнительныеСвойства.Вставить("УдаляемыеНазначенныеУслуги", Новый Массив); // если не указан текст документа, то читаем его из объекта (понадобится при перепроведении) Если НЕ ЭтотОбъект.ДополнительныеСвойства.Свойство("ТекстДокументаПрограммногоСобытия") Тогда ШаблоныМедицинскихДокументовПоликлиника.ОбъектМДДляПрограммныхСобытий( ЭтотОбъект, ЭтотОбъект.ТелоМедицинскогоДокумента.Получить() ); КонецЕсли; Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ТекстДокументаПрограммногоСобытия") Тогда ПрограммныеСобытия.ОповеститьОПрограммномСобытии( "ПередЗаписьюМедицинскогоДокумента", ЭтотОбъект, ЭтотОбъект.ДополнительныеСвойства.ТекстДокументаПрограммногоСобытия, ЭтотОбъект.ДополнительныеСвойства.ДанныеПрограммногоСобытия, ЭтотОбъект.ДополнительныеСвойства.ДанныеШМДПрограммногоСобытия, Отказ, РежимЗаписи, РежимПроведения ); Если Отказ Тогда Возврат; КонецЕсли; КонецЕсли; Если Не ЗначениеЗаполнено(Дата) Тогда Дата = ТекущаяДатаСеанса(); КонецЕсли; Если ЗначениеЗаполнено(ЭтотОбъект.МедицинскаяКарта) И Не ЗначениеЗаполнено(ЭтотОбъект.Пациент) Тогда ЭтотОбъект.Пациент = ЭтотОбъект.МедицинскаяКарта.Пациент; КонецЕсли; Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда УстановкаТранзакционнойБлокировки(); Если ЗначениеЗаполнено(ЭтотОбъект.МедицинскаяКарта) И ЭтотОбъект.МедицинскаяКарта.Пациент <> ЭтотОбъект.Пациент Тогда Отказ = Истина; СообщенияПользователю.Показать( "ОформлениеЗаказов_ПациентКартыИПациентВРеквизитеНеСовпадают", Новый Структура("ПациентКарты,Пациент", ЭтотОбъект.МедицинскаяКарта.Пациент, ЭтотОбъект.Пациент), Истина ); Возврат; КонецЕсли; Найденные = Исполнители.НайтиСтроки(Новый Структура("ОтветственныйЗаНазначение",Истина)); Если Найденные.Количество() <> 1 Тогда Справочники.СообщенияПользователю.СообщитьПользователю( Справочники.СообщенияПользователю.МедицинскийДокумент_ОдинИсполнительДолженБытьОтветственным,,,,Истина); Отказ = Истина; Возврат; КонецЕсли; Для Каждого строкаТЧ_ Из ЭтотОбъект.ДиагнозыПоМКБ10 Цикл Отбор_ = Новый Структура("УникальныйИдентификаторУслуги,КлючСтрокиСоставаУслуги,ТипДиагноза", строкаТЧ_.УникальныйИдентификаторУслуги, строкаТЧ_.КлючСтрокиСоставаУслуги, Перечисления.ТипыДиагнозовПациента.Основной ); Найденные_ = ЭтотОбъект.ДиагнозыПоМКБ10.НайтиСтроки(Отбор_); Если ЭтотОбъект.ДиагнозыПоМКБ10.Количество() > 0 И Найденные_.Количество() <> 1 Тогда СообщенияПользователю.Показать("МедицинскийДокумент_ДолженБытьОдинОсновнойДиагноз",,Истина); Отказ = Истина; Возврат; КонецЕсли; КонецЦикла; КонецЕсли; Если РежимЗаписи = РежимЗаписиДокумента.Проведение И ЭтотОбъект.Проведен Тогда // Перепроведение ПараметрыОтбора = Новый Структура("УникальныйИдентификаторУслуги,КлючСтрокиСоставаУслуги"); Для Каждого СтрокаТЧ Из ЭтотОбъект.Ссылка.ВыполненныеУслуги Цикл ПараметрыОтбора.УникальныйИдентификаторУслуги = СтрокаТЧ.УникальныйИдентификаторУслуги; ПараметрыОтбора.КлючСтрокиСоставаУслуги = СтрокаТЧ.КлючСтрокиСоставаУслуги; НайденныеСтроки = ЭтотОбъект.ВыполненныеУслуги.НайтиСтроки(ПараметрыОтбора); Если НайденныеСтроки.Количество() = 0 Тогда // Эту строку удалили из тч документа => нужно изменить статус услуги на исходный ДополнительныеСвойства.УдаляемыеВыполненныеУслуги.Добавить( Новый Структура( "УникальныйИдентификаторУслуги,ИсходныйСтатус,КлючСтрокиСоставаУслуги", СтрокаТЧ.УникальныйИдентификаторУслуги, СтрокаТЧ.ИсходныйСтатус, СтрокаТЧ.КлючСтрокиСоставаУслуги) ); КонецЕсли; КонецЦикла; ПараметрыОтбора = Новый Структура("УникальныйИдентификаторУслуги"); Для Каждого СтрокаТЧ Из ЭтотОбъект.Ссылка.НазначенныеУслуги Цикл ПараметрыОтбора.УникальныйИдентификаторУслуги = СтрокаТЧ.УникальныйИдентификаторУслуги; НайденныеСтроки = ЭтотОбъект.НазначенныеУслуги.НайтиСтроки(ПараметрыОтбора); Если НайденныеСтроки.Количество() = 0 Тогда // Эту строку удалили из тч НазначенныеУслуги документа => нужно удалить ее из регистра СтатусыУслуг ДополнительныеСвойства.УдаляемыеНазначенныеУслуги.Добавить( Новый Структура( "УникальныйИдентификаторУслуги", СтрокаТЧ.УникальныйИдентификаторУслуги) ); КонецЕсли; КонецЦикла; Для Каждого СтрокаТЧ_ Из ЭтотОбъект.ВыполненныеУслуги Цикл ПараметрыОтбора.УникальныйИдентификаторУслуги = СтрокаТЧ_.УникальныйИдентификаторУслуги; НайденныеСтроки_ = ЭтотОбъект.Ссылка.ВыполненныеУслуги.НайтиСтроки(ПараметрыОтбора); Если НайденныеСтроки_.Количество() = 0 Тогда // В ТЧ появились новые строки СтрокаТЧ_.ИсходныйСтатус = УправлениеЗаказамиУслугами.ПолучитьСтатусУслуги( СтрокаТЧ_.УникальныйИдентификаторУслуги); КонецЕсли; КонецЦикла; ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Для Каждого СтрокаТЧ из ЭтотОбъект.ВыполненныеУслуги Цикл СтрокаТЧ.ИсходныйСтатус = УправлениеЗаказамиУслугами.ПолучитьСтатусУслуги( СтрокаТЧ.УникальныйИдентификаторУслуги); КонецЦикла; КонецЕсли; Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда //Заполним реквизит Организация. Возьмем его из заказа. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | СтатусыУслуг.Заказ.Организация КАК Организация |ИЗ | РегистрСведений.СтатусыУслуг КАК СтатусыУслуг |ГДЕ | СтатусыУслуг.УникальныйИдентификаторУслуги В(&УникальныеИдентификаторыУслуг) | И СтатусыУслуг.Заказ.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)"; УникальныеИдентификаторыУслуг_ = ЭтотОбъект.ВыполненныеУслуги.ВыгрузитьКолонку("УникальныйИдентификаторУслуги"); Запрос.УстановитьПараметр("УникальныеИдентификаторыУслуг", УникальныеИдентификаторыУслуг_); Организации_ = Запрос.Выполнить().Выгрузить(); Если Организации_.Количество() > 1 Тогда Справочники.СообщенияПользователю.СообщитьПользователю( Справочники.СообщенияПользователю.МедицинскийДокумент_УслугиЗаказовРазныхОрганизаций, Новый Структура("Организация1,Организация2",Организации_[0].Организация, Организации_[1].Организация) ); ИначеЕсли Организации_.Количество() = 1 Тогда Если ЗначениеЗаполнено(Организации_[0].Организация) Тогда ЭтотОбъект.Организация = Организации_[0].Организация; КонецЕсли; КонецЕсли; КонецЕсли; ПроведениеСерверПереопределяемый.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения); КонецПроцедуры |
|||
22
1С-ница
22.07.14
✎
10:27
|
Я так понимаю, тело документа заполняется раньше.
|
|||
23
f_vadim
22.07.14
✎
10:29
|
пока не ясно, а в ПриЗаписи, и ОбработкаПроведения есть что-нибудь по теме?
|
|||
24
1С-ница
22.07.14
✎
10:32
|
В обработке проведения нету ничего по теме, ПриЗаписи - нет такой процедуры
|
|||
25
Trotter
22.07.14
✎
10:34
|
Предлагаю, поставить точку остановки при запуске системы, и пробежаться по функциям.
|
|||
26
Trotter
22.07.14
✎
10:35
|
как говорит наш консультант которому пока не предложили денег за консультацию "вы понимаете, это как человека лечить по телефону" ))
|
|||
27
Trotter
22.07.14
✎
10:35
|
но после денег можно и по телефону )
|
|||
28
lodger
22.07.14
✎
10:36
|
ПриЗаписи это в модуле формы. ПередЗаписью там же глянуть можно.
еще поглядеть ПриСозданииНаСервере, ПриОткрытии. и модуль объекта на заполнение потрясти(инициируется еще до создания формы). |
|||
29
f_vadim
22.07.14
✎
10:37
|
(24) тады поискать по модулям документа "ТелоМедицинскогоДокумента"
|
|||
30
f_vadim
22.07.14
✎
10:37
|
потом можно глобальным поиском пройтись
|
|||
31
1С-ница
22.07.14
✎
10:47
|
Общий модуль:
//// // Функция: УстановитьДокумент // Устанавливает медицинский документ в ПолеHTMLДокумент (предварительно // преобразовав его из CDA в HTML). // // Параметры: // ТелоДокумента_ (Строка) // Документ в формате CDA HL 7. Если НеОпределено тогда устанавливает теломедицинского документа из // // Возврат: // Истина, всё прошло удачно. // Ложь, не удалось установить документ. /// &НаСервере Функция УстановитьДокумент(ЭтаФорма, ДинПоле, ТелоДокумента_ = Неопределено) Экспорт Перем ИдентификаторДокумента_; Попытка ИдентификаторДокумента_ = ДинамическоеПолеФормы.ПолучитьРеквизит(ЭтаФорма, ДинПоле, "ИдентификаторДокумента"); Если ТелоДокумента_ = Неопределено Тогда Если ТипЗнч(ИдентификаторДокумента_) = Тип("ДокументСсылка.МедицинскийДокумент") И НЕ ИдентификаторДокумента_.Пустая() Тогда ТелоДокумента = ИдентификаторДокумента_.ТелоМедицинскогоДокумента.Получить(); КонецЕсли; Иначе ТелоДокумента = ТелоДокумента_; КонецЕсли; // проверяем, есть ли в XML тэг ClinicalDocument1C (если есть, то будем считать, что документ // поддерживает усеченный-полный, иначе - нет) ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ТелоДокумента); Если ЧтениеXML.Прочитать() Тогда Если Найти(ЧтениеXML.ЛокальноеИмя, "ClinicalDocument1C") > 0 Тогда ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ЕстьУсеченный", Истина); Иначе ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ЕстьУсеченный", Ложь); ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ПолныйДокумент", Истина); КонецЕсли; КонецЕсли; // чтобы заново нормально отработало событие ДокументСформирован устанавливаем счетчик в ноль ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ДокументСформирован", Ложь); // если идентификатордокумента не является ссылкой на документ, то будем считать, что просматривается документ // в режиме тестирования, а значит базовый адрес будет на временное хранилище Если ИдентификаторДокумента_ = Неопределено ИЛИ ИдентификаторДокумента_ = "" ИЛИ ИдентификаторДокумента_.Пустая() Тогда БазовыйАдрес_ = "../../e1cib/tempstorage/"; Иначе БазовыйАдрес_ = ШаблоныМедицинскихДокументовПереопределяемый.ОпределитьБазовыйАдрес(ИдентификаторДокумента_); КонецЕсли; РезультатПреобразования = ШаблоныМедицинскихДокументов.CDA2HTML( ТелоДокумента, ДинамическоеПолеФормы.ПолучитьРеквизит(ЭтаФорма, ДинПоле, "Визуализатор"), БазовыйАдрес_, ШаблоныМедицинскихДокументовПереопределяемый.ДокументГотов(ИдентификаторДокумента_), ДинамическоеПолеФормы.ПолучитьРеквизит(ЭтаФорма, ДинПоле, "ПолныйДокумент") ); //// Делаем "финт ушами", который избавляет от очередного бага 1С РезультатПреобразования = СтрЗаменить(РезультатПреобразования, "<?xml version=""1.0""?>", ""); Ссылка = ПоместитьВоВременноеХранилище( РезультатПреобразования, ЭтаФорма.УникальныйИдентификатор ); ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ТекстДокумента", ШаблоныМедицинскихДокументов.СделатьАбсолютнуюНавигационнуюСсылку( Ссылка, "text/html" ) ); ДинамическоеПолеФормы.УстановитьРеквизит(ЭтаФорма, ДинПоле, "ТелоМедицинскогоДокумента", ТелоДокумента ); Исключение Инфо = ИнформацияОбОшибке(); ЗаписьЖурналаРегистрации( "ДинПолеОтображениеМД.УстановитьДокумент", УровеньЖурналаРегистрации.Ошибка, , ИдентификаторДокумента_, ПодробноеПредставлениеОшибки(Инфо) ); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции |
|||
32
Trotter
22.07.14
✎
10:50
|
я так понимаю оно лежит тута ?
БазовыйАдрес_ = "../../e1cib/tempstorage/"; |
|||
33
lodger
22.07.14
✎
11:02
|
(31) сюда копайте. где и кто этот CDA2HTML, видимо там есть объект CDA?
РезультатПреобразования = ШаблоныМедицинскихДокументов.CDA2HTML( ТелоДокумента, ДинамическоеПолеФормы.ПолучитьРеквизит(ЭтаФорма, ДинПоле, "Визуализатор"), БазовыйАдрес_, ШаблоныМедицинскихДокументовПереопределяемый.ДокументГотов(ИдентификаторДокумента_), ДинамическоеПолеФормы.ПолучитьРеквизит(ЭтаФорма, ДинПоле, "ПолныйДокумент") ); |
|||
34
1С-ница
22.07.14
✎
11:10
|
(32) а как искать по такому не полному пути?
|
|||
35
f_vadim
22.07.14
✎
11:20
|
(34) начать там где база лежит
потом там где 1с установлена |
|||
36
alex_pshkv
23.07.14
✎
08:20
|
(1) Формирование xml происходит в методе ШаблоныМедицинскихДокументов.СформироватьМедицинскийДокумент
|
|||
37
1С-ница
23.07.14
✎
09:50
|
(36) Спасибо!
|
|||
38
1С-ница
24.07.14
✎
10:48
|
(36) С помощью макета и визуализатора поняла, где влиять на вывод. Размер шрифта можно только в визуализаторе настроить? С макета не берет.
|
|||
39
alex_pshkv
24.07.14
✎
13:08
|
(38) В модуле форму обработки ШМД можно переопределить способ формирования xml, я не помню можно ли там установить свой размер шрифта. Если нет, то скорее всего размер шрифта определяется макетом в справочнике ВизуализаторыМедицинскихДокументов.
|
|||
40
1С-ница
24.07.14
✎
15:33
|
(39) в справочнике ВизуализаторыМедицинскихДокументов содержится файл xml, и как я поняла шрифт можно настроить только для всех выводимых текстов.
|
|||
41
alex_pshkv
29.07.14
✎
17:53
|
(40) Надо покопаться в документации по ШМД выложенной на диске ИТС и на сайте 1с, по-моему в самой обработке ШМД есть возможность переопределить создание xml и возможно контролировать размер шрифта для определенных полей.
|
|||
42
Garykom
гуру
29.07.14
✎
18:30
|
(41) легкая форма некрофилии ))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |