Выборка данных из второй табличной части документа
Уважаемые разработчики, прошу вашего совета. Не могу разобраться, как сделать. Есть документ, в котором две табличных части "РаботникиОРганизации" и "Покупки". В первой табличной части список людей (физЛицо - Справочник. ФизЛица), а во второй табличной части каждая строка состоит из ссылки на физЛица и дата покупки (ДатаПокупки). В первой табличной части встаем на человека, во второй таблице отображаются его покупки.
Ошибку выдает "Поле не найдено "Документ.Наши_Документы.Ссылка"".
Док = Неопределено;
ДокВыборка = Документы.Наши_Документы.Выбрать(НачДата, КонДата);
Пока ДокВыборка.Следующий() Цикл
Если ДокВыборка.Проведен Тогда
Док = ДокВыборка.ПолучитьОбъект();
Для Каждого СтрокаТабЧастиФио из Док.РаботникиОрганизации Цикл
физ = СтрокаТабЧастиФио.ФизЛицо.Ссылка;
Фамилия = физ.Фамилия;
Имя = физ.Имя;
//Покупки
Запрос = Новый Запрос;
Запрос.Текст = "Выбрать
|ДокументЗаписиОПокупки.ДатаПокупки Как ДатаПокупки,
|ИЗ
| Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
|ГДЕ
| Документ.Наши_Документы.Ссылка = Док
| И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("Докум", Док);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаПокупки = Формат(Выборка.ДатаПокупки, "ДЛФ=Д");
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ПоказатьОшибку выдает "Поле не найдено "Документ.Наши_Документы.Ссылка"".
По теме из базы знаний
- Добавление табличных частей из других документов
- Представление в запросе табличной части документа одним строковым полем
- Проверка на наличие дублирующихся строк в табличных частях
- Как легко загружать данные из электронных таблиц (Excel, OpenOffice и т.д)
- Ошибка синхронизации документа "Отчет переработчика" и боль типового обмена (УНФ - БП)
Найденные решения
(19) И чем это я вас оскорбил?
Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.
Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .
Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом
Когда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.
Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .
Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом
Выбрать РАЗЛИЧНЫЕ
РаботникиОрганизации.ФизЛицо,
ИЗ
Документ.Наши_Документы.РаботникиОрганизации Как РаботникиОрганизации
ГДЕ
РаботникиОрганизации.Ссылка.Дата Между &НачДата И &КонДата
Запрос.УстановитьПараметр("НачДата ", НачДата );
Запрос.УстановитьПараметр("КонДата", КонДата);
=====================================================
ПоказатьКогда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
(22) Вторая часть будет заключаться в создании и подключении процедуры обработки события активации строки верхней табличной части.
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:
На этом - ВСЕ
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:
Выбрать
ДокументЗаписиОПокупки.ДатаПокупки,
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата Между &НачДата И &КонДата
И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("НачДата ", НачДата );
ПоказатьНа этом - ВСЕ
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Вы должны были в форме использовать обработку событий формы...
И там настраивать факт "встаем на человека" - и этому событию присваивать процедуру обработки...
У вас же вообще непонятно , что да еще с ошибками
Что такое = Док
А вот это по вашему для чего вы сделали
Как ДокументЗаписиОПокупки
Если потом пишете
Да еще некрасиво использовать Запросы одновременно с ДокВыборка = Документы.Наши_Документы.Выбрать(НачДата, КонДата);
Просто очень непрофессионально это...
Этот код ВЕСЬ однозначно - в топку
И там настраивать факт "встаем на человека" - и этому событию присваивать процедуру обработки...
У вас же вообще непонятно , что да еще с ошибками
| Документ.Наши_Документы.Ссылка = Док
| И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("Докум", Док);
| И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("Докум", Док);
Что такое = Док
А вот это по вашему для чего вы сделали
Как ДокументЗаписиОПокупки
Если потом пишете
ГДЕ
| Документ.Наши_Документы.
Да еще некрасиво использовать Запросы одновременно с ДокВыборка = Документы.Наши_Документы.Выбрать(НачДата, КонДата);
Просто очень непрофессионально это...
Этот код ВЕСЬ однозначно - в топку
(3) У меня выборка используется для выборки документов, потом идет цикл по первой табличной части. А потом использую запрос для выборки записей из второй табличной части. Если подскажите как правильнее и лучше - подскажите. А не ругайте сразу.
Ваш код - кошмар, летящий в ночи!
Вы озвучили одну задачу а код , мало того что ужасный, так он еще и совершенно не отсюда, то есть даже не приближается к решению..
Вы озвучили одну задачу а код , мало того что ужасный, так он еще и совершенно не отсюда, то есть даже не приближается к решению..
присоединяюсь, для связи строк между двумя ТЧ можно использовать отбор
вот пример (даже не уверен, сможете ли адаптировать/применить его для своей задачи)
вот пример (даже не уверен, сможете ли адаптировать/применить его для своей задачи)
//в первой ТЧ там где мышкой тыкаете в Физ.лицо, событие ПриАктивизацииСтроки
Процедура тзПользователиПриАктивизацииСтроки(Элемент)
лкСтр = ЭлементыФормы.тзСотрудники.ТекущаяСтрока;
Если лкСтр = Неопределено Тогда
Иначе
УстановитьОтбор(лкСтр.Сотрудник);
КонецЕсли;
КонецПроцедуры
Процедура УстановитьОтбор(лкСотрудник)
лкОтбор = ЭлементыФормы.тзДокументы.ОтборСтрок;
лкОтбор.Сотрудник.Использование = Истина;
лкОтбор.Сотрудник.ВидСравнения = ВидСравнения.Равно;
лкОтбор.Сотрудник.Значение = лкСотрудник;
КонецПроцедуры
Показать
и что, документ называется "Наши_Документы" ?
Это что за имя такое ? У меня ощущение, что вам дали пример...а вы его как есть использовали, и даже к именам метаданных не переделали
Это что за имя такое ? У меня ощущение, что вам дали пример...а вы его как есть использовали, и даже к именам метаданных не переделали
(10)
ну выдает то у вас ошибку, что поле не найдено...
откуда нам знать, что у вас там не так, что вы там подменили..и как сделать правильно, если вы кусками еще и предоставленный код видоизменили.
Юзайте конструктор, через него ошибки с отсутсвующими полями - сложно получить
В сообщении я заменила настоящее имя документа на Наши_Документы. Это ошибка?
ну выдает то у вас ошибку, что поле не найдено...
откуда нам знать, что у вас там не так, что вы там подменили..и как сделать правильно, если вы кусками еще и предоставленный код видоизменили.
Юзайте конструктор, через него ошибки с отсутсвующими полями - сложно получить
Извините, сам документ работает нормально и правильно. Нужно создать отчет: Из документов Наши_документы выбрать людей с их покупками. И извините за не профессионализм - я только учусь
ДокументЗаписиОПокупки.ДатаПокупки Как ДатаПокупки,
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка = &Докум
И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо
Исправьте запрос и все заработает
К какой ВТОРОЙ табличной части?
Вам уже разжевали все , что ваш код не предназначен для решения озвученной задачи...
Вы сами сказали, что на самом деле это вообще отчет, а не документ...
Вы просто поймите - вы занимаетесь НЕ ТЕМ!
Вам уже разжевали все , что ваш код не предназначен для решения озвученной задачи...
Вы сами сказали, что на самом деле это вообще отчет, а не документ...
Вы просто поймите - вы занимаетесь НЕ ТЕМ!
(18) Как вы суровы. Вроде я никого не оскорбляла, просто попросила совета и разъяснения. Да, я формирую отчет. Я показала как я вижу решение обратиться ко второй табличной части. Если неправильно, дайте наметку как как можно решить этот вопрос, а не оскорбляйте.
(19) И чем это я вас оскорбил?
Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.
Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .
Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом
Когда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
Начнем с того , что изначально - то что вы хотите сделать называется НЕ отчет, а обработка, которая будет выводить информацию по документам.
Отчет формируется 1 раз и не способен активно взаимодействовать с пользователем после вывода информации.
Вам же необходима обработка, которая отбирает данные по физлицам из отобранного списка документов (за период) .
Поэтому и создавать нужно обработку и ФОРМУ обработки, в которой будет отбор документов по периоду и 2 табличных поля - верхнее физ лица, нижнее даты покупки. Данные для верхнего табличного поля - таблица значений из всех физ лиц ВСЕХ отобранных документов.
Заполняется после заполнения условий отбора - дат
Запросом
Выбрать РАЗЛИЧНЫЕ
РаботникиОрганизации.ФизЛицо,
ИЗ
Документ.Наши_Документы.РаботникиОрганизации Как РаботникиОрганизации
ГДЕ
РаботникиОрганизации.Ссылка.Дата Между &НачДата И &КонДата
Запрос.УстановитьПараметр("НачДата ", НачДата );
Запрос.УстановитьПараметр("КонДата", КонДата);
=====================================================
ПоказатьКогда вы увидите своих физлиц в верхнем окне табличной части приступайте ко второй части разработки ( не раньше).
Сначала нужен первичный простой работающий каркас
(22) Вторая часть будет заключаться в создании и подключении процедуры обработки события активации строки верхней табличной части.
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:
На этом - ВСЕ
Найдите в событиях табличной части в свойствах "При активации строки" и создайте там процедуру формирующую данные для нижней табличной части запросом:
Выбрать
ДокументЗаписиОПокупки.ДатаПокупки,
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата Между &НачДата И &КонДата
И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо
Запрос.УстановитьПараметр("ФизЛицо", физ);
Запрос.УстановитьПараметр("НачДата ", НачДата );
ПоказатьНа этом - ВСЕ
(24)коллега, на уровне форм при активации строки перезаполнять не всегда хорошо. Для связи табличных частей есть замечательная вещь - отборы. Элементы.ТЧ.ОтборСтрок = новый фиксированнаяСтруктура("ПолеОтбора", ЗначениеОтбора)
С динамическим списком несколько иначе, но принцип тот же.
С динамическим списком несколько иначе, но принцип тот же.
Ваш код выбирает ВСЕ документы за период скажем 1000000 документов, потом для КАЖДОГО обращается к его табличной части РаботникиОРганизации и для КАЖДОЙ строчки ФизЛицо выводит все Даты покупки из табличной части Покупки ....
Получите Огромную кучу данных
Это вообще-то не то что вы хотели!
Кроме того вы не понимаете смысл строки
Док = ДокВыборка.ПолучитьОбъект();
Зачем это написали?
Получите Огромную кучу данных
Это вообще-то не то что вы хотели!
Кроме того вы не понимаете смысл строки
Док = ДокВыборка.ПолучитьОбъект();
Зачем это написали?
(20) Именно то что вы написали - я и хочу. А строку ПолучитьОбъект(). Я написала чтоб зафиксировать этот документ. И обращаться ко второй таблице именно этого документа. Я недавно программирую. Если можно как то по-другому - скажите хотя бы направление.
(21) Что значат ваши слова
Повнимательнее прочтите ЧТО делает функция ПолучитьОбъект()
Она нужна только в одном случае - вы хотите ИЗМЕНИТЬ данные в полученном объекте - другой причины обратиться к ней не существует
зафиксировать этот документ
?
Повнимательнее прочтите ЧТО делает функция ПолучитьОбъект()
Она нужна только в одном случае - вы хотите ИЗМЕНИТЬ данные в полученном объекте - другой причины обратиться к ней не существует
(23) Спасибо за спокойный тон и за объяснения.
А после выполнения этого запроса:
Так будет правильно?
А после выполнения этого запроса:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ФизЛицо= Выборка.Физлицо
ТекстЗапроса1="Выбрать
ПокупкиФИО.Дата,
ИЗ
Документ.Наши_Документы.Покупки Как ПокупкиФИО
ГДЕ
ПокупкиФИО.ФизЛицо = ФИО
Запрос1.УстановитьПараметр("ФИО ", Физлицо );
Выборка1 = Запрос1.Выполнить().Выбрать();
КонецЦикла;
ПоказатьТак будет правильно?
этого вообще не должно быть НИГДЕ!
Вы физлицо -одно выбирать же вручную собираетесь, зачем же ВСЕХ сразу получать в этих строках ...
------------------------------------------------------------
У вашего Объекта долно быть 2 табличных части - ВерхняяТабличнаячасть и НижняяТабличнаячасть
Они будут заполняться запросами
Должно быть заполнение верхней табличной части, источником данных, которой является
================================================
Во-вторых вы получили уже выборку в верхнее окно?
Вот когда получите - ТОЛЬКО тогда продолжайте!
И как я уже написал - это будет совсем другая процедура... см картинку
В ней должна быть реакция на ваш выбор в нижнем табличном поле :
Пока Выборка.Следующий() Цикл
ФизЛицо= Выборка.Физлицо
Вы физлицо -одно выбирать же вручную собираетесь, зачем же ВСЕХ сразу получать в этих строках ...
------------------------------------------------------------
У вашего Объекта долно быть 2 табличных части - ВерхняяТабличнаячасть и НижняяТабличнаячасть
Они будут заполняться запросами
Должно быть заполнение верхней табличной части, источником данных, которой является
РезултатЗапроса= Запрос.Выполнить().Выгрузить();
Объект.ВерхняяТабличнаячасть.Загрузить(РезултатЗапроса);
================================================
Во-вторых вы получили уже выборку в верхнее окно?
Вот когда получите - ТОЛЬКО тогда продолжайте!
И как я уже написал - это будет совсем другая процедура... см картинку
В ней должна быть реакция на ваш выбор в нижнем табличном поле :
Процедура ПриАктивацииСтроки(Элемент)
//Сначала надо очистить таблицу от предыдущих данных
Объект.НижняяТабличнаяЧасть.Очистить();
Если НЕ ЭтаФорма.Элементы.ВерхняяТаблица.ТекущиеДанные=Неопределено Тогда
//Получаем значение физлица из строки на котором ткнули мышкой...
физЛИЦО=ЭтаФорма.Элементы.НижняяТаблица.ТекущиеДанные.ФизЛицо;
Конецесли;
Запрос.УстановитьПараметр("ФизЛицо", физЛИЦО);
Запрос.УстановитьПараметр("НачДата ", НачДата );
Запрос.Текст=
"ВЫБРАТЬ
ДокументЗаписиОПокупки.ДатаПокупки
ИЗ
Документ.Наши_Документы.Покупки Как ДокументЗаписиОПокупки
ГДЕ
ДокументЗаписиОПокупки.Ссылка.Дата Между &НачДата И &КонДата
И ДокументЗаписиОПокупкие.ФизЛицо = &ФизЛицо";
РезултатЗапроса= Запрос.Выполнить().Выгрузить();
Объект.НижняяТабличнаячасть.Загрузить(РезултатЗапроса);
КонецПроцедуры // ПриАктивациСтроки
ПоказатьПрикрепленные файлы:
После того как сделаете Обработку и форму, приведите пожалуйста весь код из вашей формы, что у вас получился, чтобы мы не говорили про Фому и Ерему....
(28) Спасибо огромное!!! Ваши объяснения и советы очень помогли! Отчет заработал. Понимаете мне нужен был именно отчет, а не обработка. Надо было выбирать именно всех людей, а не по одному. Результат этих выборок мне надо записать в текстовый файл (физЛицо + данные из 2 регистров по Физлицам + Покупка + данные из регистра по конкретной покупки). Текстовый файл передается в головной офис.
Я раньше программировала на 7.7, а в 8 стала пробовать совсем недавно.
Основная моя ошибка - это то что я по старинке (как в 7.7) начала выборку с документов. А когда вы написали, что надо начинать с табличной части ФизЛиц, а потом объяснили как обратиться к табличной части Покупки. Все заработало. Еще раз огромное спасибо!! И успехов вам!!!
Я раньше программировала на 7.7, а в 8 стала пробовать совсем недавно.
Основная моя ошибка - это то что я по старинке (как в 7.7) начала выборку с документов. А когда вы написали, что надо начинать с табличной части ФизЛиц, а потом объяснили как обратиться к табличной части Покупки. Все заработало. Еще раз огромное спасибо!! И успехов вам!!!
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот