Разработка и отладка внешних печатных форм (ВПФ) — стандартная задача для программиста 1С, которую можно ускорить, используя специальный skill для ИИ, помогающий разбирать код и значения переменных. Однако часто возникают ситуации, когда привычные методы отладки перестают работать из-за изменения инфраструктуры: переноса базы на другой сервер, изменения сетевых путей или политик безопасности. Чтобы не тратить время на ручную подготовку среды, можно применить помощник отладки. Рассмотрим подробнее, как решить проблему с доступом к файлам при отладке и какие существуют современные подходы к формированию печатных форм, особенно при работе с макетами MS Word.
Трудности возникают часто, поэтому полезно знать общие принципы, по которым строится отладка внешних печатных форм и обработок.
Типичный метод отладки ВПФ заключается в модификации процедуры Печать в модуле обработки (также удобно использовать шаблон дополнительной обработки с единой системой хранения настроек). Мы прописываем путь к файлу на диске, чтобы система при каждом вызове печати перечитывала актуальный код с диска, не требуя перерегистрации обработки в справочнике «Дополнительные отчеты и обработки».
Проанализируем классический код для отладки:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Включаем возможность печати комплектом
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
// Путь к файлу на диске разработчика
ПутьКФайлу = "F:\ConvData\МояПФ.epf";
// Создаем объект внешней обработки напрямую из файла
ВО = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Прерываем стандартное выполнение, чтобы сработал наш отладочный код
Возврат;
КонецПроцедуры
Ситуация осложняется, когда информационная база работает в клиент-серверном варианте. Выясним причину, по которой код выше может выдать ошибку «Каталог не обнаружен», даже если файл физически существует.
Многие разработчики совершают ошибку, подключая сетевой ресурс как локальный диск (например, диск Z:). Рассмотрим, почему это не работает для сервера 1С:
Печать в современных конфигурациях на базе БСП (УНФ, ERP, КА, УТ) выполняется на стороне сервера.USR1CV8).Z: не существует.Для решения этой проблемы необходимо использовать UNC-пути (Universal Naming Convention) вида \\ИмяСервера\ИмяПапки\Файл. Но и здесь есть нюанс: у пользователя, от имени которого запущен сервер 1С, должны быть полные права доступа (чтение и запись) на эту сетевую шару и на уровне файловой системы NTFS.
Рассмотрим по шагам, как правильно настроить окружение для отладки на удаленном сервере:
Пример исправленного кода:
// Используем UNC-путь, понятный серверу 1С
ПутьКФайлу = "\\Server02\ConvData\МояПФ.epf";
ВО = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Возврат;
Если нет возможности настраивать сетевые права, разберем более гибкий метод. Мы можем встроить отладочную версию обработки в саму себя или передавать её через временное хранилище.
Посмотрим на логику работы через временный каталог:
.epf.Этот способ гарантирует, что сервер всегда «увидит» файл, так как КаталогВременныхФайлов() всегда доступен процессу сервера 1С.
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = ЭтотОбъект.ПолучитьМакет("ОтладочнаяВерсия");
ДвоичныеДанные.Записать(ИмяФайла);
ВО = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// После выполнения файл можно удалить
УдалитьФайлы(ИмяФайла);
Возврат;
Проанализируем ситуацию: зачем вообще лезть в код БСП и менять процедуру Печать? Можно пойти по пути создания «интерактивной» отладки. Для этого во внешней обработке создается форма, на которой размещаются:
СсылкаНаОбъект (документ, для которого печатаем).В этом случае мы запускаем обработку просто через «Файл — Открыть» (в конфигураторе или клиенте). Рассмотрим пример кода для такой формы:
&НаСервере
Функция ПечатьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаДокумент);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("МояПечатнаяФорма");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Возврат КоллекцияПечатныхФорм;
КонецФункции
Этот метод считается более «чистым», так как не требует внесения правок в основной модуль, которые можно забыть удалить перед загрузкой в рабочую базу.
В процессе обсуждения выяснилось, что автор использует макеты Word. Выясним, как эффективно управлять заполнением таких форм. Использование формата Word оправдано, когда пользователям требуется сложная верстка или возможность ручного редактирования документа после формирования.
Разберем основные принципы разметки макета Word для 1С:
{v8 Область.ИмяОбласти} и {/v8 Область.ИмяОбласти}. Это позволяет выводить повторяющиеся части (например, строки таблицы).{v8 ИмяПараметра}.Важный совет: при работе с Word на сервере убедитесь, что на сервере установлен MS Office. Однако, для надежности лучше передавать формирование на сторону клиента, если это возможно, либо использовать специализированные библиотеки для работы с форматом .docx без использования COM-объектов.
Рассмотрим пример кода, который открывает сформированный документ Word на клиенте:
&НаКлиенте
Процедура ОткрытьДокументWord(ДанныеФайла)
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
ДанныеФайла.Записать(ИмяФайла);
Попытка
WordОбъект = ПолучитьCOMОбъект(ИмяФайла);
WordОбъект.Application.Visible = Истина;
WordОбъект.Activate();
Исключение
Сообщить("Ошибка при открытии MS Word: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Подведем итоги. При возникновении ошибки доступа к файлу во время отладки ВПФ на сервере, в первую очередь проверяйте права доступа службы 1С и используйте UNC-пути вместо букв дисков. Для максимальной автономности используйте методы с временным хранилищем или создавайте тестовые формы внутри самой обработки. Это сэкономит время и избавит от необходимости постоянного взаимодействия с системными администраторами при каждом изменении серверной инфраструктуры.