Как правильно программно открыть форму Заказ-наряда в 1С:УНФ 3.0?

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

При разработке в среде 1С:Управление нашей фирмой (УНФ) 3.0 программисты часто сталкиваются с особенностью реализации документа Заказ-наряд. На уровне метаданных такого отдельного документа не существует — это всего лишь один из режимов работы документа Заказ покупателя. Из-за этой архитектурной особенности простого вызова формы ПолучитьФорму() часто оказывается недостаточно: форма может открыться без нужных вкладок (например, пропадает вкладка "Товары"), а при записи документ ошибочно сохраняется как обычный заказ покупателя. Разберем подробно, почему так происходит и как правильно решить эту задачу.

Почему стандартный метод открытия формы работает некорректно?

Рассмотрим типичную ошибку. Программист пытается получить форму, заполнить её данные на сервере и затем открыть. В этом случае пропускается важнейший этап — инициализация формы при создании. В УНФ логика интерфейса (видимость закладок "Работы", "Товары", "Материалы", "Зарплата") жестко завязана на реквизит ВидОперации и параметры, передаваемые в момент создания формы на сервере.

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

Правильный подход: использование параметров заполнения

Для того чтобы форма открылась корректно, со всеми нужными вкладками и правильным поведением, необходимо использовать метод ОткрытьФорму() и передавать данные через структуру ЗначенияЗаполнения. Это заставит систему выполнить стандартные механизмы БСП (Библиотеки стандартных подсистем), которые правильно настроят видимость элементов.

Проанализируем основные шаги, которые нам нужно выполнить:

  1. Определить путь к нужной форме (в УНФ это Документ.ЗаказПокупателя.Форма.ФормаЗаказНаряда).
  2. Подготовить структуру параметров, где ключевым будет ВидОперации.
  3. Вызвать процедуру открытия, передав в неё все необходимые реквизиты.

Реализация программного создания Заказ-наряда

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


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

Разберем важные нюансы настройки интерфейса

Выясним причину, по которой вкладка "Товары" может оставаться скрытой даже при правильном открытии. В УНФ 3.0 видимость панелей в заказ-наряде управляется не только кодом, но и функциональными опциями. Однако чаще всего проблема кроется в процедуре УстановитьВидимостьПанелей внутри модуля формы.

Когда вы передаете ВидОперации через ЗначенияЗаполнения, форма при создании выполняет следующий алгоритм:

Если же вам нужно открыть уже существующий документ, но вы хотите гарантировать, что откроется именно форма заказ-наряда (а не заказа покупателя), используйте ключ ЗначениеКопирования или просто передавайте Ключ (ссылку на документ) в нужную форму:


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

Почему документ «падает» в Заказы покупателей?

Посмотрим на ситуацию с точки зрения списков (журналов) документов. В УНФ список "Заказы покупателей" и список "Заказ-наряды" — это два разных динамических списка, которые фильтруют записи одной и той же таблицы Документ.ЗаказПокупателя по полю ВидОперации.

Если вы создали документ программно, но не установили ВидОперации в значение ЗаказНаряд, он автоматически получит значение ЗаказНаПродажу (первое в перечислении). После сохранения такой документ будет виден в общем списке заказов и исчезнет из списка заказ-нарядов. Именно поэтому использование ПараметрыЗаполнения является обязательным условием для корректной работы.

Рекомендации по доработке кода

Если ваша задача — не просто открыть пустую форму, а заполнить её сложными данными (например, табличной частью с товарами или работами), лучше всего сделать это следующим образом:

  1. Создайте документ программно на сервере (через Документы.ЗаказПокупателя.СоздатьДокумент()).
  2. Заполните все реквизиты и табличные части.
  3. Запишите документ (или используйте временное хранилище, если запись до открытия формы нежелательна).
  4. Откройте форму уже созданного документа, передав его ссылку.

Такой подход исключает ошибки инициализации интерфейса формы, так как при чтении существующего объекта форма сама настроит себя под те данные, которые в нем записаны.

Важный момент: При работе с ФормаЗаказНаряда в коде управляемого приложения всегда проверяйте параметры ВестиРасчетыПоДоговорам и ВестиРасчетыПоЗаказам. В некоторых версиях УНФ они могут влиять на доступность полей оплаты в нижней части формы. Их также можно передать в структуру параметров при открытии, если типовые механизмы определения не срабатывают в вашем контексте.

Подводя итог: для успешного программного открытия Заказ-наряда в УНФ 3.0 откажитесь от прямого манипулирования объектом формы через КопироватьДанныеФормы. Используйте метод ОткрытьФорму с корректно заполненной структурой ЗначенияЗаполнения, где обязательно указан ВидОперации. Это гарантирует, что 1С сама применит всю заложенную логику отображения вкладок и поведения документа.

← На главную