Разработка и Конфигурация · 12 мин
Как передать параметры в обработку 1С
Как передать параметры во внешнюю обработку 1С: через форму, программно, через команду БСП и фоновое выполнение. Примеры кода, ошибки и проверка результата.
Передача параметров в обработку 1С — базовая задача, которая возникает при разработке внешних обработок, печатных форм и сервисных инструментов. В зависимости от сценария параметры можно передать при открытии формы обработки, при программном вызове процедуры, через механизм дополнительных отчетов и обработок БСП или при запуске фонового задания. Каждый способ имеет свои ограничения и подводные камни.
Главная сложность в том, что обработка 1С — это не отдельная программа, а объект метаданных, у которого есть модуль объекта и (опционально) формы. Параметры формы и параметры объекта — разные вещи, и их путаница чаще всего приводит к ошибкам вида «параметр не найден» или к пустым значениям внутри обработки.
Ниже разобраны рабочие способы передачи параметров с примерами кода для управляемых форм (1С:Предприятие 8.3), поскольку именно они используются в современных конфигурациях. Для обычных форм подход аналогичен, но синтаксис отличается.
Как устроена передача параметров в обработку 1С
У обработки есть два контекста, в которые можно передать данные. Первый — форма обработки: при её открытии передаётся структура параметров, которая доступна в обработчике ПриСозданииНаСервере через переменную Параметры. Второй — объект обработки: его реквизиты можно заполнить напрямую после создания объекта методом Обработки.ИмяОбработки.Создать() или ВнешниеОбработки.Создать(ПутьКФайлу).
Ключевое ограничение: параметры формы существуют только на время создания формы на сервере. Если нужно использовать их дальше — в командах, обработчиках на клиенте или при повторных серверных вызовах — их необходимо сохранить в реквизиты формы. Иначе после завершения ПриСозданииНаСервере значения будут потеряны.
Также важно помнить о типах данных. Через параметры формы можно передавать примитивные типы, ссылки, структуры, массивы и таблицы значений. Но всё, что передаётся между клиентом и сервером, сериализуется, поэтому сложные несериализуемые объекты (например, COM-объекты или открытые файловые потоки) передать нельзя.
Передача параметров при открытии формы обработки
Самый распространённый сценарий — открыть форму обработки программно и передать в неё данные. Для этого используется метод ОткрытьФорму() с вторым аргументом — структурой параметров.
&НаКлиенте
Процедура ОткрытьОбработку(Команда)
ПараметрыОбработки = Новый Структура;
ПараметрыОбработки.Вставить("Организация", ТекущаяОрганизация);
ПараметрыОбработки.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
ПараметрыОбработки.Вставить("РежимОтладки", Истина);
ОткрытьФорму("ВнешняяОбработка.ЗагрузкаДанных.Форма.ФормаОбработки",
ПараметрыОбработки, ЭтотОбъект);
КонецПроцедуры
Внутри формы обработки параметры принимаются так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Организация") Тогда
ЭтотОбъект.Организация = Параметры.Организация;
КонецЕсли;
Если Параметры.Свойство("ДатаНачала") Тогда
ЭтотОбъект.ДатаНачала = Параметры.ДатаНачала;
КонецЕсли;
КонецПроцедуры
Обратите внимание на проверку Параметры.Свойство(...). Если форму откроют без параметров (например, пользователь запустит обработку через «Файл — Открыть»), обращение к несуществующему свойству вызовет ошибку. Всегда проверяйте наличие параметра перед использованием.
- 1Сформируйте структуру с нужными параметрами в вызывающем коде
- 2Вызовите ОткрытьФорму() с указанием пути к форме и структуры параметров
- 3В обработчике ПриСозданииНаСервере проверьте наличие каждого параметра через Свойство()
- 4Сохраните значения в реквизиты формы или объекта для дальнейшего использования
- 5Проверьте открытие формы и с параметрами, и без них
Программная передача параметров в объект обработки без формы
Если форма не нужна — например, обработка выполняет пакетную операцию или вызывается из другого кода — параметры передаются напрямую в реквизиты объекта обработки или как аргументы экспортной процедуры модуля объекта.
&НаСервере
Процедура ВыполнитьОбработку()
Обработка = Обработки.ВыгрузкаВXML.Создать();
Обработка.Организация = Справочники.Организации.НайтиПоКоду("000000001");
Обработка.КаталогВыгрузки = "C:\Export\";
Обработка.ВыполнитьВыгрузку(); // экспортная процедура модуля объекта
КонецПроцедуры
Для внешней обработки (файл .epf) объект создаётся иначе:
Обработка = ВнешниеОбработки.Создать("C:\Обработки\Загрузка.epf", Ложь);
Обработка.ПараметрПодключения = СтрокаПодключения;
Обработка.Запустить();
Второй параметр метода Создать() отвечает за безопасный режим. Значение Ложь отключает безопасный режим, что позволяет обработке обращаться к файловой системе и внешним компонентам. Используйте это осознанно: внешняя обработка из недоверенного источника в небезопасном режиме может выполнить любой код на сервере.
Передача параметров через механизм дополнительных обработок БСП
В типовых конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, БП, ЗУП) внешние обработки подключаются через справочник «Дополнительные отчеты и обработки». Здесь передача параметров работает иначе: конфигурация сама вызывает обработку и передаёт ей контекст.
Для обработки вида «Заполнение объекта» или «Создание связанных объектов» БСП вызывает экспортную процедуру ВыполнитьКоманду из модуля объекта и передаёт в неё параметры выполнения:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ЗаполнитьЦены" Тогда
Для Каждого СсылкаНаОбъект Из ОбъектыНазначения Цикл
// обработка каждого объекта
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Массив ОбъектыНазначения содержит ссылки на документы или элементы справочников, для которых вызвана команда. Структура ПараметрыВыполнения содержит служебную информацию: ссылку на дополнительную обработку, признак того, что команда выполняется в фоне, и другие данные. Собственные произвольные параметры через этот механизм напрямую не передаются — их нужно хранить в самой обработке (например, в настройках, сохраняемых в хранилище общих настроек) или запрашивать у пользователя через форму.
Если обработка открывает форму при вызове команды, БСП передаёт в форму стандартные параметры, среди которых — ДополнительнаяОбработкаСсылка и ОбъектыНазначения. Их нужно принять в ПриСозданииНаСервере.
Передача параметров в фоновое выполнение обработки
Длительные операции принято выполнять в фоновом задании. Параметры в фоновую процедуру передаются массивом через метод ФоновыеЗадания.Выполнить или, в конфигурациях с БСП, через ДлительныеОперации.ВыполнитьВФоне.
&НаСервере
Функция ЗапуститьВФоне(ПараметрыОбработки)
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("Организация", ПараметрыОбработки.Организация);
ПараметрыПроцедуры.Вставить("Период", ПараметрыОбработки.Период);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Загрузка данных обработкой";
Возврат ДлительныеОперации.ВыполнитьВФоне(
"Обработки.ЗагрузкаДанных.ВыполнитьЗагрузку",
ПараметрыПроцедуры, ПараметрыВыполнения);
КонецФункции
Здесь есть жёсткое ограничение: все передаваемые параметры должны быть сериализуемыми. Ссылки, структуры, массивы, таблицы значений проходят без проблем, а вот объекты типа ComОбъект, ТекстовыйДокумент с открытым файлом или результаты запроса с открытой выборкой — нет. Результат фонового выполнения возвращается через помещение данных во временное хранилище.
Как проверить, что параметры дошли и обработаны правильно
После внедрения передачи параметров проверьте три вещи. Во-первых, откройте обработку программным способом и убедитесь, что поля формы заполнены переданными значениями. Во-вторых, откройте ту же обработку вручную без параметров — она не должна падать с ошибкой, а должна либо работать со значениями по умолчанию, либо выдавать понятное сообщение. В-третьих, проверьте типы: если в параметр ожидается ссылка на справочник, а передана строка, лучше выявить это явной проверкой типа, чем получить ошибку в глубине логики.
Как проверить результат
Поля формы заполнены переданными значениями
Поля пустые или ошибка «Параметр не найден»
Форма открывается со значениями по умолчанию
Ошибка обращения к несуществующему свойству
Ссылки, даты и числа соответствуют ожидаемым типам
Передана строка вместо ссылки, дата в виде текста
Задание завершается, результат во временном хранилище
Задание падает с ошибкой сериализации параметра
Типичные ошибки при передаче параметров
Чаще всего разработчики сталкиваются с одними и теми же проблемами. Первая — обращение к Параметры.ИмяПараметра без проверки его наличия: форма работает при программном открытии, но падает при ручном запуске. Вторая — попытка использовать параметры вне ПриСозданииНаСервере: после завершения обработчика объект Параметры очищается, и значения теряются, если их не сохранили в реквизиты формы.
Третья типичная ошибка — передача несериализуемых объектов в фоновое задание или между клиентом и сервером. Четвёртая — путаница между параметрами формы и реквизитами объекта обработки: разработчик заполняет реквизит объекта, а форма отображает реквизит формы, и значение «не доходит». Пятая — неправильный путь к форме внешней обработки: для файла .epf, открытого через ПолучитьФорму, путь строится иначе, чем для обработки, зарегистрированной в справочнике дополнительных обработок.
Часто задаваемые вопросы
Можно ли передать таблицу значений в обработку как параметр?
Да, таблицу значений можно поместить в структуру параметров при открытии формы или в параметры фонового задания — она сериализуется корректно. Для больших таблиц надёжнее поместить их во временное хранилище методом ПоместитьВоВременноеХранилище() и передать только адрес хранилища, а в обработке получить данные обратно через ПолучитьИзВременногоХранилища().
Как передать параметры в обработку, открытую через «Файл — Открыть»?
Напрямую — никак: при ручном открытии файла .epf параметры не передаются. Обходные варианты: сохранять настройки в хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить/Загрузить), читать их из файла настроек или использовать механизм дополнительных обработок БСП, где контекст передаётся конфигурацией.
Почему параметры видны в ПриСозданииНаСервере, но пропадают потом?
Объект Параметры существует только во время создания формы на сервере. Чтобы значения были доступны в командах и других обработчиках, скопируйте их в реквизиты формы. Альтернатива — объявить параметр как ключевой в свойствах формы в конфигураторе, тогда он сохраняется платформой.
Как вернуть результат из обработки обратно в вызывающий код?
Если форма открыта модально или с описанием оповещения, используйте Закрыть(Результат) и обработайте результат в ОписаниеОповещения. Для немодального открытия применяйте Оповестить() с параметрами — вызывающая форма получит событие через ОбработкаОповещения. Из фонового задания результат возвращается через временное хранилище.
Можно ли передать параметры в обработку из командной строки при запуске 1С?
Да, через параметр запуска /C в командной строке можно передать строку, которая будет доступна в глобальном контексте как ПараметрЗапуска. Обработка, запускаемая после старта сеанса, может разобрать эту строку (обычно её форматируют как пары «ключ=значение» через разделитель) и использовать значения. Способ подходит для автоматизации и пакетных сценариев.
Что делать, если параметр содержит ссылку на объект другой информационной базы?
Ссылка имеет смысл только внутри своей базы — в другой базе она будет битой или укажет на другой объект. Передавайте между базами уникальный идентификатор (GUID) в виде строки или ключевые поля объекта (код, номер и дату документа), а в обработке восстанавливайте ссылку поиском.
Что важно запомнить
Параметры в форму обработки передаются структурой через ОткрытьФорму() и доступны только в ПриСозданииНаСервере — сохраняйте их в реквизиты. Для работы без формы заполняйте реквизиты объекта обработки напрямую. В БСП контекст приходит в ВыполнитьКоманду, а в фоновые задания передавайте только сериализуемые данные. Всегда проверяйте наличие параметра через Свойство() перед использованием.