Как отладить внешнюю печатную форму в 1С, если база переехала на другой сервер?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

Разработка и отладка внешних печатных форм (ВПФ) — стандартная задача для программиста 1С, которую можно ускорить, используя специальный skill для ИИ, помогающий разбирать код и значения переменных. Однако часто возникают ситуации, когда привычные методы отладки перестают работать из-за изменения инфраструктуры: переноса базы на другой сервер, изменения сетевых путей или политик безопасности. Чтобы не тратить время на ручную подготовку среды, можно применить помощник отладки. Рассмотрим подробнее, как решить проблему с доступом к файлам при отладке и какие существуют современные подходы к формированию печатных форм, особенно при работе с макетами MS Word.

Проблема: Ошибка подключения внешних метаданных и «Каталог не обнаружен»

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

Типичный метод отладки ВПФ заключается в модификации процедуры Печать в модуле обработки (также удобно использовать шаблон дополнительной обработки с единой системой хранения настроек). Мы прописываем путь к файлу на диске, чтобы система при каждом вызове печати перечитывала актуальный код с диска, не требуя перерегистрации обработки в справочнике «Дополнительные отчеты и обработки».

Проанализируем классический код для отладки:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Включаем возможность печати комплектом
    ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
    
    // Путь к файлу на диске разработчика
    ПутьКФайлу = "F:\ConvData\МояПФ.epf"; 
    
    // Создаем объект внешней обработки напрямую из файла
    ВО = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
    ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    
    // Прерываем стандартное выполнение, чтобы сработал наш отладочный код
    Возврат;
КонецПроцедуры

Ситуация осложняется, когда информационная база работает в клиент-серверном варианте. Выясним причину, по которой код выше может выдать ошибку «Каталог не обнаружен», даже если файл физически существует.

Разбор причины: Сессия 0 и сетевые диски

Многие разработчики совершают ошибку, подключая сетевой ресурс как локальный диск (например, диск Z:). Рассмотрим, почему это не работает для сервера 1С:

  1. Контекст выполнения: Процедура Печать в современных конфигурациях на базе БСП (УНФ, ERP, КА, УТ) выполняется на стороне сервера.
  2. Пользователь службы: Сервер 1С:Предприятия обычно запускается от имени специальной системной учетной записи (например, USR1CV8).
  3. Изоляция сессий: Сетевые диски, подключенные вами под вашей учетной записью Windows, видны только в вашей сессии. Для «Сессии 0», в которой работает служба сервера 1С, диска Z: не существует.

Для решения этой проблемы необходимо использовать UNC-пути (Universal Naming Convention) вида \\ИмяСервера\ИмяПапки\Файл. Но и здесь есть нюанс: у пользователя, от имени которого запущен сервер 1С, должны быть полные права доступа (чтение и запись) на эту сетевую шару и на уровне файловой системы NTFS.

Решение №1: Настройка прав и UNC-путей

Рассмотрим по шагам, как правильно настроить окружение для отладки на удаленном сервере:

  1. Попросим системного администратора создать папку на сервере, где расположена база (например, Server02), или на любом доступном файловом ресурсе.
  2. Настроим общий доступ к папке для вашей учетной записи и для учетной записи службы сервера 1С.
  3. В коде отладки заменим букву диска на полный сетевой путь.

Пример исправленного кода:


// Используем UNC-путь, понятный серверу 1С
ПутьКФайлу = "\\Server02\ConvData\МояПФ.epf"; 
ВО = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Возврат;

Решение №2: Использование временных файлов (универсальный способ)

Если нет возможности настраивать сетевые права, разберем более гибкий метод. Мы можем встроить отладочную версию обработки в саму себя или передавать её через временное хранилище.

Посмотрим на логику работы через временный каталог:

  1. Создаем в основной обработке макет с типом «Двоичные данные», куда помещаем файл .epf.
  2. В процедуре печати извлекаем эти данные во временный файл на сервере.
  3. Создаем внешнюю обработку из этого временного файла.

Этот способ гарантирует, что сервер всегда «увидит» файл, так как КаталогВременныхФайлов() всегда доступен процессу сервера 1С.


ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = ЭтотОбъект.ПолучитьМакет("ОтладочнаяВерсия");
ДвоичныеДанные.Записать(ИмяФайла);

ВО = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);

// После выполнения файл можно удалить
УдалитьФайлы(ИмяФайла);
Возврат;

Решение №3: Создание тестовой формы внутри ВПФ

Проанализируем ситуацию: зачем вообще лезть в код БСП и менять процедуру Печать? Можно пойти по пути создания «интерактивной» отладки. Для этого во внешней обработке создается форма, на которой размещаются:

В этом случае мы запускаем обработку просто через «Файл — Открыть» (в конфигураторе или клиенте). Рассмотрим пример кода для такой формы:


&НаСервере
Функция ПечатьНаСервере()
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаДокумент);
    
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("МояПечатнаяФорма");
    ОбъектыПечати = Новый СписокЗначений;
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    
    Возврат КоллекцияПечатныхФорм;
КонецФункции

Этот метод считается более «чистым», так как не требует внесения правок в основной модуль, которые можно забыть удалить перед загрузкой в рабочую базу.

Особенности работы с макетами MS Word

В процессе обсуждения выяснилось, что автор использует макеты Word. Выясним, как эффективно управлять заполнением таких форм. Использование формата Word оправдано, когда пользователям требуется сложная верстка или возможность ручного редактирования документа после формирования.

Разберем основные принципы разметки макета Word для 1С:

  1. Области: В тексте Word используются теги вида {v8 Область.ИмяОбласти} и {/v8 Область.ИмяОбласти}. Это позволяет выводить повторяющиеся части (например, строки таблицы).
  2. Параметры: Внутри областей расставляются теги {v8 ИмяПараметра}.
  3. Формирование: Программа ищет эти теги и заменяет их значениями из выборки данных.

Важный совет: при работе с Word на сервере убедитесь, что на сервере установлен MS Office. Однако, для надежности лучше передавать формирование на сторону клиента, если это возможно, либо использовать специализированные библиотеки для работы с форматом .docx без использования COM-объектов.

Рассмотрим пример кода, который открывает сформированный документ Word на клиенте:


&НаКлиенте
Процедура ОткрытьДокументWord(ДанныеФайла)
    ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
    ДанныеФайла.Записать(ИмяФайла);
    
    Попытка
        WordОбъект = ПолучитьCOMОбъект(ИмяФайла);
        WordОбъект.Application.Visible = Истина;
        WordОбъект.Activate();
    Исключение
        Сообщить("Ошибка при открытии MS Word: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Заключение

Подведем итоги. При возникновении ошибки доступа к файлу во время отладки ВПФ на сервере, в первую очередь проверяйте права доступа службы 1С и используйте UNC-пути вместо букв дисков. Для максимальной автономности используйте методы с временным хранилищем или создавайте тестовые формы внутри самой обработки. Это сэкономит время и избавит от необходимости постоянного взаимодействия с системными администраторами при каждом изменении серверной инфраструктуры.

← На главную