Разработка и Конфигурация · 13 мин
1С: использование обработок как объектов
Как использовать внешние и встроенные обработки 1С как объекты: Создать(), ПолучитьФорму, методы, данные и типичные ошибки разработчика.
Обработка в 1С — это не только форма, которую пользователь открывает и закрывает. Любая обработка может использоваться как полноценный программный объект: её можно создать кодом, обратиться к её экспортным процедурам и функциям, заполнить реквизиты, вызвать методы и получить результат — без открытия интерфейса. Такой подход превращает обработку в библиотеку алгоритмов, которую легко вызывать из других мест конфигурации.
Техника «обработка как объект» применяется в трёх основных сценариях: вызов внешних обработок из кода (например, для пакетной печати или загрузки данных), повторное использование логики, написанной в модуле объекта обработки, и программное создание обработки для заполнения табличных частей и реквизитов перед выводом формы. Во всех случаях ключевой момент — понимание разницы между модулем объекта, модулем формы и модулем менеджера обработки.
Ниже разобраны конкретные приёмы: как создать объект обработки, как вызвать её методы, как передать параметры, какие ограничения есть у внешних обработок в безопасном режиме и как проверить, что вызов отработал корректно.
Что значит «обработка как объект» и когда это нужно
Когда обработка добавлена в конфигурацию, платформа создаёт для неё менеджер — Обработки.ИмяОбработки. У менеджера есть метод Создать(), который возвращает объект типа «ОбработкаОбъект». Этот объект содержит реквизиты, табличные части и все экспортные процедуры и функции, описанные в модуле объекта обработки. С ним можно работать так же, как с объектом документа или справочника: присваивать значения, вызывать методы, передавать между процедурами.
Типовые задачи, где такой подход оправдан:
- пакетная обработка данных — например, обработка загрузки из Excel вызывается из регламентного задания без участия пользователя;
- повторное использование алгоритмов — сложный расчёт написан один раз в модуле объекта и вызывается из разных мест конфигурации;
- программная подготовка данных перед открытием формы — объект заполняется, а форма открывается уже с готовыми данными;
- тестирование логики обработки без интерфейса.
Создание объекта встроенной обработки
Для обработки, включённой в состав конфигурации, объект создаётся одной строкой:
ОбработкаОбъект = Обработки.ЗагрузкаДанныхИзФайла.Создать();
ОбработкаОбъект.ИмяФайла = "C:\Data\price.xlsx";
ОбработкаОбъект.Загрузить();
Чтобы метод Загрузить() был доступен, он должен быть объявлен в модуле объекта обработки с ключевым словом Экспорт:
Процедура Загрузить() Экспорт
// логика загрузки
КонецПроцедуры
Реквизиты обработки доступны напрямую через точку — как у любого объекта метаданных. Табличные части заполняются стандартно:
НоваяСтрока = ОбработкаОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденныйТовар;
НоваяСтрока.Количество = 10;
Важно помнить: объект обработки не сохраняется в базу данных. Он существует только в памяти сеанса, пока на него есть ссылка в коде. Если нужно зафиксировать результат — записывайте его в регистры, документы или файлы явно.
Создание объекта внешней обработки
Внешняя обработка (файл .epf) подключается через менеджер ВнешниеОбработки:
ВнешняяОбработка = ВнешниеОбработки.Создать("C:\Обработки\Выгрузка.epf");
ВнешняяОбработка.Период = ТекущаяДатаСеанса();
Результат = ВнешняяОбработка.СформироватьВыгрузку();
На сервере путь указывается относительно файловой системы сервера 1С, а не клиентского компьютера — это частая причина ошибки «файл не найден». Если обработка хранится в справочнике дополнительных отчётов и обработок (БСП), её сначала подключают через механизм подсистемы, а затем создают по имени:
ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлемент);
Точное имя метода зависит от версии библиотеки стандартных подсистем — сверяйтесь с программным интерфейсом вашей версии БСП в модуле ДополнительныеОтчетыИОбработки.
Получение формы обработки и передача параметров
Если нужен интерактивный сценарий, объект создаётся неявно — через получение формы. Метод ПолучитьФорму() принимает имя формы, владельца и ключ уникальности:
ФормаОбработки = ПолучитьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.ОсновнаяФорма");
ФормаОбработки.Открыть();
Для внешней обработки путь к форме строится через полное имя файла:
ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.Выгрузка.Форма.ОсновнаяФорма");
Передать данные в форму можно двумя способами. Первый — через параметры формы, обрабатывая их в событии ПриСозданииНаСервере. Второй — получить объект из формы, заполнить его и вернуть обратно:
ОбъектОбработки = ФормаОбработки.РеквизитФормыВЗначение("Объект");
ОбъектОбработки.Контрагент = ВыбранныйКонтрагент;
ФормаОбработки.ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
Второй способ требует аккуратности: преобразование РеквизитФормыВЗначение выполняется на сервере и создаёт копию объекта, поэтому изменения нужно возвращать обратно через ЗначениеВРеквизитФормы.
- 1Объявите в модуле объекта обработки нужные процедуры и функции с ключевым словом Экспорт
- 2Создайте объект: Обработки.Имя.Создать() или ВнешниеОбработки.Создать(путь)
- 3Заполните реквизиты и табличные части объекта
- 4Вызовите экспортный метод и получите результат
- 5Проверьте результат и зафиксируйте его в данных конфигурации, если требуется
Контекст исполнения: клиент, сервер, тонкий клиент
Главное ограничение техники — контекст. Метод ВнешниеОбработки.Создать() доступен на сервере и в толстом клиенте, но недоступен в тонком и веб-клиенте для файловой системы клиента. Поэтому типовая схема для тонкого клиента выглядит так: файл помещается во временное хранилище на клиенте, передаётся на сервер, и там создаётся объект обработки.
Директивы компиляции в модуле объекта обработки не используются — модуль объекта всегда исполняется там, где создан объект. Если обработка вызывается из серверной процедуры, весь её код выполняется на сервере, и обращения к клиентским объектам (например, к ДиалогВыбораФайла без передачи на клиента) приведут к ошибке.
Проверяйте также безопасный режим: если код вызывается из фонового задания или из подсистемы дополнительных отчётов, платформа может включить безопасный режим, в котором операции с файловой системой и COM-объектами запрещены. Признак проблемы — ошибки вида «Операция не разрешена в безопасном режиме».
Сравнение подходов: объект, форма, общий модуль
| Подход | Когда подходит | Ограничения |
|---|---|---|
| Объект обработки через Создать() | Пакетные операции, вызов логики без интерфейса, заполнение данных | Не сохраняется в базе; внешние обработки ограничены безопасным режимом |
| ПолучитьФорму() с параметрами | Интерактивная работа пользователя с предзаполненными данными | Требует клиентского контекста; нельзя вызвать из регламентного задания |
| Общий модуль | Логика, нужная в нескольких объектах конфигурации | Только для встроенных обработок; требует изменения конфигурации |
Правило выбора простое: если логика нужна только этой обработке — оставляйте её в модуле объекта и вызывайте через Создать(). Если логика общая для конфигурации — выносите в общий модуль, а обработку используйте как тонкую обёртку с интерфейсом.
Сравнение вариантов
Быстрый вызов, полный доступ к реквизитам и методам; требует доработки конфигурации
Подключается без изменения конфигурации; ограничена безопасным режимом и доступностью файла на сервере
Хранятся в базе, управляются правами; вызов через программный интерфейс подсистемы, зависит от версии БСП
Типичные ошибки и как их избежать
Первая группа ошибок связана с областью видимости методов. Если процедура в модуле объекта объявлена без Экспорт, вызов извне даст ошибку «Метод объекта не обнаружен». То же произойдёт, если метод находится в модуле формы, а вызывается у объекта обработки.
Вторая группа — путаница между объектом и формой. Разработчик создаёт объект через Создать(), заполняет его реквизиты, а затем открывает форму через ПолучитьФорму() — и видит пустую форму, потому что форма создала собственный экземпляр объекта. Связать их можно только через реквизит формы типа «ДанныеФормыСтруктура» на основе объекта обработки.
Третья группа — ресурсы и транзакции. Длительная обработка, вызванная как объект внутри транзакции записи документа, удерживает блокировки. Если обработка обращается к тем же таблицам, возможны взаимоблокировки. Вызывайте тяжёлые обработки вне транзакций или через фоновые задания.
Проверка результата и отладка
Отладка обработки, вызванной как объект, ничем не отличается от обычной: точки останова в модуле объекта срабатывают, если отладчик подключён к нужному сеансу. Для серверных вызовов включайте отладку на сервере 1С, для фоновых заданий — отладку фоновых заданий в конфигураторе.
Признаки корректной работы вызова:
- объект создан без исключения — метод
Создать()вернул значение, а не ошибку; - экспортный метод отработал и вернул ожидаемое значение или заполнил реквизит результата;
- изменения в данных конфигурации (если они предполагались) зафиксированы и видны в отчётах;
- в журнале регистрации нет ошибок безопасного режима или обращения к файлам.
Как проверить результат
Переменная содержит объект, тип — ОбработкаОбъект
Исключение: файл не найден, нет прав, безопасный режим
Метод выполнен, результат соответствует ожиданию
«Метод объекта не обнаружен» — нет Экспорт или метод в другом модуле
Реквизиты и табличные части заполнены, записи в базе созданы
Объект пуст или изменения видны только до конца сеанса
Для регламентных вызовов полезно добавить в обработку запись диагностических сообщений в журнал регистрации через ЗаписьЖурналаРегистрации — тогда сбой в ночном задании не останется незамеченным.
Что важно запомнить
Обработка как объект создаётся методом Создать() у менеджера Обработки или ВнешниеОбработки, содержит реквизиты, табличные части и экспортные методы модуля объекта и живёт только в памяти сеанса. Форма и объект — разные экземпляры; переиспользуемую логику размещайте в модуле объекта или общем модуле, а внешние обработки проверяйте на безопасность перед подключением.
Частые вопросы
Можно ли вызвать обработку как объект из фонового задания?
Да, это один из основных сценариев. В модуле фонового задания объект создаётся через Обработки.Имя.Создать() на сервере. Учитывайте, что интерактивные вызовы (вопросы, диалоги) в фоновом задании недоступны, а для внешних обработок может действовать безопасный режим.
Как передать объект обработки между клиентом и сервером?
Напрямую — никак: объект обработки не сериализуется. Передавайте примитивные данные (структуры, массивы, таблицы значений через хранилище) и создавайте объект заново на нужной стороне, либо работайте через реквизит формы с преобразованием РеквизитФормыВЗначение на сервере.
Почему ПолучитьФорму() открывает форму без данных, хотя объект был заполнен?
Потому что ПолучитьФорму() создаёт новый экземпляр объекта внутри формы. Заполненный вами объект и объект формы — разные экземпляры. Передавайте данные через параметры формы или заполняйте реквизит формы после её получения.
Можно ли использовать обработку как объект в мобильном клиенте или веб-клиенте?
Встроенные обработки — да, если конфигурация поддерживает эти клиенты и код не использует недоступные там механизмы. Внешние обработки из файловой системы в веб-клиенте создать нельзя; используйте хранение обработки в базе (например, в справочнике дополнительных обработок) и создание из двоичных данных.
Чем вызов обработки как объекта лучше копирования кода в общий модуль?
Объект сохраняет состояние между вызовами методов: реквизиты и табличные части заполняются один раз и используются всеми процедурами. В общем модуле состояние пришлось бы передавать параметрами в каждый вызов. Но для логики без состояния общий модуль проще и доступнее во всех контекстах.
Как ограничить запуск внешней обработки только определённым пользователям?
Права на встроенные обработки настраиваются в ролях конфигурации. Для внешних обработок из справочника дополнительных отчётов и обработок БСП доступ регулируется настройками самого элемента справочника и профилями групп доступа. Прямой вызов ВнешниеОбработки.Создать() из кода ролями не ограничивается — добавляйте проверку прав явно.