Переход на новые версии платформы 1С:Предприятие, начиная с 8.3.10, часто вызывает у разработчиков трудности, связанные с изменением архитектуры работы интерфейса. Методы, которые годами работали в «толстом клиенте» или на ранних версиях управляемого приложения (например, 8.2 или 8.3.9), начинают выдавать ошибки, открывать пустые формы или вовсе игнорировать команды. В этой статье мы подробно разберем, как правильно открывать форму существующего объекта, почему старые методы больше не эффективны и как избежать типичных ошибок в коде.
Ранее программисты часто использовали метод ПолучитьФорму() с последующим вызовом Открыть(). Однако в современной парадигме 1С, ориентированной на работу в веб-клиенте и мобильных приложениях, такой подход считается устаревшим и ненадежным. Основная причина — глобальный переход платформы к немодальности и асинхронности. Рассмотрим ситуацию: если вы пытаетесь вызвать модальное окно или использовать метод, блокирующий поток выполнения, платформа выдаст ошибку «Модальные окна запрещены».
Проанализируем типичный неудачный пример кода, с которым сталкиваются многие:
// Так делать НЕ РЕКОМЕНДУЕТСЯ в 8.3.10+
Форма = ПолучитьФорму("Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента");
Форма.Открыть();
При таком подходе форма может открыться пустой, так как платформа не «понимает», какой именно экземпляр документа нужно загрузить в эту форму. Для корректной работы системе нужно явно передать идентификатор объекта.
Это самый правильный и рекомендуемый способ в управляемом приложении. Основной секрет заключается в использовании специальной структуры параметров, где системное поле должно называться именно «Ключ» (Key). Если вы напишете «Ссылка» или «Документ», платформа проигнорирует этот параметр и создаст форму нового (пустого) документа.
Разберем по шагам правильную реализацию на клиенте:
&НаКлиенте
Процедура ОткрытьДокументПоСсылке(ВыбраннаяСсылка)
Если НЕ ВыбраннаяСсылка.Пустая() Тогда
// Создаем структуру параметров.
// Имя "Ключ" зарезервировано платформой для передачи ссылки на объект.
ПараметрыФормы = Новый Структура("Ключ", ВыбраннаяСсылка);
// Вызываем открытие формы, указывая её полное имя и параметры
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
В данном примере ОткрытьФорму выполняет весь цикл: создает контекст формы на сервере, заполняет её данными из базы по переданному ключу и отображает пользователю на клиенте.
Часто разработчики допускают ошибку в логическом условии, из-за чего код срабатывает «наоборот». Посмотрим на фрагмент кода, который обсуждался на форуме:
// ОШИБОЧНЫЙ ВАРИАНТ
Если СозданныйСчет.Пустая Тогда
ПараметрыФормы = Новый Структура("Ключ", СозданныйСчет);
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента", ПараметрыФормы);
КонецЕсли;
Выясним причину проблемы: метод Пустая() (или обращение к свойству Пустая) возвращает Истина, если ссылки на документ нет. В итоге код пытается открыть форму именно тогда, когда документ не существует. В результате пользователь видит пустую форму нового документа. Правильное условие всегда должно содержать отрицание: Если НЕ СозданныйСчет.Пустая() Тогда....
Если вам не нужно специфически настраивать форму, а требуется просто быстро показать объект пользователю, воспользуйтесь методом ПоказатьЗначение(). Это современный немодальный аналог старого метода ОткрытьЗначение().
Рассмотрим пример использования:
&НаКлиенте
Процедура ПоказатьСчет(СсылкаНаСчет)
// Метод работает асинхронно и не блокирует выполнение кода
ПоказатьЗначение(, СсылкаНаСчет);
КонецПроцедуры
Важный нюанс: метод ПоказатьЗначение открывает форму, которая назначена в конфигураторе как «Основная форма объекта». Если такая форма не задана, 1С сгенерирует её автоматически (в виде простого списка реквизитов), что может выглядеть не так красиво, как специально отрисованная форма. Если вам нужна конкретная форма (например, форма для печати или спец. интерфейс), используйте первый способ с ОткрытьФорму.
Проанализируем еще один современный способ, который часто применяется в интерфейсах «Такси». Это открытие через навигационную ссылку. Этот метод имитирует клик пользователя по гиперссылке документа.
&НаКлиенте
Процедура ОткрытьЧерезНавигацию(ОбъектСсылка)
СсылкаТекст = ПолучитьНавигационнуюСсылку(ОбъектСсылка);
ПерейтиПоНавигационнойСсылке(СсылкаТекст);
КонецПроцедуры
Этот метод удобен тем, что он автоматически обрабатывает все нюансы открытия и активирует уже открытое окно, если документ уже был запущен пользователем ранее.
При использовании ОткрытьФорму мы рекомендуем использовать дополнительные возможности метода для повышения комфорта пользователя:
ОткрытьФорму, система не будет открывать бесконечное количество копий одного и того же документа. Она просто найдет уже открытое окно и выведет его на передний план.Посмотрим на пример с контролем уникальности:
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента",
ПараметрыФормы,
ЭтаФорма,
ВыбраннаяСсылка); // Четвертый параметр обеспечивает уникальность окна
Для успешной работы в 1С 8.3.10+ следует придерживаться следующих правил:
ПолучитьФорму().Открыть() на клиенте.Новый Структура("Ключ", Ссылка) для передачи объекта в форму.НЕ Ссылка.Пустая()).ПоказатьЗначение, ПоказатьПредупреждение) для обеспечения совместимости с веб-клиентом.Соблюдение этих простых правил позволит вашему коду работать стабильно и соответствовать современным стандартам разработки на платформе 1С:Предприятие 8.3.