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

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

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

1. Базовый метод: передача параметров через ОткрытьФорму()

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

Синтаксис метода:

ОткрытьФорму(<ИмяФормы>, <Параметры>, <РежимОткрытия>, <Уникальность>, <Родитель>);

Где:

  • 📌 <ИмяФормы> — строка с именем формы (например, "Справочник.Номенклатура.ФормаЭлемента")
  • 📌 <Параметры> — структура или таблица значений с передаваемыми данными
  • 📌 <РежимОткрытия> — необязательный параметр (по умолчанию Неопределён)
  • 📌 <Уникальность> — управление уникальностью формы (например, Уникальность.ПоИмениФормыИПараметрам)

Пример передачи простых параметров:

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

Параметры.Вставить("Клиент", СсылкаНаКлиента);

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

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

ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", Параметры);

💡

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

Например, в модуле формы можно получить их так:

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

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

Клиент = Параметры.Клиент;

ЗаполнитьДанныеКлиента(Клиент);

КонецЕсли;

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

2. Передача параметров через ОткрытьЗначение()

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

Синтаксис:

ОткрытьЗначение(<Значение>, <Параметры>, <РежимОткрытия>, <Уникальность>);

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

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

Параметры.Вставить("ТипЦены", Перечисление.ТипыЦен.Розничная);

Параметры.Вставить("Валюта", Справочники.Валюты.НайтиПоНаименованию("Рубль"));

ОткрытьЗначение(1500, Параметры, "ФормаЗначенияЧисло");

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

📊 Какой метод вы чаще используете для передачи параметров?
ОткрытьФорму()
ОткрытьЗначение()
Через ссылки
Другие способы

3. Использование ссылок как параметров

Один из самых эффективных способов передачи параметров — использование ссылок на объекты метаданных. Этот метод особенно полезен, когда нужно открыть форму для конкретного элемента справочника или документа.

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

  • 🔗 Автоматическое заполнение формы данными объекта
  • 🔗 Возможность передачи контекста (например, родительский элемент)
  • 🔗 Оптимизация производительности (платформа сама подгружает нужные данные)

Пример передачи ссылки на документ:

ДокументОбъект = Документы.ЗаказКлиента.СоздатьДокумент();

ДокументОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

ДокументОбъект.Дата = ТекущаяДата();

ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДокументОбъект.Ссылка);

В форме объект будет автоматически загружен по переданной ссылке. Если нужно передать дополнительные параметры, их можно комбинировать со ссылкой:

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

Параметры.Вставить("Объект", ДокументОбъект.Ссылка);

Параметры.Вставить("Режим", "Просмотр");

ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", Параметры);

Что будет, если передать несуществующую ссылку?

При передаче несуществующей или "битой" ссылки платформа выбросит исключение с текстом "Объект не найден (передан неверный идентификатор объекта)". Чтобы избежать этого, всегда проверяйте ссылки перед передачей с помощью метода Ссылка.Пустая() или конструкции ТипЗнч(Ссылка) = Тип("Ссылка").

4. Работа с реквизитами формы как альтернатива параметрам

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

  • 🔄 Параметры нужно динамически обновлять
  • 🔄 Форма открывается в модальном режиме, и данные зависят от действий пользователя
  • 🔄 Требуется сложная логика инициализации, которую проще реализовать в модуле формы

Пример заполнения реквизитов после открытия:

Форма = ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");

Форма.Реквизит.Фильтр.Контрагент = ТекущийКонтрагент;

Форма.Реквизит.Фильтр.ДатаНачала = НачалоМесяца(ТекущаяДата());

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

Экспортируйте нужные реквизиты в модуле формы|Проверьте права доступа к реквизитам|Используйте обработчик ПриОткрытии для инициализации|Обработайте случай, если форма уже открыта-->

5. Передача сложных структур: таблицы значений, массивы, объекты

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

Способ 1. Сериализация в JSON

