Работа с обработками в 1С:Предприятие часто требует передачи параметров — будь то идентификаторы документов, фильтры для отборов или настройки интерфейса. Без правильной передачи данных обработка либо не запустится, либо будет работать с ошибками. Эта статья раскроет все актуальные способы передачи параметров в обработки 1С 8.3 (актуально и для 8.2), включая нюансы для управляемых и обычных форм, а также типичные ошибки, которые допускают даже опытные разработчики.

Мы разберём не только базовые методы вроде ПараметрыЗапуска, но и продвинутые техники: передачу через реквизиты формы, использование временных хранилищ (ХранилищеЗначения) и даже обмен данными между клиентом и сервером. Особое внимание уделим проблеме "потери параметров" при открытии обработки в новом окне — это одна из самых распространённых причин багов в конфигурациях.

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

1. Базовый способ: параметры запуска обработки

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

Пример кода для открытия обработки с параметром:

Параметры = Новый Структура("ИдентификаторДокумента, ДатаНачала", 12345, ТекущаяДата());

ОткрытьФорму("Обработка.МояОбработка.Форма", Параметры);

В модуле обработки параметры получают через ПараметрыЗапуска:

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

Если ПараметрыЗапуска.Свойство("ИдентификаторДокумента") Тогда

Сообщить("Получен документ с ID: " + ПараметрыЗапуска.ИдентификаторДокумента);

КонецЕсли;

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

  • 📌 Подходит для передачи простых типов данных (числа, строки, даты).
  • 🔄 Параметры доступны только при первом открытии формы.
  • ⚠️ Нельзя передавать объектные ссылки (например, ссылку на документ) — они превратятся в пустые значения.
  • 🔗 Работает и в тонком клиенте, и в веб-клиенте.
💡

Если нужно передать несколько параметров одного типа (например, массив ID документов), используйте Массив вместо Структура. Это упростит обработку на стороне получателя.

2. Передача через реквизиты формы

Если обработка имеет реквизиты формы, их можно заполнить до открытия. Этот метод удобен, когда параметры нужно не только передать, но и отобразить в интерфейсе (например, в полях ввода).

Пример для управляемой формы:

Обработка = Обработки.МояОбработка.Создать();

Обработка.РеквизитФормы = "Значение";

ОткрытьФормуМодально(Обработка.ПолучитьФорму());

Для обычной формы код будет аналогичным, но с учётом особенностей неуправляемого интерфейса:

Обработка = Обработки.МояОбработка.Создать();

Обработка.Параметр = 100; // Реквизит модуля обработки

ОткрытьФормуМодально("Обработка.МояОбработка.ФормаОбработки", Обработка);

Способ Тип формы Поддерживает объектные ссылки Требует изменения кода обработки
ПараметрыЗапуска Любая ❌ Нет ❌ Нет
Реквизиты формы Управляемая/Обычная ✅ Да ✅ Да (нужно добавить реквизит)
ХранилищеЗначения Любая ✅ Да ❌ Нет

⚠️ Внимание: При передаче объектных ссылок через реквизиты формы в веб-клиенте может возникнуть ошибка сериализации. В этом случае используйте ХранилищеЗначения или передавайте уникальные идентификаторы (GUID) вместо самих объектов.

3. Использование ХранилищеЗначения для сложных данных

Когда нужно передать большой объём данных (например, таблицу значений) или объектные ссылки, на помощь приходит ХранилищеЗначения. Это временное хранилище в памяти , которое позволяет обмениваться данными между разными частями системы.

Пример передачи таблицы значений:

// Отправитель

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Наименование");

Таблица.Добавить().Наименование = "Товар 1";

Хранилище = Новый ХранилищеЗначения(Таблица, 60); // Хранится 60 секунд

Параметры = Новый Структура("Хранилище", Хранилище.УникальныйИдентификатор);

ОткрытьФорму("Обработка.МояОбработка.Форма", Параметры);

Приём данных в обработке:

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

Хранилище = ХранилищаЗначений.Получить(ПараметрыЗапуска.Хранилище);

Если Хранилище <> Неопределено Тогда

Таблица = Хранилище.Получить();

// Работаем с таблицей

КонецЕсли;

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

  • 🕒 Время жизни хранилища настраивается (по умолчанию — 60 секунд).
  • 🔗 Подходит для передачи любых типов данных, включая объекты и двоичные данные.
  • ⚠️ В распределённой инфобазе (например, с RAS) хранилище может быть недоступно на другом узле.
  • 🔄 Можно использовать для обратной связи — когда обработка возвращает данные вызывающему коду.
Как увеличить время жизни ХранилищеЗначения?

По умолчанию хранилище существует 60 секунд, но это значение можно изменить. Например, для хранения данных в течение 10 минут используйте:

Хранилище = Новый ХранилищеЗначения(Данные, 600);

Однако помните, что долгое хранение увеличивает нагрузку на сервер, особенно в системах с большим числом пользователей.

4. Передача параметров между клиентом и сервером

В управляемых формах часто требуется передать параметры с клиента на сервер (например, при нажатии кнопки). Для этого используются параметры команд.

Пример: передача значения из поля ввода на сервер:

&НаКлиенте

Процедура КомандаВыполнить(Команда)

ПараметрыВыполнения = Новый Структура("ЗначениеПоля", ЗначениеПоля);

ВыполнитьНаСервере(ОбработатьДанные, ПараметрыВыполнения);

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

&НаСервере

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

Сообщить("Получено значение: " + Параметры.ЗначениеПоля);

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

Для обратной передачи (с сервера на клиент) используйте Возврат:

&НаСервере

Функция ПолучитьДанные()

Возврат "Результат обработки";

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

&НаКлиенте

Процедура КомандаПолучитьДанные(Команда)

Результат = ПолучитьДанные();

Сообщить(Результат);

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

📊 Какой способ передачи параметров вы используете чаще?
ПараметрыЗапуска
Реквизиты формы
ХранилищеЗначения
Команды клиент-сервер
Другой

⚠️ Внимание: При передаче данных между клиентом и сервером автоматически сериализует и десериализует объекты. Это может привести к потере типов (например, Дата превратится в строку). Всегда проверяйте типы полученных данных!

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

Модальные обработки (открытые через ОткрытьФормуМодально) требуют особого подхода. Здесь параметры можно передать либо через ПараметрыЗапуска, либо через реквизиты формы, но с учётом контекста выполнения.

Пример открытия модальной обработки с возвратом результата:

Параметры = Новый Структура("Вопрос", "Подтвердите действие");

Результат = ОткрытьФормуМодально("Обработка.Подтверждение.Форма", Параметры);

Если Результат = Истина Тогда

Сообщить("Действие подтверждено!");

Иначе

Сообщить("Отменено пользователем.");

КонецЕсли;

В обработке результат возвращается через Закрыть:

Процедура Подтвердить(Команда)

Закрыть(Истина);

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

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

Закрыть(Ложь);

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

Проверьте, что обработка поддерживает модальный режим (нет длинных операций)

Убедитесь, что возвращаемое значение обрабатывается корректно

Передавайте только необходимые параметры (избыточные данные замедляют работу)

Используйте Try-Catch для обработки ошибок при закрытии формы-->

6. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при передаче параметров. Вот самые распространённые ошибки и способы их решения:

  • 🔴 "Параметры не доходят до обработки" — проверьте, что вы используете правильное имя параметра (регистр важен!). В ПараметрыЗапуска ключи чувствительны к регистру: Идентификатор и идентификатор — это разные параметры.
  • 🔴 "Объектная ссылка становится пустой" — не передавайте объекты напрямую через ПараметрыЗапуска. Используйте ХранилищеЗначения или передавайте УникальныйИдентификатор объекта.
  • 🔴 "Ошибка сериализации в веб-клиенте" — некоторые типы данных (например, ДвоичныеДанные) не поддерживаются в веб-клиенте. Используйте Base64Строка для передачи двоичных данных.
  • 🔴 "Параметры теряются при обновлении формы" — если обработка переоткрывается (например, после изменения конфигурации), параметры запуска сбрасываются. Сохраняйте критичные данные в ХранилищеЗначения или реквизитах формы.

