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

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

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

Что такое внешняя обработка и зачем открывать формы из неё

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

  • 🔧 Расширять функционал типовой конфигурации без её модификации
  • 📊 Автоматизировать отчётность или обработку данных
  • 🖥️ Создавать пользовательские интерфейсы для удобного ввода информации

Открытие форм из внешней обработки необходимо в случаях, когда:

  • 📝 Требуется показать пользователю данные для редактирования (например, реквизиты документа)
  • 🔍 Нужно предоставить инструмент для фильтрации или анализа данных с визуальным интерфейсом
  • ⚙️ Необходимо интегрировать сторонние сервисы с привычным для пользователей видом форм

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

📊 Как часто вы используете внешние обработки в 1С?
Ежедневно
Несколько раз в неделю
Редко, по необходимости
Никогда не пробовал

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

Самый простой способ открыть форму из внешней обработки — использовать встроенную функцию ОткрытьФорму(). Она поддерживает несколько вариантов вызова в зависимости от типа формы:

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

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

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

ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлемента", , Истина);

Ключевые параметры функции:

Параметр Описание Пример значения
ИмяФормы Строка с полным именем формы (включая тип объекта) "Документ.РеализацияТоваровУслуг.Форма.ФормаОбъекта"
Параметры Структура с дополнительными данными для формы Новый Структура("Режим,Отбор", "Просмотр", Новый Структура("ДатаНачала, 01.01.2026"))
Модальность Если Истина — форма открывается модально Ложь
Родитель Ссылка на родительское окно (для встраивания) ЭтотОбъект

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

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

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

ОткрытьФорму(

"Документ.ПоступлениеТоваров.Форма.Список",

ПараметрыФормы,

Ложь

);

💡

Если форма не открывается, проверьте права пользователя в ролях конфигурации. Часто проблема кроется в отсутствии прав на чтение объекта, форму которого вы пытаетесь открыть.

Открытие форм для конкретных объектов

Часто требуется открыть форму не просто по типу, а для конкретного элемента (например, документа с определённым номером). В этом случае используйте метод ПолучитьФорму() объекта:

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

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

Если Не СсылкаНаЭлемент.Пустая() Тогда

Форма = СсылкаНаЭлемент.ПолучитьФорму();

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

КонецЕсли;

Для документов логика аналогична, но с учётом уникального номера:

Документ = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ-000123", ТекущаяДата());

Если Не Документ.Пустая() Тогда

ФормаДокумента = Документ.ПолучитьФорму();

ФормаДокумента.ОткрытьМодально();

КонецЕсли;

Важные нюансы:

  • 🔹 Метод ПолучитьФорму() возвращает объект формы, который можно модифицировать до открытия (например, скрыть ненужные элементы)
  • 🔹 Для управляемых форм используйте ПолучитьФорму("ФормаОбъекта") с явным указанием имени формы
  • 🔹 Если объект не найден, метод вернёт Неопределён — обязательно обрабатывайте эту ситуацию
Что делать, если ПолучитьФорму() возвращает ошибку?

Если при вызове ПолучитьФорму() возникает ошибка "Форма не найдена", проверьте:

1. Существует ли форма для данного типа объекта в конфигурации (в некоторых случаях формы отключены).

2. Правильно ли указано имя формы (для управляемых форм часто требуется указывать "ФормаОбъекта" или "ФормаСписка").

3. Не блокирует ли роль пользователя доступ к форме (проверьте в Администрирование → Настройки пользователей и прав).

Работа с управляемыми формами

В конфигурациях на управляемом приложении (например, 1С:ERP или 1С:УТ 11) процесс открытия форм имеет особенности. Основные отличия:

  • 📱 Формы открываются в отдельном окне браузера или тонкого клиента
  • 🔧 Для взаимодействия с формой используются клиентские и серверные процедуры
  • 🔒 Больше ограничений на доступ к объектам из-за песчанницы (sandbox)

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

&НаКлиенте

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

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

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

ОткрытьФорму(

"Справочник.Контрагенты.Форма.ФормаЭлемента",

ПараметрыФормы,

Истина,

ЭтотОбъект

);

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

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

ОткрытьЗначение(

Новый ДинамическийСписок(Справочники.Номенклатура.Выбрать())

);

💡

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

Передача параметров в форму

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

Пример передачи сложного отбора и режима работы:

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

Параметры.Вставить("Отбор",

Новый Структура(

"ПометкаУдаления, ВидНоменклатуры",

Ложь,

Перечисления.ВидыНоменклатуры.Товар

)

);

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

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

ОткрытьФорму(

"Справочник.Номенклатура.Форма.ФормаСписка",

Параметры

);

В управляемых формах параметры доступны в обработчике ПриСозданииНаСервере():

&НаСервере

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

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

Если Параметры.Режим = "Выбор" Тогда

ЭлементыФормы.КоманднаяПанель.Видимость = Ложь;

КонецЕсли;

КонецЕсли;

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

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

  • 🚫 Передача несериализуемых объектов (например, ДокументОбъект вместо ссылки)
  • 🚫 Несоответствие типов данных (например, передача даты как строки)
  • 🚫 Отсутствие обработки параметров в форме-приёмнике

Используйте сериализуемые типы данных (число, строка, дата, ссылка)

Проверьте наличие обработчика параметров в целевой форме

Убедитесь, что имена параметров совпадают в обработке и форме

Тестируйте передачу на пустых и заполненных данных

-->

Обработка событий и взаимодействие с формой

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

  • 🔄 Обработчики событий формы (например, ПриЗакрытии)
  • 📥 Возврат значения через модальное окно
  • 🔗 Общие модули для обмена данными

Пример получения выбранного значения из модальной формы:

