Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

1С МБ Разобраться с запросом

1С МБ Разобраться с запросом
Я
   andmerc
 
30.10.18 - 14:02
Добрый день, конфигурация Больница, я крайне начинающий в программировании. В общем модуле Регистратура есть такая "Функция ПоискПациента(СтруктураПоиска) Экспорт". Нужно воспользоватся этой функцией во внешней обработке. Не могу понять, почему функция всегда возвращает "неопределено".
При просмотре через отладчик, почемуто сразу "прыжок" с начала цикла в конец, какбудто цикл не выполняется.
 
 
   andmerc
 
1 - 30.10.18 - 14:02
Функция ПоискПациента(СтруктураПоиска) Экспорт
    Ответ = Неопределено;
    
    // обязательные для поиска поля

    Если НЕ (СтруктураПоиска.Свойство("Фамилия") И ЗначениеЗаполнено(СтруктураПоиска.Фамилия) И
             СтруктураПоиска.Свойство("Имя") И ЗначениеЗаполнено(СтруктураПоиска.Имя) И
             СтруктураПоиска.Свойство("Отчество") И ЗначениеЗаполнено(СтруктураПоиска.Отчество) И
             СтруктураПоиска.Свойство("ДатаРождения") И ЗначениеЗаполнено(СтруктураПоиска.ДатаРождения)
             )
    Тогда
        Возврат Ответ;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ДанныеПациентов.Фамилия,
        |    ДанныеПациентов.Имя,
        |    ДанныеПациентов.Отчество,
        |    ДанныеПациентов.Пол,
        |    ДанныеПациентов.ДатаРождения,
        |    ДанныеПациентов.Пациент,
        |    ВЫБОР
        |        КОГДА Пациенты.ДокументВыбытия = НЕОПРЕДЕЛЕНО
        |                ИЛИ Пациенты.ДокументВыбытия ЕСТЬ NULL 
        |                ИЛИ Пациенты.ДатаВыбытия > &ПериодУбытия
        |            ТОГДА ЛОЖЬ
        |        ИНАЧЕ ИСТИНА
        |    КОНЕЦ КАК ПациентВыбывший
        |ИЗ
        |    РегистрСведений.ДанныеПациентов.СрезПоследних КАК ДанныеПациентов
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Картотека КАК Пациенты
        |        ПО ДанныеПациентов.Пациент = Пациенты.Ссылка
        |ГДЕ
        |    ДанныеПациентов.Фамилия = &Фамилия И
        |    ДанныеПациентов.Имя =  &Имя И
        |    ДанныеПациентов.Отчество = &Отчество И
        |    ДанныеПациентов.ДатаРождения = &ДатаРождения";
        
        
    Запрос.УстановитьПараметр("ПериодУбытия", НачалоДня(ТекущаяДатаСеанса()));
    Запрос.УстановитьПараметр("Неопределено", Неопределено);
    Запрос.УстановитьПараметр("Фамилия", СтруктураПоиска.Фамилия);
    Запрос.УстановитьПараметр("Имя", СтруктураПоиска.Имя);
    Запрос.УстановитьПараметр("Отчество", СтруктураПоиска.Отчество);
    Запрос.УстановитьПараметр("ДатаРождения", СтруктураПоиска.ДатаРождения);
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для каждого Рез Из Результат Цикл
        // ищем по ДУЛу, потом по контактам

        Пациент = Рез.Пациент;
        СовпадениеДУЛ = Ложь;
        СовпадениеКонтакты = Ложь;
        Если СтруктураПоиска.Свойство("ДУЛСерия") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛСерия) И
             СтруктураПоиска.Свойство("ДУЛНомер") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛНомер) И
             СтруктураПоиска.Свойство("ДУЛКемВыдан") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛКемВыдан) И 
             СтруктураПоиска.Свойство("ДУЛДатаВыдачи") И ЗначениеЗаполнено(СтруктураПоиска.ДУЛДатаВыдачи)
        Тогда
            ДУЛ = Регистратура.ПолучитьДУЛПациента(Пациент);
            Если ДУЛ.Количество() > 0 Тогда
                ДУЛНайденного = ДУЛ[0];
                // убираем пробелы из маски

                ДокСерия = СтрЗаменить(ДУЛ[0].ДокументСерия," ","");
                
                Если ДокСерия = СтруктураПоиска.ДУЛСерия И
                     ДУЛНайденного.ДокументНомер = СтруктураПоиска.ДУЛНомер И
                     ДУЛНайденного.ДокументДатаВыдачи = СтруктураПоиска.ДУЛДатаВыдачи
                Тогда
                    СовпадениеДУЛ = Истина;
                    Ответ = Пациент;
                    Прервать;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        Если (СтруктураПоиска.Свойство("ТелефонРабочий") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонРабочий)) ИЛИ 
             (СтруктураПоиска.Свойство("ТелефонДомашний") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонДомашний)) ИЛИ 
             (СтруктураПоиска.Свойство("ТелефонМобильный") И ЗначениеЗаполнено(СтруктураПоиска.ТелефонМобильный)) ИЛИ 
             (СтруктураПоиска.Свойство("email") И ЗначениеЗаполнено(СтруктураПоиска.email))
        Тогда
            Контакты = Регистратура.ПолучитьКонтактыПациента(Пациент);
            Для каждого Контакт Из Контакты Цикл
                Если (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.ДомТелефонПациента 
                                И Контакт.Представление = СтруктураПоиска.ТелефонДомашний)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.РабТелефонПациента 
                                 И Контакт.Представление = СтруктураПоиска.ТелефонРабочий)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.МобТелефонПациента 
                                 И Контакт.Представление = СтруктураПоиска.ТелефонМобильный)
                        ИЛИ
                     (Контакт.Вид = Справочники.ВидыКонтактнойИнформации.EmailПациента 
                                 И Контакт.Представление = СтруктураПоиска.email)
                Тогда
                    // нашли пациента по контакту

                    СовпадениеКонтакты = Истина;
                    Ответ = Пациент;
                    Прервать;
                КонецЕсли;
            КонецЦикла; 
        КонецЕсли;
    КонецЦикла; 
        
    Возврат Ответ;
КонецФункции
   piter3
 
2 - 30.10.18 - 14:03
Если НЕ (СтруктураПоиска.Свойство("Фамилия") И ЗначениеЗаполнено(СтруктураПоиска.Фамилия) И
             СтруктураПоиска.Свойство("Имя") И ЗначениеЗаполнено(СтруктураПоиска.Имя) И
             СтруктураПоиска.Свойство("Отчество") И ЗначениеЗаполнено(СтруктураПоиска.Отчество) И
             СтруктураПоиска.Свойство("ДатаРождения") И ЗначениеЗаполнено(СтруктураПоиска.ДатаРождения)
             )
    Тогда
        Возврат Ответ;
    КонецЕсли;
   piter3
 
3 - 30.10.18 - 14:03
Заполни и будет счастье
   DexterMorgan
 
4 - 30.10.18 - 14:06
(3) Если цикл не выполняется, значит у него результат запроса пустой
   elCust
 
5 - 30.10.18 - 14:08
(0) Самое быстрое решение:

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

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

Сразу станет понятно, почему запрос возвращает пустую выборку.
   andmerc
 
6 - 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]

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

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

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


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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует