Рассмотрим достаточно распространенную ситуацию при разработке в 1С на обычных формах (например, в конфигурации «Управление торговлей»). Возникает задача: настроить регламентное задание, которое должно в фоновом режиме формировать печатные формы документов (например, заказов покупателей или реализаций), сохранять их в формате PDF, отправлять по электронной почте и делать соответствующую запись о статусе в независимый непериодический регистр сведений.
На первый взгляд, при выполнении фонового задания система выдает непонятную ошибку. Разработчику может показаться, что проблема кроется в попытке записать данные в регистр сведений, так как одна функция успешно добавляет запись, а вторая — падает с ошибкой. Однако, если мы посмотрим на логику более детально, то выясним причину: ошибка кроется не в регистре, а в попытке вызова экспортной функции печати, такой как ПечатьСчетаЗаказа, или при обращении к методу ПолучитьТабличныйДокумент().
Разберем по шагам, что происходит под капотом платформы 1С. Регламентное задание всегда выполняется строго на сервере в фоновом режиме. В этом контексте полностью отсутствует пользовательский интерфейс.
В конфигурациях на обычных формах типовые механизмы печати часто содержат интерактивные проверки. В коде модуля могут быть затесаны вызовы клиентских процедур, таких как Предупреждение(), Вопрос(), или обращения к глобальным переменным клиента. Например, система может попытаться вывести диалоговое окно с вопросом «Выводить печатную форму с печатью и подписью?» или проверить права текущего пользователя на интерактивный вывод.
Так как в фоновом задании нет возможности показать пользователю диалог, любая попытка использовать интерактивный метод или клиентскую переменную приводит к критической ошибке (часто система возвращает сообщение «Объект не найден» или сообщает, что функция не обнаружена). Если мы запустим этот же код вручную через обработку (в клиентском сеансе), то все отработает корректно, так как контекст клиента будет доступен.
Чтобы быстро найти такие ошибки в коде, выполните синтаксический контроль: откройте модуль в конфигураторе, перейдите в меню «Конфигурация» — «Проверка конфигурации» и обязательно установите галочку Сервер.
Когда мы получаем табличный документ с помощью кода вида:
ТабличныйДокумент = ОбъектДокумент.ПолучитьТабличныйДокумент();
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
При фоновом выполнении метода сохранения в PDF на сервере могут возникать специфические подводные камни. Разберем их подробнее:
USR1CV8). У этого системного аккаунта обычно нет прав на запись файлов в сетевые директории, на рабочие столы пользователей или в корень диска. Обязательно проверяйте, предоставлены ли права на чтение и запись в целевую папку для пользователя сервера 1С.Print Spooler) на самом сервере. В таких случаях помогает перезапуск этой службы операционной системы.Arial. Причина проста: нужные шрифты установлены локально на компьютерах пользователей, но отсутствуют в операционной системе сервера 1С. Обязательно установите все необходимые шрифты на серверной машине.Проанализируем ситуацию и рассмотрим несколько подходов к решению задачи фонового формирования печатных форм.
Вариант 1: Архитектурный рефакторинг кода (Рекомендуемый)
Самый правильный путь — отделить логику получения данных и компоновки макета от пользовательского интерактива. Создайте отдельную серверную процедуру (или вынесите функцию формирования табличного документа во внешнюю/служебную обработку без контекста), которая будет заниматься исключительно сборкой табличного документа. Убедитесь, что в этой функции нет вызовов Предупреждение(), нет обращений к клиентским общим модулям и глобальным переменным приложения.
Вариант 2: Использование эмулятора на клиенте (Для старых конфигураций)
Если код типовой конфигурации слишком запутан, и вычленить чистый серверный алгоритм печати невозможно без переписывания половины конфигурации, можно воспользоваться альтернативным путем. Фирма «1С» предоставляет стандартную внешнюю обработку ВыполнениеРегламентныхЗаданийНаКлиенте.epf (ее можно найти на диске ИТС). Она позволяет запустить отдельный технологический сеанс «Толстого клиента», который будет эмулировать фоновую работу. В этом случае регламентные задания будут выполняться в полноценном клиентском контексте, что снимет проблему с недоступностью интерактивных методов и COM-объектов (например, при выгрузке в Excel).
Вариант 3: Подход в современных версиях на базе БСП
Если вы работаете в современных конфигурациях (начиная с 8.3), использующих «Библиотеку стандартных подсистем» (БСП), то фирма 1С уже решила эту проблему на архитектурном уровне. Механизм подсистемы УправлениеПечатью изначально разделен на клиентские вызовы (где задаются вопросы пользователю) и строгие серверные методы. Для фоновой генерации печатных форм используйте метод СформироватьПечатныеФормыНаСервере. Этот метод гарантированно изолирован от любых диалогов и корректно формирует табличные документы в контексте фоновых заданий.