Книга знаний

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

Программное копирование документа.

Программное копирование документа.Автор статьи: Ангел-Хоронитель | Редакторы: Волшебник,
Последняя редакция №2 от 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

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