Получение и запись реквизитов документа через метаданные. Ключевые слова: копирование, получение, реквизит документ, метаданные, программно
Для копирования документа в 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
|