Как вызвать произвольную форму документа в 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

Разбор синтаксиса обращения к форме

Основная причина ошибок при вызове метода ОткрытьФорму() — это неверное указание пути. В 1С:Предприятие 8.3 для управляемых форм принят строгий стандарт именования. Рассмотрим структуру пути к форме на примере документа ВыпускПродукции и его произвольной формы ФормаПодбораЦенИнгредиентов.

Для обращения к основной форме документа (которая назначена в метаданных как основная) достаточно указать: "Документ.ВыпускПродукции.ФормаОбъекта". Но если мы работаем с произвольной формой, синтаксис меняется. Проанализируем правильный вариант:

Шаблон: "Документ.[ИмяОбъекта].Форма.[ИмяПроизвольнойФормы]"

Таким образом, если мы хотим открыть форму из примера, код в модуле основной формы будет выглядеть так:


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

Обратите внимание на ключевое слово Форма в середине пути. Без него система не сможет идентифицировать объект в коллекции форм документа. Также важно следить за грамотностью написания имен: если в конфигураторе форма названа ФормаПодбораЦенИнгрИдиентов (через "и"), то и в коде нужно писать именно так, несмотря на правила орфографии русского языка.

Использование контекстной подсказки конфигуратора

Чтобы избежать опечаток в именах форм, проанализируем возможности самого конфигуратора. Платформа 1С предоставляет мощный механизм контекстной подсказки. Разберем по шагам, как им пользоваться:

  1. Начните вводить метод ОткрытьФорму(.
  2. Поставьте открывающую двойную кавычку ".
  3. В этот момент должно появиться выпадающее меню со списком доступных типов объектов (Справочник, Документ, ОбщаяФорма и т.д.).
  4. Выберите нужный тип и поставьте точку. Система предложит список объектов данного типа.
  5. После выбора конкретного документа и постановки точки, обязательно выберите пункт Форма.
  6. Только после этого вы увидите список всех форм, созданных внутри этого объекта.

Если после выбора объекта и постановки точки список форм не появляется, проверьте, сохранена ли конфигурация базы данных (клавиша F7) и нет ли синтаксических ошибок в коде выше.

Передача и обработка параметров

Просто открыть окно — это лишь половина задачи. Чаще всего нам нужно передать в это окно контекст (например, склад или дату). Рассмотрим, как правильно принять эти данные в открываемой форме. Простого передачи структуры в ОткрытьФорму недостаточно для автоматического заполнения реквизитов.

В модуле открываемой формы (в нашем случае ФормаПодбораЦенИнгредиентов) необходимо прописать обработчик события ПриСозданииНаСервере. Выясним, как это работает:


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

Все ключи структуры, которую мы создали в вызывающем коде, автоматически попадают в системную коллекцию Параметры открываемой формы.

Возврат результата в вызывающую форму

В современных управляемых формах использование модальных окон запрещено. Поэтому для получения результата выбора из произвольной формы мы используем механизм оповещений. Разберем эту ситуацию подробнее.

В вызывающей форме (модуль формы документа) мы должны создать объект ОписаниеОповещения. Посмотрим на пример кода:


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

&НаКлиенте
Процедура ПослеЗакрытияФормыПодбора(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    Если РезультатВыбора <> Неопределено Тогда
        // Обрабатываем полученные данные (например, выбранную цену)
        Объект.Цена = РезультатВыбора;
    КонецЕсли;
    
КонецПроцедуры

А в самой произвольной форме, когда пользователь нажимает кнопку "Выбрать", мы вызываем метод Закрыть(), передавая в него выбранное значение:


&НаКлиенте
Процедура КомандаОК(Команда)
    // Допустим, мы выбрали значение в реквизит ВыбраннаяЦена
    Закрыть(ВыбраннаяЦена);
КонецПроцедуры

Метод ОткрытьФорму vs ПолучитьФорму

Рассмотрим разницу между этими двумя методами, так как в обсуждениях часто предлагают оба варианта.

Метод ОткрытьФорму() является предпочтительным. Он работает на клиенте и минимизирует количество серверных вызовов. Вы просто даете команду системе подготовить и отобразить окно.

Метод ПолучитьФорму() создает объект формы в памяти сервера и возвращает ссылку на него клиенту. Это более "тяжелая" операция. Использовать ПолучитьФорму() стоит только в исключительных случаях, например, когда вам нужно программно изменить состав элементов формы (добавить кнопки или поля) до того, как форма будет показана пользователю. После внесения изменений форму все равно придется открывать методом ФормаИ.Открыть().

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

Дополнительные рекомендации

1. Права доступа. Если код написан верно, но ошибка сохраняется, убедитесь, что у пользователя в роли есть право на Просмотр данной конкретной формы. Иногда разработчики забывают включить новую форму в состав ролей.

2. Ключ уникальности. Если вам нужно открыть несколько экземпляров одной и той же произвольной формы (например, для сравнения цен по разным складам одновременно), используйте четвертый параметр метода ОткрытьФорму — КлючУникальности. Если его не указать, 1С просто переключит фокус на уже открытую форму вместо открытия новой.

3. Общие формы. Если ваша форма находится в дереве метаданных в ветке Общие -> Общие формы, путь к ней будет короче: "ОбщаяФорма.ИмяВашейФормы". Попытка вызвать ее через "Документ..." приведет к ошибке.

Подводя итог, можно сказать, что работа с произвольными формами в 1С требует внимательности к синтаксису и понимания клиент-серверного взаимодействия. Использование правильного пути Документ.Имя.Форма.Имя и механизмов оповещения позволяет создавать гибкие и удобные интерфейсы для пользователей.

← На главную