Как программно определить способ открытия внешней обработки: через "Файл - Открыть" или подсистему БСП?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробнее, какие существуют методы для решения этой задачи, проанализируем примеры кода и разберем по шагам наиболее оптимальные варианты реализации.

Способ 1: Анализ строкового представления объекта и имени файла (через код)

Этот метод основан на проверке свойств объекта обработки, когда она уже инициализирована на сервере. Платформа 1С формирует разное внутреннее представление для объектов, открытых из файла напрямую, и тех, что подключены программно.

Посмотрим на пример кода, который проверяет два ключевых условия: наличие расширения .epf в имени файла и специфического префикса ВнешняяОбработкаОбъект в строковом представлении самого объекта.


&НаКлиенте
Процедура Тест(Команда)   
    ВнешняяИзФайла = ЭтоВнешняяОбработкаИзФайла();    
КонецПроцедуры

&НаСервере
Функция ЭтоВнешняяОбработкаИзФайла()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

    ЭтоВнешняя = Найти(СокрЛП(ОбработкаОбъект), "ВнешняяОбработкаОбъект") > 0;
    ИзФайла = Найти(ОбработкаОбъект.ИспользуемоеИмяФайла, ".epf") > 0;
    
    Возврат ЭтоВнешняя И ИзФайла;    
КонецФункции

Этот вариант кода легко читается благодаря использованию промежуточных переменных ЭтоВнешняя и ИзФайла. Для тех, кто предпочитает более компактный стиль написания, код можно свернуть в одно выражение. Проанализируем оптимизированную версию:


&НаСервере
Функция ЭтоВнешняяОбработкаИзФайла()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    Возврат Найти(СокрЛП(ОбработкаОбъект), "ВнешняяОбработкаОбъект") > 0 И 
            Найти(ОбработкаОбъект.ИспользуемоеИмяФайла, ".epf") > 0;    
КонецФункции

Выбор между развернутым и компактным вариантом остается за разработчиком. Развернутый вариант удобнее при отладке, а однострочный делает код менее громоздким.

Способ 2: Проверка через параметры формы (Самый надежный способ для БСП)

Методы со строковым анализом работают, но могут давать ложноположительные результаты. Например, при открытии через БСП обработка всё равно временно сохраняется на диск и имеет расширение .epf. Поэтому выясним причину, почему проверка параметров формы является более архитектурно правильным решением.

Когда внешняя обработка запускается из подсистемы БСП, система делает это программно и передает в форму служебные данные. В коллекции ЭтаФорма.Параметры будут присутствовать специфические свойства.

Разберем по шагам, какие параметры можно искать в событии ПриСозданииНаСервере:

  1. ДополнительнаяОбработкаСсылка — содержит ссылку на элемент справочника дополнительных отчетов и обработок.
  2. ИдентификаторКоманды или ИмяКоманды — указывает, какая именно команда была вызвана.
  3. ОбъектыНазначения — массив ссылок на объекты, если это печатная форма или обработка заполнения.

Если вы открываете файл через Файл - Открыть, эти параметры в форму переданы не будут. Таким образом, простая проверка наличия свойства ДополнительнаяОбработкаСсылка в коллекции Параметры дает стопроцентную гарантию определения источника.

Способ 3: Анализ пути к файлу

Если вам все же нужно опираться на файловую систему, обратите внимание не на расширение, а на сам путь к файлу. Свойство ИспользуемоеИмяФайла содержит полный путь.

Проанализируем ситуацию:

  1. При запуске через подсистему БСП двоичные данные выгружаются во временную папку ОС (например, каталог Temp пользователя). Путь будет содержать характерные признаки временных директорий.
  2. При ручном открытии через меню путь будет указывать на реальную пользовательскую директорию (Рабочий стол, папка с проектами, сетевой диск).

Способ 4: Особенности безопасного режима и среды исполнения

Существует еще одно важное отличие, которое мы рассмотрим. Это контекст безопасности.

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

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

Используя комбинацию этих знаний, вы можете надежно управлять поведением ваших внешних обработок в зависимости от сценария их вызова пользователем.

← На главную