Форма Списка справочника

1. user618496_Riko.Naomi 16.01.17 13:58 Сейчас в теме
День добрый! Подскажите пожалуйста, что не так? У меня есть справочник с формой списка, на этой форме есть поле надписи "Задолжность", мне нужно чтобы при выборе пациента (одним щелчком по пациенту) в этом поле надписи выводилась его задолжность. Подскажите кто-нибудь, что я не так делаю?

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
		
	Если Элементы.Список.ТекущиеДанные.Задолжность = Неопределено Тогда
		ЗаполнитьРеквизитЗадолженностьПациента();
	КонецЕсли;	
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьРеквизитЗадолженностьПациента()
	Если Элементы.Список.ТекущиеДанные.Задолжность = Неопределено Тогда
		Попытка
			Запрос = Новый Запрос;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	ОплатыПриемовОстаткиИОбороты.СуммаКонечныйОстаток
			|ИЗ
			|	РегистрНакопления.ОплатыПриемов.ОстаткиИОбороты(
			|			,
			|			,
			|			,
			|			,
			|			Прием.Пациент = &Пациент";
			
			Запрос.УстановитьПараметр("Пациент", ПациентВПриеме(Элементы.Список.ТекущиеДанные.Задолжность));
			
			Результат = Запрос.Выполнить();
			
			Выборка = Результат.Выбрать();
			Сумма = 0;
			Пока Выборка.Следующий() Цикл
				Сумма = Сумма + Выборка.СуммаКонечныйОстаток;	
			КонецЦикла;
			Если Сумма = 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Синий; 
				Элементы.Список.ТекущиеДанные.Задолжность = "У пациента нет задолженности";
			ИначеЕсли Сумма > 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Красный; 
				Элементы.Список.ТекущиеДанные.Задолжность = "Задолженность пациента составляет: "+Сумма+" "+Константы.ОсновнаяВалюта.Получить();
			ИначеЕсли Сумма < 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Синий;
				Элементы.Список.ТекущиеДанные.Задолжность = "Задолженность перед пациентом составляет: "+Сумма*-1+" "+Константы.ОсновнаяВалюта.Получить();	
			КонецЕсли;
		Исключение;
		КонецПопытки;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ПациентВПриеме(Прием)
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПриемСтоматолога.Пациент
	|ИЗ
	|	Документ.ПриемСтоматолога КАК ПриемСтоматолога
	|ГДЕ
	|	ПриемСтоматолога.Ссылка = &Ссылка";
	
	Запрос.УстановитьПараметр("Ссылка", Элементы.Наименование);
	
	Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
	
	Пока Выборка.Следующий() Цикл
	Пациент = Выборка.Пациент;		
	КонецЦикла;
	Возврат Пациент;
КонецФункции
Показать
По теме из базы знаний
Найденные решения
26. DrBlack 23 17.01.17 13:18 Сейчас в теме
(23) Вот так должно быть то, что хотели сделать:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	ТекПациент = Элементы.Список.ТекущаяСтрока;
	Если ТекПациент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СуммаЗадолженности = ПолучитьСуммуЗадолженностиПациента(ТекПациент);
	
	Если СуммаЗадолженности = 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Синий; 
		Элементы.Задолженность.Заголовок  = "У пациента нет задолженности";
	ИначеЕсли СуммаЗадолженности > 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Красный; 
		Элементы.Задолженность.Заголовок  = "Задолженность пациента составляет: "+СуммаЗадолженности;
	ИначеЕсли СуммаЗадолженности < 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Синий;
		Элементы.Задолженность.Заголовок  = "Задолженность перед пациентом составляет: "+СуммаЗадолженности*(-1);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьСуммуЗадолженностиПациента(СсылкаНаПациента)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОплатыПриемовОстатки.СуммаОстаток КАК СуммаОстаток
	|ИЗ
	|	РегистрНакопления.ОплатыПриемов.Остатки(, Прием.Пациент = &СсылкаНаПациента) КАК ОплатыПриемовОстатки";	
	Запрос.УстановитьПараметр("СсылкаНаПациента", СсылкаНаПациента);
	
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат 0;
	КонецЕсли;
	
	Выборка = Результат.Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка.СуммаОстаток;
	
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. starjevschik 16.01.17 14:06 Сейчас в теме
(1) как-то сумбурно, но в общем примерно так и надо делать. Попытку надо убрать (она не нужна там вообще в принципе) и отладить.
6. user618496_Riko.Naomi 16.01.17 14:06 Сейчас в теме
(4) Хорошо, попытку уберу сейчас
18. user618496_Riko.Naomi 17.01.17 11:49 Сейчас в теме
День добрый. Я все по этой же теме, в общем внесла некоторые изменения, прохожусь отладчиком и вылетает постоянно именно на строке "Если Элементы.Список.ТекущиеДанные.Задолжность = Неопределено Тогда" (Процедура СписокПриАктивизацииСтроки(Элемент)).

Ошибку не выдает, но останавливает именно здесь.

Открываю "Стек вызовов" пишет (Справочник.Пациенты.Форма.ФормаСписка.Форма.СписокПриАктивизацииСтроки(Элемент = ТаблицаФормы) 34 Тонкий клиент:Администратор (4), ghgh:1562)

А при открытии "Локальные переменные" указывает "Переменная" (Элемент), "Значение" (ТаблицаФормы), Тип(ТаблицаФормы).
19. DrBlack 23 17.01.17 11:57 Сейчас в теме
(18)
Ошибку не выдает, но останавливает именно здесь.

Снимите/уберите точку остановки )))))
20. user618496_Riko.Naomi 17.01.17 12:17 Сейчас в теме
5. Denis_CFO 48 16.01.17 14:06 Сейчас в теме
(1)
РегистрНакопления.ОплатыПриемов.ОстаткиИОбороты
а где дата, на которую выбирается задолженность?
7. user618496_Riko.Naomi 16.01.17 14:07 Сейчас в теме
(5) а вот кстати, да, про дату я и не вспомнила
24. spacecraft 17.01.17 13:02 Сейчас в теме
(1) мне совсем не понятно, зачем получать отдельно Пациента в запросе? Он ведь есть в ТЧ?
Поле Задолженность это не отдельное поле, а колонка динамического списка?
Тогда зачем ее получать обработчиком ПриАктивизацииСтроки? Проще сразу в динамическом списке получать.
Оформление цветом и надписью. Это все делается УО того же динамического списка.

