|
Выборка документов определенного типа | ☑ | ||
---|---|---|---|---|
0
YurAnt
03.09.13
✎
20:25
|
Доброго времени суток, господа-форумчане.
Вопрос такой: каким образом изменить нижеследующий код дабы взлетело Документы.ЗаказКлиента.Выбрать ... а именно "ЗаказКлиента" - в идеале заменяется переменной и туда передается ТипДокумента, а ля "АвансовыйОтчет", "АктВыполненныхРабот" и т.д., отсед проблема, как сделать, чтобы данное "условие" выборки формировалось динамически ? Выборка=Документы.ЗаказКлиента.Выбрать(ДатаНачалаПериода,ДатаОкончанияПериода); Пока Выборка.Следующий()Цикл Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Номер", Строка(Выборка.Номер)); Запись.ЗаписатьАтрибут("Дата", Строка(Выборка.Дата)); Запись.ЗаписатьАтрибут("Организация", Строка(Выборка.Организация)); Запись.ЗаписатьАтрибут("Склад", Строка(Выборка.Склад)); Запись.ЗаписатьАтрибут("ПодразделениеОрганизации", Строка(Выборка.Подразделение)); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Благодарен за любые советы. С ув. Yurant PS есть подозрение, что мб сделать выборку всех отобрав их по типу... но это опять же лишняя нагрузка... не комильфо вроде как. |
|||
1
YurAnt
03.09.13
✎
20:39
|
ДокументыТекТипа = Метаданные.Документы.Найти(ТипДокумента);
немного не то... |
|||
2
grate
03.09.13
✎
20:40
|
Использовать запрос.
Что-то типа ВЫБРАТЬ Док.Номер, Док.Дата, Док.Организация.Представление, Док.Склад.Представление, Док.Подразделение.Представление ИЗ Документ.//Параметр КАК Док ГДЕ Док.Дата МЕЖДУ &ДатаНачалаПериода И &ДатаОкончанияПериода Вместо "//Параметр" - подставлять нужный тип документа. Можно сформировать текст запрос для нескольких типов документов, используя ОБЪЕДИНИТЬ ВСЕ - чтобы собрать все данные в одной выборке. |
|||
3
EugeniaK
03.09.13
✎
20:46
|
(0) запросом с условием
ГДЕ Документы.ЗаказКлиента.Ссылка ССЫЛКА <Нужный тип> |
|||
4
МихаилМ
03.09.13
✎
20:48
|
=Документы["ЗаказКлиента"]Выбрать
|
|||
5
Noob_Of_1C
03.09.13
✎
20:54
|
должно работать
ИмяДокументаСтрока = Метаданные.НайтиПоТипу(ТипДокумента).Имя; Документы[ИмяДокументаСтрока].Выбрать() |
|||
6
YurAnt
03.09.13
✎
21:13
|
(5) чувствую не примет он "ТипДокумента", поскольку это есть строка, а в НайтиПоТипу(Тип) этот самый Тип - должен быть Типом...
Т.е. необходимо найти Тип, Наименование которого равно строке... как-то так... подозреваю. Вот только там значение возвращаемое "Документы.АвансовыйОтчет" (на месте "АвансовыйОтчет" может быть любой другой док) возвращает "ДокументМенеджер.АвансовыйОтчет", т.е. мне нужно осуществить поиск с исходными данными в виде строки, который вернет мне такое же значение... бррр. |
|||
7
Noob_Of_1C
03.09.13
✎
21:13
|
(6) Тип = ТипЗнч(Документ)
|
|||
8
Noob_Of_1C
03.09.13
✎
21:14
|
(7) Тип = ТипЗнч(ДокументСсылка)
|
|||
9
Noob_Of_1C
03.09.13
✎
21:16
|
(6) откуда такое значение берется вобще?
И еще вариант Тип = Тип(СтрочноеЗначениеТогоЧтоИщем) |
|||
10
Живой Ископаемый
03.09.13
✎
21:17
|
1сники такие 1сники... правильный и самый легки ответ уже был, а они будут плакаться как у них не получается неправильный или тяжелый
|
|||
11
YurAnt
03.09.13
✎
21:23
|
Просто там суть в том что имеется ТабЗнач, строка ТЗшки имеет одно из значений - "ТипДокумента" (строковая переменная хранящая в себе Наименование типа)... т.е. АвансовыыОтчеты Заказы и прочее... но (!!!) они все какбе строкой.
далее начинается перебор Для Каждого Строка Из СписокВсехТиповДокументов Цикл Если Строка.ДокументВыбран = Истина Тогда ТипДокумента = Строка.ТипДокумента; Если ЗначениеЗаполнено(ТипДокумента) Тогда Запись.ЗаписатьНачалоЭлемента(ТипДокумента); ТипЗнч(ДокументСсылка.) ДокументыТекТипа = Метаданные.НайтиПоТипу(ТипДокумента).Имя; Выборка = Документы[ДокументыТекТипа].Выбрать(ДатаНачалаПериода,ДатаОкончанияПериода); Пока Выборка.Следующий()Цикл Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Номер", Строка(Выборка.Номер)); Запись.ЗаписатьАтрибут("Дата", Строка(Выборка.Дата)); Запись.ЗаписатьАтрибут("Организация", Строка(Выборка.Организация)); Запись.ЗаписатьАтрибут("Склад", Строка(Выборка.Склад)); Запись.ЗаписатьАтрибут("ПодразделениеОрганизации", Строка(Выборка.Подразделение)); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЕсли; КонецЦикла; (2) скорее всего так и придется сделать =/ , ну сейчас пока еще подумаю, быть может действительно получится сделать это каким-нибудь виртуозным подобием ИмяДокументаСтрока = Метаданные.НайтиПоТипу(ТипДокумента).Имя; Документы[ИмяДокументаСтрока].Выбрать() но все больше уже склоняюсь к выборке...) |
|||
12
YurAnt
03.09.13
✎
21:24
|
пардон)
ТипЗнч(ДокументСсылка.) - закоменчено. |
|||
13
Noob_Of_1C
03.09.13
✎
21:30
|
(12)
Короче, у тебя какие данные есть? Приведи пример: значение и тип того что есть у тебя |
|||
14
Noob_Of_1C
03.09.13
✎
21:38
|
Такое, например, работает
Документы[Метаданные.НайтиПоТипу(тип("ДокументМенеджер.ПоступлениеТоваров")).Имя].Выбрать() |
|||
15
YurAnt
04.09.13
✎
06:57
|
Огромная вам благодарность, Noob_Of_1C
Взлетело вот так: Процедура ВыполнитьВыгрузкуВXML() Экспорт Запись=Новый ЗаписьXML; Запись.ОткрытьФайл(Файл); Запись.ЗаписатьОбъявлениеXML(); Запись.ЗаписатьНачалоЭлемента("Документы"); Для Каждого Строка Из СписокВсехТиповДокументов Цикл Если Строка.ДокументВыбран = Истина Тогда ТипДокумента = Строка.ТипДокумента; Если ЗначениеЗаполнено(ТипДокумента) Тогда Запись.ЗаписатьНачалоЭлемента(ТипДокумента); //ДокументыТекТипа = Метаданные.НайтиПоТипу(ТипДокумента).Имя; Выборка = Документы[Метаданные.НайтиПоТипу(тип("ДокументМенеджер."+ТипДокумента)).Имя].Выбрать(); Пока Выборка.Следующий()Цикл Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Номер", Строка(Выборка.Номер)); Запись.ЗаписатьАтрибут("Дата", Строка(Выборка.Дата)); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЕсли; КонецЦикла; Запись.ЗаписатьКонецЭлемента(); Запись.Закрыть(); КонецПроцедуры Тему можно закрывать. Всем спасибо за советы и просто участие. С ув. Yurant. |
|||
16
palpetrovich
04.09.13
✎
07:14
|
(15) а чем (4) не устроило-то? Не ищем легких путей? :)
|
|||
17
YurAnt
04.09.13
✎
08:11
|
(16) фейспалм)) А слона-то мы и не заметили))
(4) тоже работает :) |
|||
18
Noob_Of_1C
04.09.13
✎
13:47
|
Ааа, я то думал что у тебя входные данные такие "ДокументМенеджер.АвансовыйОтчет", а если имеется чистое имя документа, то конечно лучше обращаться
Документы[ИмяДокумента], где ИмяДокумента является строкой "АвансовыйОтчет" - Полный аналог Документ.АвансовыйОтчет |
|||
19
Noob_Of_1C
04.09.13
✎
13:57
|
Самое смешное что
Метаданные.НайтиПоТипу(тип("ДокументМенеджер."+"АвансовыйОтчет")).Имя равно "АвансовыйОтчет" То есть от чего ушли к тому пришли xD |
|||
20
YurAnt
07.09.13
✎
17:58
|
хм, Noob_Of_1C, судя по всему тестировал я это в БП (если не ошибаюсь) а в УТ вариант (4) ругается на несоответствие типов параметр номер 1, а вариант
Выборка = Документы[Метаданные.НайтиПоТипу(тип("ДокументМенеджер."+ТипДокумента)).Имя].Выбрать(); работает стабильно на разных кофигурациях (УТ, БП, ЗУП) чего собственно и хотелось добиться)) |
|||
21
YurAnt
07.09.13
✎
17:59
|
так что, ваш вариант таки приемлемее :)
|
|||
22
palpetrovich
08.09.13
✎
14:30
|
(20) " в УТ вариант (4) ругается на несоответствие типов параметр номер 1" - ересь! проблема стопудово в другом :)
|
|||
23
YurAnt
08.09.13
✎
18:07
|
мб, но раз вариант (4) не взлетает, использую то, что работает корректно...
и еще, вопрос из той же области: как обратиться к свойству выборки, при том, что оно задается динамически ? Пока ВыборкаСправочников.Следующий()Цикл Если ЭлементСправочникаЗаписан = Истина Тогда Если ВыборкаСправочников.ПометкаУдаления = Ложь Тогда Если ВыборкаСправочников.ЭтоГруппа Тогда Запись.ЗаписатьНачалоЭлемента("Группа"); Запись.ЗаписатьАтрибут("id", Строка(id)); Запись.ЗаписатьАтрибут("Код", Строка(ВыборкаСправочников.Код)); Запись.ЗаписатьАтрибут("Наименование", Строка(ВыборкаСправочников.Наименование)); Запись.ЗаписатьАтрибут("Родитель", Строка(ВыборкаСправочников.Родитель)); Запись.ЗаписатьАтрибут("Владелец", Строка(ВыборкаСправочников.Владелец)); Запись.ЗаписатьАтрибут("Состояние", Строка("Записан")); //Для каждого Реквизит Из Метаданные.Справочники[ТипСправочника].Реквизиты Цикл // Запись.ЗаписатьАтрибут(Строка(Реквизит), Строка(ВыборкаСправочников.Реквизит.Значение)); //КонецЦикла; Запись.ЗаписатьКонецЭлемента(); id = id + 1; В закомменченом куске, Запись.ЗаписатьАтрибут(Строка(Реквизит), Строка(ВыборкаСправочников.Реквизит.Значение)); ВыборкаСправочников.Реквизит.Значение - вполне очевидно, что не срабатывает, вот прикидываю как обратиться к реквизиту(свойству) элемента выборки, имея его название в строковом формате... |
|||
24
YurAnt
08.09.13
✎
18:26
|
Итак, ответ на этот и многие другие вопросы о динамической сборке данных вот:
Для каждого Реквизит Из Метаданные.Справочники[ТипСправочника].Реквизиты Цикл Запись.ЗаписатьАтрибут(Строка(Реквизит), Строка(Вычислить("ВыборкаСправочников." + Реквизит))); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |