Выборка данных из второй табличной части документа

1. MarinaChist 31.01.19 16:25 Сейчас в теме
Уважаемые разработчики, прошу вашего совета. Не могу разобраться, как сделать. Есть документ, в котором две табличных части "РаботникиОРганизации" и "Покупки". В первой табличной части список людей (физЛицо - Справочник. ФизЛица), а во второй табличной части каждая строка состоит из ссылки на физЛица и дата покупки (ДатаПокупки). В первой табличной части встаем на человека, во второй таблице отображаются его покупки.

Док = Неопределено;
        ДокВыборка = Документы.Наши_Документы.Выбрать(НачДата, КонДата);
	Пока ДокВыборка.Следующий() Цикл
	    Если ДокВыборка.Проведен Тогда
	        Док = ДокВыборка.ПолучитьОбъект();
			
			Для Каждого СтрокаТабЧастиФио из Док.РаботникиОрганизации Цикл
				физ = СтрокаТабЧастиФио.ФизЛицо.Ссылка;
				
            	                Фамилия = физ.Фамилия;
				Имя = физ.Имя;

				//Покупки
				Запрос = Новый Запрос;
				Запрос.Текст = "Выбрать
				|ДокументЗаписиОПокупки.ДатаПокупки Как ДатаПокупки, 
		                |ИЗ
		                |	Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
		                |ГДЕ 
                                |	Документ.Наши_Документы.Ссылка = Док
		                |	И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
				Запрос.УстановитьПараметр("ФизЛицо", физ); 
				Запрос.УстановитьПараметр("Докум", Док); 
				
				Выборка = Запрос.Выполнить().Выбрать();
				Пока Выборка.Следующий() Цикл
						ДатаПокупки = Формат(Выборка.ДатаПокупки, "ДЛФ=Д");
				КонецЦикла;
			КонецЦикла;
     КонецЕсли;
	КонецЦикла;
Показать





Ошибку выдает "Поле не найдено "Документ.Наши_Документы.Ссылка"".
+
По теме из базы знаний
Найденные решения
22. YannikAlx 43 31.01.19 18:14 Сейчас в теме
(19) И чем это я вас оскорбил?

Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.

Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .

Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом

Выбрать РАЗЛИЧНЫЕ
РаботникиОрганизации.ФизЛицо,
ИЗ
 Документ.Наши_Документы.РаботникиОрганизации Как РаботникиОрганизации 
ГДЕ
 РаботникиОрганизации.Ссылка.Дата Между &НачДата  И &КонДата


Запрос.УстановитьПараметр("НачДата  ", НачДата  );
Запрос.УстановитьПараметр("КонДата", КонДата); 
=====================================================
Показать

Когда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
+
24. YannikAlx 43 31.01.19 18:23 Сейчас в теме
(22) Вторая часть будет заключаться в создании и подключении процедуры обработки события активации строки верхней табличной части.
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:

Выбрать
ДокументЗаписиОПокупки.ДатаПокупки,
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата  Между &НачДата И &КонДата
 И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо


Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("НачДата ", НачДата );
Показать




На этом - ВСЕ
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. YannikAlx 43 31.01.19 16:49 Сейчас в теме
Вы должны были в форме использовать обработку событий формы...
И там настраивать факт "встаем на человека" - и этому событию присваивать процедуру обработки...

У вас же вообще непонятно , что да еще с ошибками

| Документ.Наши_Документы.Ссылка = Док
| И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("Докум", Док);


Что такое = Док

А вот это по вашему для чего вы сделали
Как ДокументЗаписиОПокупки
Если потом пишете
ГДЕ
| Документ.Наши_Документы.

Да еще некрасиво использовать Запросы одновременно с ДокВыборка = Документы.Наши_Документы.Выбрать(НачДата, КонДата);
Просто очень непрофессионально это...

