Имя: Пароль:
1C
1С v8
Шаблон медицинского документа
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) легкая форма некрофилии ))