Имя: Пароль:
1C
1С v8
Выборка документов определенного типа
,
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
Итак, ответ на этот и многие другие вопросы о динамической сборке данных вот:

Для каждого Реквизит Из Метаданные.Справочники[ТипСправочника].Реквизиты Цикл
                                                Запись.ЗаписатьАтрибут(Строка(Реквизит), Строка(Вычислить("ВыборкаСправочников." + Реквизит)));
                                            КонецЦикла;