⚠️ Внимание: В 1С:Предприятие 8.3.20+ появились изменения в механизме передачи параметров для внешних обработок (подключаемых через ПодключитьОбработку). Теперь параметры могут передаваться только через ПараметрыЗапуска, а реквизиты формы игнорируются. Проверьте актуальную документацию для вашей версии платформы!

💡

Для передачи сложных данных всегда используйте ХранилищеЗначения — это единственный надёжный способ обмена объектными ссылками и большими структурами между формами.

7. Продвинутые техники: передача через глобальные переменные и общие модули

В некоторых случаях удобно использовать глобальные переменные или общие модули для передачи параметров. Этот метод подходит для внутрисеансового обмена данными, когда обработки работают в одном сеансе.

Пример с общим модулем:

// В общем модуле "ПеременныеСеанса"

Перем мЭкспорт ДанныеДляОбработки;

// В коде, открывающем обработку

ПеременныеСеанса.ДанныеДляОбработки = Новый Структура("Параметр1, Параметр2", Значение1, Значение2);

ОткрытьФорму("Обработка.МояОбработка.Форма");

// В обработке

Данные = ПеременныеСеанса.ДанныеДляОбработки;

Преимущества метода:

  • 🔄 Данные доступны в течение всего сеанса.
  • 🛠️ Не требует изменений в сигнатуре вызова обработки.
  • ⚠️ Опасно использовать в многопользовательском режиме — данные могут перезаписаться другим пользователем.

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

FAQ: Частые вопросы по передаче параметров в 1С

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

Да, но не через ПараметрыЗапуска — ссылка станет пустой. Используйте ХранилищеЗначения или передавайте УникальныйИдентификатор документа, а в обработке получите объект по этому ID:

Док = Документы.МояНоменклатура.НайтиПоУникальномуИдентификатору(ПараметрыЗапуска.IDДокумента);
Как передать таблицу значений в обработку?

Лучший способ — через ХранилищеЗначения:

Хранилище = Новый ХранилищеЗначения(МояТаблица, 300); // Хранится 5 минут

Параметры = Новый Структура("ХранилищеID", Хранилище.УникальныйИдентификатор);

В обработке:

Таблица = ХранилищаЗначений.Получить(ПараметрыЗапуска.ХранилищеID).Получить();
Почему параметры не передаются в обработку при открытии в новом окне?

Это известная особенность платформы. При открытии обработки в новом окне (например, через ОткрытьФорму("..., РежимОткрытияФормы.Независимый")) контекст теряется. Решения:

  1. Используйте ХранилищеЗначения.
  2. Передавайте параметры через URL (для веб-клиента).
  3. Сохраните данные в РегистрСведений с привязкой к пользователю.
Как передать параметр в обработку из отчёта?

В отчётах можно использовать ПараметрыЗапуска при открытии обработки из кнопки. Пример:

Параметры = Новый Структура("ОтчетДанные", ДанныеОтчета);

ОткрытьФорму("Обработка.ЭкспортДанных.Форма", Параметры);

Если нужно передать результат отчёта (таблицу), используйте ХранилищеЗначения.

Можно ли передать в обработку функцию (делегат)?

Нет, напрямую передать функцию как параметр нельзя. Альтернативы:

  1. Передавайте имя метода строкой и вызывайте его через Выполнить().
  2. Используйте общий модуль с экспортными функциями.

Пример:

Параметры = Новый Структура("МетодОбработки", "МойМодуль.ОбработатьДанные");

ОткрытьФорму("Обработка.УниверсальнаяОбработка.Форма", Параметры);