Почему не работают стандартные команды в управляемых формах при запуске в «обычном приложении»?

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

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

Понимание природы проблемы

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

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

Способы решения проблемы

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

  1. Создание формы записи или редактирования. Это самый надежный способ. Если вы явно создадите в конфигураторе Форму записи или Форму объекта для вашего справочника или регистра сведений, платформа перестанет пытаться «угадать» поведение и будет использовать созданную вами форму.
  2. Явное назначение обработчиков. Вместо использования стандартных кнопок командной панели, вы можете создать свои собственные команды и назначить им обработчики, в которых будет использоваться метод ОткрытьФорму.

Рассмотрим пример реализации

Если вы хотите, чтобы при нажатии кнопки «Изменить» гарантированно открывалась нужная вам форма, вы можете переопределить стандартную команду или создать новую. Рассмотрим, как это выглядит на практике:


&НаКлиенте
Процедура ИзменитьЗапись(Команда)
    // Получаем текущие данные из таблицы
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ПараметрыОткрытия = Новый Структура(\"Ключ\", ТекущиеДанные.Ссылка);
        ОткрытьФорму(\"РегистрСведений.ИмяВашегоРегистра.ФормаЗаписи\", ПараметрыОткрытия);
    КонецЕсли;
КонецПроцедуры

Такой подход делает поведение формы предсказуемым. Метод ОткрытьФорму с указанием конкретного имени формы позволяет платформе «понять», что именно от неё требуется, независимо от режима запуска основного приложения.

Особенности работы с данными

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


&НаСервере
Процедура ЗаписатьДанныеНаСервере()
    // Логика записи объекта
    ОбъектЗапись = РеквизитФормыВЗначение(\"Запись\");
    ОбъектЗапись.Записать();
КонецПроцедуры

Рекомендации по разработке

Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил:

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

← На главную