На Инфостарте выложено множество внешних печатных форм «с выбором…», и почти все они реализованы по одному принципу — перед печатью выводим форму, на которой пользователь выбирает нужное значение для подстановки. И я так неоднократно делал. Но некоторое время назад появилась пара клиентов, которые выписывают под тысячу счетов-фактур в день. Казалось бы, невелик труд — лишний раз на кнопку «ОК» кликнуть, если подписи уполномоченных по умолчанию печатать надо, но к концу дня бухгалтер стала нехорошо на меня посматривать 🙂 Пришлось переделывать. Результатом стала внешняя печатная форма с выбором ответственных лиц без формы выбора.
Для демонстрации воспользуюсь стандартной внешней печатной формой счет-фактуры выданной по постановлению 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.Текст = Доверенность; Исключение
Конецпопытки
КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры
Вот и все. Теперь при выборе нашей печатной формы, программа будет без всяких вопросов выводить фамилию директора и главбуха. А если их надо поменять на кого-либо из уполномоченных, то достаточно кликнуть на «ФИОРуководителя» или «ФИОГлавногоБухгалтера» и выбрать нужного из появившегося списка.
еще проще регламентное задание с печатью доков за период тогда сделать, буху вообще не придется ничего жать. А вообще не очень правильно после вывода печатной формы еще что-то делать, лучше до, печать как результат д.б.
(1) serega3333, Ага. Прибежал покупатель — давай счет-фактуру! А подписывать кто будет? У Иванова совещание, Петров в обладминистрацию уехал… Значит Сидоров подпишет. Пока бумажку печатали Сидоров в 5-й цех убежал, а это почти 4 км от административного корпуса. Зато у Иванова совещание закончилось. И так раз м-надцать за день. А хоть регламентное, хоть групповое — хорошо когда на аванс печатаешь. Там проблемы «Кто подпишет?» нет.
Присоединяюсь к (1), мне кажется если реализовывать такой алгоритм, то нужно в базе сохранять данные об измененном подписанте. Иначе может получиться нестыковка при сверке с контрагентами или налоговой.
(3) FedorovEvg, возражаю: идея избавиться от промежуточного окошка хороша (воспользовался), а использовать можно для неофициальных форм. и ничто не мешает в рамках этой идеи сделать сохранение
(4) так нам показан алгоритм на сф, это самая офицальная форма.
(3) Не уверен в необходимости хранения подобной информации в базе. На каждого уполномоченного должен быть приказ или доверенность «На основании…» Это «на основании» печатается под подписью.
(5) СФ выбрана потому, что она у каждого есть 🙂 И, соответственно, мне нет необходимости постить кучу кода. Люди с малым рейтингом могут не качать пример, и так все понятно.
Механизм реализации имеет право на жизнь. А значит «+». И не важно в какой момент выбирать значение — до печати или после. Все на любителя!
Очень изящно. Очень помогло. Спасибо