Почему метод ПолучитьФорму не работает в тонком клиенте и как правильно обновлять данные формы?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Почему возникает ошибка при использовании ПолучитьФорму

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

Метод ПолучитьФорму() в тонком клиенте просто отсутствует, так как клиентская часть не имеет прямого доступа к внутренним структурам объекта «на лету» таким способом. Попытка вызвать этот метод приведет к прерыванию выполнения кода, так как вы пытаетесь использовать серверный подход в клиентской среде.

Правильное решение: использование механизма оповещений

В современной разработке (особенно в конфигурациях уровня УТ 11.4 и выше) единственно верным способом обновить данные в одной форме после изменений, совершенных в другой, является использование системы оповещений. Рассмотрим этот подход пошагово.

  1. Шаг 1: Оповещение из обработки. В коде вашей обработки, сразу после того как вы программно изменили данные в документе (например, пересчитали цены), необходимо отправить сигнал системе о том, что данные изменились.
  2. Шаг 2: Обработка события в документе. В форме документа, из которой была открыта ваша обработка, нужно прописать процедуру, которая будет «слушать» этот сигнал и обновлять данные.

Разберем пример реализации. В модуле формы вашей обработки, после внесения изменений в документ, добавьте вызов метода Оповестить:


// В модуле формы обработки
Процедура ПриНажатииНаКнопкуВыполнить(Команда)
    // ... ваш код изменения табличной части документа ...
    
    // Оповещаем систему, что данные изменились
    Оповестить("ОбновитьЦеныВДокументе");
    
    // Закрываем форму обработки
    ЭтаФорма.Закрыть();
КонецПроцедуры

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


// В модуле формы документа
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ОбновитьЦеныВДокументе" Тогда
        // Выполняем чтение данных для актуализации формы
        ЭтаФорма.Прочитать();
    КонецЕсли;
КонецПроцедуры

Альтернативные подходы и рекомендации

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

Основные рекомендации по архитектуре:

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

← На главную