Удобно для передачи произвольных структур данных. Пример:

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

Параметры.Вставить("Фильтры", JSON.Записать(ТаблицаФильтров));

// В форме:

ТаблицаФильтров = JSON.Прочитать(Параметры.Фильтры);

Способ 2. Использование временных хранилищ

Подходит для больших объёмов данных. Пример:

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

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

// В форме:

ТаблицаДанных = ХранилищеЗначения.Восстановить(Параметры.ИдентификаторХранилища);

Способ 3. Передача через общие модули

Если данные нужны многим формам, их можно разместить в общем модуле с свойством Глобальный. Пример:

// В общем модуле:

Переменная ГлобальныеФильтры Экспорт;

// При открытии формы:

ОбщийМодуль.ГлобальныеФильтры = ТаблицаФильтров;

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

Способ передачи Макс. размер данных Скорость Когда использовать
Параметры формы ~1 МБ ⚡ Быстро Простые данные, небольшие структуры
JSON ~5 МБ ⚡⚡ Средне Сложные структуры, вложенные объекты
Хранилище значений ~50 МБ ⚡⚡⚡ Медленно Очень большие данные, фоновая обработка
Общий модуль Не ограничено ⚡⚡⚡⚡ Мгновенно Глобальные данные для многих форм

6. Особенности передачи параметров в управляемых формах

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

1. Ограничения на типы данных

Не все типы данных можно передавать напрямую. Например, ДвоичныеДанные или ХранилищеЗначения требуют предварительной обработки.

2. Асинхронная загрузка

В веб-клиенте форма может открыться быстрее, чем загрузятся переданные параметры. Используйте обработчик ПриАктивизацииНаКлиенте для проверки готовности данных:

Процедура ПриАктивизацииНаКлиенте(Активизация)

Если НЕ ЗначениеЗаполнено(Параметры.Данные) Тогда

ПоказатьПредупреждение("Данные ещё загружаются..");

КонецЕсли;

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

3. Безопасность

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

💡

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

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

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

Ошибка 1: Параметры не передаются в форму

  • 🔍 Причина: Неправильное имя формы или опечатка в параметрах.
  • 🔧 Решение: Проверьте регистр в имени формы и структуру параметров с помощью Сообщить(Параметры).

Ошибка 2: Форма открывается пустой

  • 🔍 Причина: Переданная ссылка неверна или объект не найден.
  • 🔧 Решение: Проверьте ссылку на валидность: Если НЕ Ссылка.Пустая() Тогда...

Ошибка 3: Зависание при передаче больших данных

  • 🔍 Причина: Передача крупных таблиц значений через параметры.
  • 🔧 Решение: Используйте ХранилищеЗначения или разбивайте данные на части.
💡

Если форма открывается в модальном режиме (ЭтотОбъект.Модальность = Истина), убедитесь, что все параметры переданы до вызова Показать(). Изменение параметров после показа модального окна может привести к непредсказуемому поведению.

⚠️ Внимание: При передаче параметров в формы внешних обработок (подключаемых через "Дополнительные отчёты и обработки") учитывайте, что структура параметров может конфликтовать с внутренними механизмами платформы. Всегда тестируйте такие сценарии в отдельной базе.

8. Продвинутые техники: динамическая передача и события

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

1. Подписка на события

Родительская форма может передавать данные в дочернюю через события. Пример:

// В родительской форме:

ФормаДетей = ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");

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

// В дочерней форме:

Процедура ОбновитьФильтр(Фильтр) Экспорт

Элементы.Список.Фильтр = Фильтр;

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

2. Использование временных таблиц

Если данные нужно передавать между формами в рамках одной сессии, можно использовать временные таблицы базы данных:

// Создание временной таблицы

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

Товар КАК Товар,

Количество КАК Количество

ПОМЕСТИТЬ ВТ_ТекущийЗаказ

ИЗ

&ТекущийЗаказ КАК ТекущийЗаказ";

Запрос.УстановитьПараметр("ТекущийЗаказ", ТекущийЗаказ);

Запрос.Выполнить();

// В другой форме:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВТ_ТекущийЗаказ");

Результат = Запрос.Выполнить().Выгрузить();

3. Обмен через HTTP-сервисы

Для распределённых систем (например, когда формы открываются в разных базах) можно использовать HTTP-сервисы :

HTTPСервис = HTTPСоединение.Установить("https://server/ws/Parameters.1cws");

Ответ = HTTPСервис.ВыполнитьPOST(JSON.Записать(Параметры));

⚠️ Внимание: При использовании временных таблиц или HTTP-сервисов убедитесь, что данные очищаются после использования. Накопление "мусорных" данных может привести к снижению производительности сервера.

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

Можно ли передавать в форму объекты с методами (например, менеджеры значений)?

Нет, через стандартные механизмы (ОткрытьФорму()) можно передавать только данные, но не исполняемый код. Если нужно передать объект с методами, используйте:

  • 🔹 Общие модули с экспортными методами
  • 🔹 Временные хранилища с сериализованными данными + отдельные обработчики в форме

Пример: вместо передачи объекта передайте его идентификатор, а в форме восстановите объект через фабричный метод.

Как передать параметры в форму, которая открывается из отчёта?

При открытии формы из отчёта (например, по двойному клику на строку) используйте обработчик ПриАктивизацииСтроки в схеме компоновки данных:

Процедура ПриАктивизацииСтроки(Элемент, Строки, Колонка, СтандартнаяОбработка)

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

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

ОткрытьФорму("Документ.ЗаказКлиента.ФормаСписка", Параметры);

СтандартнаяОбработка = Ложь;

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

Важно: в параметрах будет передаваться выгруженная таблица, а не ссылки на оригинальные данные.

Почему параметры теряются при обновлении формы?

Это происходит, если:

  • 🔹 Форма пересоздаётся (например, при изменении прав доступа)
  • 🔹 Используется Обновить() без сохранения параметров
  • 🔹 В настройках формы отключено сохранение состояния (СохранятьСостояние = Ложь)

Решение: сохраняйте критичные параметры в реквизитах формы или в общем модуле.

Как передать параметры в форму мобильного приложения 1С?

В мобильном клиенте параметры передаются так же, как в тонком клиенте, но с учётом:

  • 📱 Ограничений на размер передаваемых данных (рекомендуется не более 500 КБ)
  • 📱 Отсутствия поддержки некоторых типов (например, ДвоичныеДанные нужно конвертировать в Base64)
  • 📱 Задержек при передаче больших структур (используйте асинхронную загрузку)

Пример адаптированного кода:

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

Параметры.Вставить("ФильтрJSON", Base64Строка(JSON.Записать(Фильтр)));

ОткрытьФорму("Mobile.ФормаЗаказов", Параметры);

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

Прямая передача параметров между базами невозможна, но есть обходные пути:

  1. 🔄 Через HTTP-сервисы (рекомендуемый способ)
  2. 🔄 Через общие файлы (JSON, XML) в сетевой папке
  3. 🔄 Через регистры сведений в распределённой базе
  4. 🔄 Через обмен сообщениями (для облачных решений)

Пример с HTTP-сервисом:

// База-отправитель:

HTTPЗапрос = Новый HTTPЗапрос("/hs/TransferParams");

HTTPЗапрос.УстановитьТелоИзСтроки(JSON.Записать(Параметры));

HTTPСоединение = Новый HTTPСоединение("https://target-base.ru");

Ответ = HTTPСоединение.ВыполнитьЗапрос(HTTPЗапрос);

// База-получатель (в HTTP-сервисе):

Функция ОбработатьЗапрос(Запрос) Экспорт

Параметры = JSON.Прочитать(Запрос.ТелоКакСтроку);

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

Возврат Новый HTTPОтвет(200);

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