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

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

Как в 1С получить имя внешней обработки

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

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

В управляемом приложении и обычном приложении подходы немного отличаются, а встроенный язык предоставляет несколько механизмов: метод Метаданные() у объекта обработки, свойство ИмяФормы, работа с объектом Файл и структурой Новый Файл(...), а также функция ИспользуемоеИмяФайла у обработки. Ниже разобраны все рабочие способы с примерами кода и указанием, когда какой применять.

Что понимать под «именем внешней обработки»

Прежде чем писать код, определите, какое именно «имя» нужно. Внешняя обработка имеет минимум четыре разных идентификатора, и они не совпадают между собой.

Первый — имя объекта метаданных, заданное разработчиком в конфигураторе при создании обработки (например, ЗагрузкаДанныхИзExcel). Оно хранится внутри файла .epf и не зависит от того, как назван файл на диске. Второй — имя файла (например, zagruzka_v2_final.epf), которое присваивает пользователь при сохранении и которое может быть произвольным. Третий — синоним, то есть человекочитаемое представление («Загрузка данных из Excel»). Четвертый — имя формы, используемое платформой при открытии.

Для регистрации в механизме дополнительных отчетов и обработок (БСП) обычно нужно имя метаданных и синоним. Для проверки «какой файл запущен» — имя файла. Для отладки форм — имя формы. Дальше разобраны способы получить каждый из них.

Получение имени объекта через Метаданные()

Самый надежный способ узнать внутреннее имя обработки — обратиться к её объекту метаданных из модуля объекта или модуля формы. Метод Метаданные() возвращает описание объекта, у которого доступны свойства Имя и Синоним.

// В модуле объекта или формы обработки

ИмяОбработки = ЭтотОбъект.Метаданные().Имя;

СинонимОбработки = ЭтотОбъект.Метаданные().Синоним;

Сообщить("Имя: " + ИмяОбработки);

Сообщить("Синоним: " + СинонимОбработки);

Этот способ работает независимо от того, как назван файл на диске, и дает стабильный идентификатор, который удобно использовать в логах и проверках версий. Если обработка открыта как внешняя, Метаданные() вернет объект типа ОбъектМетаданных, описывающий именно эту внешнюю обработку.

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

Получение имени файла обработки

Когда нужно узнать, из какого файла запущена обработка, используется свойство ИспользуемоеИмяФайла. Оно доступно у объекта обработки и содержит полный путь к файлу .epf на диске.

// В модуле объекта обработки

ПолныйПуть = ЭтотОбъект.ИспользуемоеИмяФайла;

// Например: C:\Обработки\ЗагрузкаДанных.epf

Если нужен не полный путь, а только имя файла без каталога и расширения, путь разбирается через объект Файл:

ФайлОбработки = Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);

ИмяБезРасширения = ФайлОбработки.ИмяБезРасширения; // "ЗагрузкаДанных"

ТолькоИмяФайла = ФайлОбработки.Имя; // "ЗагрузкаДанных.epf"

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

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

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

ОбъектОбработки = ВнешниеОбработки.Создать("C:\Обработки\ЗагрузкаДанных.epf", Ложь);

ИмяОбработки = ОбъектОбработки.Метаданные().Имя;

ПутьКФайлу = ОбъектОбработки.ИспользуемоеИмяФайла;

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

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

Имя обработки через свойство ИмяФормы

В модуле формы внешней обработки доступно свойство ИмяФормы, которое содержит полное имя формы в формате платформы. Для внешней обработки оно выглядит примерно так: ВнешняяОбработка.ЗагрузкаДанныхИзExcel.Форма.Форма.

// В модуле формы

ПолноеИмя = ЭтаФорма.ИмяФормы;

// "ВнешняяОбработка.ЗагрузкаДанныхИзExcel.Форма.Форма"

ЧастиИмени = СтрРазделить(ПолноеИмя, ".");

ИмяОбработки = ЧастиИмени[1]; // "ЗагрузкаДанныхИзExcel"

Этот способ удобен, когда код находится в модуле формы и нужен именно идентификатор объекта без обращения к метаданным. Также ИмяФормы используется при программном открытии формы через ОткрытьФорму(), поэтому умение его сформировать и разобрать полезно в обе стороны.

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

Получение имени обработки, подключенной через БСП

Если обработка зарегистрирована в справочнике «Дополнительные отчеты и обработки», её идентификация строится иначе. У элемента справочника есть реквизит ИмяОбъекта — это и есть имя метаданных обработки, полученное при регистрации. Из кода обработки узнать его можно через параметры, передаваемые при подключении, либо через функции БСП.

// Поиск элемента справочника по имени объекта

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка,

| ДополнительныеОтчетыИОбработки.ИмяОбъекта КАК ИмяОбъекта

|ИЗ

| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки

|ГДЕ

| ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта";

Запрос.УстановитьПараметр("ИмяОбъекта", "ЗагрузкаДанныхИзExcel");

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

Сравнение способов

Метаданные().Имя

Дает внутреннее имя объекта из файла .epf. Подходит для логов и регистрации. Не зависит от имени файла на диске.

ИспользуемоеИмяФайла

Дает путь к файлу. Подходит для диагностики, но путь может быть временным при подключении через БСП.

ИмяФормы

Доступно только в модуле формы. Удобно для разбора идентификатора формы, но требует парсинга строки.

Справочник БСП

Дает имя объекта для зарегистрированных обработок. Требует БСП и работает только для подключенных обработок.

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

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

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

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

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

Что вернуло Метаданные().Имя
Норма

Внутреннее имя объекта, заданное в конфигураторе

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

Пустая строка или ошибка — код вызван не в контексте объекта обработки

Что вернуло ИспользуемоеИмяФайла
Норма

Путь к реальному файлу .epf

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

Путь во временный каталог — обработка подключена из хранилища в базе

Совпадает ли имя с записью в справочнике БСП
Норма

ИмяОбъекта в справочнике равно Метаданные().Имя

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

Значения различаются — обработку переименовали после регистрации, требуется обновление

FAQ

Как получить имя внешней обработки, если код находится в общем модуле конфигурации?

В общем модуле нет контекста обработки, поэтому сначала создайте объект: ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Истина), затем вызовите ОбъектОбработки.Метаданные().Имя. Общий модуль должен иметь признак «Сервер», иначе метод будет недоступен в управляемом приложении.

Чем отличается имя файла от имени объекта обработки?

Имя файла — это название .epf на диске, его может менять любой пользователь при сохранении. Имя объекта задается разработчиком в конфигураторе внутри самой обработки и хранится в файле. Они независимы: файл test.epf может содержать объект с именем ЗагрузкаПрайсов.

Почему ИспользуемоеИмяФайла показывает странный путь во временную папку?

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

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

В модуле формы доступны ЭтаФорма.ИмяФормы и ЭтотОбъект (если форма принадлежит обработке), поэтому имя можно извлечь и на клиенте. А вот создание объекта через ВнешниеОбработки.Создать() требует серверного вызова.

Как узнать синоним (представление) внешней обработки?

Через те же метаданные: ЭтотОбъект.Метаданные().Синоним. Если синоним не задан разработчиком, свойство вернет пустую строку — в этом случае в качестве представления обычно используют имя объекта.

Что делать, если после переименования обработки она перестала находиться в дополнительных обработках?

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

Итог

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

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