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

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

Как получить ссылку на обработку в 1С

Как получить ссылку на внешнюю и встроенную обработку в 1С: через справочник дополнительных обработок, ВнешниеОбработки.Создать, навигационные ссылки. Примеры кода и ошибки.

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

Чаще всего задача возникает в типовых конфигурациях на БСП (УТ, ERP, БП, ЗУП), где внешние обработки регистрируются в справочнике «Дополнительные отчеты и обработки». Тогда ссылка — это обычная ссылка на элемент справочника, которую можно найти запросом, передать в другую процедуру или сохранить в реквизит документа. Для обработок, встроенных в конфигурацию, ссылка как таковая не нужна: объект создается через менеджер Обработки.ИмяОбработки.

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

Что именно считается ссылкой на обработку

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

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

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

В типовых конфигурациях с подсистемой «Дополнительные отчеты и обработки» каждая подключенная обработка — это элемент одноименного справочника. Самый простой способ получить ссылку — поиск по наименованию:

СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки

.НайтиПоНаименованию("Загрузка прайсов поставщиков", Истина);

Если СсылкаНаОбработку.Пустая() Тогда

ВызватьИсключение "Обработка не зарегистрирована в базе";

КонецЕсли;

Более надежный вариант — поиск запросом по имени объекта, которое обработка сообщает при регистрации (свойство ИмяОбработки из сведений о внешней обработке). Наименование пользователь может переименовать, а имя объекта обычно стабильно:

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1

| ДопОбработки.Ссылка КАК Ссылка

|ИЗ

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

|ГДЕ

| ДопОбработки.ИмяОбъекта = &ИмяОбъекта

| И НЕ ДопОбработки.ПометкаУдаления";

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

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

Если Результат.Следующий() Тогда

СсылкаНаОбработку = Результат.Ссылка;

КонецЕсли;

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

Создание объекта внешней обработки из файла

Если обработка хранится файлом .epf на диске сервера или в макете конфигурации, ссылка в терминах базы не нужна — создается объект обработки. На сервере это выглядит так:

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

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

Второй параметр метода Создать() управляет безопасным режимом. Значение Истина (или вызов без параметра в некоторых контекстах) включает безопасный режим: обработка не сможет обращаться к файловой системе и COM-объектам. Для доверенных файлов, требующих доступа к диску, безопасный режим отключают явно, но это должно быть осознанное решение.

Если файл хранится в макете конфигурации или в хранилище значения, сначала получите двоичные данные и сохраните их во временный файл:

ДвоичныеДанные = ПолучитьОбщийМакет("МояВнешняяОбработка");

ИмяФайла = ПолучитьИмяВременногоФайла("epf");

ДвоичныеДанные.Записать(ИмяФайла);

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

Работа с обработкой, встроенной в конфигурацию

Для обработки, добавленной в ветку «Обработки» конфигуратора, объект создается через менеджер, а форма открывается напрямую:

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

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

Здесь «ссылкой» по сути выступает имя обработки в дереве конфигурации. Его можно хранить строкой в настройках и строить путь к форме динамически через конкатенацию: "Обработка." + ИмяОбработки + ".Форма". Это удобно, когда одна и та же процедура должна открывать разные обработки в зависимости от настроек пользователя.

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

Навигационная ссылка для открытия обработки

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

НавСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбработку);

// Результат вида: e1cib/data/Справочник.ДополнительныеОтчетыИОбработки?ref=...

Для формы встроенной обработки навигационная ссылка формируется вручную как строка вида e1cib/app/Обработка.ИмяОбработки. Такая ссылка работает только внутри клиентского приложения 1С — в браузере без веб-клиента она бессмысленна.

Обратная задача — получить ссылку на объект из навигационной ссылки — решается функцией ЗначениеИзСтрокиВнутр() не всегда; корректный путь — разобрать строку и получить ссылку через Справочники.ДополнительныеОтчетыИОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID)), где GUID извлекается из параметра ref.

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

Справочник дополнительных обработок

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

ВнешниеОбработки.Создать()

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

Обработки.Имя.Создать()

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

Навигационная ссылка

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

Проверка результата и отладка

После получения ссылки проверьте три вещи: ссылка не пустая, объект не помечен на удаление и публикация не отключена (в справочнике БСП есть реквизит Публикация, значение «Отключена» делает обработку недоступной пользователям). Простая проверка:

Если СсылкаНаОбработку.Пустая()

Или СсылкаНаОбработку.ПометкаУдаления Тогда

ВызватьИсключение "Обработка недоступна";

КонецЕсли;

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

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

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

Значение переменной со ссылкой
Норма

Тип СправочникСсылка.ДополнительныеОтчетыИОбработки, Пустая() = Ложь

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

Неопределено или пустая ссылка — поиск не нашел элемент

Открытие формы обработки
Норма

Форма открывается без ошибок

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

Ошибка «Объект не найден» — ссылка битая или нет прав

Создание объекта из файла
Норма

Метод Создать() вернул объект

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

Исключение о недоступности файла или нарушении безопасного режима

Типичные ошибки и их причины

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

Вторая группа ошибок связана с безопасным режимом: обработка, которой нужен доступ к файлам или COM-объектам, молча не выполняет часть операций или падает с ошибкой «Нарушение прав доступа». Проверьте, с каким значением параметра безопасного режима создан объект, и профиль безопасности в кластере, если база серверная.

Третья типичная ситуация — поиск по наименованию находит не ту обработку или ничего не находит после переименования. Лечится переходом на поиск по ИмяОбъекта или хранением ссылки в настройке.

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

Частые вопросы

Как получить ссылку на обработку, если конфигурация самописная и справочника БСП нет?

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

Можно ли передать ссылку на обработку в фоновое задание?

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

Почему ПолучитьОбъект() по ссылке возвращает ошибку?

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

Как узнать GUID ссылки для отладки?

Вызовите СсылкаНаОбработку.УникальныйИдентификатор() на сервере. GUID удобно искать в журнале регистрации, использовать в навигационных ссылках и сопоставлять записи при обмене между базами.

Открывается ли внешняя обработка по навигационной ссылке из браузера?

Только если база опубликована на веб-сервере и пользователь работает через веб-клиент. Ссылка вида e1cib/... сама по себе в браузере не работает — нужен полный URL публикации, а навигационная часть добавляется к нему. Для внешних .epf-файлов навигационных ссылок не существует в принципе.

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

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

Итог

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

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