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

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

Как получить объект обработки в 1С

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

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

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

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

Способы получения объекта: что выбрать в вашей ситуации

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

Внутренняя обработка доступна через менеджер Обработки, внешняя — через менеджер ВнешниеОбработки или механизм дополнительных отчетов и обработок БСП. Форма обработки получается через ПолучитьФорму(), а объект из уже открытой формы — через преобразование реквизита формы в значение.

Маршрут решения

Как выбрать действие

Обработка встроена в конфигурацию, нужен вызов функцийИспользуйте Обработки.ИмяОбработки.Создать() на сервере
Обработка — внешний epf-файл, обычное приложениеИспользуйте ВнешниеОбработки.Создать(ПутьКФайлу)
Управляемое приложение, обработка подключена через БСППолучайте объект через ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку
Нужно вызвать серверную функцию из управляемой формы обработкиИспользуйте РеквизитФормыВЗначение("Объект") в серверной процедуре формы

Получение объекта внутренней обработки

Внутренняя обработка входит в состав конфигурации (ветка «Обработки» в дереве конфигуратора). Её объект создаётся методом Создать() менеджера обработок:

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

ОбъектОбработки.КаталогФайлов = "C:\Import\";

Результат = ОбъектОбработки.ВыполнитьЗагрузку();

Метод Создать() доступен только на сервере и в толстом клиенте обычного приложения. В тонком клиенте и веб-клиенте вызвать его напрямую нельзя — код нужно размещать в серверной процедуре общего модуля или в серверной процедуре формы с директивой &НаСервере.

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

Получение объекта внешней обработки

Обычное приложение

В обычном приложении внешняя обработка открывается напрямую по пути к файлу:

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

ОбъектОбработки.ВыполнитьДействие();

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

Управляемое приложение и БСП

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

ИмяОбработки = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(СсылкаНаОбработку);

ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);

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

Получение объекта из формы обработки

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

&НаСервере

Процедура ВыполнитьОбработкуНаСервере()

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

ОбъектОбработки.ВыполнитьОсновноеДействие();

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

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

Здесь "Объект" — стандартный основной реквизит формы внешней обработки типа «ОбработкаОбъект». Вызов РеквизитФормыВЗначение создаёт на сервере полноценный объект с текущими данными формы. После выполнения кода обратное преобразование ЗначениеВРеквизитФормы возвращает изменённые данные в форму — без него результаты работы (например, заполненная табличная часть) на экране не появятся.

Для получения самой формы обработки извне используется ПолучитьФорму():

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

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

Порядок действий: вызов серверной функции из формы
  1. 1
    Убедитесь, что у формы есть основной реквизит «Объект» типа ОбработкаОбъект
  2. 2
    Создайте процедуру с директивой &НаСервере
  3. 3
    Получите объект: ОбъектОбработки = РеквизитФормыВЗначение("Объект")
  4. 4
    Вызовите нужную экспортную процедуру или функцию объекта
  5. 5
    Верните данные: ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект")
  6. 6
    Вызовите серверную процедуру из клиентской и проверьте результат на форме

Проверка результата и контрольные точки

После получения объекта убедитесь, что он создан корректно и вызовы работают. Простейшая проверка — тип полученного значения и доступность экспортных методов.

Контрольные точки

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

Тип созданного значения
Норма

ТипЗнч возвращает ОбработкаОбъект.ИмяОбработки или ВнешняяОбработкаОбъект

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

Значение Неопределено — файл не найден или обработка не подключена

Вызов экспортной функции
Норма

Функция выполняется и возвращает значение

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

Ошибка «Метод объекта не обнаружен» — функция не экспортная или вызвана не в том контексте

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

Табличные части и реквизиты обновились на экране

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

Данные не меняются — пропущен вызов ЗначениеВРеквизитФормы

Работа в тонком клиенте
Норма

Код создания объекта выполняется только на сервере

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

Ошибка компиляции на клиенте — Создать() вызван в клиентской процедуре

Для отладки полезно вывести тип объекта:

Сообщить(ТипЗнч(ОбъектОбработки)); // ОбработкаОбъект.ЗагрузкаДанныхИзExcel

Типичные ошибки и ограничения

Большинство проблем при получении объекта обработки сводятся к нарушению контекста выполнения или неверному способу подключения внешней обработки. Разберём основные.

Типичные ошибки
01
Вызов Создать() в клиентской процедуре тонкого клиента — ошибка компиляции; выносите код на сервер
02
Использование ВнешниеОбработки.Создать(Путь) в управляемом приложении без подключения через БСП — обработка не найдена
03
Пропуск ЗначениеВРеквизитФормы после серверной обработки — изменения не отображаются на форме
04
Обращение к реквизитам формы через объект — у объекта нет доступа к элементам формы, только к реквизитам обработки
05
Ожидание общего состояния между двумя вызовами Создать() — каждый вызов создаёт новый пустой экземпляр

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

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

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

Часто задаваемые вопросы

Чем отличается ПолучитьФорму() от Создать()?

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

Как получить объект обработки в регламентном задании?

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

Почему возникает ошибка «Метод объекта не обнаружен»?

Чаще всего вызываемая процедура или функция в модуле объекта не объявлена с ключевым словом «Экспорт». Также проверьте, что метод размещён именно в модуле объекта, а не в модуле формы — методы формы через объект недоступны.

Можно ли получить объект уже открытой обработки из другого кода?

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

Работает ли ВнешниеОбработки.Создать() в тонком клиенте?

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

Как передать параметры в объект обработки?

После вызова Создать() присвойте значения реквизитам обработки (ОбъектОбработки.Период = Дата) или передайте их параметрами в экспортную процедуру. У конструктора Создать() нет параметров инициализации, поэтому вся настройка выполняется после создания объекта.

Итог

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

Внутренняя обработка создаётся через Обработки.Имя.Создать(), внешняя в управляемом приложении — через подключение механизмом БСП. Создание объекта возможно только на сервере, из формы объект получают через РеквизитФормыВЗначение("Объект") с обратным преобразованием для отображения результатов.