Как программно открыть внешнюю обработку и передать в неё параметры: подробное руководство для 1С 7.7 и 8.x

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Реализация задачи в среде 1С:Предприятие 7.7

Для платформы 7.7 работа с внешними файлами обработок (файлы с расширением .ert) имеет свои синтаксические особенности, которые часто вызывают затруднения. Главная ошибка, которую мы часто видим в коде — использование неверного идентификатора типа объекта при вызове функции ОткрытьФорму.

Проанализируем синтаксис функции ОткрытьФорму для внешних отчетов и обработок. Для запуска внешнего файла в первом параметре обязательно указывается строковое значение "Отчет", независимо от того, является ли файл по своей сути отчетом или обработкой. Система 7.7 воспринимает их одинаково в контексте внешних файлов.

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


// Формируем контейнер для данных
ПараметрыПередачи = СоздатьОбъект("СписокЗначений");
ПараметрыПередачи.Установить("Сотрудник", ТекущийСотрудник);
ПараметрыПередачи.Установить("ДатаНачала", ВыбДата);
// Можно передать даже таблицу значений
ПараметрыПередачи.Установить("ТЗ_Данных", ТаблицаТоваров);

// Указываем путь к файлу внешней обработки
ПутьКФайлу = КаталогИБ() + "ExtForms\MyProcessing.ert";

// Проверяем существование файла перед открытием (хороший тон программирования)
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
    // Открываем форму, передавая список значений вторым параметром
    ОткрытьФорму("Отчет", ПараметрыПередачи, ПутьКФайлу);
Иначе
    Сообщить("Файл не найден по пути: " + ПутьКФайлу, "!");
КонецЕсли;

Теперь выясним, как принять эти данные в открываемой форме. В системе 7.7 переданный параметр становится доступен через атрибут Форма.Параметр. Лучше всего обрабатывать получение данных в предопределенной процедуре ПриОткрытии.


Процедура ПриОткрытии()
    // Проверяем, были ли переданы параметры
    Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
        // Извлекаем данные по ключам
        ВыбСотрудник = Форма.Параметр.Получить("Сотрудник");
        ДатаОтчета = Форма.Параметр.Получить("ДатаНачала");
        
        // Получаем таблицу значений, если она была передана
        ТЗ_Локальная = Форма.Параметр.Получить("ТЗ_Данных");
        // Теперь с ТЗ можно работать как с обычным объектом
    КонецЕсли;
КонецПроцедуры

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

Реализация задачи в 1С:Предприятие 8.x (Управляемые формы)

В современных версиях платформы 8.3 механизм передачи параметров более формализован и основан на использовании структуры параметров формы. Здесь нам не нужно заботиться о ключевых словах типа "Отчет", так как работа идет через менеджеры объектов или явное указание имени формы.

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


// Создаем структуру параметров
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Склад", Объект.СкладОтправитель);
ПараметрыОткрытия.Вставить("Товары", Объект.Товары.Выгрузить());

// Открываем форму внешней обработки
// ИмяФормы должно содержать полный путь, например "ВнешняяОбработка.ЗагрузкаДанных.Форма.Форма"
ОткрытьФорму("ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы", ПараметрыОткрытия);

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем наличие параметра в структуре
    Если Параметры.Свойство("Склад") Тогда
        Объект.Склад = Параметры.Склад;
    КонецЕсли;
    
    // Если передавали таблицу, загружаем ее в реквизит формы
    Если Параметры.Свойство("Товары") Тогда
        Объект.Товары.Загрузить(Параметры.Товары);
    КонецЕсли;
КонецПроцедуры

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

Как программно закрыть открытую форму

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

В 1С 7.7 для закрытия текущей формы используется метод Форма.Закрыть(0). Если вы хотите закрыть форму сразу после того, как она была открыта (например, если параметры не прошли валидацию), используйте СтатусВозврата(0) внутри процедуры ПриОткрытии.

В 1С 8.x управление закрытием формы извне требует наличия ссылки на эту форму. Проанализируем пример:


// При открытии сохраняем ссылку на форму в переменную
ПеременнаяФормы = ОткрытьФорму("ВнешняяОбработка.Тест.Форма", Параметры);

// ... спустя некоторое время или по событию ...
Если ПеременнаяФормы.Открыта() Тогда
    ПеременнаяФормы.Закрыть();
КонецЕсли;

Если же форму нужно закрыть "саму себя" изнутри её собственного модуля, достаточно вызвать метод ЭтаФорма.Закрыть() (на клиенте).

Особенности передачи Таблицы Значений (ТЗ)

Проанализируем проблему, упомянутую в обсуждении: "не передается таблица". В 7.7 это часто связано с тем, что программист пытается передать ТЗ как отдельный параметр, забывая, что ОткрытьФорму принимает только один аргумент для параметров. Решение — всегда упаковывать ТЗ в СписокЗначений, как мы рассмотрели выше.

В 8.3 (Управляемое приложение) передача ТЗ через параметры формы может вызвать ошибку "Данный тип не может быть передан на сервер". Чтобы этого избежать, используем следующий алгоритм:

  1. На стороне вызывающей формы помещаем ТЗ во временное хранилище: Адрес = ПоместитьВоВременноеХранилище(ТвояТЗ, УникальныйИдентификатор);
  2. Передаем Адрес в структуру параметров.
  3. В открываемой форме в ПриСозданииНаСервере извлекаем данные: ТЗ = ПолучитьИзВременногоХранилища(Параметры.Адрес);

Таким образом, мы обеспечиваем корректную работу системы без нарушения правил взаимодействия клиент-серверной архитектуры.

Заключение и рекомендации

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

Использование этих подходов позволит вам создавать гибкие и отказоустойчивые решения при разработке внешних инструментов на платформе 1С.

← На главную