Пример печатной формы "с выбором" без формы выбора


Пример реализации внешней печатной формы с выбором ответственного лица без формы выбора

На Инфостарте выложено множество внешних печатных форм «с выбором…», и почти все они реализованы по одному принципу — перед печатью выводим форму, на которой пользователь выбирает нужное значение для подстановки. И я так неоднократно делал. Но некоторое время назад появилась пара клиентов, которые выписывают под тысячу счетов-фактур в день. Казалось бы, невелик труд — лишний раз на кнопку «ОК» кликнуть, если подписи уполномоченных по умолчанию печатать надо, но к концу дня бухгалтер стала нехорошо на меня посматривать 🙂 Пришлось переделывать. Результатом стала внешняя печатная форма с выбором ответственных лиц без формы выбора.

Для демонстрации воспользуюсь стандартной внешней печатной формой счет-фактуры выданной по постановлению 1137 для Бухгалтерии 2.0. Подготовительные мероприятия по заполнению регистра «ОтветственныеЛицаОрганизаций» и дополнительных свойств справочника «ФизическиеЛица» подробно расписывать не буду.  Все стандартно:

1)      В справочнике «Физические лица» заполняем дополнительные реквизиты «Доверенность за директора» и «Доверенность за гл.бухгалтера»;

2)      В ответственных лицах организаций добавляем новых ответственных как «Уполномоченное лицо».

И меняем нашу печатную форму.

Первым делом добавляем форму обработки. Снимаем галочки командных панелей сверху и снизу — они не нужны. На созданной форме удаляем кнопки «Выполнить» и «Закрыть», и «кидаем» на форму поле табличного документа.

Теперь идем в модуль объекта, находим там функцию Печать(), переименовываем её например в ОригинальнаяПечать(). И пишем свою:

Функция Печать() Экспорт  
 Форма = ПолучитьФорму("Форма");
ТабДокумент = Форма.ЭлементыФормы.ПолеТабличногоДокумента;
Форма.Открыть();
Конецфункции // Печать  

Все. В модуле объекта работы закончены.

Теперь меняем макеты (в данном случае их два и изменить надо оба). Берем ячейки, в которых содержаться те параметры которые будем менять, и присваиваем им имена. Т.е. ячейке с параметром «ФИОРуководителя» присваиваем имя «Директор», а ячейке с параметром «ФИОГлавногоБухгалтера» — «Главбух». Кроме того, надо объединить ячейки на две строки  ниже подписи. Те, куда будет выводиться еще одна строка — «По доверенности…» или «По приказу…».

Возвращаюсь к форме. Вешаю на саму форму Событие «ПриОткрытии», а на поле табличного документа событие «Выбор».

 

Процедура ПриОткрытии()
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент = ОригинальнаяПечать();

ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.ПолеСверху = 13;
ТабДокумент.ПолеСлева  = 0;
ТабДокумент.ПолеСнизу  = 0;
ТабДокумент.ПолеСправа = 0;

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

Элементыформы.ПолеТабличногоДокумента.ВставитьОбласть(ТабДокумент.Область());
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьЗаголовки = Ложь;
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьСетку     = Ложь;
ЭлементыФормы.ПолеТабличногоДокумента.Защита              = Истина;
ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр      = Истина;
КонецПроцедуры  

 

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

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

Запрос.УстановитьПараметр("Дата", СсылкаНаОбъект.Дата);
Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("Уполномоченный", Перечисления.ОтветственныеЛицаОрганизаций.УполномоченныйПредставитель);

НужнаяСтрока = Область.Верх;
НужнаяКолонка = Область.Лево;

Если Область.Имя = "Директор" Тогда 
Запрос.УстановитьПараметр("Владелец","Доверенность за директора");
Иначе
   Запрос.УстановитьПараметр("Владелец","Доверенность за гл.бухгалтера");
КонецЕсли;

Выборка = Запрос.Выполнить().Выгрузить();
Руководители=РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(СсылкаНаОбъект.Организация,СсылкаНаОбъект.Дата,);
НоваяСтрока = Выборка.Вставить(0);
НоваяСтрока.Доверенность = "";
Если Область.Имя = "Директор" Тогда 
НоваяСтрока.ФИО = Руководители.Руководитель;
Иначе
   НоваяСтрока.ФИО = Руководители.ГлавныйБухгалтер;
КонецЕсли;

Спис = Новый СписокЗначений;
Спис.ЗагрузитьЗначения(Выборка.ВыгрузитьКолонку("ФИО"));

ВыбЭлемент = Спис.ВыбратьЭлемент("Выберите сотрудника.", ВыбЭлемент);

Если Не ВыбЭлемент = Неопределено Тогда 
ВыбЗначение = ВыбЭлемент.Значение;
НайденныеСтроки = Выборка.НайтиСтроки(Новый Структура("ФИО", ВыбЗначение));
Если ЗначениеЗаполнено(НайденныеСтроки[0].Доверенность) Тогда
    Доверенность = НайденныеСтроки[0].Доверенность;
Иначе
    Доверенность = "";
КонецЕсли;

Если Область.Имя = "Директор" тогда 
    Обл1 = ТабДок.Область(НужнаяСтрока,НужнаяКолонка,НужнаяСтрока,НужнаяКолонка);
Обл2 = ТабДок.Область(НужнаяСтрока + 2,2,НужнаяСтрока + 2,7);

Попытка
      Обл1.Текст = НайденныеСтроки[0].ФИО;
Обл2.Текст = Доверенность;
Исключение
    КонецПопытки
   Иначе     
    Обл1 = ТабДок.Область(НужнаяСтрока,НужнаяКолонка,НужнаяСтрока,НужнаяКолонка);
Обл2 = ТабДок.Область(НужнаяСтрока + 2,9,НужнаяСтрока + 2,15);

Попытка
     Обл1.Текст = НайденныеСтроки[0].ФИО;
Обл2.Текст = Доверенность;
Исключение
    Конецпопытки
   КонецЕсли;
КонецЕсли;
 КонецЕсли;
КонецПроцедуры  

 

Вот и все. Теперь при выборе нашей печатной формы, программа будет без всяких вопросов выводить фамилию директора и главбуха. А если их надо поменять на кого-либо из уполномоченных, то достаточно кликнуть на «ФИОРуководителя» или «ФИОГлавногоБухгалтера» и выбрать нужного из появившегося списка.

8 Comments

  1. serega3333

    еще проще регламентное задание с печатью доков за период тогда сделать, буху вообще не придется ничего жать. А вообще не очень правильно после вывода печатной формы еще что-то делать, лучше до, печать как результат д.б.

    Reply
  2. Dasty

    (1) serega3333, Ага. Прибежал покупатель — давай счет-фактуру! А подписывать кто будет? У Иванова совещание, Петров в обладминистрацию уехал… Значит Сидоров подпишет. Пока бумажку печатали Сидоров в 5-й цех убежал, а это почти 4 км от административного корпуса. Зато у Иванова совещание закончилось. И так раз м-надцать за день. А хоть регламентное, хоть групповое — хорошо когда на аванс печатаешь. Там проблемы «Кто подпишет?» нет.

    Reply
  3. FedorovEvg

    Присоединяюсь к (1), мне кажется если реализовывать такой алгоритм, то нужно в базе сохранять данные об измененном подписанте. Иначе может получиться нестыковка при сверке с контрагентами или налоговой.

    Reply
  4. tango

    (3) FedorovEvg, возражаю: идея избавиться от промежуточного окошка хороша (воспользовался), а использовать можно для неофициальных форм. и ничто не мешает в рамках этой идеи сделать сохранение

    Reply
  5. FedorovEvg

    (4) так нам показан алгоритм на сф, это самая офицальная форма.

    Reply
  6. Dasty

    (3) Не уверен в необходимости хранения подобной информации в базе. На каждого уполномоченного должен быть приказ или доверенность «На основании…» Это «на основании» печатается под подписью.

    (5) СФ выбрана потому, что она у каждого есть 🙂 И, соответственно, мне нет необходимости постить кучу кода. Люди с малым рейтингом могут не качать пример, и так все понятно.

    Reply
  7. fomix

    Механизм реализации имеет право на жизнь. А значит «+». И не важно в какой момент выбирать значение — до печати или после. Все на любителя!

    Reply
  8. user906884

    Очень изящно. Очень помогло. Спасибо

    Reply

Leave a Comment

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