Я пока вижу попытку сделать на УФ то, что делали на ОФ. Это не оптимально в принципе.
25. user618496_Riko.Naomi 17.01.17 13:04 Сейчас в теме
(24) Возможно вы правы, но с 1с я только полтора месяца и мне еще сложно с некоторыми вещами.
27. DrBlack 23 17.01.17 13:20 Сейчас в теме
(25) Очень плохо что вы учитесь сразу на продуктовой базе, вот честно если, мне даже жалко эту стоматологию и того человека, что будет заниматься поддержкой базы после вас
28. user618496_Riko.Naomi 17.01.17 13:22 Сейчас в теме
(27) Я и сама это понимаю, стараюсь делать все возможное чтобы все было более понятно и корректно.
29. user618496_Riko.Naomi 17.01.17 13:32 Сейчас в теме
(27) Спасибо большое еще раз за помощь! Все работает. Очень благодарна)
2. vadim1011985 100 16.01.17 14:02 Сейчас в теме
А в чем конкретно ошибка ? Отладчиком пробовала поройтись ?
3. user618496_Riko.Naomi 16.01.17 14:05 Сейчас в теме
да пробовала, в том и дело, что ошибки вообще не выдает никакой, но поле надписи не заполняется
8. vadim1011985 100 16.01.17 14:08 Сейчас в теме
Я думаю еще не хватает вызвать функцию ОповеститьОбИзменении() - можно почитать о ней в синтаксис-помощнике
9. user618496_Riko.Naomi 16.01.17 14:09 Сейчас в теме
(8) Хорошо, учту, прочту, добавлю. Какие еще изменения, скажем так, нужно внести? Или пока достаточно того, что предложили выше?
10. Denis_CFO 48 16.01.17 14:12 Сейчас в теме
(9) Можно вместо "Пока Цикл КонецЦикла" в данном случае использовать "Если Тогда КонецЕсли" и вот это:
Если Сумма = 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Синий;
Элементы.Список.ТекущиеДанные.Задолжность = "У пациента нет задолженности";
ИначеЕсли Сумма > 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Красный;
Элементы.Список.ТекущиеДанные.Задолжность = "Задолженность пациента составляет: "+Сумма+" "+Константы.ОсновнаяВалюта.Получить();
ИначеЕсли Сумма < 0 Тогда Элементы.ЗадолженностьПациента.ЦветТекста = WebЦвета.Синий;
Элементы.Список.ТекущиеДанные.Задолжность = "Задолженность перед пациентом составляет: "+Сумма*-1+" "+Константы.ОсновнаяВалюта.Получить();

