Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Выбор всех атрибутов документа


Автор: Scatman 6.6.2007, 21:04
Можно ли как нить выбрать список всех реквизитов выбранного документа
Код

 Сз=создатьОбъект("СписокЗначений");
    спр=создатьОбъект("Документ.ПКО");
 сз.ДобавитьЗначение(спр.ДокОснование);//добавляем необходимые реквизиты.
        сз.ДобавитьЗначение(спр.Касса);
        сз.ДобавитьЗначение(спр.КодОперации);
        сз.ДобавитьЗначение(спр.Контрагент);
        сз.ДобавитьЗначение(спр.ФизЛицо);
        сз.ДобавитьЗначение(спр.Валюта);
        сз.ДобавитьЗначение(спр.Курс);
        сз.ДобавитьЗначение(спр.Сумма);
                                          сз.ДобавитьЗначение(спр.СтавкаНДС);
        сз.ДобавитьЗначение(спр.ОблагаетсяНП);
        сз.ДобавитьЗначение(спр.СтавкаНП);
        сз.ДобавитьЗначение(спр.СуммаВзаиморасчетов);
        сз.ДобавитьЗначение(спр.ПринятоОТ);
        сз.ДобавитьЗначение(спр.Основание);
        сз.ДобавитьЗначение(спр.Приложение);
                                                                   .....

Что бы не писать все это безобразие каждый раз при выборе другого документа(не ПКО)

Автор: evGenie 7.6.2007, 11:04
Код

Сз=создатьОбъект("СписокЗначений");
Док=СоздатьОбъект("Документ.ПКО");
Док.НайтиДокумент(...);
КолРекв=Метаданные.Документ("ПКО").РеквизитШапки();
Для к=1 По КолРекв Цикл
    Атр=Док.ПолучитьАтрибут(Метаданные.Документ("ПКО").РеквизитШапки(к).Идентификатор);
        сз.ДобавитьЗначение(Атр);
КонецЦикла;

Аналогично для реквизитов ТЧ

Автор: Scatman 12.6.2007, 06:30
Скажите а как переписать строки 
Док.ПолучитьАтрибут(Метаданные.Документ("ПКО").РеквизитШапки(к).Идентификатор);
Док.ПолучитьАтрибут(Метаданные.Документ("ПКО").РеквизитТабличнойЧасти(к).Идентификатор);
в 8
там нет такого метода как получитьатрибут()

Автор: Granata005 12.6.2007, 14:25
 smile  Надо бы форум разбить на подфорумы.... 7.7. и 8 .......

Автор: Engee 12.6.2007, 15:17
В 8-ке все немного по-другому:
Код

Мас = Новый Массив;
Для Каждого Реквизит Из Документы.ПКО.СоздатьДокумент().Метаданные().Реквизиты Цикл
    Мас.Добавить(Реквизит);
КонецЦикла;


В массиве будут содержаться все реквизиты ШАПКИ документа. Если нужны реквизиты табличных частей, то делаешь обход по ним.
Я бы все написал универсально вот так:
Код

ДЗ = Новый ДеревоЗначений;
ДЗ.Колонки.Добавить("Реквизит");

МетаданныеДокумента = Документы.ПКО.СоздатьДокумент().Метаданные();

// берем метаданные шапки
Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
    НовыйРеквизит = ДЗ.Строки.Добавить();
    НовыйРеквизит.Реквизит = Реквизит.Имя;
КонецЦикла;

// берем метаданные всех табличных частей
Для Каждого ТабличнаяЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
    НоваяТЧ = ДЗ.Строки.Добавить();
    НоваяТЧ.Реквизит = ТабличнаяЧасть.Имя;
    Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
         НовыйРеквизитТЧ = НоваяТЧ.Строки.Добавить();
         НовыйРеквизитТЧ.Реквизит = РеквизитТЧ.Имя;
    КонецЦикла;
КонецЦикла;

Автор: Scatman 12.6.2007, 16:42
Спасибо конечно 
но мне нужны не реквизиты а их значения
пока удается получить значения только спомощью 
док.Организация 
и тп
хотелось бы писать универсально

Автор: stron 12.6.2007, 23:09
Модератор: не забываем указывать версию системы по которой задаём вопрос

Автор: Scatman 13.6.2007, 04:54
в 8 версии
Как получить все атрибуты универсально

Автор: Scatman 14.6.2007, 04:16
неужели не кто не знает 8

Автор: PKD 14.6.2007, 15:19
Суть структуры БД 1С8, если я понял правильно, организована на уровне регистров.
И наиболее оптимальным обращением к данным, в данной ситуации, 
является использование встроенного языка SQL для обхода значений.

Типа в обработке:
Цитата

Процедура КнопкаВыполнитьНажатие(Кнопка)
//-----------------------------------------------------------------------------
    Текст = "ВЫБРАТЬ
   |    ПКО.*
   |ИЗ
   |    Документ.ПриходныйКассовыйОрдер КАК ПКО
   |ГДЕ
   |    ПКО.Ссылка = &Ссылка";    
//-----------------------------------------------------------------------------
    Запрос = Новый Запрос(Текст);
    Запрос.УстановитьПараметр("Ссылка", Тек_Документ);
//-----------------------------------------------------------------------------
    ПКО = Запрос.Выполнить();
//-----------------------------------------------------------------------------
    Для Каждого Колонка 
    Из          ПКО.Колонки
    Цикл        Кол_Имя = Колонка.Имя;
//работа с колонками "шапки документа" ........................

//определяем табличные части документа
       Кол_Тип = Строка(Колонка.ТипЗначения);

       Если  Кол_Тип = "Результат запроса"
       Тогда Текст = "ВЫБРАТЬ
        |    ПКО.*
        |ИЗ
        |    Документ.ПриходныйКассовыйОрдер." + Кол_Имя + " КАК ПКО
        |ГДЕ
        |    ПКО.Ссылка = &Ссылка";

       Запрос = Новый Запрос(Текст);
       Запрос.УстановитьПараметр("Ссылка", Тек_Документ);

       Таб_ПКО = Запрос.Выполнить();

       Для Каждого Таб_Колонка 
       Из          Таб_ПКО.Колонки
       Цикл        Таб_Кол = Таб_Колонка.Имя;
//работа с колонками табличной части.........
       КонецЦикла;
       КонецЕсли;
    КонецЦикла;
//-----------------------------------------------------------------------------
КонецПроцедуры


Используя язык запросов Вы работаете не с объектами метаданных, а с их ссылочными структурами.
Можно обращаться как к структуре, в данном случае документа ПКО, так и к самим данным.
Выигрыш в производительности очевиден....

P.S. Прошу прощения за кривой код (писал "на коленках"). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)