Печать договора из УТ 11


5 Окт 2012

С нашей точки зрения, на сегодня "1С:Управление торговлей 8" редакции 11 - самая современная и прогрессивная конфигурация фирмы "1С". Именно на ее базе ведется внутренняя автоматизация компании "Сумма технологий".

В частности, в ней реализован интересный механизм, "печать" документов в MS Word. Например, черновик коммерческого предложения можно получить нажатием одной кнопки, и затем отредактировать его непосредственно в Word. К сожалению, в типовой конфигурации не реализован такой экспорт для наиболее, с нашей точки зрения, подходящих для этого объектов, а именно договоров. Ниже мы разберем по пунктам, как это исправить.

Разбираемся с технологией

В УТ 11 реализован полустандартный механизм экспорта в MS Word. Через DCOM-соединение открывается приложение MS Word, имеющее "свою 1С-ку", VBA (Visual Basic for Applications). Средствами VBA создается новый документ и заполняется по шаблону, который хранится в базе "1С:Управление торговлей 8". Полустандартный он потому, что код сильно "заточен" под конкретные объекты, и для экспорта других приходится писать много своего, обойтись параметрической настройкой не получится.

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

Шаблон печатной формы сохраняется как макет в двоичных данных:

Макет печатной формы 1С в двоичных данных

Для того, чтобы понять, как устроен шаблон, просто выгрузим готовый на диск и посмотрим, что там внутри:

Шаблон печатной формы в MS Word

Примерно понятно, в документе есть области, выделенный тегами <v8 Область.имя="ИмяОбласти"> ..... </v8 Область.имя="ИмяОбласти">, и есть реквизиты вида <v8 реквизит="ИмяРеквизита">, которые заменяются на значения при заполнении шаблона. Сразу предупрежу - если у вас в шаблоне будет один и тот же реквизит в нескольких местах (наименование организации, например), типовой механизм подставит значение только в первый, и на этом успокоится! Сразу добавляйте разные (НашаОрганизация1, НашаОрганизация2, ...).

Шаблон сделали:

Шаблон печатной формы договора в Word

Теперь подцепим его макетом к нужному объекту и загрузим.

Добавляем объекту команду печати:

Команда управляемого интерфейса Печать

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

Функция ПолучитьДанныеОбъектаПоВыборке(Выборка,РезультатЗапроса)
ДанныеОбъекта = Новый Структура;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
ДанныеОбъекта.Вставить(Колонка.Имя,?(Выборка[Колонка.Имя]=NULL ИЛИ ПустаяСтрока(Выборка[Колонка.Имя]),"_________________",Выборка[Колонка.Имя]));
КонецЦикла;
ДанныеОбъекта.Дата=Формат(ДанныеОбъекта.Дата,"ДЛФ=DD");
ДанныеОбъекта.НачалоДействия=Формат(ДанныеОбъекта.НачалоДействия,"ДЛФ=DD");
ДанныеОбъекта.КонецДействия=Формат(ДанныеОбъекта.КонецДействия,"ДЛФ=DD");
//Доп. реквизиты
Попытка
ДанныеОбъекта.Вставить("ЗаказчикВЛице",
Выборка.Ссылка.ДополнительныеРеквизиты
.Найти(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("В лице"),"Свойство").Значение);
Исключение
ДанныеОбъекта.Вставить("ЗаказчикВЛице","_________________");
КонецПопытки;

Итак, шаблон заполняется данными, отлично:
 Печать договора из 1С

Красным я подсветил области, которые заполняются из "Управление торговлей" 11, чтобы глаз сразу цеплял места, которые нужно проверить. Теперь остаются нюансы. Нюанс первый: в договорах нужны нижние колонтитулы с подписями на каждой странице, кроме последней. На последней странице этот "колонтитул" идет сразу за текстом, и кроме подписей, имеет маркировку места под печати. Эта задача прекрасно решается в MS Word созданием двух разделов с разными колонтитулами. Вручную - легко. А вот при программном заполнении приходится помучаться:

Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет,Секции[ИмяМакета].Заголовок);
УправлениеПечатьюКлиент.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
УправлениеПечатьюКлиент.ЗаполнитьПараметры(ПечатнаяФорма, ДанныеОбъекта);
Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет,Секции[ИмяМакета].НижнийКолонтитул);
УправлениеПечатьюКлиент.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
УправлениеПечатьюКлиент.ЗаполнитьПараметры(ПечатнаяФорма, ДанныеОбъекта);
Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет,Секции[ИмяМакета].Раздел2);
УправлениеПечатьюКлиент.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
УправлениеПечатьюКлиент.ЗаполнитьПараметры(ПечатнаяФорма, ДанныеОбъекта);
Макет.COMСоединение.ActiveDocument.Sections(2).Footers.Item(1).Range.Copy();
ПечатнаяФорма.COMСоединение.ActiveDocument.Sections(2).Footers.Item(1).LinkToPrevious=Ложь;
ПечатнаяФорма.COMСоединение.ActiveDocument.Sections(2).Footers.Item(1).Range.Delete();
ПечатнаяФорма.COMСоединение.ActiveDocument.Sections(2).Footers.Item(1).Range.Paste();
УправлениеПечатьюКлиент.ПоказатьДокумент(ПечатнаяФорма);
Теперь наш договор заполняется, колонтитулы отлично встают как нужно. Предпоследняя страница:
Колонтитул договора

Последняя страница:

Колонтитул последней страницы договора

Что осталось? Остался только один нюанс, с которым пришлось поразбираться. Документы в Visual Basic for Applications создаются с типовыми именами: "Документ-1", "Документ-2" и так далее. Свойство "Name", в котором лежит имя документа, доступно только для чтения. А ведь жутко обидно, согласитесь, вручную переименовывать документ, при том, что его содержание на 100% заполняется программно. Решение есть!

Dialog=ПечатнаяФорма.COMСоединение.Dialogs(84); 
Dialog.Name=ДанныеОбъекта.ИмяДокумента;
Dialog.Show();


84 - числовой код диалога wbDialogFileSaveAs, который входит в коллекцию Dialogs объекта Document в Word VBA. То есть, мы создаем диалог сохранения файла с новым именем, подставляем нужное нам имя (я использую конструкцию вида "12-10-04 ООО Лучший клиент на свете - Проектный договор №18/12 от 4 октября 2012"), и показываем диалог на экране. Пользователю остается выбрать, при необходимости, новый каталог, нажить кнопку "Сохранить", и просмотреть текст договора на предмет незаполненных значений. И, конечно, после проверки убрать красный цвет текста. Все!

С помощью этого решения бизнес получает следующие результаты:

  • гарантия наличия и совпадения реквизитов в базе и в бумажном договоре
  • гарантия того, что в договор одного контрагента не попадет наименование другого (реальный случай из практики) 
  • экономия до 10-15 минут времени на каждый формируемый договор (а судя по работе с некоторыми контрагентами, и до трех суток) 
  • гарантия единообразия оформления договоров

Надеюсь, эта статья была вам полезна. Если что-то не получается, звоните, поможем!





Вернуться к списку