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