Этот код ВЕСЬ однозначно - в топку
+
14. MarinaChist 31.01.19 17:34 Сейчас в теме
(3) У меня выборка используется для выборки документов, потом идет цикл по первой табличной части. А потом использую запрос для выборки записей из второй табличной части. Если подскажите как правильнее и лучше - подскажите. А не ругайте сразу.
+
2. YannikAlx 43 31.01.19 16:42 Сейчас в теме
Ваш код - кошмар, летящий в ночи!
Вы озвучили одну задачу а код , мало того что ужасный, так он еще и совершенно не отсюда, то есть даже не приближается к решению..
+
4. soft_wind 31.01.19 16:49 Сейчас в теме
присоединяюсь, для связи строк между двумя ТЧ можно использовать отбор
вот пример (даже не уверен, сможете ли адаптировать/применить его для своей задачи)

//в первой ТЧ там где мышкой тыкаете в Физ.лицо, событие ПриАктивизацииСтроки
Процедура тзПользователиПриАктивизацииСтроки(Элемент)
	лкСтр = ЭлементыФормы.тзСотрудники.ТекущаяСтрока;
	Если лкСтр = Неопределено Тогда
		
	Иначе
		УстановитьОтбор(лкСтр.Сотрудник);
	КонецЕсли;
КонецПроцедуры

Процедура УстановитьОтбор(лкСотрудник)

	лкОтбор = ЭлементыФормы.тзДокументы.ОтборСтрок;	
	лкОтбор.Сотрудник.Использование 	= Истина;
	лкОтбор.Сотрудник.ВидСравнения 		= ВидСравнения.Равно;
	лкОтбор.Сотрудник.Значение			= лкСотрудник;

КонецПроцедуры
Показать
+
11. MarinaChist 31.01.19 17:27 Сейчас в теме
(4) Мне не нужна связь между таблицами в документе. Документ работает правильно. Мне в отчете надо вывести список людей с датой и суммой их покупки. Просто документ так устроен, что в нем две табличных части.
+
5. Boneman 298 31.01.19 16:51 Сейчас в теме
и что, документ называется "Наши_Документы" ?
Это что за имя такое ? У меня ощущение, что вам дали пример...а вы его как есть использовали, и даже к именам метаданных не переделали
+
10. MarinaChist 31.01.19 17:25 Сейчас в теме
(5) В сообщении я заменила настоящее имя документа на Наши_Документы. Это ошибка?
+
12. Boneman 298 31.01.19 17:29 Сейчас в теме
(10)
В сообщении я заменила настоящее имя документа на Наши_Документы. Это ошибка?

ну выдает то у вас ошибку, что поле не найдено...
откуда нам знать, что у вас там не так, что вы там подменили..и как сделать правильно, если вы кусками еще и предоставленный код видоизменили.

Юзайте конструктор, через него ошибки с отсутсвующими полями - сложно получить
+
15. MarinaChist 31.01.19 17:37 Сейчас в теме
(12) Извините, изменила только имя документа
+
6. SedovSU@mail.ru 297 31.01.19 16:51 Сейчас в теме
Напишите в запросе "где документ записиопокупке.ссылка =док" и ошибка уйдёт
+
16. MarinaChist 31.01.19 17:40 Сейчас в теме
(6) Ошибка ушла. Но ко второй табличной части вообще не обращается.
+
7. MarinaChist 31.01.19 16:56 Сейчас в теме
Извините, сам документ работает нормально и правильно. Нужно создать отчет: Из документов Наши_документы выбрать людей с их покупками. И извините за не профессионализм - я только учусь
+
8. YannikAlx 43 31.01.19 17:09 Сейчас в теме
ДокументЗаписиОПокупки.ДатаПокупки Как ДатаПокупки,
ИЗ
 Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
 ДокументЗаписиОПокупки.Ссылка = &Докум
 И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо

Исправьте запрос и все заработает
+
9. MarinaChist 31.01.19 17:22 Сейчас в теме
(8) Извините, выдает сообщение " Поле не найдено "ДокументЗаписиОПокупки.Наши_Документы.Ссылка"
ДокументЗаписиОПокупки.<<?>>Наши_Документы.Ссылка = &Докум
+
13. YannikAlx 43 31.01.19 17:31 Сейчас в теме
(9) Исправил 8 сообщение -= скопируйте еще раз
+
17. MarinaChist 31.01.19 17:46 Сейчас в теме
(13) Спасибо, ошибку не выдает. Но ко второй табличной части не обращается. Запрос не работает
+
18. YannikAlx 43 31.01.19 17:48 Сейчас в теме
К какой ВТОРОЙ табличной части?
Вам уже разжевали все , что ваш код не предназначен для решения озвученной задачи...
Вы сами сказали, что на самом деле это вообще отчет, а не документ...
Вы просто поймите - вы занимаетесь НЕ ТЕМ!
+
19. MarinaChist 31.01.19 17:55 Сейчас в теме
(18) Как вы суровы. Вроде я никого не оскорбляла, просто попросила совета и разъяснения. Да, я формирую отчет. Я показала как я вижу решение обратиться ко второй табличной части. Если неправильно, дайте наметку как как можно решить этот вопрос, а не оскорбляйте.
+
22. YannikAlx 43 31.01.19 18:14 Сейчас в теме
(19) И чем это я вас оскорбил?

Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.

Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .

Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом

Выбрать РАЗЛИЧНЫЕ
РаботникиОрганизации.ФизЛицо,
ИЗ
 Документ.Наши_Документы.РаботникиОрганизации Как РаботникиОрганизации 
ГДЕ
 РаботникиОрганизации.Ссылка.Дата Между &НачДата  И &КонДата


Запрос.УстановитьПараметр("НачДата  ", НачДата  );
Запрос.УстановитьПараметр("КонДата", КонДата); 
=====================================================
Показать

Когда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
+
24. YannikAlx 43 31.01.19 18:23 Сейчас в теме
(22) Вторая часть будет заключаться в создании и подключении процедуры обработки события активации строки верхней табличной части.
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:

Выбрать
ДокументЗаписиОПокупки.ДатаПокупки,
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата  Между &НачДата И &КонДата
 И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо


Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("НачДата ", НачДата );
Показать




На этом - ВСЕ
+
26. MarinaChist 31.01.19 18:39 Сейчас в теме
(24) Спасибо большое! Буду стараться делать. Завтра отпишусь, что получилось
+
30. Infector 201 02.02.19 18:02 Сейчас в теме
(24)коллега, на уровне форм при активации строки перезаполнять не всегда хорошо. Для связи табличных частей есть замечательная вещь - отборы. Элементы.ТЧ.ОтборСтрок = новый фиксированнаяСтруктура("ПолеОтбора", ЗначениеОтбора)
С динамическим списком несколько иначе, но принцип тот же.
+
20. YannikAlx 43 31.01.19 18:00 Сейчас в теме
Ваш код выбирает ВСЕ документы за период скажем 1000000 документов, потом для КАЖДОГО обращается к его табличной части РаботникиОРганизации и для КАЖДОЙ строчки ФизЛицо выводит все Даты покупки из табличной части Покупки ....
Получите Огромную кучу данных


Это вообще-то не то что вы хотели!

Кроме того вы не понимаете смысл строки
Док = ДокВыборка.ПолучитьОбъект();
Зачем это написали?
+
21. MarinaChist 31.01.19 18:05 Сейчас в теме
(20) Именно то что вы написали - я и хочу. А строку ПолучитьОбъект(). Я написала чтоб зафиксировать этот документ. И обращаться ко второй таблице именно этого документа. Я недавно программирую. Если можно как то по-другому - скажите хотя бы направление.
+
23. YannikAlx 43 31.01.19 18:15 Сейчас в теме
(21) Что значат ваши слова
зафиксировать этот документ
?
Повнимательнее прочтите ЧТО делает функция ПолучитьОбъект()
Она нужна только в одном случае - вы хотите ИЗМЕНИТЬ данные в полученном объекте - другой причины обратиться к ней не существует
+
25. MarinaChist 31.01.19 18:36 Сейчас в теме
(23) Спасибо за спокойный тон и за объяснения.
А после выполнения этого запроса:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
        ФизЛицо= Выборка.Физлицо

        ТекстЗапроса1="Выбрать 
           ПокупкиФИО.Дата,
        ИЗ
           Документ.Наши_Документы.Покупки Как ПокупкиФИО
        ГДЕ
            ПокупкиФИО.ФизЛицо = ФИО
        Запрос1.УстановитьПараметр("ФИО ", Физлицо );

         Выборка1 = Запрос1.Выполнить().Выбрать();



