При разработке внешних обработок в экосистеме 1С, работающих на базе Библиотеки стандартных подсистем (БСП), программисты часто сталкиваются с дилеммой: как правильно инициировать открытие формы, чтобы она не просто отобразилась пользователю, но и содержала уже обработанные данные. В этой статье мы подробно разберем, как реализовать этот механизм, проанализируем различия в типах команд и выясним, как избежать типичных ошибок с именованием форм.
Рассмотрим стандартную ситуацию: нам необходимо создать внешнюю обработку (например, печатную форму или помощник заполнения), которая получает массив ссылок на объекты (документы или элементы справочников), выполняет серверные расчеты (например, формирует сложный HTML-текст) и выводит результат в форму.
В механизме БСП «Дополнительные отчеты и обработки» при регистрации команды в функции СведенияОВнешнейОбработке мы можем выбрать один из вариантов использования:
Разберем, какой вариант предпочтительнее в зависимости от сложности логики.
Многие разработчики ошибочно полагают, что при обычном открытии формы невозможно передать массив выбранных объектов. Однако это не так. Рассмотрим подробнее механизм передачи параметров через ОбъектыНазначения.
Когда вы выбираете тип команды ОткрытиеФормы, платформа 1С и механизмы БСП автоматически передают структуру параметров в создаваемую форму. Чтобы обработать эти данные до того, как пользователь увидит интерфейс, нам нужно использовать обработчик ПриСозданииНаСервере в модуле формы.
Пример реализации в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметра с объектами
Если Параметры.Свойство("ОбъектыНазначения") Тогда
МассивСсылок = Параметры.ОбъектыНазначения;
// Вызываем логику заполнения реквизитов формы
СформироватьПредварительныеДанные(МассивСсылок);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СформироватьПредварительныеДанные(СписокДокументов)
// Здесь выполняем расчеты, заполняем HTML-поле или таблицу
Для Каждого Ссылка Из СписокДокументов Цикл
// Обработка данных...
КонецЦикла;
Объект.ПолеHTML = "Данные успешно подготовлены!";
КонецПроцедуры
Преимущество этого метода заключается в его простоте: вам не нужно писать код для открытия формы, БСП сделает это за вас. Форма откроется уже заполненной, и пользователю не придется нажимать дополнительные кнопки «Сформировать».
Этот вариант подходит, если перед открытием формы на клиенте требуется выполнить дополнительную логику или если вы хотите иметь полный контроль над процессом открытия. В этом случае в модуле формы обязательно должна присутствовать экспортная процедура ВыполнитьКоманду.
Проанализируем ситуацию, когда нам нужно программно открыть саму форму из этого метода. Важно понимать, что обращение по жесткому имени типа ВнешниеОбработки.ИмяФайла.ПолучитьФорму работать не будет, так как БСП регистрирует обработку под временным внутренним именем.
Решение задачи через «ВыполнитьКоманду»:
&НаКлиенте
Процедура ВыполнитьКоманду(ПараметрыКоманды) Экспорт
// ПараметрыКоманды.ОбъектыНазначения - содержит массив ссылок
// ПараметрыКоманды.ИмяФормы - уже содержит правильный путь к форме
// Мы можем заполнить параметры для открытия
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ОбъектыНазначения", ПараметрыКоманды.ОбъектыНазначения);
// Открываем форму, используя предопределенное имя из параметров БСП
ОткрытьФорму(ПараметрыКоманды.ИмяФормы, ПараметрыОткрытия, ПараметрыКоманды.Источник);
КонецПроцедуры
Если же вы пытаетесь открыть форму из этого же модуля через ЭтотОбъект.Открыть(), будьте осторожны: этот метод не позволяет гибко передавать параметры инициализации так, как это делает ОткрытьФорму.
Выясним причину, по которой часто возникает ошибка «Неверное имя формы». Когда обработка загружена в справочник «Дополнительные отчеты и обработки», её фактическое имя в системе генерируется динамически (например, ВнешняяОбработка.ДополнительнаяОбработка_Идентификатор).
Чтобы гарантированно открыть форму программно, используйте следующие подходы:
ПараметрыКоманды.ИмяФормы, которое БСП передает в процедуру ВыполнитьКоманду.ЭтотОбъект.Метаданные().ПолноеИмя() + ".Форма.ИмяВашейФормы".Рассмотрим ситуацию, когда объем данных для передачи в форму велик (не просто массив ссылок, а тяжелые таблицы или структуры). Передача больших объемов данных через Параметры может замедлить работу клиента. В таких случаях рекомендуется использовать временное хранилище.
Алгоритм действий:
ПоместитьВоВременноеХранилище.АдресХранилища в параметры открытия формы.ПриСозданииНаСервере извлекаем данные через ПолучитьИзВременногоХранилища.Важно помнить, что внешние обработки часто запускаются в безопасном режиме. Если ваша логика заполнения формы требует доступа к файловой системе, внешним компонентам или COM-объектам, обычное открытие может завершиться ошибкой прав доступа.
В этом случае при регистрации обработки в справочнике необходимо настроить разрешения (разрешить использование внешних ресурсов). Проанализируйте, действительно ли вашей обработке нужны такие права, или логику можно перенести в безопасное русло.
Мы разобрали два основных способа работы с формами внешних обработок. Подытожим:
Параметры.ОбъектыНазначения в ПриСозданииНаСервере.ОткрытьФорму() вручную, используя путь из ПараметрыКоманды.ИмяФормы.Параметры.Свойство(), чтобы избежать ошибок при интерактивном запуске обработки напрямую из файла.