При разработке в среде 1С:Управление нашей фирмой (УНФ) 3.0 программисты часто сталкиваются с особенностью реализации документа Заказ-наряд. На уровне метаданных такого отдельного документа не существует — это всего лишь один из режимов работы документа Заказ покупателя. Из-за этой архитектурной особенности простого вызова формы ПолучитьФорму() часто оказывается недостаточно: форма может открыться без нужных вкладок (например, пропадает вкладка "Товары"), а при записи документ ошибочно сохраняется как обычный заказ покупателя. Разберем подробно, почему так происходит и как правильно решить эту задачу.
Рассмотрим типичную ошибку. Программист пытается получить форму, заполнить её данные на сервере и затем открыть. В этом случае пропускается важнейший этап — инициализация формы при создании. В УНФ логика интерфейса (видимость закладок "Работы", "Товары", "Материалы", "Зарплата") жестко завязана на реквизит ВидОперации и параметры, передаваемые в момент создания формы на сервере.
Если мы сначала получаем форму через ПолучитьФорму(), а потом пытаемся программно подсунуть в неё данные, обработчик ПриСозданииНаСервере отрабатывает в тот момент, когда объект еще пустой. В результате форма «не понимает», что она должна работать в режиме заказ-наряда, и инициализирует интерфейс по умолчанию (как для заказа покупателя).
Для того чтобы форма открылась корректно, со всеми нужными вкладками и правильным поведением, необходимо использовать метод ОткрытьФорму() и передавать данные через структуру ЗначенияЗаполнения. Это заставит систему выполнить стандартные механизмы БСП (Библиотеки стандартных подсистем), которые правильно настроят видимость элементов.
Проанализируем основные шаги, которые нам нужно выполнить:
Документ.ЗаказПокупателя.Форма.ФормаЗаказНаряда).ВидОперации.Рассмотрим пример кода, который решает проблему отсутствующих вкладок и неверного типа документа при записи. Вместо ручного копирования данных формы, мы используем механизм параметров открытия.
&НаКлиенте
Процедура СоздатьИОткрытьЗаказНаряд()
// Подготавливаем параметры заполнения для нового документа
ПараметрыЗаполнения = Новый Структура;
// Указываем вид операции - это критически важно для Заказ-наряда!
ПараметрыЗаполнения.Вставить("ВидОперации", ПредопределенноеЗначение("Перечисление.ВидОперацииЗаказПокупателя.ЗаказНаряд"));
// Заполняем основные реквизиты
ПараметрыЗаполнения.Вставить("Организация", ПолучитьОрганизациюПоУмолчанию());
ПараметрыЗаполнения.Вставить("Контрагент", Объект.Контрагент);
ПараметрыЗаполнения.Вставить("Комментарий", "Создано автоматически из внешней обработки");
// Помещаем значения заполнения в структуру параметров формы
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
// Открываем именно форму заказ-наряда
ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаЗаказНаряда", ПараметрыОткрытия);
КонецПроцедуры
Выясним причину, по которой вкладка "Товары" может оставаться скрытой даже при правильном открытии. В УНФ 3.0 видимость панелей в заказ-наряде управляется не только кодом, но и функциональными опциями. Однако чаще всего проблема кроется в процедуре УстановитьВидимостьПанелей внутри модуля формы.
Когда вы передаете ВидОперации через ЗначенияЗаполнения, форма при создании выполняет следующий алгоритм:
ВидОперации равен ЗаказНаряд, программно включается видимость страниц "Работы" и "Материалы", а страница "Запасы" переименовывается в "Товары".Если же вам нужно открыть уже существующий документ, но вы хотите гарантировать, что откроется именно форма заказ-наряда (а не заказа покупателя), используйте ключ ЗначениеКопирования или просто передавайте Ключ (ссылку на документ) в нужную форму:
// Пример открытия существующего Заказ-наряда
ПараметрыКлюча = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаЗаказНаряда", ПараметрыКлюча);
Посмотрим на ситуацию с точки зрения списков (журналов) документов. В УНФ список "Заказы покупателей" и список "Заказ-наряды" — это два разных динамических списка, которые фильтруют записи одной и той же таблицы Документ.ЗаказПокупателя по полю ВидОперации.
Если вы создали документ программно, но не установили ВидОперации в значение ЗаказНаряд, он автоматически получит значение ЗаказНаПродажу (первое в перечислении). После сохранения такой документ будет виден в общем списке заказов и исчезнет из списка заказ-нарядов. Именно поэтому использование ПараметрыЗаполнения является обязательным условием для корректной работы.
Если ваша задача — не просто открыть пустую форму, а заполнить её сложными данными (например, табличной частью с товарами или работами), лучше всего сделать это следующим образом:
Документы.ЗаказПокупателя.СоздатьДокумент()).Такой подход исключает ошибки инициализации интерфейса формы, так как при чтении существующего объекта форма сама настроит себя под те данные, которые в нем записаны.
Важный момент: При работе с ФормаЗаказНаряда в коде управляемого приложения всегда проверяйте параметры ВестиРасчетыПоДоговорам и ВестиРасчетыПоЗаказам. В некоторых версиях УНФ они могут влиять на доступность полей оплаты в нижней части формы. Их также можно передать в структуру параметров при открытии, если типовые механизмы определения не срабатывают в вашем контексте.
Подводя итог: для успешного программного открытия Заказ-наряда в УНФ 3.0 откажитесь от прямого манипулирования объектом формы через КопироватьДанныеФормы. Используйте метод ОткрытьФорму с корректно заполненной структурой ЗначенияЗаполнения, где обязательно указан ВидОперации. Это гарантирует, что 1С сама применит всю заложенную логику отображения вкладок и поведения документа.