Как программно создать элемент справочника и сразу открыть его форму в 1С 8.3

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

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

Разберем детально, почему старые методы из «обычных форм» не работают, и рассмотрим правильные подходы к решению этой задачи.

Анализ проблемы: клиент-серверная граница

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

С другой стороны, на клиенте мы имеем доступ к методам открытия форм, но не можем напрямую манипулировать объектом справочника (создавать его, заполнять реквизиты и записывать), так как тип СправочникОбъект доступен только на сервере. Выясним, как связать эти два мира.

Способ №1: Создание на сервере с возвратом ссылки

Этот метод подходит, если элемент должен быть обязательно записан в базу данных до того, как пользователь его увидит. Рассмотрим алгоритм действий:

  1. На клиенте вызываем серверную функцию.
  2. На сервере создаем объект, заполняем его, записываем и возвращаем Ссылку.
  3. На клиенте, получив ссылку, открываем форму существующего объекта.

Преобразуем исходный код автора в рабочую конструкцию. Начнем с серверной части. Обратите внимание, что мы меняем Процедура на Функция, чтобы вернуть результат.


&НаСервере
Функция СоздатьКонтрагентаНаСервере()
    
    // Создаем новый объект в памяти сервера
    НовыйПартнер = Справочники.Партнеры.СоздатьЭлемент();
    НовыйПартнер.Наименование = Объект.Наименование;
    НовыйПартнер.НаименованиеПолное = Объект.Наименование;
    НовыйПартнер.Клиент = Истина;
    НовыйПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.Компания;
    
    // Записываем объект, чтобы получить ссылку
    НовыйПартнер.Записать();
    
    // Работа с контактной информацией через БСП
    УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(
        НовыйПартнер.Ссылка,
        УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(Объект.Телефон, Справочники.ВидыКонтактнойИнформации.ТелефонПартнера),
        Справочники.ВидыКонтактнойИнформации.ТелефонПартнера,
        Перечисления.ТипыКонтактнойИнформации.Телефон
    );
    
    // Возвращаем ссылку на созданный элемент
    Возврат НовыйПартнер.Ссылка;
    
КонецФункции

Теперь проанализируем клиентскую часть. Для открытия формы нам понадобится структура параметров, где в поле Ключ мы передадим нашу новую ссылку.


&НаКлиенте
Процедура СоздатьКонтрагента(Команда)
    
    // Получаем ссылку созданного объекта
    СсылкаНаНовогоПартнера = СоздатьКонтрагентаНаСервере();
    
    // Проверяем, что ссылка не пустая
    Если Не СсылкаНаНовогоПартнера.Пустая() Тогда
        
        // Формируем параметры для открытия формы. 
        // "Ключ" - это стандартный параметр для открытия формы существующего объекта
        ПараметрыФормы = Новый Структура("Ключ", СсылкаНаНовогоПартнера);
        
        // Открываем форму
        ОткрытьФорму("Справочник.Партнеры.ФормаОбъекта", ПараметрыФормы);
        
    КонецЕсли;
    
КонецПроцедуры

Способ №2: Открытие формы нового (незаписанного) элемента

Иногда бизнес-логика требует, чтобы объект не записывался сразу «тихо» в базу, а открывался предзаполненным, чтобы пользователь мог нажать «Отмена» или дозаполнить данные вручную. В управляемом приложении для этого используется параметр ЗначенияЗаполнения.

Посмотрим на пример реализации этого подхода полностью на клиенте:


&НаКлиенте
Процедура ОткрытьФормуНовогоПартнера(Команда)
    
    // Подготавливаем данные для заполнения
    ДанныеЗаполнения = Новый Структура;
    ДанныеЗаполнения.Вставить("Наименование", Объект.Наименование);
    ДанныеЗаполнения.Вставить("Клиент", Истина);
    
    // Помещаем структуру в специальный параметр "ЗначенияЗаполнения"
    ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ДанныеЗаполнения);
    
    // При открытии формы нового элемента сработает обработчик ОбработкаЗаполнения в модуле объекта
    ОткрытьФорму("Справочник.Партнеры.ФормаОбъекта", ПараметрыФормы);
    
КонецПроцедуры

Важный нюанс: Чтобы этот способ сработал, в модуле объекта справочника «Партнеры» должен быть прописан код в процедуре ОбработкаЗаполнения, который умеет принимать структуру и распределять её по реквизитам. В типовых конфигурациях, таких как УТ 11, этот механизм уже развит и активно используется.

Особенности справочника «Партнеры» в УТ 11

Рассмотрим специфику конфигурации «Управление торговлей». Справочник Партнеры часто имеет несколько форм. В коде автора упоминается ФормаЭлементаРеквизитыКонтрагента. Это специфическая форма, которая может ожидать определенных параметров контекста.

Если вы работаете в УТ 11, важно помнить о существовании «Помощника создания партнеров». Часто правильнее вызывать именно его, так как он автоматически создает не только партнера, но и связанного с ним контрагента, соглашение и контактное лицо. Выясним, как можно программно упростить этот процесс, используя встроенные функции БСП.

Для работы с контактной информацией (телефоны, адреса) в современных конфигурациях лучше использовать программный интерфейс модуля УправлениеКонтактнойИнформациейКлиентСервер. Это позволит избежать прямого формирования XML-строк вручную, что чревато ошибками при обновлении платформы.

Использование метода ПоказатьЗначение

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


&НаКлиенте
Процедура СоздатьИПоказать(Команда)
    Ссылка = СоздатьКонтрагентаНаСервере();
    ПоказатьЗначение(Неопределено, Ссылка);
КонецПроцедуры

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

Резюме для закрепления материала

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

  1. Не пытайтесь открывать формы на сервере. Это архитектурно невозможно.
  2. Разделяйте ответственность: сервер создает запись в базе и возвращает ссылку, клиент — визуализирует эту ссылку пользователю.
  3. Для открытия существующего объекта используйте структуру параметров с ключом "Ключ".
  4. Для открытия нового объекта с данными используйте параметр "ЗначенияЗаполнения".
  5. Всегда проверяйте, какая форма является основной для справочника в вашей конфигурации, прежде чем жестко прописывать путь к конкретной форме в коде.

Использование этих подходов сделает ваш код надежным, соответствующим стандартам разработки 1С и удобным для поддержки в будущем.

← На главную