К статье
Практический материал

Разработка и Конфигурация · 13 мин

1С: использование обработок как объектов

Как использовать внешние и встроенные обработки 1С как объекты: Создать(), ПолучитьФорму, методы, данные и типичные ошибки разработчика.

Обработка в 1С — это не только форма, которую пользователь открывает и закрывает. Любая обработка может использоваться как полноценный программный объект: её можно создать кодом, обратиться к её экспортным процедурам и функциям, заполнить реквизиты, вызвать методы и получить результат — без открытия интерфейса. Такой подход превращает обработку в библиотеку алгоритмов, которую легко вызывать из других мест конфигурации.

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

Ниже разобраны конкретные приёмы: как создать объект обработки, как вызвать её методы, как передать параметры, какие ограничения есть у внешних обработок в безопасном режиме и как проверить, что вызов отработал корректно.

Что значит «обработка как объект» и когда это нужно

Когда обработка добавлена в конфигурацию, платформа создаёт для неё менеджер — Обработки.ИмяОбработки. У менеджера есть метод Создать(), который возвращает объект типа «ОбработкаОбъект». Этот объект содержит реквизиты, табличные части и все экспортные процедуры и функции, описанные в модуле объекта обработки. С ним можно работать так же, как с объектом документа или справочника: присваивать значения, вызывать методы, передавать между процедурами.

Типовые задачи, где такой подход оправдан:

  • пакетная обработка данных — например, обработка загрузки из Excel вызывается из регламентного задания без участия пользователя;
  • повторное использование алгоритмов — сложный расчёт написан один раз в модуле объекта и вызывается из разных мест конфигурации;
  • программная подготовка данных перед открытием формы — объект заполняется, а форма открывается уже с готовыми данными;
  • тестирование логики обработки без интерфейса.

Создание объекта встроенной обработки

Для обработки, включённой в состав конфигурации, объект создаётся одной строкой:

ОбработкаОбъект = Обработки.ЗагрузкаДанныхИзФайла.Создать();

ОбработкаОбъект.ИмяФайла = "C:\Data\price.xlsx";

ОбработкаОбъект.Загрузить();

Чтобы метод Загрузить() был доступен, он должен быть объявлен в модуле объекта обработки с ключевым словом Экспорт:

Процедура Загрузить() Экспорт

// логика загрузки

КонецПроцедуры

Реквизиты обработки доступны напрямую через точку — как у любого объекта метаданных. Табличные части заполняются стандартно:

НоваяСтрока = ОбработкаОбъект.Товары.Добавить();

НоваяСтрока.Номенклатура = НайденныйТовар;

НоваяСтрока.Количество = 10;

Важно помнить: объект обработки не сохраняется в базу данных. Он существует только в памяти сеанса, пока на него есть ссылка в коде. Если нужно зафиксировать результат — записывайте его в регистры, документы или файлы явно.

Создание объекта внешней обработки

Внешняя обработка (файл .epf) подключается через менеджер ВнешниеОбработки:

ВнешняяОбработка = ВнешниеОбработки.Создать("C:\Обработки\Выгрузка.epf");

ВнешняяОбработка.Период = ТекущаяДатаСеанса();

Результат = ВнешняяОбработка.СформироватьВыгрузку();

На сервере путь указывается относительно файловой системы сервера 1С, а не клиентского компьютера — это частая причина ошибки «файл не найден». Если обработка хранится в справочнике дополнительных отчётов и обработок (БСП), её сначала подключают через механизм подсистемы, а затем создают по имени:

ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлемент);

Точное имя метода зависит от версии библиотеки стандартных подсистем — сверяйтесь с программным интерфейсом вашей версии БСП в модуле ДополнительныеОтчетыИОбработки.

Получение формы обработки и передача параметров

Если нужен интерактивный сценарий, объект создаётся неявно — через получение формы. Метод ПолучитьФорму() принимает имя формы, владельца и ключ уникальности:

ФормаОбработки = ПолучитьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.ОсновнаяФорма");

ФормаОбработки.Открыть();

Для внешней обработки путь к форме строится через полное имя файла:

ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.Выгрузка.Форма.ОсновнаяФорма");

