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

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

Как программно открыть обработку в 1С

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

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

Главное различие способов — в управляемости формы и в месте хранения обработки. Управляемые формы открываются через ОткрытьФорму() с указанием полного пути вида «Обработка.ИмяОбработки.Форма», обычные формы в толстом клиенте — через ПолучитьФорму(). Внешние файлы предварительно подключаются через ВнешниеОбработки.Подключить() либо создаются как объект.

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

Открытие встроенной обработки в управляемом приложении

В тонком клиенте и веб-клиенте (управляемое приложение) используется метод ОткрытьФорму(). Путь к форме строится по шаблону: Обработка.ИмяОбработки.Форма.ИмяФормы. Если имя формы не указано, откроется основная форма обработки, назначенная в конфигураторе.

&НаКлиенте

Процедура ОткрытьОбработку(Команда)

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма");

КонецПроцедуры

Метод возвращает ссылку на открытую форму, через которую можно обратиться к её реквизитам и экспортным процедурам. Если форма с таким путём не найдена, платформа выдаст ошибку «Ошибка при вызове метода контекста (ОткрытьФорму)» — чаще всего причина в опечатке в имени обработки или в том, что у обработки нет управляемой формы.

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

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

Передача параметров и получение результата

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

&НаКлиенте

Процедура ОткрытьСПараметрами(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ДокументОснование", Объект.Ссылка);

ПараметрыФормы.Вставить("Режим", "Проведение");

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма", ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

Если нужно получить результат после закрытия обработки (например, пользователь выбрал значения), используйте модальный режим с описанием оповещения. В обработке при закрытии вызовите Закрыть(Результат), а на стороне вызывающего кода обработайте оповещение.

&НаКлиенте

Процедура ОткрытьМодально(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияОбработки", ЭтотОбъект);

ОткрытьФорму("Обработка.Подбор.Форма", , ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте

Процедура ПослеЗакрытияОбработки(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

Сообщить("Выбрано: " + Результат);

КонецЕсли;

КонецПроцедуры

Открытие обработки в обычном приложении (толстый клиент)

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

Процедура ОткрытьОбработкуОбычная(Кнопка)

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

ФормаОбработки = ОбработкаОбъект.ПолучитьФорму("Форма");

ФормаОбработки.Открыть();

КонецПроцедуры

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

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

Открытие внешней обработки из файла .epf

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

&НаСервере

Функция ПодключитьВнешнююОбработку(ПутьКФайлу)

Возврат ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);

КонецФункции

&НаКлиенте

Процедура ОткрытьВнешнюю(Команда)

ПутьКФайлу = "C:\Обработки\Загрузка.epf";

ИмяОбработки = ПодключитьВнешнююОбработку(ПутьКФайлу);

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");

КонецПроцедуры

Третий параметр Подключить() отвечает за безопасный режим. В файловой базе подключение выполняется непосредственно; в клиент-серверной — на сервере, поэтому файл должен быть доступен с сервера 1С, а не с клиентской машины. Это частая причина ошибки «файл не найден»: путь C:\ существует у пользователя, но не на сервере.

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

Открытие через механизм дополнительных отчетов и обработок (БСП)

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

&НаКлиенте

Процедура ВыполнитьКомандуОбработки(Команда)

ПараметрыКоманды = Новый Структура("ДополнительнаяОбработкаСсылка", СсылкаНаОбработку);

ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандуОбработки(ПараметрыКоманды);

КонецПроцедуры

Точные имена процедур зависят от версии БСП, поэтому сверяйтесь с составом общих модулей вашей конфигурации. Принцип неизменен: обработка зарегистрирована в справочнике, у неё есть команды с видами «ОткрытиеФормы», «ВызовКлиентскогоМетода» или «ВызовСерверногоМетода», и вызов идёт через API библиотеки.

Сравнение вариантов

ОткрытьФорму()

Встроенные обработки в управляемом приложении. Не подходит для обычных форм и толстого клиента.

ПолучитьФорму()

Обычное приложение и толстый клиент. Не работает в тонком и веб-клиенте.

ВнешниеОбработки.Подключить() + ОткрытьФорму()

Внешние .epf в управляемом приложении. Требует доступности файла на сервере.

ДополнительныеОтчетыИОбработки (БСП)

Типовые конфигурации с БСП. Даёт права и безопасный режим, но требует регистрации обработки.

Типичные ошибки и их диагностика

Ошибка «Метод объекта не обнаружен» или «Ошибка при вызове метода контекста (ОткрытьФорму)» почти всегда означает неверный путь: проверьте имя обработки в конфигураторе (с учётом регистра неважно, но опечатки критичны) и наличие у неё формы нужного типа. Если у обработки только обычная форма, в тонком клиенте открыть её не получится — создайте управляемую форму.

Ошибка «Файл не обнаружен» при подключении внешней обработки указывает на проблему путей: в клиент-серверном режиме файл ищется на сервере. Решение — разместить файл на сервере, передать двоичные данные с клиента через временное хранилище и записать их во временный файл на сервере, либо использовать справочник дополнительных обработок, где файл хранится в базе.

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

Типичные ошибки
01
Указание пути к .epf с клиентского диска в клиент-серверной базе — файл не находится на сервере, подключение падает с ошибкой.
02
Попытка открыть обычную форму в тонком клиенте — метод ПолучитьФорму недоступен, нужна управляемая форма.
03
Ожидание, что параметры сами попадут в реквизиты формы — их нужно вручную прочитать из Параметры в ПриСозданииНаСервере.
04
Открытие обработки в цикле без уникального ключа — плодятся десятки одинаковых окон и растёт потребление памяти.

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

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

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

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

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

Вызов ОткрытьФорму()
Норма

Форма открылась без сообщений об ошибке

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

Ошибка вызова метода — проверить путь и тип формы

Передача параметров
Норма

В ПриСозданииНаСервере Параметры содержит переданные ключи

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

Параметры пусты — не совпали имена ключей структуры

Подключение .epf
Норма

Подключить() вернул имя обработки

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

Ошибка доступа к файлу — путь недоступен на сервере

Повторный вызов
Норма

Активируется уже открытое окно при заданном ключе уникальности

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

Открываются дубли окон

Итог

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

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

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

Как открыть обработку при запуске программы?

Используйте обработчик события в модуле управляемого приложения: в ПриНачалеРаботыСистемы или ПослеНачалаРаботыСистемы вызовите ОткрытьФорму(). Учтите, что в ПриНачалеРаботыСистемы интерактивные вызовы ограничены — надёжнее открывать форму в ПослеНачалаРаботыСистемы через обработчик ожидания.

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

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

Почему ОткрытьФорму() выдаёт ошибку, хотя обработка есть в конфигурации?

Чаще всего у обработки нет управляемой формы (создана только обычная) либо в пути пропущен сегмент «Форма». Проверьте в конфигураторе список форм обработки и тип клиента, в котором выполняется код.

Как передать в обработку таблицу значений?

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

Как открыть внешнюю обработку, если файл хранится в базе?

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

Чем ОткрытьФорму() отличается от ПолучитьФорму()?

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