С нашей точки зрения, на сегодня "1С:Управление торговлей 8" редакции 11 - самая современная и прогрессивная конфигурация фирмы "1С". Именно на ее базе ведется внутренняя автоматизация компании "Сумма технологий".
В частности, в ней реализован интересный механизм, "печать" документов в MS Word. Например, черновик коммерческого предложения можно получить нажатием одной кнопки, и затем отредактировать его непосредственно в Word. К сожалению, в типовой конфигурации не реализован такой экспорт для наиболее, с нашей точки зрения, подходящих для этого объектов, а именно договоров. Ниже мы разберем по пунктам, как это исправить.
В УТ 11 реализован полустандартный механизм экспорта в MS Word. Через DCOM-соединение открывается приложение MS Word, имеющее "свою 1С-ку", VBA (Visual Basic for Applications). Средствами VBA создается новый документ и заполняется по шаблону, который хранится в базе "1С:Управление торговлей 8". Полустандартный он потому, что код сильно "заточен" под конкретные объекты, и для экспорта других приходится писать много своего, обойтись параметрической настройкой не получится.
Конечно, правильнее со многих точек зрения использовать технологию подключения внешних печатных форм, но по ряду малоинтересных причин в этом конкретном случае доработка делалась непосредственно в конфигурации. С точки зрения реализации оба подхода отличаются мало, с основном размещением процедур и функций в разных модулях.
Для того, чтобы понять, как устроен шаблон, просто выгрузим готовый на диск и посмотрим, что там внутри:
Примерно понятно, в документе есть области, выделенный тегами <v8 Область.имя="ИмяОбласти"> ..... </v8 Область.имя="ИмяОбласти">, и есть реквизиты вида <v8 реквизит="ИмяРеквизита">, которые заменяются на значения при заполнении шаблона. Сразу предупрежу - если у вас в шаблоне будет один и тот же реквизит в нескольких местах (наименование организации, например), типовой механизм подставит значение только в первый, и на этом успокоится! Сразу добавляйте разные (НашаОрганизация1, НашаОрганизация2, ...).
Теперь подцепим его макетом к нужному объекту и загрузим.
Переписываем код этой команды под наш шаблон. Данные для печати собираются в модуле менеджера объекта. Если в вашем случае так же, как в моем, у объекта не было печатных форм и менеджер был пустой, просто скопируйте его из другого объекта и перепишите. Подскажу, как красиво заполнить структуру объекта данными по выборке и добавить дополнительные реквизиты, которые в запросе выбирать неудобно:
Красным я подсветил области, которые заполняются из "Управление торговлей" 11, чтобы глаз сразу цеплял места, которые нужно проверить. Теперь остаются нюансы. Нюанс первый: в договорах нужны нижние колонтитулы с подписями на каждой странице, кроме последней. На последней странице этот "колонтитул" идет сразу за текстом, и кроме подписей, имеет маркировку места под печати. Эта задача прекрасно решается в MS Word созданием двух разделов с разными колонтитулами. Вручную - легко. А вот при программном заполнении приходится помучаться:
Последняя страница:
Что осталось? Остался только один нюанс, с которым пришлось поразбираться. Документы в 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"), и показываем диалог на экране. Пользователю остается выбрать, при необходимости, новый каталог, нажить кнопку "Сохранить", и просмотреть текст договора на предмет незаполненных значений. И, конечно, после проверки убрать красный цвет текста. Все!
Надеюсь, эта статья была вам полезна. Если что-то не получается, звоните, поможем!