обрабатывать на клиенте. Т.е. с сервера возвращаете только Сумму.
11. user618496_Riko.Naomi 16.01.17 14:15 Сейчас в теме
(10) Попробую тоже, хорошо
12. Denis_CFO 48 16.01.17 14:17 Сейчас в теме
13. user618496_Riko.Naomi 16.01.17 14:19 Сейчас в теме
(12) Мм, да.
Я думала ее добавить, сначала добавила, а потом чет запаролась и удалила ее нафиг))
15. user618496_Riko.Naomi 16.01.17 14:32 Сейчас в теме
(10) Хочу уточнить, эту часть, которую вы отметили, ее сделать на клиенте процедурой, правильно или нет?
16. Denis_CFO 48 16.01.17 14:42 Сейчас в теме
(15) а чем её ещё можно сделать? Функцией? В данном случае - без разницы.
17. user618496_Riko.Naomi 16.01.17 14:48 Сейчас в теме
14. user618496_Riko.Naomi 16.01.17 14:20 Сейчас в теме
Добавила обратно валюту
21. user618496_Riko.Naomi 17.01.17 12:24 Сейчас в теме
Изменила последний запрос

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


Но все равно результата никакого, не отображается)
22. DrBlack 23 17.01.17 12:49 Сейчас в теме
(21) Если честно, какая-то бредовая функция, надо как-то так:
&НаКлиенте
Процедура ПриАктивацииСтроки()

ТекСтрока = Элементы.Список.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Возврат;
КонецЕсли;

ПациентВПриеме(ТекСтрока.Ссылка);

КонецПроцедуры

&НаСервере
Функция ПациентВПриеме(СсылкаНаОбъект)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|Пациенты.Наименование
|ИЗ
|Справочник.Пациенты КАК Пациенты
|ГДЕ
|Пациенты.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат "";
КонецЕсли;

Выборка = Результат.Выбрать();
Выборка.Следующий();

Возврат Выборка.Наименование;

КонецФункции
Показать
23. user618496_Riko.Naomi 17.01.17 12:57 Сейчас в теме
(22) Жалуется на отсутствие ссылки
{Справочник.Пациенты.Форма.ФормаСписка.Форма(44)}: Поле объекта не обнаружено (Ссылка)
ПациентВПриеме(ТекСтрока.Ссылка);
26. DrBlack 23 17.01.17 13:18 Сейчас в теме
(23) Вот так должно быть то, что хотели сделать:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	ТекПациент = Элементы.Список.ТекущаяСтрока;
	Если ТекПациент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СуммаЗадолженности = ПолучитьСуммуЗадолженностиПациента(ТекПациент);
	
	Если СуммаЗадолженности = 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Синий; 
		Элементы.Задолженность.Заголовок  = "У пациента нет задолженности";
	ИначеЕсли СуммаЗадолженности > 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Красный; 
		Элементы.Задолженность.Заголовок  = "Задолженность пациента составляет: "+СуммаЗадолженности;
	ИначеЕсли СуммаЗадолженности < 0 Тогда
		Элементы.Задолженность.ЦветТекстаЗаголовка = WebЦвета.Синий;
		Элементы.Задолженность.Заголовок  = "Задолженность перед пациентом составляет: "+СуммаЗадолженности*(-1);
	КонецЕсли;
	
КонецПроцедуры

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот