Имя: Пароль:
1C
1С v8
1С МБ Разобраться с запросом
0 andmerc
 
30.10.18
14:02
Добрый день, конфигурация Больница, я крайне начинающий в программировании. В общем модуле Регистратура есть такая "Функция ПоискПациента(СтруктураПоиска) Экспорт". Нужно воспользоватся этой функцией во внешней обработке. Не могу понять, почему функция всегда возвращает "неопределено".
При просмотре через отладчик, почемуто сразу "прыжок" с начала цикла в конец, какбудто цикл не выполняется.
1 andmerc
 
30.10.18
14:02
Функция ПоискПациента(СтруктураПоиска) Экспорт
    Ответ = Неопределено;
    
    // обязательные для поиска поля
    Если НЕ (СтруктураПоиска.Свойство("Фамилия") И ЗначениеЗаполнено(СтруктураПоиска.Фамилия) И
             СтруктураПоиска.Свойство("Имя") И ЗначениеЗаполнено(СтруктураПоиска.Имя) И
             СтруктураПоиска.Свойство("Отчество") И ЗначениеЗаполнено(СтруктураПоиска.Отчество) И
             СтруктураПоиска.Свойство("ДатаРождения") И ЗначениеЗаполнено(СтруктураПоиска.ДатаРождения)
             )
    Тогда
        Возврат Ответ;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ДанныеПациентов.Фамилия,
        |    ДанныеПациентов.Имя,
        |    ДанныеПациентов.Отчество,
        |    ДанныеПациентов.Пол,
        |    ДанныеПациентов.ДатаРождения,
        |    ДанныеПациентов.Пациент,
        |    ВЫБОР
        |        КОГДА Пациенты.ДокументВыбытия = НЕОПРЕДЕЛЕНО
        |                ИЛИ Пациенты.ДокументВыбытия ЕСТЬ NULL
        |                ИЛИ Пациенты.ДатаВыбытия > &ПериодУбытия
        |            ТОГДА ЛОЖЬ
        |        ИНАЧЕ ИСТИНА
        |    КОНЕЦ КАК ПациентВыбывший
        |ИЗ
        |    РегистрСведений.ДанныеПациентов.СрезПоследних КАК ДанныеПациентов
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Картотека КАК Пациенты
        |        ПО ДанныеПациентов.Пациент = Пациенты.Ссылка
        |ГДЕ
        |    ДанныеПациентов.Фамилия = &Фамилия И
        |    ДанныеПациентов.Имя =  &Имя И
        |    ДанныеПациентов.Отчество = &Отчество И
        |    ДанныеПациентов.ДатаРождения = &ДатаРождения";
        
        
    Запрос.УстановитьПараметр("ПериодУбытия", НачалоДня(ТекущаяДатаСеанса()));
    Запрос.УстановитьПараметр("Неопределено", Неопределено);
    Запрос.УстановитьПараметр("Фамилия", СтруктураПоиска.Фамилия);
    Запрос.УстановитьПараметр("Имя", СтруктураПоиска.Имя);
    Запрос.УстановитьПараметр("Отчество", СтруктураПоиска.Отчество);
    Запрос.УстановитьПараметр("ДатаРождения", СтруктураПоиска.ДатаРождения);
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для каждого Рез Из Результат Цикл
        // ищем по ДУЛу, потом по контактам
        Пациент = Рез.Пациент;
        СовпадениеДУЛ = Ложь;
        СовпадениеКонтакты = Ложь;
        Если СтруктураПоиска.Свойство("ДУЛСерия") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛСерия) И
             СтруктураПоиска.Свойство("ДУЛНомер") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛНомер) И
             СтруктураПоиска.Свойство("ДУЛКемВыдан") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛКемВыдан) И
             СтруктураПоиска.Свойство("ДУЛДатаВыдачи") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛДатаВыдачи)
        Тогда
            ДУЛ = Регистратура.ПолучитьДУЛПациента(Пациент);
            Если ДУЛ.Количество() > 0 Тогда
                ДУЛНайденного = ДУЛ[0];
                // убираем пробелы из маски
                ДокСерия = СтрЗаменить(ДУЛ[0].ДокументСерия," ","");
                
                Если ДокСерия = СтруктураПоиска.ДУЛСерия И
                     ДУЛНайденного.ДокументНомер = СтруктураПоиска.ДУЛНомер И
                     ДУЛНайденного.ДокументДатаВыдачи = СтруктураПоиска.ДУЛДатаВыдачи
                Тогда
                    СовпадениеДУЛ = Истина;
                    Ответ = Пациент;
                    Прервать;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        Если (СтруктураПоиска.Свойство("ТелефонРабочий") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонРабочий)) ИЛИ
             (СтруктураПоиска.Свойство("ТелефонДомашний") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонДомашний)) ИЛИ
             (СтруктураПоиска.Свойство("ТелефонМобильный") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонМобильный)) ИЛИ
             (СтруктураПоиска.Свойство("email") И ЗначениеЗаполнено(СтруктураПоиска.email))
        Тогда
            Контакты = Регистратура.ПолучитьКонтактыПациента(Пациент);
            Для каждого Контакт Из Контакты Цикл
                Если (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.ДомТелефонПациента
                                И Контакт.Представление = СтруктураПоиска.ТелефонДомашний)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.РабТелефонПациента
                                 И Контакт.Представление = СтруктураПоиска.ТелефонРабочий)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.МобТелефонПациента
                                 И Контакт.Представление = СтруктураПоиска.ТелефонМобильный)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.EmailПациента
                                 И Контакт.Представление = СтруктураПоиска.email)
                Тогда
                    // нашли пациента по контакту
                    СовпадениеКонтакты = Истина;
                    Ответ = Пациент;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
        
    Возврат Ответ;
