Разработка и Конфигурация · 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, а объект внутри — ИмпортНоменклатуры. Если код дальше ищет обработку по имени объекта, а вы передали имя файла, поиск ничего не найдет.
Вторая типичная ошибка — обращение к ИспользуемоеИмяФайла у обработки, открытой из хранилища в базе: путь укажет на временный файл во временном каталоге, который удаляется после закрытия сеанса. Третья — вызов ВнешниеОбработки.Создать() в клиентском контексте управляемого приложения, что приводит к ошибке выполнения. Четвертая — использование СтрРазделить в старых версиях платформы, где этой функции нет; там применяют СтрЗаменить с разделителем или собственный разбор строки.
Как проверить результат
Внутреннее имя объекта, заданное в конфигураторе
Пустая строка или ошибка — код вызван не в контексте объекта обработки
Путь к реальному файлу .epf
Путь во временный каталог — обработка подключена из хранилища в базе
ИмяОбъекта в справочнике равно Метаданные().Имя
Значения различаются — обработку переименовали после регистрации, требуется обновление
FAQ
Как получить имя внешней обработки, если код находится в общем модуле конфигурации?
В общем модуле нет контекста обработки, поэтому сначала создайте объект: ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Истина), затем вызовите ОбъектОбработки.Метаданные().Имя. Общий модуль должен иметь признак «Сервер», иначе метод будет недоступен в управляемом приложении.
Чем отличается имя файла от имени объекта обработки?
Имя файла — это название .epf на диске, его может менять любой пользователь при сохранении. Имя объекта задается разработчиком в конфигураторе внутри самой обработки и хранится в файле. Они независимы: файл test.epf может содержать объект с именем ЗагрузкаПрайсов.
Почему ИспользуемоеИмяФайла показывает странный путь во временную папку?
Так происходит, когда обработка подключена через справочник дополнительных отчетов и обработок: платформа выгружает двоичные данные из базы во временный файл и запускает его. Это нормальное поведение — не используйте такой путь как постоянный идентификатор, берите имя из метаданных.
Можно ли получить имя обработки на тонком клиенте без сервера?
В модуле формы доступны ЭтаФорма.ИмяФормы и ЭтотОбъект (если форма принадлежит обработке), поэтому имя можно извлечь и на клиенте. А вот создание объекта через ВнешниеОбработки.Создать() требует серверного вызова.
Как узнать синоним (представление) внешней обработки?
Через те же метаданные: ЭтотОбъект.Метаданные().Синоним. Если синоним не задан разработчиком, свойство вернет пустую строку — в этом случае в качестве представления обычно используют имя объекта.
Что делать, если после переименования обработки она перестала находиться в дополнительных обработках?
В справочнике БСП хранится имя объекта на момент регистрации. Откройте карточку обработки в справочнике и обновите её (перезагрузите из файла) — платформа перечитает метаданные и обновит имя объекта и параметры регистрации.
Что важно запомнить
Имя объекта внешней обработки получают через Метаданные().Имя, путь к файлу — через ИспользуемоеИмяФайла, идентификатор формы — через ИмяФормы. Для обработок из БСП ориентируйтесь на реквизит ИмяОбъекта справочника. Не путайте имя файла с именем метаданных и не сохраняйте временные пути как постоянные идентификаторы.