СкопироватьДокумент, Копирование документа
Теги: 1С

# Код реализации

```1c
// Выполняет копирование документа.
//
// Параметры:
//  Приемник					 - Объект	 - Документ, в который копируются данные.
//  Источник					 - Ссылка	 - Документ, из которого копируются данные.
//  ИсключаемыеСвойства			 - Строка	 - Имена свойств, разделенные запятыми, которые необходимо исключить из заполнения.
//  ИсключаемыеТабличныеЧасти	 - Строка	 - Имена табличных частей, разделенные запятыми, которые необходимо исключить из заполнения.
//  ДанныеЗаполнения			 - Структура - Значение параметра процедуры ОбработкаЗаполнения, используется как основание для заполнения документа.
//
Процедура СкопироватьДокумент(Приемник, Источник, ИсключаемыеСвойства = "", ИсключаемыеТабличныеЧасти = "", ДанныеЗаполнения = Неопределено) Экспорт

	ДанныеДокумента = Источник.Скопировать();
	МетаданныеДокумента = Приемник.Метаданные();

	ЗаполнитьЗначенияСвойств(Приемник, ДанныеДокумента, , ИсключаемыеСвойства);

	// ЗарплатаКадрыПодсистемы.КадровыйУчет.ЭлектронныеТрудовыеКнижки

	ЭлектронныеТрудовыеКнижкиРасширенный.ПриЗаполненииДокументаИсправления(Приемник, Источник);

	// Конец ЗарплатаКадрыПодсистемы.КадровыйУчет.ЭлектронныеТрудовыеКнижки

	Если ИсключаемыеТабличныеЧасти = "" Тогда
		ИменаИсключаемыхТабличныхЧастей = Новый Массив;
	Иначе
		ИменаИсключаемыхТабличныхЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсключаемыеТабличныеЧасти, , , Истина);
	КонецЕсли;

	Для каждого ТабличнаяЧастьДокумента Из МетаданныеДокумента.ТабличныеЧасти Цикл
		Если ИменаИсключаемыхТабличныхЧастей.Найти(ТабличнаяЧастьДокумента.Имя) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Для Каждого СтрокаДокумента Из Источник[ТабличнаяЧастьДокумента.Имя] Цикл
			НоваяСтрока = Приемник[ТабличнаяЧастьДокумента.Имя].Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДокумента);
		КонецЦикла;
	КонецЦикла;

	Если ДанныеЗаполнения = Неопределено Тогда
		ДанныеЗаполнения = Новый Структура;
		ИсправлениеВТекущемПериоде = Ложь;
	Иначе
		ИсправлениеВТекущемПериоде = ДанныеЗаполнения.Свойство("ДопустимоИсправлениеВТекущемПериоде")
			И ДанныеЗаполнения.ДопустимоИсправлениеВТекущемПериоде
			И ВозможноИсправлениеТекущимПериодом(Источник);
	КонецЕсли;

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

			Если МетаданныеРеквизита <> Неопределено Тогда
				ИмяПериодРегистрации = МетаданныеРеквизита.Имя;
				ПериодРегистрацииИсправленногоДокумента = ДанныеДокумента[ИмяПериодРегистрации];
			Иначе
				ИмяПериодРегистрации = Неопределено;
				ПериодРегистрацииИсправленногоДокумента = Дата(1, 1, 1);
			КонецЕсли;
		КонецЕсли;

		Если ИмяПериодРегистрации <> Неопределено Тогда
			Значения = Новый Структура("Месяц");
			ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(Значения);

			Приемник[ИмяПериодРегистрации] = Макс(ДобавитьМесяц(ПериодРегистрацииИсправленногоДокумента, 1), Значения.Месяц);
		КонецЕсли;
	КонецЕсли;

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