КонецЦикла;
Показать


Так будет правильно?
+
27. YannikAlx 43 01.02.19 09:18 Сейчас в теме
этого вообще не должно быть НИГДЕ!

Пока Выборка.Следующий() Цикл
ФизЛицо= Выборка.Физлицо 

Вы физлицо -одно выбирать же вручную собираетесь, зачем же ВСЕХ сразу получать в этих строках ...
------------------------------------------------------------

У вашего Объекта долно быть 2 табличных части - ВерхняяТабличнаячасть и НижняяТабличнаячасть
Они будут заполняться запросами

Должно быть заполнение верхней табличной части, источником данных, которой является

РезултатЗапроса= Запрос.Выполнить().Выгрузить();
Объект.ВерхняяТабличнаячасть.Загрузить(РезултатЗапроса);




================================================

Во-вторых вы получили уже выборку в верхнее окно?
Вот когда получите - ТОЛЬКО тогда продолжайте!
И как я уже написал - это будет совсем другая процедура... см картинку
В ней должна быть реакция на ваш выбор в нижнем табличном поле :


Процедура ПриАктивацииСтроки(Элемент)

//Сначала надо очистить таблицу от предыдущих данных
Объект.НижняяТабличнаяЧасть.Очистить();
	
Если НЕ ЭтаФорма.Элементы.ВерхняяТаблица.ТекущиеДанные=Неопределено Тогда 
	//Получаем значение физлица из строки на котором ткнули мышкой...
       физЛИЦО=ЭтаФорма.Элементы.НижняяТаблица.ТекущиеДанные.ФизЛицо;
Конецесли;

Запрос.УстановитьПараметр("ФизЛицо", физЛИЦО);
Запрос.УстановитьПараметр("НачДата ", НачДата ); 
Запрос.Текст=
"ВЫБРАТЬ
ДокументЗаписиОПокупки.ДатаПокупки
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата Между &НачДата И &КонДата
И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";

РезултатЗапроса= Запрос.Выполнить().Выгрузить();
Объект.НижняяТабличнаячасть.Загрузить(РезултатЗапроса);

КонецПроцедуры  // ПриАктивациСтроки
Показать
Прикрепленные файлы:
+
28. YannikAlx 43 01.02.19 09:26 Сейчас в теме
После того как сделаете Обработку и форму, приведите пожалуйста весь код из вашей формы, что у вас получился, чтобы мы не говорили про Фому и Ерему....
+
29. MarinaChist 01.02.19 09:47 Сейчас в теме
(28) Спасибо огромное!!! Ваши объяснения и советы очень помогли! Отчет заработал. Понимаете мне нужен был именно отчет, а не обработка. Надо было выбирать именно всех людей, а не по одному. Результат этих выборок мне надо записать в текстовый файл (физЛицо + данные из 2 регистров по Физлицам + Покупка + данные из регистра по конкретной покупки). Текстовый файл передается в головной офис.
Я раньше программировала на 7.7, а в 8 стала пробовать совсем недавно.
Основная моя ошибка - это то что я по старинке (как в 7.7) начала выборку с документов. А когда вы написали, что надо начинать с табличной части ФизЛиц, а потом объяснили как обратиться к табличной части Покупки. Все заработало. Еще раз огромное спасибо!! И успехов вам!!!
+
Внимание! Тема сдана в архив

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