|
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
|
Понял, спасибо. Мне эти условия не нужны, сделал так
Для каждого Рез Из Результат Цикл Пациент = Рез.Пациент; Ответ = Пациент; КонецЦикла; Правильно понимаю, что раз пациент найден запросом и попал в цикл, значит это и есть мой "ответ"? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |