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