Процесс печати счета-оферты одной кнопкой. Альфа-авто 6

У клиента бывают одноразовые клиенты. Но по закону надо с ними заключать договор-оферту.

Клиент попросил сделать процесс оформления этой оферты одной кнопкой. Я реализовал.

Печатную форму счета-оферты я сделал ранее, но клиенту было неудобно ею пользоваться без автоматики.

Создал кнопку печати счета-оферты, расположил в блоке Плательщик документа заказ-наряд:

&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

	//Команда счета-оферта
	ИмяКоманды = "дор_СчетОферта";
	КомандаФормы = ЭтаФорма.Команды.Добавить(ИмяКоманды);
	КомандаФормы.Действие = ИмяКоманды;
	КомандаФормы.Заголовок = "Счет-оферта";
	КомандаФормы.ИзменяетСохраняемыеДанные = истина;
	КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст;
	
	Привязка = Элементы.ИдентификаторГосударственногоКонтракта;
	НовыйЭлемент = ЭтаФорма.Элементы.Вставить(ИмяКоманды, Тип("КнопкаФормы"), Привязка.Родитель, Привязка);
	НовыйЭлемент.ИмяКоманды = ИмяКоманды;
	
	
КонецПроцедуры  

Далее реализовал логику:

  1. Проверяем что дата договора равна дате документа, если нет, создаем одноразовый договор с датой и номером из документа. Сохраняем документ заказа-наряда
  2. Создаем на основании заказ-наряда счет на оплату, или перезаполняем, если счет уже есть.
  3. Печатаем из счета на оплату внешнюю печатную форму «Счет-оферта».
&НаКлиенте
Процедура дор_СчетОферта(Команда) 
	Если Объект.Ссылка.Пустая() Тогда
		ПоказатьПредупреждение(, "Сначала запишите документ!");
		Возврат;
	КонецЕсли;
	//Если НЕ Объект.Проведен Тогда
	//	ПоказатьПредупреждение(, "Сначала проведите документ!");
	//	Возврат;
	//КонецЕсли;
	
	СчетСсылка = дор_СчетОфертаНаСервере();  
	//Далее печатаем счет на оплату.  
	ПечатьИзВПФКлиент("ПечатнаяФормаСчетаОферты", "СчетОфертаНаОплату", СчетСсылка, ЭтаФорма);

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

&НаСервере
Функция дор_СчетОфертаНаСервере() Экспорт
	//Проверяем договор 
	Если НЕ ЗначениеЗаполнено(Объект.ДоговорВзаиморасчетов) ИЛИ 
		НачалоДня(Объект.ДоговорВзаиморасчетов.ДатаНачала) <> НачалоДня(Объект.Дата) Тогда
		//Если договор не соответствует, ищем или создаем новый
		З = Новый Запрос(
		"ВЫБРАТЬ
		|	ДоговорыВзаиморасчетов.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ДоговорыВзаиморасчетов КАК ДоговорыВзаиморасчетов
		|ГДЕ
		|	ДоговорыВзаиморасчетов.Владелец = &Владелец
		|	И НАЧАЛОПЕРИОДА(ДоговорыВзаиморасчетов.ДатаНачала, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
		|	И ДоговорыВзаиморасчетов.НомерДоговора = &НомерДоговора
		|	И НЕ ДоговорыВзаиморасчетов.ПометкаУдаления");
		З.УстановитьПараметр("ДатаНачала", Объект.Дата);
		З.УстановитьПараметр("НомерДоговора", Объект.Номер);
		З.УстановитьПараметр("Владелец", Объект.Контрагент);
		
		Выборка = З.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			ДоговорСсылка = Выборка.ссылка;
		Иначе
			ДоговорОбъект = Справочники.ДоговорыВзаиморасчетов.СоздатьЭлемент();
			ДоговорОбъект.ДатаНачала = Объект.Дата;
			ДоговорОбъект.НомерДоговора = Объект.Номер;
			ДоговорОбъект.Владелец = Объект.Контрагент;
			ДоговорОбъект.Наименование = "" + ДоговорОбъект.НомерДоговора + " от " + Формат(ДоговорОбъект.ДатаНачала, "ДФ=dd.MM.yyyy");
			ДоговорОбъект.ВидДоговора = Перечисления.ВидыДоговоров.Продажа;
			ДоговорОбъект.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить();
			ДоговорОбъект.Записать();
			ДоговорСсылка = ДоговорОбъект.Ссылка;
		КонецЕсли;                                                         
		//Записываем, если договор отличается
		Объект.ДоговорВзаиморасчетов = ДоговорСсылка;
		ПЗ = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
		Записать(ПЗ);
	КонецЕсли;

	//Далее создаем на основании счет на оплату (перезаполняем)
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	СчетНаОплату.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.СчетНаОплату КАК СчетНаОплату
	|ГДЕ
	|	СчетНаОплату.ДокументОснование = &ДокументОснование
	|	И НЕ СчетНаОплату.ПометкаУдаления");
	З.УстановитьПараметр("ДокументОснование", Объект.Ссылка);
	Выборка = З.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		СчетСсылка = Выборка.ссылка;
	Иначе
		СчетОбъект = Документы.СчетНаОплату.СоздатьДокумент();
		СчетОбъект.Заполнить(Объект.Ссылка);
		СчетОбъект.Записать(РежимЗаписиДокумента.Запись);
		СчетСсылка = СчетОбъект.Ссылка;
	КонецЕсли;         
	
	Возврат СчетСсылка;
КонецФункции

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

Функция НайтиВПФПоИмениОбъекта(ИмяВПФ) Экспорт     
	Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", ИмяВПФ);
КонецФункции

Пришлось разобраться, как вывести внешнюю печатную форму. Данные на Инфостарте на этот счет уже слегка устарели.

Среда: Альфа-Авто: Автосалон+Автосервис+Автозапчасти КОРП. Редакция 6 (6.1.03.17)
Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *