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