При разработке конфигураций, которые должны поддерживать работу как в режиме управляемого приложения, так и в режиме обычного толстого клиента, разработчики часто сталкиваются с тем, что стандартные команды управляемой формы (создать, копировать, изменить) перестают функционировать. Давайте разберем, почему это происходит и как исправить данную ситуацию, чтобы обеспечить кроссплатформенную работу вашего решения.
Важно осознать принципиальное различие в механизмах работы форм. В обычных формах (старая архитектура) команды тесно связаны с объектом базы данных. Платформа сама «знает», как открыть форму объекта, как записать его и какие обработчики вызвать. В управляемых формах (УФ) взаимодействие происходит через ДанныеФормы. Командная панель в УФ — это лишь набор кнопок, которые в автоматическом режиме ожидают наличия определенных контекстов выполнения.
Когда мы запускаем Управляемую форму в «толстом клиенте (обычное приложение)», среда исполнения не всегда может корректно интерпретировать стандартные действия, так как ожидает либо обычную форму, либо наличие явно определенных управляемых форм записи. Платформа попросту «теряется», не понимая, какую форму вызова данных (например, для создания или изменения строки) ей нужно сгенерировать на лету.
Для того чтобы ваши управляемые формы корректно работали в обоих режимах запуска, рассмотрим несколько пошаговых рекомендаций.
Форму записи или Форму объекта для вашего справочника или регистра сведений, платформа перестанет пытаться «угадать» поведение и будет использовать созданную вами форму.ОткрытьФорму.Если вы хотите, чтобы при нажатии кнопки «Изменить» гарантированно открывалась нужная вам форма, вы можете переопределить стандартную команду или создать новую. Рассмотрим, как это выглядит на практике:
&НаКлиенте
Процедура ИзменитьЗапись(Команда)
// Получаем текущие данные из таблицы
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ПараметрыОткрытия = Новый Структура(\"Ключ\", ТекущиеДанные.Ссылка);
ОткрытьФорму(\"РегистрСведений.ИмяВашегоРегистра.ФормаЗаписи\", ПараметрыОткрытия);
КонецЕсли;
КонецПроцедуры
Такой подход делает поведение формы предсказуемым. Метод ОткрытьФорму с указанием конкретного имени формы позволяет платформе «понять», что именно от неё требуется, независимо от режима запуска основного приложения.
Помните, что в управляемых формах редактирование происходит не напрямую в базе данных, а с копией данных формы. Даже если вы настроили визуальное «редактирование в списке», вам необходимо обеспечить вызов записи данных, если вы планируете сохранять изменения в регистре или справочнике. Если стандартные механизмы не срабатывают, добавьте в обработчик команды или при закрытии формы вызов записи:
&НаСервере
Процедура ЗаписатьДанныеНаСервере()
// Логика записи объекта
ОбъектЗапись = РеквизитФормыВЗначение(\"Запись\");
ОбъектЗапись.Записать();
КонецПроцедуры
Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил:
&НаКлиенте и &НаСервере. В обычном приложении вызовы, которые требуют серверного контекста, должны быть явно отделены, иначе вы получите ошибку исполнения.ОткрытьФорму всегда передавайте параметры через структуру, это позволит корректно инициализировать форму в любом режиме работы.Формы записи — это ваш «золотой стандарт», обеспечивающий работу в тонком, толстом и веб-клиенте.Проанализировав описанную ситуацию, мы выяснили, что неработоспособность команд — это не ошибка, а следствие нехватки явных указаний платформе о том, какие формы открытия использовать. Создание явной Формы записи и использование программного открытия форм — это эффективный путь к стабильной работе вашего приложения в любых условиях.