Как программно открыть форму документа Реализация товаров и услуг с предопределенным видом операции

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

В современных конфигурациях 1С, таких как «Управление торговлей 11», «ERP Управление предприятием 2» или «Комплексная автоматизация», разработчики часто сталкиваются с ситуацией, когда при программном вызове формы документа РеализацияТоваровУслуг система вместо открытия окна документа выводит диалоговое окно выбора: «Товары», «Услуги» или «Товары, услуги, комиссия». Это происходит потому, что платформа не получает достаточно данных для однозначного определения того, какой именно интерфейс формы должен быть представлен пользователю.

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

Метод 1. Использование прямого пути к форме

Самый быстрый и очевидный способ — это обращение к конкретной форме по её имени, заданному в конфигураторе. Однако здесь часто возникает ошибка «Неизвестное имя формы». Проанализируем причину её возникновения.

При использовании метода ОткрытьФорму крайне важно соблюдать строгий синтаксис обращения к метаданным. Рассмотрим пример неправильного кода, который часто приводит к ошибке:


// ОШИБОЧНЫЙ ВАРИАНТ
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаДокументаТовары", ПараметрыФормы);

Ошибка заключается в пропуске обязательного ключевого слова Форма в строке пути. Выясним, как написать этот код правильно. Путь должен выглядеть следующим образом:


// ПРАВИЛЬНЫЙ ВАРИАНТ
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары", ПараметрыФормы, Контекст);

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

Метод 2. Передача параметров через «ЗначенияЗаполнения»

Рассмотрим более гибкий и «правильный» с точки зрения архитектуры типовых решений метод. В современных конфигурациях выбор конкретной формы часто управляется через обработчик ОбработкаПолученияФормы в модуле менеджера документа. Чтобы система автоматически выбрала нужную форму, нам нужно передать параметры, которые позволят менеджеру принять решение без участия пользователя.

Разберем, как правильно сформировать структуру параметров. Основным ключом здесь выступает ВидОперации или, что более актуально для последних релизов ERP/УТ, ХозяйственнаяОперация.


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

// Упаковываем в структуру параметров формы
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", СтруктураДанных);

// Открываем основную форму объекта
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник);

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

Метод 3. Программная установка вида операции в объекте

Если методы, описанные выше, по какой-то причине не подходят, проанализируем ситуацию, когда нам необходимо получить форму, настроить её и только потом показать пользователю. Для этого мы можем использовать функцию ПолучитьФорму.

Рассмотрим пошагово этот алгоритм:

  1. Получаем форму документа на клиенте.
  2. Если это новый документ, устанавливаем значения параметров.
  3. Используем серверную функцию для получения правильного значения перечисления.
  4. Открываем готовую форму.

// Пример на стороне клиента
ПараметрыФормы = Новый Структура;
// Если нужно открыть форму для нового документа на основании
СтруктураЗаполнения = Новый Структура("Основание", ПараметрКоманды);
ПараметрыФормы.Вставить("ЗначенияЗаполнения", СтруктураЗаполнения);

Форма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

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

Форма.Открыть();

Почему это важно: нюансы управляемого приложения

Разберем несколько критических моментов, которые помогут избежать ошибок при реализации данной задачи:

Во-первых, всегда проверяйте контекст исполнения. Методы ОткрытьФорму и ПолучитьФорму должны вызываться на стороне клиента. Если вы попытаетесь вызвать их в серверной процедуре, система выдаст ошибку.

Во-вторых, обратите внимание на параметр КлючНазначенияИспользования. Если вы хотите, чтобы настройки формы (расположение колонок, видимость панелей) сохранялись отдельно для разных видов операций, передавайте в этот параметр уникальную строку, например, "РеализацияТовары" или "РеализацияУслуги". Это позволит платформе кэшировать настройки интерфейса независимо друг от друга.

В-третьих, в современных версиях 1С:Предприятие 8.3 многие формы являются динамическими. Это означает, что физически существует одна форма ФормаДокумента, а все «превращения» её в форму «Товары» или «Услуги» происходят программно в событии ПриСозданииНаСервере. В этом случае попытка открыть ФормаДокументаТовары напрямую всегда будет приводить к ошибке «Неизвестное имя формы», так как такой формы просто нет в метаданных. В этой ситуации единственно верным решением будет передача правильной ХозяйственнойОперации через ЗначенияЗаполнения.

Резюме по решению проблемы

Проанализировав ситуацию, мы выяснили, что наиболее стабильным решением является комбинированный подход:

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

← На главную