Результат = ОткрытьФормуМодально(

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

Новый Структура("МножественныйВыбор", Ложь)

);

Если НЕ Результат = Неопределён Тогда

Сообщить("Выбран: " + Результат.Наименование);

КонецЕсли;

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

&НаКлиенте

Процедура ПодписатьсяНаСобытияФормы(Форма)

ДобавитьОбработчик Форма.ПриИзменении, "ОбработатьИзменениеВФорме";

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

&НаКлиенте

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

Сообщить("Изменён элемент: " + Элемент.Имя);

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

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

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

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

Ошибка Возможная причина Решение
Форма не найдена Неверное имя формы или форма отключена в конфигурации Проверьте имя формы в конфигураторе (Конфигурация → Формы). Для управляемых форм используйте ФормаОбъекта или ФормаСписка
Недостаточно прав У пользователя нет прав на чтение объекта или открытие формы Настройте роль в Администрирование → Настройки пользователей и прав. Добавьте право на Интерактивное открытие
Нет доступа к методу Попытка вызвать серверный метод из клиентского контекста Используйте директивы &НаКлиенте и &НаСервере. Для вызова серверных методов применяйте ВыполнитьНаСервере()
Неопределён при вызове ПолучитьФорму() Объект не найден или не существует форма для этого типа объекта Проверьте существование объекта через Ссылка.Пустая(). Убедитесь, что для типа объекта определена форма в конфигурации

Дополнительные рекомендации:

  • 🛠️ Всегда обрабатывайте исключения с помощью Попытка...Исключение
  • 📋 Для отладки используйте Сообщить() или ЗаписьЖурналаРегистрации()
  • 🔍 Проверяйте актуальность методов для вашей версии платформы (например, в 1С 8.3.20 появились новые параметры для ОткрытьФорму())

1. Переданы ли корректные параметры отбора.

2. Не блокирует ли роль пользователя доступ к данным (например, по организации или подразделению).

3. Совпадают ли даты в отборе с датами доступных данных.-->

Продвинутые техники: динамическое создание форм

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

  • 🖼️ Использовать формы обработки (встроенные в .epf файл)
  • 📝 Генерировать формы через ФормаДокумента или ФормаСписка
  • 🔧 Применять внешние компоненты для сложных интерфейсов

Пример создания простой формы выбора с динамическим содержимым:

&НаКлиенте

Процедура СоздатьФормуВыбора(Команда)

Форма = Новый Форма();

Форма.Заголовок = "Выбор параметров";

// Добавляем реквизит для списка

ЭлементСписка = Форма.ЭлементыФормы.Добавить(

"Список",

Тип("ПолеСписка"),

Истина

);

ЭлементСписка.Список = Новый СписокЗначений();

ЭлементСписка.Список.Добавить("Вариант 1");

ЭлементСписка.Список.Добавить("Вариант 2");

// Добавляем кнопку ОК

КнопкаОК = Форма.ЭлементыФормы.Добавить(

"КнопкаОК",

Тип("Кнопка"),

Истина

);

КнопкаОК.Заголовок = "Выбрать";

КнопкаОК.Действие = "ВыполнитьВыбор";

Форма.ОткрытьМодально();

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

&НаКлиенте

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

Сообщить("Выбран: " + ЭлементыФормы.Список.Значение);

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

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

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

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

Форма = Список.ПолучитьФорму();

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

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

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

Можно ли открыть форму из внешней обработки в фоновом режиме?

Нет, платформа 1С:Предприятие не поддерживает открытие форм в фоновом режиме без взаимодействия с пользователем. Все формы открываются в интерактивном режиме. Однако вы можете:

  • Использовать ОткрытьЗначение() для показа данных без полноценной формы
  • Выводить уведомления через ПоказатьОповещениеПользователя()
  • Запускать фоновые задачи через ФоновоеЗадание (но без визуального интерфейса)
Почему при открытии формы из обработки не работают стандартные команды (например, "Провести")?

Это ограничение безопасности: внешние обработки выполняются в песчаннице (sandbox), которая блокирует доступ к некоторым методам конфигурации. Решения:

  • Перенесите критичные действия в саму форму (через параметры)
  • Используйте серверные вызовы с проверкой прав
  • Настройте Доверенная процедура в модуле обработки (требует прав администратора)

Подробнее об ограничениях песчанницы читайте в документации 1С.

Как открыть форму отчёта из внешней обработки?

Для открытия форм отчётов используйте метод ПолучитьФорму() объекта отчёта с указанием имени формы:

Отчет = Отчеты.ОборотноСальдоваяВедомость.Создать();

ФормаОтчета = Отчет.ПолучитьФорму("ОсновнаяФорма");

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

Для передачи параметров в отчёт используйте структуру:

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

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

ФормаОтчета.Параметры.Заполнить(Параметры);

Можно ли из внешней обработки изменить стандартную форму конфигурации?

Нет, внешняя обработка не может модифицировать стандартные формы конфигурации напрямую. Однако вы можете:

  • Создать расширение конфигурации, которое изменит форму
  • Открыть стандартную форму и передать в неё параметры для настройки отображения
  • Создать собственную форму в обработке и эмулировать нужный интерфейс

Изменение стандартных форм через внешние обработки противоречит политике безопасности и может привести к ошибкам при обновлении конфигурации.

Как открыть форму для нового элемента справочника?

Используйте метод СоздатьЭлемент() перед открытием формы:

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();

Форма = НовыйЭлемент.ПолучитьФорму();

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

Для управляемых форм добавьте параметр "Режим":

Параметры = Новый Структура("Режим", "Создание");

ОткрытьФорму(

"Справочник.Контрагенты.Форма.ФормаЭлемента",

Параметры

);