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

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

Все примеры протестированы на актуальных релизах платформы 1С:Предприятие 8.3.23 и 8.2.20. Если вы работаете с более ранними версиями, проверьте совместимость методов в документации.

📊 С какой целью вы чаще всего вызываете процедуры формы в 1С?
Для обработки событий (например, ПриИзменении)
Для автоматизации бизнес-логики
Для интеграции с другими формами
Для работы с таймерами
Другое

1. Вызов процедуры формы из модуля объекта

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

Пример вызова процедуры ОбновитьДанные() из модуля документа "ЗаказПокупателя":

Процедура ПриЗаписи(Отказ)

// Получаем ссылку на текущую форму документа

ФормаОбъекта = ЭтотОбъект.ПолучитьФорму();

Если Не ФормаОбъекта = Неопределено Тогда

// Вызываем процедуру формы

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

КонецЕсли;

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

  • 🔹 Плюсы: простой и прямой вызов без дополнительных объектов.
  • 🔹 Минусы: работает только если форма уже открыта. Если форма закрыта, метод вызовет ошибку.
  • ⚠️ Нюанс: в 1С 8.2 вместо ПолучитьФорму() используйте ПолучитьФормуОбъекта().
⚠️ Внимание: Если форма не открыта, попытка вызова её метода приведёт к ошибке "Объект не является значением объекта типа Форма". В этом случае сначала откройте форму с помощью ОткрытьФорму().

1. Убедитесь, что форма открыта (используйте ПолучитьФорму())

2. Проверьте существование процедуры в модуле формы

3. Передайте все обязательные параметры (если они есть)

4. Обработайте возможные исключения с помощью Попытка...Исключение-->

2. Вызов процедуры по таймеру

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

Пример настройки таймера, который каждые 5 секунд вызывает процедуру ПроверитьСостояниеЗадачи():

// В модуле формы (например, в процедуре ПриОткрытии)

Процедура ПриОткрытии()

// Создаём таймер с интервалом 5000 мс (5 секунд)

Таймер = Форма.ЭлементыФормы.Добавить("Таймер1", Тип("Таймер"));

Таймер.Интервал = 5000;

Таймер.Включен = Истина;

Таймер.ПриАктивизации = "ПроверитьСостояниеЗадачи";

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

// Процедура, которая будет вызываться по таймеру

Процедура ПроверитьСостояниеЗадачи()

// Логика проверки

Сообщить("Таймер сработал: " + ТекущаяДата());

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

// Не забудьте остановить таймер при закрытии формы!

Процедура ПриЗакрытии()

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

Таймер.Включен = Ложь;

КонецЕсли;

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

Свойство таймера Описание Пример значения
Интервал Периодичность срабатывания в миллисекундах 5000 (5 секунд)
Включен Флаг активации таймера (Истина/Ложь) Истина
ПриАктивизации Имя процедуры, которая будет вызвана "ОбновитьЦены"
OneShot Если Истина, таймер сработает только один раз Ложь
⚠️ Внимание: Таймеры продолжают работать даже если форма свёрнута или перекрыта другим окном. Чтобы избежать лишней нагрузки, останавливайте таймеры в процедуре ПриЗакрытии или при потере фокуса формой (ПриИзмененииАктивности).

3. Вызов процедуры из другой формы

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

  1. Прямой вызов — если у вас есть ссылка на целевую форму.
  2. Через события — если формы слабо связаны (например, через Оповещение или ПубличноеОповещение).

Пример прямого вызова процедуры ОбновитьСписокТоваров() из формы справочника "Номенклатура" в форму документа "ЗаказПокупателя":

// В модуле формы справочника "Номенклатура"

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

// Открываем форму заказа

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

// Вызываем процедуру формы заказа

Если ФормаЗаказа <> Неопределено Тогда

ФормаЗаказа.ОбновитьСписокТоваров(ЭтотОбъект.Ссылка);

КонецЕсли;

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

Если формы не связаны напрямую, используйте ПубличноеОповещение:

// В форме-отправителе

Процедура ОправитьСигналОбновления()

Оповещение = Новый Оповещение("ОбновитьДанные", ЭтотОбъект);

Оповещение.Публиковать();

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

// В форме-получателе (в модуле формы)

Процедура ПриПодпискеНаОповещение(ИмяОповещения, Источник, Данные)

Если ИмяОповещения = "ОбновитьДанные" Тогда

ОбновитьСписокТоваров(Данные);

КонецЕсли;

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

Что делать, если форма не реагирует на вызов?

Если процедура формы не выполняется при вызове из другой формы, проверьте:

1. Контекст выполнения: Убедитесь, что вы передаёте корректную ссылку на форму (например, через ОткрытьФорму()).

2. Права доступа: В 1С:Предприятие 8.3 проверьте, что у пользователя есть права на выполнение метода (настройка ролей).

3. Исключения: Оберните вызов в Попытка...Исключение, чтобы увидеть ошибку:

Попытка

ФормаЦелевая.Процедура1();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки

4. Асинхронность: Если форма открывается модально (ОткрытьФормуМодально()), вызов процедуры блокируется до закрытия модального окна. Используйте ОткрытьФорму() без модальности.

4. Вызов процедуры через командный интерфейс

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

Чтобы связать процедуру с командой:

  1. Создайте команду в дереве конфигурации (раздел Команды).
  2. В модуле формы напишите процедуру-обработчик с именем КомандаИмяКоманды().
  3. Привяжите команду к элементу формы (кнопке, пункту меню).

Пример для команды "ОбновитьЦены":

// 1. Создаём команду в конфигураторе с именем "ОбновитьЦены"

// 2. В модуле формы пишем обработчик

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

// Логика обновления цен

Сообщить("Цены обновлены!");

ОбновитьТаблицуТоваров();

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

// 3. Привязываем команду к кнопке на форме:

// В свойствах кнопки укажите действие "Команда" и выберите "ОбновитьЦены"

  • 🔹 Преимущество: пользователь может вызвать процедуру без доступа к конфигуратору.
  • 🔹 Ограничение: имя процедуры-обработчика должно строго соответствовать имени команды (КомандаИмяКоманды).
  • 🔹 Совет: для горячих клавиш настройте свойство СочетаниеКлавиш в команде (например, Ctrl+Shift+U).
Процедура ОпределитьДоступностьКоманд(СтандартнаяОбработка, Команды)

Команды.ОбновитьЦены.Доступность = (ТаблицаТоваров.ТекущаяСтрока <> Неопределено);

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

-->

5. Динамический вызов процедуры по имени (через Выполнить())

Иногда имя процедуры известно только во время выполнения (например, оно хранится в справочнике или передаётся как параметр). В этом случае используйте метод Выполнить(), который позволяет вызвать процедуру по строковому имени.

Пример динамического вызова процедуры ОбработатьДокумент() или ОбработатьСправочник() в зависимости от типа объекта:

Процедура ВызватьОбработчик(ТипОбъекта)

ИмяПроцедуры = "Обработать" + ТипОбъекта;

Попытка

// Вызываем процедуру динамически

Выполнить(ИмяПроцедуры);

Исключение

Сообщить("Процедура " + ИмяПроцедуры + " не найдена!");

КонецПопытки;

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

// Пример процедур, которые могут быть вызваны

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

Сообщить("Обработка документа...");

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

Процедура ОбработатьСправочник()

Сообщить("Обработка справочника...");

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

⚠️ Внимание: Метод Выполнить() не проверяет существование процедуры на этапе компиляции. Ошибка возникнет только во время выполнения. Всегда обрабатывайте исключения!

Важно: в 1С 8.3.20+ для динамического вызова процедур с параметрами используйте синтаксис Выполнить(ИмяПроцедуры, Параметр1, Параметр2). В более ранних версия параметры передаются через запятую внутри строки: Выполнить("Процедура1(Параметр1, Параметр2)").

6. Распространённые ошибки и их решения

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

Ошибка Причина Решение
Ошибка при вызове метода объекта (ОбновитьДанные) Форма не открыта или процедура не существует Проверьте ПолучитьФорму() и имя процедуры
Недостаточно прав для выполнения операции У пользователя нет прав на вызов метода Настройте роль в конфигураторе (Администрирование → Пользователи)
Параметр не соответствует типу Несовпадение типов передаваемых параметров Проверьте сигнатуру процедуры и типы данных
Объект не является значением объекта типа Форма Попытка вызвать метод закрытой формы Откройте форму перед вызовом (ОткрытьФорму())

Если вы получаете ошибку "Метод объекта не обнаружен", убедитесь, что:

  • 🔹 Процедура объявлена с ключевым словом Процедура (а не Функция).
  • 🔹 Имя процедуры написано без опечаток (регистр не важен, но символы должны совпадать).
  • 🔹 Процедура находится в правильном модуле (например, в модуле формы, а не в модуле объекта).
💡

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

FAQ: Частые вопросы по вызову процедур формы в 1С

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

Да, но для этого нужно:

  1. Получить ссылку на форму через ПолучитьФорму() или ОткрытьФорму().
  2. Убедиться, что процедура объявлена с модификатором Экспорт (если вызывается из другого модуля).

Пример:

ФормаДокумента = Документы.ЗаказПокупателя.НайтиПоНомеру("0001").ПолучитьФорму();

ФормаДокумента.ЭкспортнаяПроцедура();

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

Параметры передаются как аргументы функции. Пример:

// Вызов с параметрами

Форма.ОбновитьДанные(Истина, 100);

// Определение процедуры в модуле формы

Процедура ОбновитьДанные(Принудительно = Ложь, Таймаут = 0)

Если Принудительно Тогда

// Логика обновления

КонецЕсли;

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

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

Выполнить("ОбновитьДанные(Истина, 100)");
Почему процедура формы не выполняется при вызове из другой формы?

Возможные причины:

  • Форма не открыта (используйте ОткрытьФорму() перед вызовом).
  • Процедура не объявлена с модификатором Экспорт.
  • Контекст выполнения потерян (например, форма закрылась после открытия).

Решение: добавьте отладку перед вызовом:

Если ФормаЦелевая = Неопределено Тогда

Сообщить("Форма не открыта!");

КонецЕсли;

Как вызвать процедуру формы асинхронно?

В 1С 8.3 для асинхронного выполнения используйте ВыполнитьОбработкуПозднее():

ВыполнитьОбработкуПозднее("Форма.ДолгаяПроцедура()", 0);

Это позволит избежать "зависания" интерфейса при длительных операциях. Альтернатива — использование ФоновоеЗадание (доступно с версии 8.3.14).

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

Да, но с ограничениями:

  • 🔹 В тонком клиенте доступны все методы формы, если они объявлены с Экспорт.
  • 🔹 В веб-клиенте некоторые методы могут быть заблокированы по соображениям безопасности (например, работа с файлами).
  • 🔹 Для мобильного приложения проверьте совместимость методов с платформой 1С:Мобильная платформа.

Пример безопасного вызова:

Если КлиентНаСервере() Тогда

Форма.СервернаяПроцедура();

Иначе

Форма.КлиентскаяПроцедура();

КонецЕсли;