Работа с формами в 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков и администраторов системы. Новые формы требуются для расширения функционала, улучшения пользовательского интерфейса или адаптации программы под специфические бизнес-процессы. Однако процесс их создания и открытия часто вызывает вопросы, особенно у новичков: где найти конструктор форм, как правильно написать код для вызова, и почему форма может не открываться despite корректных настроек?

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

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

1. Типы форм в 1С: чем управляемые формы отличаются от обычных

Прежде чем создавать новую форму, важно понять, какой её тип подходит для вашей задачи. В 1С:Предприятие 8.3 существуют два основных типа форм:

  • 📄 Обычные формы — унаследованы из ранних версий платформы (8.2 и ранее). Они работают только в толстом клиенте, имеют ограниченные возможности по адаптации под разные устройства и менее гибкие в плане программного управления. Используются преимущественно для поддержки устаревших конфигураций.
  • 🎛️ Управляемые формы — современный стандарт, поддерживаемый во всех типах клиентов (тонкий, веб, мобильный). Позволяют динамически изменять интерфейс в зависимости от прав пользователя, разрешения экрана и других параметров. Рекомендуются для новых разработок.

Основные различия между типами форм:

Критерий Обычные формы Управляемые формы
Поддержка клиентов Только толстый клиент Тонкий, веб, мобильный, толстый
Адаптивность Ограниченная Гибкая (подстраивается под разрешение)
Программное управление Через свойства и методы формы Через серверные и клиентские процедуры
Производительность Выше (работает локально) Зависит от типа клиента

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

📊 Какой тип клиента 1С вы используете чаще?
Тонкий клиент
Толстый клиент
Веб-клиент
Мобильное приложение

2. Создание новой формы в конфигураторе: пошаговая инструкция

Чтобы открыть новую форму, её сначала нужно создать в конфигураторе. Рассмотрим процесс на примере управляемой формы для документа ЗаказПокупателя:

  1. Откройте конфигуратор в режиме 1С:Предприятие (с правами администратора).
  2. В дереве объектов конфигурации найдите раздел ДокументыЗаказПокупателя.
  3. Кликните правой кнопкой по документу и выберите Создать формуУправляемая форма.
  4. В открывшемся окне укажите имя формы (например, ФормаЗаказаПокупателяРасширенная) и нажмите ОК.

После создания откроется конструктор формы, где вы можете:

  • 🔧 Добавлять элементы управления (поля ввода, кнопки, таблицы) из палитры инструментов.
  • 📋 Настраивать свойства элементов (видимость, доступность, привязку к данным).
  • 💻 Писать обработчики событий (например, ПриИзменении для поля или ПередЗаписью для формы).

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

☑️ Подготовка к созданию формы

Выполнено: 0 / 4

3. Программное открытие формы: основные методы

После создания формы её нужно открыть программно. В 1С:Предприятие 8.3 для этого используются разные подходы в зависимости от типа формы и контекста вызова.

3.1. Открытие управляемой формы

Для управляемых форм применяется метод ОткрытьФорму() с указанием имени формы и параметров. Пример для формы документа:

Процедура ОткрытьФормуЗаказа(Заказ)

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

ПараметрыФормы.Вставить("Ключ", Заказ.Ссылка);

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

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

Ключевые моменты:

  • 🔑 ПараметрыФормы — структура, через которую передаются данные в форму (например, ссылка на документ или фильтры).
  • 📌 Имя формы указывается в формате "ТипОбъекта.ИмяОбъекта.ИмяФормы".
  • 🔄 Для модального открытия используйте параметр РежимОткрытияФормы.БлокироватьОкноВладельца.

3.2. Открытие обычной формы

Для обычных форм используется метод ПолучитьФорму() с последующим вызовом Открыть():

Процедура ОткрытьОбычнуюФормуЗаказа(Заказ)

Форма = ПолучитьФорму("Документ.ЗаказПокупателя.ФормаОбъекта");

Форма.Объект = Заказ;

Форма.Открыть();

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

Обратите внимание: обычные формы требуют явного указания объекта (Форма.Объект = Заказ), тогда как управляемые формы получают его через параметры.

