Книга знаний

1С:Предприятие / Объекты конфигурации / Документы

Получение и запись реквизитов документа через метаданные.

Приемы работы с реквизитами документов через метаданные.Автор статьи: Ангел-Хоронитель | Редакторы: Волшебник,
Последняя редакция №9 от 24.04.06 | История
URL: http://kb.mista.ru/article.php?id=176

Ключевые слова: копирование, перебор, получение, документ, реквизит, метаданные, программно


Для копирования документа в 1С есть клавиша F9. Но зачастую нужно скопировать документ программно. И основная трудность при этом определить все реквизиты для копирования. В этом нам помогут метаданные.

Итак, приведем пример получения идентификаторов документа на примере документа «РеализацияРозница». Они делятся на три части: общие реквизиты, реквизиты шапки и реквизиты табличной части.
    //Получаем идентификаторы общих реквизитов
    Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
           Сообщить(Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор);
    КонецЦикла;
    
    //Получаем идентификаторы реквизитов шапки
    Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитШапки() Цикл
           Сообщить(Метаданные.Документ("РеализацияРозница").РеквизитШапки(nn).Идентификатор);
    КонецЦикла;    
     
    //Получаем идентификаторы реквизитов табличной части
    Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти() Цикл
           Сообщить(Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти(nn).Идентификатор);
    КонецЦикла;

P.S. Замечу, что эти методы позволяют получить текстовые идентификаторы реквизитов

Итак, универсальная процедура копирования документа выглядит так:
Процедура CopyDoc(Док)
                                         
    //создаем документ такого же вида
    Ндок = СоздатьОбъект("Документ."+Док.Вид());
    
    //Создаем новый документ
    Ндок.Новый(); 
     
    //устанавливаем дату документа
    Ндок.ДатаДок = ТекущаяДата();
    
    //Присваиваем новому документу новый номер
    //здесь стоит посмотреть особенности своей конфигурации относительно правил задания префикса
    Ндок.УстановитьНовыйНомер( СокрЛП( Константа.ПрефиксИБ));
    
    //копируем общие реквизиты
    Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
           Рекв = Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор;  
           Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
    КонецЦикла;
    
    //копируем реквизиты шапки
    Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитШапки() Цикл
           Рекв = Метаданные.Документ("РеализацияРозница").РеквизитШапки(nn).Идентификатор;
           Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
    КонецЦикла;    
     
    //перебираем строки данного документа, создавая строки в новом
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл 
        Ндок.НоваяСтрока();        
        //копируем реквизиты табличной части
        Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти() Цикл
               Рекв = Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти(nn).Идентификатор;
               Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
        КонецЦикла;    
    КонецЦикла;
                                        
    //записываем новый документ
    Ндок.Записать();
                                                 
    //открываем новый документ
    ОткрытьФорму(Ндок.ТекущийДокумент());
    
КонецПроцедуры
       
Отшлифуем эту процедуру. Во-первых: автор тоже копируется в новый документ, а нам это не нужно. Во-вторых документ записывается, а это нам тоже не обязательно.
Процедура CopyDoc(Док)
                                                      
    Ндок = "";
    
        //открываем форму нового документа такого же вида
    ОткрытьФорму("Документ."+Док.Вид(),Ндок); 
    
    //копируем общие реквизиты
    Для nn = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
           Рекв = Метаданные. ОбщийРеквизитДокумента(nn).Идентификатор;
           Если Рекв = "Автор" Тогда
            Продолжить;
           КонецЕсли;
           Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
    КонецЦикла;
    
    //копируем реквизиты шапки
    Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитШапки() Цикл
           Рекв = Метаданные.Документ("РеализацияРозница").РеквизитШапки(nn).Идентификатор;
           Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
    КонецЦикла;    
     
    //перебираем строки данного документа, создавая строки в новом
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл 
        Ндок.НоваяСтрока();        
        //копируем реквизиты табличной части
        Для nn = 1 По Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти() Цикл
               Рекв = Метаданные.Документ("РеализацияРозница").РеквизитТабличнойЧасти(nn).Идентификатор;
               Ндок.УстановитьАтрибут(Рекв,Док.ПолучитьАтрибут(Рекв));
        КонецЦикла;    
    КонецЦикла;

КонецПроцедуры

Отличие этой процедуры от предыдущей состоит в том, что она открывает новый документ и заполняет реквизиты, не записывая его. А также не устанавливает автора, предоставляя эту возможность самому документу J

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика