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