gifts2017

1С УТ 10.3. Дорабатываем "универсальный передаточный документ" (УПД)

Опубликовал Петр Лунегов (pvlunegov) в раздел Программирование - Практика программирования

1c «Управление Торговлей» 10.3. Доработаем печатную форму «Универсальный Передаточный Документ». Эта форма заменяет собой 2 формы «Торг-12» + «Счет-фактура». Добавим колонки «Количество в одном месте», «Количество мест», «Цена с НДС».

Итак, что нам нужно?

Типовая конфигурация 1c "Управление Торговлей" 10.3. Лучше всего, с демо-данными. Если у вас нет демо-данных, то можно скачать конфигурацию и установить себе чистую базу данных. Завести несколько документов (Поступление, Реализация). Если у вас уже есть рабочая база УТ 10.3, отлично! Итак, что я имею? Для статей по 1с на данном сайте я использую типовую конфигурацию с заведенными документами, фиктивные организации и фиктивные документы. Под этим я понимаю взятые с потолка названия, суммы и цифры. Заведенные в 1с документы, отчеты и печатные формы показывают жизнь придуманной организации.

Что мы хотим получить?

Я работаю программистом в организации, использующей несколько оптовых складов. На складах отгружают товар пачками, упаковками, коробками. НЕ штуками! Поэтому кладовщику, и грузчикам крайне неудобно в стандартных формах Торг-12, счет-фактура, УПД видеть количество в штуках. Именно складские работники попросили внести изменения в УПД, для облегчения и ускорения складской отгрузки товаров:

  1. Добавить колонку "Количество мест". Место - это коробка, упаковка для оптовой отгрузки товара большой партией. Для каждого товара устанавливается своя единица измерения (коробка, упаковка, и т.п.)
  2. Добавить колонку "Количество штук в месте". Это означает, сколько единиц товара в 1 коробке.
  3. Добавить колонку "Цена с НДС". Эта колонка важна для клиентов, которые сверяют документы при погрузке товара на складе со своими документами. Чем быстрее Клиент убедится в правильности цифр, тем быстрее заберет товар.

  Итак, начнем!

 1. Типовая форма УПД в УТ 10.3 - Демо конфигурация 1. Типовая форма УПД в УТ 10.3 - Демо конфигурация. Мы видим, как выглядит Универсальный Передаточный Документ.
 2. Общие Макеты в Конфигурации 2. Откроем Общие Макеты в Конфигурации
 3. Скопируем Макет УниверсальныйПередаточныйДокумент 3. Скопируем Макет УниверсальныйПередаточныйДокумент
 4. Назовем скопированный макет УниверсальныйПередаточныйДокумент_Доработанный 4. Назовем скопированный макет УниверсальныйПередаточныйДокумент_Доработанный
 5. Откроем на редактирование скопированный Макет 5. Откроем на редактирование скопированный Макет. Таким образом мы не затронем типовой макет, свои изменения будем вносить в скопированный. При обновлении типовой конфигурации все наши изменения останутся на месте!
 6. Добавим колонки в макет 6. Добавим колонки в макет
 7. Откроем Общий Модуль УчетНДС 7. Откроем Общий Модуль УчетНДС
 8. Откроем процедуру ВывестиСчетФактуруВТабличныйДокумент 8. Откроем процедуру ВывестиСчетФактуруВТабличныйДокумент
 9.1. Изменения в коде процедуры 9.1. Внесем Изменения в коде процедуры
 9.2. Изменения в коде процедуры 9.2. Изменения в коде процедуры
 9.3. Изменения в коде процедуры 9.3. Изменения в коде процедуры

Полный текст измененной процедуры:

