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

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

Как передать параметры в обработку 1С

Как передать параметры во внешнюю обработку 1С: через форму, программно, через команду БСП и фоновое выполнение. Примеры кода, ошибки и проверка результата.

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

Главная сложность в том, что обработка 1С — это не отдельная программа, а объект метаданных, у которого есть модуль объекта и (опционально) формы. Параметры формы и параметры объекта — разные вещи, и их путаница чаще всего приводит к ошибкам вида «параметр не найден» или к пустым значениям внутри обработки.

Ниже разобраны рабочие способы передачи параметров с примерами кода для управляемых форм (1С:Предприятие 8.3), поскольку именно они используются в современных конфигурациях. Для обычных форм подход аналогичен, но синтаксис отличается.

Как устроена передача параметров в обработку 1С

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

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

Также важно помнить о типах данных. Через параметры формы можно передавать примитивные типы, ссылки, структуры, массивы и таблицы значений. Но всё, что передаётся между клиентом и сервером, сериализуется, поэтому сложные несериализуемые объекты (например, COM-объекты или открытые файловые потоки) передать нельзя.

Передача параметров при открытии формы обработки

Самый распространённый сценарий — открыть форму обработки программно и передать в неё данные. Для этого используется метод ОткрытьФорму() с вторым аргументом — структурой параметров.

&НаКлиенте

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

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

ПараметрыОбработки.Вставить("Организация", ТекущаяОрганизация);

ПараметрыОбработки.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));

ПараметрыОбработки.Вставить("РежимОтладки", Истина);

ОткрытьФорму("ВнешняяОбработка.ЗагрузкаДанных.Форма.ФормаОбработки",

ПараметрыОбработки, ЭтотОбъект);

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

Внутри формы обработки параметры принимаются так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

ЭтотОбъект.Организация = Параметры.Организация;

КонецЕсли;

Если Параметры.Свойство("ДатаНачала") Тогда

ЭтотОбъект.ДатаНачала = Параметры.ДатаНачала;

КонецЕсли;

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

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

Порядок действий при передаче через форму
  1. 1
    Сформируйте структуру с нужными параметрами в вызывающем коде
  2. 2
    Вызовите ОткрытьФорму() с указанием пути к форме и структуры параметров
  3. 3
    В обработчике ПриСозданииНаСервере проверьте наличие каждого параметра через Свойство()
  4. 4
    Сохраните значения в реквизиты формы или объекта для дальнейшего использования
  5. 5
    Проверьте открытие формы и с параметрами, и без них

Программная передача параметров в объект обработки без формы

Если форма не нужна — например, обработка выполняет пакетную операцию или вызывается из другого кода — параметры передаются напрямую в реквизиты объекта обработки или как аргументы экспортной процедуры модуля объекта.

&НаСервере

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

Обработка = Обработки.ВыгрузкаВXML.Создать();

Обработка.Организация = Справочники.Организации.НайтиПоКоду("000000001");

Обработка.КаталогВыгрузки = "C:\Export\";

Обработка.ВыполнитьВыгрузку(); // экспортная процедура модуля объекта

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

Для внешней обработки (файл .epf) объект создаётся иначе:

Обработка = ВнешниеОбработки.Создать("C:\Обработки\Загрузка.epf", Ложь);

Обработка.ПараметрПодключения = СтрокаПодключения;

Обработка.Запустить();

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

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

В типовых конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, БП, ЗУП) внешние обработки подключаются через справочник «Дополнительные отчеты и обработки». Здесь передача параметров работает иначе: конфигурация сама вызывает обработку и передаёт ей контекст.

Для обработки вида «Заполнение объекта» или «Создание связанных объектов» БСП вызывает экспортную процедуру ВыполнитьКоманду из модуля объекта и передаёт в неё параметры выполнения:

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт

Если ИдентификаторКоманды = "ЗаполнитьЦены" Тогда

Для Каждого СсылкаНаОбъект Из ОбъектыНазначения Цикл

// обработка каждого объекта

КонецЦикла;

КонецЕсли;

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

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

Если обработка открывает форму при вызове команды, БСП передаёт в форму стандартные параметры, среди которых — ДополнительнаяОбработкаСсылка и ОбъектыНазначения. Их нужно принять в ПриСозданииНаСервере.

Передача параметров в фоновое выполнение обработки

Длительные операции принято выполнять в фоновом задании. Параметры в фоновую процедуру передаются массивом через метод ФоновыеЗадания.Выполнить или, в конфигурациях с БСП, через ДлительныеОперации.ВыполнитьВФоне.

&НаСервере

Функция ЗапуститьВФоне(ПараметрыОбработки)

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

ПараметрыПроцедуры.Вставить("Организация", ПараметрыОбработки.Организация);

ПараметрыПроцедуры.Вставить("Период", ПараметрыОбработки.Период);

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);

ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Загрузка данных обработкой";

Возврат ДлительныеОперации.ВыполнитьВФоне(

"Обработки.ЗагрузкаДанных.ВыполнитьЗагрузку",

ПараметрыПроцедуры, ПараметрыВыполнения);

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

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

Как проверить, что параметры дошли и обработаны правильно

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

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

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

Открытие формы с параметрами
Норма

Поля формы заполнены переданными значениями

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

Поля пустые или ошибка «Параметр не найден»

Открытие без параметров
Норма

Форма открывается со значениями по умолчанию

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

Ошибка обращения к несуществующему свойству

Типы данных
Норма

Ссылки, даты и числа соответствуют ожидаемым типам

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

Передана строка вместо ссылки, дата в виде текста

Фоновое выполнение
Норма

Задание завершается, результат во временном хранилище

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

Задание падает с ошибкой сериализации параметра

Типичные ошибки при передаче параметров

Чаще всего разработчики сталкиваются с одними и теми же проблемами. Первая — обращение к Параметры.ИмяПараметра без проверки его наличия: форма работает при программном открытии, но падает при ручном запуске. Вторая — попытка использовать параметры вне ПриСозданииНаСервере: после завершения обработчика объект Параметры очищается, и значения теряются, если их не сохранили в реквизиты формы.

Третья типичная ошибка — передача несериализуемых объектов в фоновое задание или между клиентом и сервером. Четвёртая — путаница между параметрами формы и реквизитами объекта обработки: разработчик заполняет реквизит объекта, а форма отображает реквизит формы, и значение «не доходит». Пятая — неправильный путь к форме внешней обработки: для файла .epf, открытого через ПолучитьФорму, путь строится иначе, чем для обработки, зарегистрированной в справочнике дополнительных обработок.

Типичные ошибки
01
Обращение к Параметры.Имя без проверки Свойство() — ошибка при открытии без параметров
02
Использование параметров после ПриСозданииНаСервере — значения уже недоступны
03
Передача COM-объектов в фоновое задание — ошибка сериализации
04
Заполнение реквизитов объекта вместо реквизитов формы — данные не отображаются
05
Неверный путь к форме внешней обработки — ошибка «Форма не найдена»

Часто задаваемые вопросы

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

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

Как передать параметры в обработку, открытую через «Файл — Открыть»?

Напрямую — никак: при ручном открытии файла .epf параметры не передаются. Обходные варианты: сохранять настройки в хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить/Загрузить), читать их из файла настроек или использовать механизм дополнительных обработок БСП, где контекст передаётся конфигурацией.

Почему параметры видны в ПриСозданииНаСервере, но пропадают потом?

Объект Параметры существует только во время создания формы на сервере. Чтобы значения были доступны в командах и других обработчиках, скопируйте их в реквизиты формы. Альтернатива — объявить параметр как ключевой в свойствах формы в конфигураторе, тогда он сохраняется платформой.

Как вернуть результат из обработки обратно в вызывающий код?

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

Можно ли передать параметры в обработку из командной строки при запуске 1С?

Да, через параметр запуска /C в командной строке можно передать строку, которая будет доступна в глобальном контексте как ПараметрЗапуска. Обработка, запускаемая после старта сеанса, может разобрать эту строку (обычно её форматируют как пары «ключ=значение» через разделитель) и использовать значения. Способ подходит для автоматизации и пакетных сценариев.

Что делать, если параметр содержит ссылку на объект другой информационной базы?

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

Итог

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

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