💡

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

4. Передача параметров в форму и работа с ними

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

Для этого используется структура ПараметрыФормы, которая передаётся вторым аргументом в метод ОткрытьФорму(). Пример с передачей нескольких параметров:

Процедура ОткрытьФормуСПараметрами()

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

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

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

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

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

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

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

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

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

Объект.Контрагент = Параметры.Клиент;

КонецЕсли;

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

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

КонецЕсли;

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

Типичные ошибки при работе с параметрами:

  • 🚫 Забывают проверить существование параметра (Параметры.Свойство("Имя")), что приводит к ошибке, если параметр не передан.
  • 🔄 Путают серверный и клиентский контекст — обработка параметров должна происходить на сервере (ПриСозданииНаСервере).
  • 📝 Передают сложные объекты (например, таблицы значений) без сериализации, что может вызвать ошибки в веб-клиенте.
Как передать таблицу значений в форму?

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

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

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

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

МассивДляПередачи = Новый Массив();

Для Каждого Строка Из Таблица Цикл

МассивДляПередачи.Добавить(Новый Структура("Товар,Количество", Строка.Товар, Строка.Количество));

КонецЦикла;

Параметры.Вставить("Товары", МассивДляПередачи);

5. Открытие формы из другой формы: взаимодействие между формами

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

Пример: открытие формы справочника Номенклатура из формы документа ЗаказПокупателя с возвратом выбранного товара:

Процедура КнопкаВыбратьТоварНажатие(Элемент)

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

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

ПараметрыФормы.Вставить("Владелец", ЭтаФорма);

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтаФорма, , ,

Новый ДействиеПриЗакрытии("ПослеВыбораТовара"));

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

Процедура ПослеВыбораТовара(ВыбранныйТовар, ДополнительныеПараметры) Экспорт

Если ВыбранныйТовар <> Неопределено Тогда

Объект.Товары.Добавить();

Объект.Товары[Объект.Товары.Количество()-1].Номенклатура = ВыбранныйТовар;

КонецЕсли;

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

Ключевые моменты:

  • 🔗 Параметр Владелец позволяет получить доступ к форме-владельцу из дочерней формы.
  • 🔄 ДействиеПриЗакрытии — обработчик, который срабатывает после закрытия дочерней формы и передаёт результат.
  • 📌 Для модального открытия используйте параметр РежимОткрытияФормы.БлокироватьОкноВладельца.

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

💡

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

6. Типичные ошибки и их решение

При работе с формами в разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее распространённые из них и способы их устранения.

⚠️ Внимание: Если форма не открывается в веб-клиенте, проверьте, что все используемые ею объекты (справочники, документы) имеют права на чтение для текущего пользователя. В веб-клиенте ошибки прав доступа могут проявляться иначе, чем в толстом клиенте.
Ошибка Возможная причина Решение
Форма не открывается без ошибок Не хватает прав на объект Проверьте роли пользователя в конфигураторе
Параметры не передаются в форму Ошибка в имени параметра или контексте Используйте Параметры.Свойство("Имя") для проверки
Форма открывается пустой Не указан объект формы (для обычных форм) Явно присвойте объект: Форма.Объект = СсылкаНаОбъект
Ошибка "Не найден метод" при открытии Опечатка в имени формы или метода Проверьте регистр и полное имя формы в конфигураторе
Форма открывается, но не отображает данные Не вызван метод ЗагрузитьДанные() Добавьте вызов в ПриОткрытии()

Ещё одна частая проблема — зависание формы при открытии. Это может происходить из-за:

  • 🐢 Длительных операций в обработчике ПриСозданииНаСервере() (например, сложные запросы к базе).
  • 🔄 Рекурсивного открытия форм (форма А открывает форму Б, которая снова открывает форму А).
  • 📡 Проблем с сетевым подключением в веб-клиенте.

Для диагностики используйте журнал регистрации (Администрирование → Журнал регистрации) и отладчик (Отладка → Начать отладку).

7. Оптимизация работы с формами: советы для разработчиков

Чтобы формы в работали быстро и стабильно, следуйте этим рекомендациям:

  • Минимизируйте код в ПриСозданииНаСервере(): переносите тяжелые операции в фоновые задания или используйте отложенную загрузку данных.
  • 🗃️ Используйте кэширование: если форма часто открывается с одними и теми же параметрами, кэшируйте результаты запросов.
  • 🔄 Разделяйте логику: серверные процедуры должны обрабатывать данные, клиентские — только интерфейс.
  • 📱 Тестируйте в разных клиентах: форма может работать в толстом клиенте, но тормозить в веб-версии.

Пример оптимизированного кода для загрузки данных в форму:

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

// Загружаем только основные данные, остальное - по требованию

Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Объект.Контрагент = ПолучатьКонтрагентаПоУмолчанию();

КонецЕсли;

// Отложенная загрузка табличной части

ЗапланироватьВыполнение(Новый ОписаниеОперации("ЗагрузитьТовары", ЭтаФорма));

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

Процедура ЗагрузитьТовары(Форма) Экспорт

Объект.Товары.Загрузить();

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

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

💡

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

8. Работа с формами в расширениях конфигурации

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

Пример создания формы в расширении:

  1. В конфигураторе откройте ваше расширение.
  2. Добавьте новую форму в разделе Общие → Формы.
  3. В свойствах формы укажите ОсновнаяФорма (если подменяете стандартную).
  4. Напишите код для открытия формы из модуля расширения:
Процедура ОткрытьРасширеннуюФормуЗаказа(Заказ)

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

Параметры.Вставить("Объект", Заказ);

// Открываем форму из расширения

ОткрытьФорму("Расширение1.ОбщаяФорма.ФормаЗаказаРасширенная", Параметры);

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

Важно: при работе с расширениями:

  • 🔧 Используйте префиксы для имён форм (например, Расширение1_ФормаЗаказа), чтобы избежать конфликтов.
  • 📌 Проверяйте совместимость с основной конфигурацией — изменения в базовой форме могут сломать ваше расширение.
  • 🔄 Тестируйте на разных версиях платформы, так как механизм расширений эволюционирует.
⚠️ Внимание: В расширениях нельзя переопределять формы, помеченные как Платформенные (например, формы встроенных отчётов). Попытка сделать это приведёт к ошибке при обновлении конфигурации.

FAQ: Ответы на частые вопросы

Как открыть форму без правки конфигурации?

Если у вас нет доступа к конфигуратору, вы можете создать внешнюю обработку с формой и открывать её через меню Файл → Открыть. Также можно использовать механизм Дополнительные отчёты и обработки, если он подключён в вашей конфигурации.

Почему форма открывается медленно?

Чаще всего это связано с:

  • Большим количеством элементов на форме (оптимизируйте макет).
  • Сложными запросами в ПриСозданииНаСервере() (перенесите их в фоновые задания).
  • Работой в веб-клиенте с большими объёмами данных (используйте постраничную загрузку).

Для диагностики включите профилировщик производительности в конфигураторе (Сервис → Профилировщик).

Можно ли открыть форму из другой базы 1С?

Да, но для этого требуется использовать COM-соединение или HTTP-сервисы. Пример через COM:

Подключение = Новый COMОбъект("V83.ComConnector");

Соединение = Подключение.Connect("File=""C:\Bases\Base1"";Usr=""Администратор"";");

Форма = Соединение.ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта");

Обратите внимание: этот метод работает только в толстом клиенте и требует настроек безопасности.

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

Для закрытия текущей формы используйте метод Закрыть():

ЭтаФорма.Закрыть();

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

Владелец.Закрыть();

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

ЭтаФорма.ЗакрытьССообщением(Новый СообщениеПользователю("Данные сохранены"));
Как сделать форму модальной?

Для модального открытия формы используйте параметр РежимОткрытияФормы.БлокироватьОкноВладельца:

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

РежимОткрытияФормы.БлокироватьОкноВладельца);

В веб-клиенте модальные окна могут работать иначе — тестируйте поведение в разных браузерах.