Передать данные в форму можно двумя способами. Первый — через параметры формы, обрабатывая их в событии ПриСозданииНаСервере. Второй — получить объект из формы, заполнить его и вернуть обратно:

ОбъектОбработки = ФормаОбработки.РеквизитФормыВЗначение("Объект");

ОбъектОбработки.Контрагент = ВыбранныйКонтрагент;

ФормаОбработки.ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");

Второй способ требует аккуратности: преобразование РеквизитФормыВЗначение выполняется на сервере и создаёт копию объекта, поэтому изменения нужно возвращать обратно через ЗначениеВРеквизитФормы.

Порядок действий: вызов обработки как объекта
  1. 1
    Объявите в модуле объекта обработки нужные процедуры и функции с ключевым словом Экспорт
  2. 2
    Создайте объект: Обработки.Имя.Создать() или ВнешниеОбработки.Создать(путь)
  3. 3
    Заполните реквизиты и табличные части объекта
  4. 4
    Вызовите экспортный метод и получите результат
  5. 5
    Проверьте результат и зафиксируйте его в данных конфигурации, если требуется

Контекст исполнения: клиент, сервер, тонкий клиент

Главное ограничение техники — контекст. Метод ВнешниеОбработки.Создать() доступен на сервере и в толстом клиенте, но недоступен в тонком и веб-клиенте для файловой системы клиента. Поэтому типовая схема для тонкого клиента выглядит так: файл помещается во временное хранилище на клиенте, передаётся на сервер, и там создаётся объект обработки.

Директивы компиляции в модуле объекта обработки не используются — модуль объекта всегда исполняется там, где создан объект. Если обработка вызывается из серверной процедуры, весь её код выполняется на сервере, и обращения к клиентским объектам (например, к ДиалогВыбораФайла без передачи на клиента) приведут к ошибке.

Проверяйте также безопасный режим: если код вызывается из фонового задания или из подсистемы дополнительных отчётов, платформа может включить безопасный режим, в котором операции с файловой системой и COM-объектами запрещены. Признак проблемы — ошибки вида «Операция не разрешена в безопасном режиме».

Сравнение подходов: объект, форма, общий модуль

ПодходКогда подходитОграничения
Объект обработки через Создать()Пакетные операции, вызов логики без интерфейса, заполнение данныхНе сохраняется в базе; внешние обработки ограничены безопасным режимом
ПолучитьФорму() с параметрамиИнтерактивная работа пользователя с предзаполненными даннымиТребует клиентского контекста; нельзя вызвать из регламентного задания
Общий модульЛогика, нужная в нескольких объектах конфигурацииТолько для встроенных обработок; требует изменения конфигурации

Правило выбора простое: если логика нужна только этой обработке — оставляйте её в модуле объекта и вызывайте через Создать(). Если логика общая для конфигурации — выносите в общий модуль, а обработку используйте как тонкую обёртку с интерфейсом.

Сравнение вариантов

Встроенная обработка + Создать()

Быстрый вызов, полный доступ к реквизитам и методам; требует доработки конфигурации

Внешняя обработка (.epf)

Подключается без изменения конфигурации; ограничена безопасным режимом и доступностью файла на сервере

Дополнительные обработки БСП

Хранятся в базе, управляются правами; вызов через программный интерфейс подсистемы, зависит от версии БСП

Типичные ошибки и как их избежать

Первая группа ошибок связана с областью видимости методов. Если процедура в модуле объекта объявлена без Экспорт, вызов извне даст ошибку «Метод объекта не обнаружен». То же произойдёт, если метод находится в модуле формы, а вызывается у объекта обработки.

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

Третья группа — ресурсы и транзакции. Длительная обработка, вызванная как объект внутри транзакции записи документа, удерживает блокировки. Если обработка обращается к тем же таблицам, возможны взаимоблокировки. Вызывайте тяжёлые обработки вне транзакций или через фоновые задания.

Типичные ошибки
01
Вызов неэкспортного метода — ошибка «Метод объекта не обнаружен»; добавьте Экспорт в объявление
02
Заполнение объекта и открытие отдельной формы — данные теряются, форма создаёт свой экземпляр
03
Путь к .epf от клиентского диска в серверном вызове — файл не найден, используйте временное хранилище
04
Ожидание сохранения данных обработки в базу — объект живёт только в памяти сеанса

Проверка результата и отладка

Отладка обработки, вызванной как объект, ничем не отличается от обычной: точки останова в модуле объекта срабатывают, если отладчик подключён к нужному сеансу. Для серверных вызовов включайте отладку на сервере 1С, для фоновых заданий — отладку фоновых заданий в конфигураторе.

Признаки корректной работы вызова:

  • объект создан без исключения — метод Создать() вернул значение, а не ошибку;
  • экспортный метод отработал и вернул ожидаемое значение или заполнил реквизит результата;
  • изменения в данных конфигурации (если они предполагались) зафиксированы и видны в отчётах;
  • в журнале регистрации нет ошибок безопасного режима или обращения к файлам.
Контрольные точки

Как проверить результат

Возврат Создать()
Норма

Переменная содержит объект, тип — ОбработкаОбъект

Тревожный признак

Исключение: файл не найден, нет прав, безопасный режим

Вызов метода
Норма

Метод выполнен, результат соответствует ожиданию

Тревожный признак

«Метод объекта не обнаружен» — нет Экспорт или метод в другом модуле

Данные после вызова
Норма

Реквизиты и табличные части заполнены, записи в базе созданы

Тревожный признак

Объект пуст или изменения видны только до конца сеанса

Для регламентных вызовов полезно добавить в обработку запись диагностических сообщений в журнал регистрации через ЗаписьЖурналаРегистрации — тогда сбой в ночном задании не останется незамеченным.

Итог

Что важно запомнить

Обработка как объект создаётся методом Создать() у менеджера Обработки или ВнешниеОбработки, содержит реквизиты, табличные части и экспортные методы модуля объекта и живёт только в памяти сеанса. Форма и объект — разные экземпляры; переиспользуемую логику размещайте в модуле объекта или общем модуле, а внешние обработки проверяйте на безопасность перед подключением.

Частые вопросы

Можно ли вызвать обработку как объект из фонового задания?

Да, это один из основных сценариев. В модуле фонового задания объект создаётся через Обработки.Имя.Создать() на сервере. Учитывайте, что интерактивные вызовы (вопросы, диалоги) в фоновом задании недоступны, а для внешних обработок может действовать безопасный режим.

Как передать объект обработки между клиентом и сервером?

Напрямую — никак: объект обработки не сериализуется. Передавайте примитивные данные (структуры, массивы, таблицы значений через хранилище) и создавайте объект заново на нужной стороне, либо работайте через реквизит формы с преобразованием РеквизитФормыВЗначение на сервере.

Почему ПолучитьФорму() открывает форму без данных, хотя объект был заполнен?

Потому что ПолучитьФорму() создаёт новый экземпляр объекта внутри формы. Заполненный вами объект и объект формы — разные экземпляры. Передавайте данные через параметры формы или заполняйте реквизит формы после её получения.

Можно ли использовать обработку как объект в мобильном клиенте или веб-клиенте?

Встроенные обработки — да, если конфигурация поддерживает эти клиенты и код не использует недоступные там механизмы. Внешние обработки из файловой системы в веб-клиенте создать нельзя; используйте хранение обработки в базе (например, в справочнике дополнительных обработок) и создание из двоичных данных.

Чем вызов обработки как объекта лучше копирования кода в общий модуль?

Объект сохраняет состояние между вызовами методов: реквизиты и табличные части заполняются один раз и используются всеми процедурами. В общем модуле состояние пришлось бы передавать параметрами в каждый вызов. Но для логики без состояния общий модуль проще и доступнее во всех контекстах.

Как ограничить запуск внешней обработки только определённым пользователям?

Права на встроенные обработки настраиваются в ролях конфигурации. Для внешних обработок из справочника дополнительных отчётов и обработок БСП доступ регулируется настройками самого элемента справочника и профилями групп доступа. Прямой вызов ВнешниеОбработки.Создать() из кода ролями не ограничивается — добавляйте проверку прав явно.