Процедура ВывестиСчетФактуруВТабличныйДокумент(ТабДокумент, Макет, ДанныеДляПечати) Экспорт

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

	СтрокаПоДокументу = "";
	Если ДанныеДляПечати.Свойство("ТаблицаДатОплат") Тогда
		Для каждого ПараметрыДокументаОплаты Из ДанныеДляПечати.ТаблицаДатОплат Цикл
			
			Если НЕ ЗначениеЗаполнено(ПараметрыДокументаОплаты.НомерПлатежноРасчетногоДокумента)
				И НЕ ЗначениеЗаполнено(ПараметрыДокументаОплаты.ДатаПлатежноРасчетногоДокумента) Тогда
				Продолжить;
			КонецЕсли;
			СтрокаПоДокументу = СтрокаПоДокументу
				+ ?(ПустаяСтрока(СтрокаПоДокументу), ?(ЭтоПечатьУПД, "", "К платежно-расчетному документу № "),", ")
				+ ПараметрыДокументаОплаты.НомерПлатежноРасчетногоДокумента 
				+ " от " + Формат(ПараметрыДокументаОплаты.ДатаПлатежноРасчетногоДокумента, "ДФ=dd.MM.yyyy") + " г.";
			
		КонецЦикла; 
	КонецЕсли;
	Если ПустаяСтрока(СтрокаПоДокументу) Тогда
		Если ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс
			ИЛИ ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАвансКомитента Тогда
			СтрокаПоДокументу = ?(ЭтоПечатьУПД, "", "К платежно-расчетному документу № ") + "-- от --";
		Иначе
			СтрокаПоДокументу = ?(ЭтоПечатьУПД, "", "К платежно-расчетному документу № ") + "   от";
		КонецЕсли; 
	КонецЕсли; 
	Если ЭтоПечатьУПД И ДанныеДляПечати.СтатусУПД = 2 Тогда
		// В УПД в статусе 2 ставятся прочерки показатели, установленные в качестве обязательных исключительно для счета-фактуры: 
		// - «К платежно-расчетному документу» (строка 7); 
		СтрокаПоДокументу = "--";
	КонецЕсли;
	ОбластьМакета.Параметры.ПоДокументу = СтрокаПоДокументу;
	
	Если БезПереходаПраваСобственности Тогда
		
		ОбластьМакета.Параметры.ПредставлениеПокупателя = "--";
		ОбластьМакета.Параметры.АдресПокупателя 		= "--";
		ОбластьМакета.Параметры.ИННПокупателя 			= "--";
		
	Иначе
	
		ОбластьМакета.Параметры.ПредставлениеПокупателя = ?(ЭтоПечатьУПД, "", "Покупатель: ") 
			+ ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "ПолноеНаименование,");
		ОбластьМакета.Параметры.АдресПокупателя = ?(ЭтоПечатьУПД, "", "Адрес: ")
			+ ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "ЮридическийАдрес,");
		
		Если ЗначениеЗаполнено(ДанныеДляПечати.КППКонтрагента) Тогда
			КПП = ДанныеДляПечати.КППКонтрагента;
		ИначеЕсли СведенияОПодразделенииПокупателя <> Неопределено Тогда
			КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПодразделенииПокупателя, "КПП,", Ложь);
		Иначе
			КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "КПП,", Ложь);
		КонецЕсли;	
			
		Если ЗначениеЗаполнено(КПП) Тогда
			КПП = "/" + КПП;
		КонецЕсли;
		
		ОбластьМакета.Параметры.ИННПокупателя = ?(ЭтоПечатьУПД, "", "ИНН/КПП покупателя: ")
			+ ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе, "ИНН,", Ложь) + КПП;
			
	КонецЕсли;
		
	ОбластьМакета.Параметры.Валюта = ?(ЭтоПечатьУПД, "", "Валюта: наименование, код ")
		+ ?(ЗначениеЗаполнено(ДанныеДляПечати.Валюта), 
			ДанныеДляПечати.Валюта.НаименованиеПолное + ", " + ДанныеДляПечати.Валюта.Код, "");		
			
	ТабДокумент.Вывести(ОбластьМакета);
	
	// Выводим заголовок таблицы
	ОбластьМакетаЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
	ОбластьМакетаЗаголовокТаблицы.Параметры.Заполнить(ДанныеДляПечати);
	ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
	
	// Дополнительная подготовка данных для вывода в табличную часть
	ВыборкаСтрокТовары = ДанныеДляПечати.ТабличнаяЧасть;
	ВыборкаСтрокТовары.Колонки.Добавить("СуммаБезНДС");
	ВыборкаСтрокТовары.Колонки.Добавить("СуммаСНДС");
	
	Если ЭтоПечатьУПД Тогда
		ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
		Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
			ВыводитьКоды 	= Истина;
			КолонкаТоварКод = "ТоварАртикул";
		ИначеЕсли ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код Тогда
			ВыводитьКоды 	= Истина;
			КолонкаТоварКод = "ТоварКод";
		Иначе
			ВыводитьКоды 	= Ложь;
			КолонкаТоварКод	= "";
		КонецЕсли;
	Иначе
		ВыводитьКоды 	= Ложь;
		КолонкаТоварКод	= "";
	КонецЕсли;

	Для Каждого Строчка Из ВыборкаСтрокТовары Цикл
		
		Строчка.СуммаСНДС = Строчка.Сумма + ?(Строчка.СуммаВключаетНДС, 0, Строчка.СуммаНДС);
		Строчка.СуммаБезНДС = Строчка.СуммаСНДС - Строчка.СуммаНДС;
		
		Если ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаРеализацию И 
			(Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120
		 	ИЛИ Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118
		 	ИЛИ Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110) Тогда
			Если (НЕ Строчка.СуммаВключаетНДС) ИЛИ Строчка.Цена = 0 Тогда
				Строчка.Цена = Окр(Строчка.СуммаСНДС / Строчка.Количество, 2);
			КонецЕсли;
		Иначе
			Если Строчка.СуммаВключаетНДС Тогда
				Строчка.Цена = 0;
			КонецЕсли;
		КонецЕсли;
		Если НЕ ЗначениеЗаполнено(Строчка.ЕдиницаИзмерения) Тогда
			Строчка.Количество = 0;
			Строчка.Цена = 0;
		ИначеЕсли Строчка.Количество = 0 Тогда
			Строчка.Цена = 0;
		ИначеЕсли Строчка.Цена = 0 Тогда
			Строчка.Цена = Окр(Строчка.СуммаБезНДС / Строчка.Количество, 2);
		КонецЕсли;
		
		Строчка.ТоварКод = ?(ВыводитьКоды, Строчка[КолонкаТоварКод], "");
		
	КонецЦикла;
		
	ВыборкаСтрокТовары.Свернуть("Товар, ТоварНаименование, ТоварКод, ЕдиницаИзмерения, ЕдиницаИзмеренияКод, Цена, СтавкаНДС,
		|НомерГТД, ПредставлениеГТД, СтранаПроисхождения, СтранаПроисхожденияКод, ПредставлениеСтраны", 
		"Количество, Сумма, СуммаНДС, СуммаСНДС, СуммаБезНДС, НомерСтроки");
	
	// Выводим строки таблицы
	ОбластьМакета       = Макет.ПолучитьОбласть("Строка");
	ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
	ОбластьМакетаИтого  = Макет.ПолучитьОбласть("Итого");
	Если ЭтоПечатьУПД Тогда
		ОбластьМакетаПодвалНакладной = Макет.ПолучитьОбласть("ПодвалНакладной");
	Иначе
		ОбластьМакетаПодвалНакладной = Новый ТабличныйДокумент;
	КонецЕсли;
	КоличествоСтраниц = 1;
	
	НомерСтроки     = 0;
	КоличествоСтрок = ВыборкаСтрокТовары.Количество();

	Для Каждого Строчка Из ВыборкаСтрокТовары Цикл
		
		НомерСтроки = НомерСтроки + 1;
		Строчка.НомерСтроки = НомерСтроки;
		
		ОбластьМакета.Параметры.Заполнить(Строчка);

		Если НЕ ЗначениеЗаполнено(Строчка.ТоварНаименование) Тогда
			ОбластьМакета.Параметры.ТоварНаименование = Строчка.Товар;
		КонецЕсли;
		ОбластьМакета.Параметры.ТоварНаименование = СокрЛП(ОбластьМакета.Параметры.ТоварНаименование);
		
		Если ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаРеализацию Тогда
			ОбластьМакета.Параметры.Стоимость = Строчка.СуммаБезНДС;
			ОбластьМакета.Параметры.Цена   	  = Строчка.Цена;
		Иначе
			ОбластьМакета.Параметры.Стоимость  = 0;
			ОбластьМакета.Параметры.Количество = 0;
			
			// Лунегов П.В. +++
			ОбластьМакета.Параметры.КоличествоМест = 0;
			// Лунегов П.В. +++
			
			ОбластьМакета.Параметры.Цена       = 0;
		КонецЕсли;	
		
		ОбластьМакета.Параметры.Всего     = Строчка.СуммаСНДС;
		ОбластьМакета.Параметры.СтавкаНДС = Строчка.СтавкаНДС;
		
		Если Строчка.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
			ОбластьМакета.Параметры.СтавкаНДС = "без НДС";
			ОбластьМакета.Параметры.СуммаНДС  = "без НДС";
		КонецЕсли;
		
		Если ДанныеДляПечати.ВидСчетаФактуры <> Перечисления.ВидСчетаФактурыВыставленного.НаАванс 
			И ДанныеДляПечати.ВидСчетаФактуры <> Перечисления.ВидСчетаФактурыВыставленного.НаАвансКомитента Тогда
			ОбластьМакета.Параметры.Акциз = "без акциза";
		КонецЕсли;	
		
		Если Строка(Строчка.ПредставлениеСтраны) = "Россия" 
			ИЛИ Строка(Строчка.ПредставлениеСтраны) = "Российская Федерация"
			ИЛИ Строчка.СтранаПроисхождения = Справочники.КлассификаторСтранМира.РОССИЯ Тогда			
			ОбластьМакета.Параметры.ПредставлениеСтраны    = "--";
			ОбластьМакета.Параметры.СтранаПроисхожденияКод = "--";
			ОбластьМакета.Параметры.ПредставлениеГТД       = "--";
		Иначе
			Если ЗначениеЗаполнено(Строчка.СтранаПроисхождения) Тогда
				ОбластьМакета.Параметры.ПредставлениеСтраны  = СокрЛП(Строчка.СтранаПроисхождения.Наименование);
			Иначе
				ОбластьМакета.Параметры.СтранаПроисхожденияКод = "--";
				ОбластьМакета.Параметры.ПредставлениеСтраны    = "--";
				ОбластьМакета.Параметры.ПредставлениеГТД       = "--";
			КонецЕсли;
		КонецЕсли; 
	
		// Проставляем прочерки в незаполненные графы в соответствии с Постановлением
		Если ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс
			ИЛИ ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАвансКомитента Тогда
			
			ОбластьМакета.Параметры.ЕдиницаИзмерения    = "--";
			ОбластьМакета.Параметры.ЕдиницаИзмеренияКод = "--";
			
			ОбластьМакета.Параметры.Количество = "--";
			// Лунегов П.В. +++
			ОбластьМакета.Параметры.КоличествоМест = "--";
			// Лунегов П.В. +++
			ОбластьМакета.Параметры.Цена       = "--";
			ОбластьМакета.Параметры.Стоимость  = "--";
			ОбластьМакета.Параметры.Акциз      = "--";
			
			ОбластьМакета.Параметры.СтранаПроисхожденияКод = "--";
			ОбластьМакета.Параметры.ПредставлениеСтраны    = "--";
			ОбластьМакета.Параметры.ПредставлениеГТД       = "--";
			
		Иначе
			
			Если НЕ ЗначениеЗаполнено(ОбластьМакета.Параметры.ЕдиницаИзмерения) Тогда
				ОбластьМакета.Параметры.ЕдиницаИзмерения    = "--";
				ОбластьМакета.Параметры.ЕдиницаИзмеренияКод = "--";
			КонецЕсли;
			Если НЕ ЗначениеЗаполнено(ОбластьМакета.Параметры.ЕдиницаИзмеренияКод) Тогда
				ОбластьМакета.Параметры.ЕдиницаИзмеренияКод = "--";
			КонецЕсли;
			Если НЕ ЗначениеЗаполнено(ОбластьМакета.Параметры.Количество) Тогда
				ОбластьМакета.Параметры.Количество = "--";
				// Лунегов П.В. +++
				ОбластьМакета.Параметры.КоличествоМест = "--";
				// Лунегов П.В. +++
			КонецЕсли;
			Если НЕ ЗначениеЗаполнено(ОбластьМакета.Параметры.Цена) Тогда
				ОбластьМакета.Параметры.Цена = "--";
			КонецЕсли;
			
		КонецЕсли;
		
		Если ЭтоПечатьУПД И ДанныеДляПечати.СтатусУПД = 2 Тогда
			
			// Ставим прочерки в графах, которые установленные в качестве обязательных исключительно для счета-фактуры
			//- «В том числе сумма акциза» (графа 6); 
			//- «Налоговая ставка» (графа 7);
			//- «Цифровой код страны происхождения товара» (графа 10);
			//- «Краткое наименование страны происхождения товара» (графа 10а);
			//- «Номер таможенной декларации» (графа 11). 
			
			ОбластьМакета.Параметры.Акциз 		= "--";
			ОбластьМакета.Параметры.СтавкаНДС 	= "--";
			ОбластьМакета.Параметры.СуммаНДС 	= ?(Строчка.СуммаНДС <> 0 , Строчка.СуммаНДС, "--");
			ОбластьМакета.Параметры.СтранаПроисхожденияКод 	= "--";
			ОбластьМакета.Параметры.ПредставлениеСтраны 	= "--";
			ОбластьМакета.Параметры.ПредставлениеГТД 		= "--";
			
		КонецЕсли;
		
		// Проверим возможность вывода табличного документа
		СтрокаСПодвалом = Новый Массив;
		СтрокаСПодвалом.Добавить(ОбластьМакета);
		Если НомерСтроки = КоличествоСтрок Тогда
			// Если последняя строка, то должен поместится итог и подвал
			СтрокаСПодвалом.Добавить(ОбластьМакетаИтого);
			СтрокаСПодвалом.Добавить(ОбластьМакетаПодвал);
			Если ЭтоПечатьУПД Тогда
				СтрокаСПодвалом.Добавить(ОбластьМакетаПодвалНакладной);
			КонецЕсли;
		КонецЕсли;
						
		Если НЕ ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, СтрокаСПодвалом) Тогда
			
			Если КоличествоСтрок > 0 Тогда
				// Вывод разделителя и заголовка таблицы на новой странице
				ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
				ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
				КоличествоСтраниц = КоличествоСтраниц + 1;
			КонецЕсли;
			
		КонецЕсли;
		
		// Лунегов П.В. +++
		ОбластьМакета.Параметры.КоличествоВОдномМесте 	= Строка(Строчка.Товар.ЕдиницаИзмеренияМест.Коэффициент);
		
		Если ЗначениеЗаполнено(Строчка.Товар.ЕдиницаИзмеренияМест.Коэффициент) Тогда
			целоеЧислоМест		= цел(Строчка.Количество / Строчка.Товар.ЕдиницаИзмеренияМест.Коэффициент);
			ОстатокЧислоМест	= Строчка.Количество % Строчка.Товар.ЕдиницаИзмеренияМест.Коэффициент;
		Иначе
			целоеЧислоМест		= 0;
			ОстатокЧислоМест	= 0;
		КонецЕсли;
		
		ОбластьМакета.Параметры.КоличествоМест 			= ?(целоеЧислоМест<>0,Строка(целоеЧислоМест),"")+ 
			?(ОстатокЧислоМест<>0, ", "+Строка(ОстатокЧислоМест), "");
		ОбластьМакета.Параметры.ЦенаСНДС 				= ?(Строчка.Количество<>0 и Строчка.СуммаСНДС <> 0,
			Строка(Строчка.СуммаСНДС / Строчка.Количество),0);
		// Лунегов П.В. ---
		
		ТабДокумент.Вывести(ОбластьМакета);

	КонецЦикла;
	
	КоличествоЛистов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Документ составлен на%1%2 %3'"), Символы.ПС, КоличествоСтраниц,
		ОбщегоНазначения.ФормаМножественногоЧисла(
			НСтр("ru = 'листе'"), НСтр("ru = 'листах'"), НСтр("ru = 'листах'"), КоличествоСтраниц));
	ДанныеДляПечати.Вставить("КоличествоЛистов", КоличествоЛистов);

	Если КоличествоСтрок > 0 Тогда
		ТабДокумент.Область(ТабДокумент.ВысотаТаблицы,,ТабДокумент.ВысотаТаблицы,).ВместеСоСледующим = Истина;
	КонецЕсли; 
		
	// Выводим строку "Всего к оплате"
	Если ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс
		ИЛИ ДанныеДляПечати.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАвансКомитента Тогда
		ОбластьМакетаИтого.Параметры.ИтогоСтоимость = "--";
	Иначе
		ОбластьМакетаИтого.Параметры.ИтогоСтоимость = ВыборкаСтрокТовары.Итог("СуммаБезНДС");
	КонецЕсли;
	
	ИтогоСуммаНДС = ВыборкаСтрокТовары.Итог("СуммаНДС");
	Если ЭтоПечатьУПД И ДанныеДляПечати.СтатусУПД = 2 Тогда
	    ОбластьМакетаИтого.Параметры.ИтогоСуммаНДС = ?(ИтогоСуммаНДС <> 0, ИтогоСуммаНДС, "--");
	ИначеЕсли ДанныеДляПечати.СчетФактураБезНДС Тогда
		ОбластьМакетаИтого.Параметры.ИтогоСуммаНДС = "без НДС";
	Иначе
		ОбластьМакетаИтого.Параметры.ИтогоСуммаНДС = ИтогоСуммаНДС;
	КонецЕсли;
	ОбластьМакетаИтого.Параметры.ИтогоВсего = ВыборкаСтрокТовары.Итог("СуммаСНДС");
	
	ТабДокумент.Вывести(ОбластьМакетаИтого);
	
	// Выводим подвал
	ОбластьМакетаПодвал.Параметры.Заполнить(ДанныеДляПечати);
							
	ОбластьМакетаПодвал.Параметры.Свидетельство = ФормированиеПечатныхФорм.ОписаниеОрганизации(
		СведенияОПоставщике, "Свидетельство,");
	
	ТабДокумент.Вывести(ОбластьМакетаПодвал);
 	
