Вроде бы простая задача - добавить описание связанных с документами Поступления/Реализации товара в "Акте взаимозачета" счетов-фактур, но все усложняется тем, что эта печатная форма строится хоть и в 1С, но выводится совсем не в табличный документ, а в отдельный файл MS Word. Возникает мысль проследить процедуру печати. На удивление, она оказалась пустой (в Модуле менеджера документа "Взаимозачет задолженности"):
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
КонецПроцедуры
Вместо нее используется абсолютная отсылка нас к общему модулю через обработчик печати:
// Акт взаимозачета (Microsoft Word)
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Обработчик = "УправлениеПечатьюУТКлиент.ПечатьАктаВзаимозачетаЗадолженностиMicrosoftWord";
КомандаПечати.МенеджерПечати = "";
КомандаПечати.Идентификатор = "АктВзаимозачетаMicrosoftWord";
КомандаПечати.Представление = НСтр("ru = 'Акт взаимозачета (Microsoft Word)'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
Как обычно, не все так просто, и в процессе выполнения нас гоняют по нескольким общим модулям, затем зачем-то снова возвращаемся в Модуль менеджера документа, и так еще пару раз. В итоге, я выудил непосредственно саму процедуру печати, которая занимается "постройкой" документа MS Word с нашими данными, и вроде бы можно уже дать глазам отдохнуть и убрать пальцы с клавиш F10 и F11, но тут Табло нам подсказывает, что в эту процедуру мы попадаем уже без ссылочных данных, и все переменные имеют строковый тип. Возникает логичный вопрос: а как нам получить связанные Счета-фактуры, если мы не имеем ссылок на документы? Самым простым решением, на мой взгляд, является контакация номеров С-Ф к строковым представлениям документов по номеру строки в исходных табличных частях, отталкиваясь от их имени: "Дебиторская задолженность" или "Кредиторская задолженность". Сработало! Теперь мы имеем целиком рабочий код печати в отдельный документ MS Word, даже не зная устройства этого макета! Далее делаем два совершенно обыденных для любого программиста действия: COPY - PASTE в "болванку" доп. печатной формы, регистрируем в базе... И понимаем, что печать не работает, так как в коде используется отсылка к клиентским общим модулям! Меняем описание доп. печатной формы с
НоваяКоманда=ТаблицаКоманд.Добавить();
НоваяКоманда.Использование="ВызовСерверногоМетода";
на
НоваяКоманда=ТаблицаКоманд.Добавить();
НоваяКоманда.Использование="ВызовКлиентскогоМетода";
также перемещаем весь исполняемый код в форму обработки, снабдив его директивой
&НаКлиенте
Всё! :)