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