КонецПроцедуры //ВывестиСчетФактуруВТабличныйДокумент
 

 

 10. Открываем процедуру ПечатьУниверсальногоПередаточногоДокумента 10. Открываем процедуру ПечатьУниверсальногоПередаточногоДокумента
 10.1. Вносим изменения в код в процедуре ПечатьУниверсальногоПередаточногоДокумента 10.1. Вносим изменения в код в процедуре ПечатьУниверсальногоПередаточногоДокумента

Полный текст измененной процедуры:

Функция ПечатьУниверсальногоПередаточногоДокумента(ДанныеДокумента, СчетФактураТребуется, СтруктураОтбораСчетаФактуры = Неопределено, ТабДокумент = Неопределено) Экспорт
	
	Если ДанныеДокумента.Дата < ДатаНачалаПримененияУПД() Тогда
		ТекстСообщения = НСтр("ru = 'Применение формы универсального передаточного (отгрузочного) документа возможно только с "+ДатаНачалаПримененияУПД(Истина)+"!'");
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат Неопределено;
	КонецЕсли;

	Если СтруктураОтбораСчетаФактуры = Неопределено Тогда
		СчетФактура = НайтиПодчиненныйСчетФактуру(ДанныеДокумента.ДокументСсылка, "СчетФактураВыданный");
	Иначе
		СчетФактура = НайтиПодчиненныйСчетФактуру(ДанныеДокумента.ДокументСсылка, "СчетФактураВыданный", СтруктураОтбораСчетаФактуры);
	КонецЕсли;
	
	Если ТабДокумент = Неопределено Тогда
		ТабДокумент = Новый ТабличныйДокумент;
		// Устанавливаем параметры печати и колонтитулы
		ТабДокумент.ОриентацияСтраницы 	= ОриентацияСтраницы.Ландшафт;
		ТабДокумент.ПолеСверху 			= 12;
		ТабДокумент.ПолеСлева  			= 0;
		ТабДокумент.ПолеСнизу  			= 0;
		ТабДокумент.ПолеСправа 			= 0;
		ТабДокумент.АвтоМасштаб 		= Истина;
		ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент";
	КонецЕсли;
	
	Если ЗначениеЗаполнено(СчетФактура) ИЛИ СчетФактураТребуется Тогда
		
		// УПД печатается из документа счет-фактура
		Если НЕ ЗначениеЗаполнено(СчетФактура) Тогда
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'По документу ""%1"" не выписан счет-фактура или он помечен на удаление!'"), ДанныеДокумента.ДокументСсылка);
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
			Возврат Неопределено;
		КонецЕсли;
		
		РеквизитыСФ = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(СчетФактура, "Дата, ВидСчетаФактуры, Исправление,НомерИсправления,
			|СчетФактураБезНДС, КППКонтрагента");
		ДанныеДокумента.Вставить("Ссылка", 					СчетФактура); 
		ДанныеДокумента.Вставить("Дата", 					РеквизитыСФ.Дата);
		ДанныеДокумента.Вставить("ВидСчетаФактуры", 		РеквизитыСФ.ВидСчетаФактуры);
		ДанныеДокумента.Вставить("Исправление", 	 		РеквизитыСФ.Исправление);
		ДанныеДокумента.Вставить("НомерИсправления", 		РеквизитыСФ.НомерИсправления);
		ДанныеДокумента.Вставить("СчетФактураБезНДС", 		РеквизитыСФ.СчетФактураБезНДС);
		ДанныеДокумента.Вставить("КППКонтрагента", 	 		РеквизитыСФ.КППКонтрагента);
		
		СчетФактураОбъект = СчетФактура.ПолучитьОбъект();
		ДанныеДляПечати = СчетФактураОбъект.ПодготовитьДанныеДляПечатиУниверсальногоПередаточногоДокумента(ДанныеДокумента);
		Если ДанныеДляПечати = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		
		Если ДанныеДокумента.Свойство("ДатаОтгрузкиПередачи") Тогда
			ДанныеДляПечати.Вставить("ДатаОтгрузкиПередачи", ДанныеДокумента.ДатаОтгрузкиПередачи);
		КонецЕсли;

		СчетФактураОбъект.ПечатьУниверсальногоПередаточногоДокумента(ДанныеДляПечати, ТабДокумент);
		Возврат ТабДокумент;
		
	КонецЕсли;
	
	// УПД печатается по статусу 2
	ДанныеДляПечати = ПодготовитьДанныеДляПечатиУниверсальногоПередаточногоДокумента(ДанныеДокумента);
	Если ДанныеДляПечати = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	
	// Лунегов П.В. +++
	// До изменения:
	//Макет = ПолучитьОбщийМакет("УниверсальныйПередаточныйДокумент");
	// После изменения:
	Макет = ПолучитьОбщийМакет("УниверсальныйПередаточныйДокумент_МегаТрейдУрал");
	// Лунегов П.В. +++

	ВывестиСчетФактуруВТабличныйДокумент(ТабДокумент, Макет, ДанныеДляПечати);

	ВывестиПодвалУниверсальногоПередаточногоДокументаВТабличныйДокумент(ТабДокумент, Макет, ДанныеДляПечати);
	
	// Устанавливаем параметры печати и колонтитулы
	ТабДокумент.ВерхнийКолонтитул.Выводить          	= Истина;
	ТабДокумент.ВерхнийКолонтитул.НачальнаяСтраница 	= 2;
	ТабДокумент.ВерхнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
	НомерНаПечатьСтрокой 	= ОбщегоНазначения.ПолучитьНомерНаПечать(ДанныеДляПечати);
	ДатаНаПечатьСтрокой  	= Формат(ДанныеДляПечати.Дата, "ДФ='дд ММММ гггг'") + " г.";
	ЗаголовокДляПечати 	 	= "Универсальный передаточный документ № " + НомерНаПечатьСтрокой + " от " +  ДатаНаПечатьСтрокой;
	ТабДокумент.ВерхнийКолонтитул.ТекстСлева   			= ЗаголовокДляПечати;
	ТабДокумент.ВерхнийКолонтитул.ТекстСправа  			= "Лист [&НомерСтраницы]";
	
	Возврат ТабДокумент;
КонецФункции // ПечатьУниверсальногоПередаточногоДокумента
 

   

 11. Вносим изменения в процедуру печати в модуле документа СчетФактураВыданный 11. Вносим изменения в процедуру печати в модуле документа СчетФактураВыданный

Полный текст измененной процедуры:

// Функция формирует табличный документ с печатной формой универсального передаточного документа
//
// Возвращаемое значение:
//  Табличный документ - печатная форма универсального передаточного документа
//
Функция ПечатьУниверсальногоПередаточногоДокумента(ДанныеДляПечати, ТабДокумент = Неопределено) Экспорт

	// Лунегов П.В. +++
	// До изменения:
	//Макет = ПолучитьОбщийМакет("УниверсальныйПередаточныйДокумент");
	// После изменения:
	Макет = ПолучитьОбщийМакет("УниверсальныйПередаточныйДокумент_МегаТрейдУрал");
	// Лунегов П.В. +++
	
	Если ТабДокумент = Неопределено Тогда
		ТабДокумент = Новый ТабличныйДокумент;
	КонецЕсли;
	
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент";
	
	УчетНДС.ВывестиСчетФактуруВТабличныйДокумент(ТабДокумент, Макет, ДанныеДляПечати);
	УчетНДС.ВывестиПодвалУниверсальногоПередаточногоДокументаВТабличныйДокумент(ТабДокумент, Макет, ДанныеДляПечати);
	
	Возврат ТабДокумент;

КонецФункции // ПечатьУниверсальногоПередаточногоДокумента
 

   

 12. Результат распечатки УПД из Реализации (Счет-фактуры) 12. Результат распечатки УПД из Реализации (Счет-фактуры). На картинке слева пометил не тот столбец! Надо было пометить столбцы "В одном месте, штук", "Мест, штук"

Печатная форма выходит на экран в измененном виде, все получилось!   На этом все, пока!

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Константин Юрин (kostyaomsk) 19.06.15 19:23
Для начинающих разработчиков описание подобных методик большой плюс. По идее портал то для разработчиков :)
2. г. Казань Рустем Гумеров (Rustig) 15.12.15 17:51
желательно вносить доработки во внешнюю форму, чтобы не снимать с основной поддержки.
типовую УПД реально разработать как внешнюю печатную форму, используя общий модуль УчетНДС и экспортные функции и процедуры данного модуля и модуля документа СчетФактураВыданный.