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