Как открыть форму нового незаписанного объекта справочника в управляемых формах 1С?

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

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

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

Почему не работают классические методы толстого клиента

Выясним причину, по которой привычный код вызывает ошибки в управляемом интерфейсе:

  1. Разделение контекста: тип СправочникОбъект доступен только на сервере. Создать объект на тонком клиенте через Справочники.ИмяСправочника.СоздатьЭлемент() невозможно.
  2. Устаревшие методы: функции ПолучитьФорму() и ПолучитьФормуНовогоЭлемента() не поддерживаются на тонком клиенте и не предназначены для управляемых форм.
  3. Отсутствие ссылки: параметр формы Ключ используется исключительно для открытия уже существующих, ранее записанных элементов информационной базы. Если элемент еще не записан, ссылки на него в базе данных не существует.

Таким образом, логика управляемого приложения строится иначе: не нужно создавать объект в памяти заранее — нужно запросить открытие формы с инструкциями о том, как ее заполнить.

Способ 1. Использование стандартного параметра «ЗначенияЗаполнения» (Основной метод)

Рассмотрим штатный и наиболее универсальный способ платформы 1С:Предприятие. На клиенте формируется структура с реквизитами, которые необходимо передать в новый объект, и передается в метод ОткрытьФорму через предопределенный параметр ЗначенияЗаполнения.

Посмотрим на пример вызова на клиенте:


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

Как это работает внутри платформы:

  1. Платформа инициирует создание новой управляемой формы на сервере.
  2. Автоматически вызывается обработчик ОбработкаЗаполнения в модуле объекта справочника.
  3. Входящий параметр ДанныеЗаполнения обработчика получает переданную структуру, после чего реквизиты объекта заполняются переданными значениями еще до отрисовки формы на клиенте.
  4. Пользователь видит открытую форму с заполненными полями, при этом кнопка «Записать и закрыть» активна, а сам объект в базу данных еще не сохранен.

Способ 2. Ввод на основании другого объекта через параметр «Основание»

Если новый элемент создается на базе существующего документа или другого справочника, логичнее всего использовать механизм ввода на основании. Для этого в параметры открытия формы передается стандартный ключ Основание.

Разберем пример:


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

В этом случае платформа передаст значение СсылкаНаДокумент в процедуру ОбработкаЗаполнения модуля объекта справочника, где сработает типовая логика заполнения нового объекта на основании переданного источника.

Способ 3. Передача сложного серверного объекта через временное хранилище

Иногда требуется сложная серверная обработка: объект создается на сервере, заполняется по сложным алгоритмам (например, формируются десятки строк в табличных частях), и передать всё через обычную плоскую структуру неудобно. В такой ситуации разберем связку через временное хранилище и метод ЗначениеВРеквизитФормы.

Шаг 1. На сервере формируем объект и помещаем его во временное хранилище:


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

Шаг 2. На клиенте передаем адрес во временном хранилище в форму:


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

Шаг 3. В модуле формы справочника в событии ПриСозданииНаСервере принимаем данные:


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

Способ 4. Передача произвольных параметров формы

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

Рассмотрим пример вызова:


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

В событии ПриСозданииНаСервере открываемой формы данные считываются из коллекции Параметры:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("БыстрыйВвод") И Параметры.БыстрыйВвод Тогда
        Объект.Категория = Параметры.КатегорияПоУмолчанию;
    КонецЕсли;
    
КонецПроцедуры

Итоги

Для открытия формы нового незаписанного элемента справочника в управляемых формах 1С рекомендуем придерживаться следующего правила:

  1. В большинстве типовых задач используйте штатный параметр ЗначенияЗаполнения метода ОткрытьФорму — это чистый код без доработки модуля самой формы.
  2. Если заполнение зависит от другого документа — передавайте ссылку через Основание.
  3. При сложной логике заполнения с табличными частями на сервере применяйте механизм ПоместитьВоВременноеХранилище и конвертацию через ЗначениеВРеквизитФормы.
← На главную