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