КонецФункции
2 piter3
 
30.10.18
14:03
Если НЕ (СтруктураПоиска.Свойство("Фамилия") И ЗначениеЗаполнено(СтруктураПоиска.Фамилия) И
             СтруктураПоиска.Свойство("Имя") И ЗначениеЗаполнено(СтруктураПоиска.Имя) И
             СтруктураПоиска.Свойство("Отчество") И ЗначениеЗаполнено(СтруктураПоиска.Отчество) И
             СтруктураПоиска.Свойство("ДатаРождения") И ЗначениеЗаполнено(СтруктураПоиска.ДатаРождения)
             )
    Тогда
        Возврат Ответ;
    КонецЕсли;
3 piter3
 
30.10.18
14:03
Заполни и будет счастье
4 DexterMorgan
 
30.10.18
14:06
(3) Если цикл не выполняется, значит у него результат запроса пустой
5 elCust
 
30.10.18
14:08
(0) Самое быстрое решение:

Открываем таблицу регистра РегистрСведений.ДанныеПациентов.

Заходим в отбор и ставим тот же отбор, что и передается в запросе этой функции.

Сразу станет понятно, почему запрос возвращает пустую выборку.
6 andmerc
 
30.10.18
14:12
(3) Заполнено
(4) Насколько я понимаю -выполняется.
[URL=https://fastpic.ru/view/92/2018/1030/_41cc152ea76f8dab097a0cee1f390be0.jpg.html][IMG]https://i92.fastpic.ru/thumb/2018/1030/e0/_41cc152ea76f8dab097a0cee1f390be0.jpeg[/IMG][/URL]

А просмотр в табло с помощью "Запрос.Выполнить().Выгрузить()" должен показывать конкретные значения? или только имена колонок?
7 andmerc
 
30.10.18
14:13
8 piter3
 
30.10.18
14:27
(4) думал неопределенно возвращает
9 andmerc
 
30.10.18
14:32
(5) если про это
https://i95.fastpic.ru/big/2018/1030/bb/_a459d3ee7ade00e9cb52fec80e33a8bb.jpg
То значения есть
10 elCust
 
30.10.18
14:35
(9) Дата рождения почему у тебя в параметрах запроса стоит как строка "10.02.1986 0:00:00" (Строка)??
11 Флориан
 
30.10.18
14:38
(10) да, да только хотел написать
12 andmerc
 
30.10.18
14:58
https://i92.fastpic.ru/big/2018/1030/4e/78ed9b8af04fea0055c5d06427c7be4e.jpg

я же все правильно сделал?  почему тогда

{ВнешняяОбработка.ЗагрузкаПациентов.Форма.Форма.Форма(43)}: Преобразование значения к типу Дата не может быть выполнено
        Пациент.Вставить("ДатаРождения",  Дата(ДеРо));
13 andmerc
 
30.10.18
15:03
ПОнял, год месяц день
14 andmerc
 
30.10.18
15:27
Разложил правильно дату, теперь зашел в цикл, правда результат всеравно "Неопределено". Видимо уже по результату прохождения цикла. Смотрю дальше.
15 andmerc
 
30.10.18
15:33
https://i95.fastpic.ru/big/2018/1030/0b/_672fa19a9ba8915dc1f6c9ee44918c0b.jpg

А почему "Ответ" который выше правильный, а тот который ниже "возврат ответ" неопределено ?
16 Флориан
 
30.10.18
15:50
(15)              Тогда
                    // нашли пациента по контакту

                    СовпадениеКонтакты = Истина;
                    Ответ = Пациент;
                    Прервать;

            Тогда
                    СовпадениеДУЛ = Истина;
                    Ответ = Пациент;
                    Прервать;

Не попадает в эти Тогда - мимо проходит
17 andmerc
 
30.10.18
16:29
Понял, спасибо. Мне эти условия не нужны, сделал так

Для каждого Рез Из Результат Цикл
        
        Пациент = Рез.Пациент;
        Ответ = Пациент;
    
    КонецЦикла;

Правильно понимаю, что раз пациент найден запросом и попал в цикл, значит это и есть мой "ответ"?