Как получить ссылку на новый документ в форме-владельце

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

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

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

Способ 1. Использование события «Обработка записи нового»

Это наиболее изящный и стандартный способ, встроенный в платформу. Если при открытии формы нового документа вы явно указываете владельца, то при первой записи этого документа в форме-владельце автоматически срабатывает событие ОбработкаЗаписиНового.

Рассмотрим алгоритм реализации:

  1. При открытии формы документа из владельца передаем текущую форму в качестве параметра Владелец.
  2. В форме-владельце создаем обработчик события ОбработкаЗаписиНового.

Пример кода в форме-владельце при открытии:


ПараметрыФормы = Новый Структура;
// Если нужно передать данные для заполнения
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);

Пример обработчика в форме-владельце:


&НаКлиенте
Процедура ОбработкаЗаписиНового(НовыйОбъект, Источник)
    // Переменная НовыйОбъект содержит ссылку на только что созданный документ
    Сообщить("Создан новый документ: " + НовыйОбъект);
    МояСсылкаНаДокумент = НовыйОбъект;
КонецПроцедуры

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

Способ 2. Программная установка ссылки (метод ГУИД)

Проанализируем ситуацию, когда нам нужно знать ссылку еще до того, как пользователь нажмет кнопку «Записать». Мы можем самостоятельно сгенерировать уникальный идентификатор и назначить его новому объекту. В этом случае форма-владелец будет заранее знать, какая ссылка будет у документа.

Для реализации этого метода выполним следующие действия:

  1. На сервере создаем ссылку для нового документа.
  2. Используем метод УстановитьСсылкуНового().
  3. Передаем эту ссылку в форму документа.

Пример реализации на сервере:


&НаСервере
Функция ПолучитьСсылкуДляНовогоДокумента()
    НовыйГУИД = Новый УникальныйИдентификатор;
    Возврат Документы.РеализацияТоваровУслуг.ПолучитьСсылку(НовыйГУИД);
КонецФункции

Затем при открытии формы:


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

Важно помнить: если пользователь закроет форму документа без сохранения, ссылка в базе данных не появится, и в форме-владельце останется «битая» ссылка. Этот момент нужно обрабатывать дополнительно.

Способ 3. Использование механизма оповещений (Оповестить)

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

Рассмотрим логику работы:

  1. В форме документа в событии ПослеЗаписи вызываем отправку оповещения.
  2. В форме-владельце ловим это оповещение в обработчике ОбработкаОповещения.

Код в форме документа (можно добавить через расширение, чтобы не менять типовую конфигурацию):


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    ПараметрыСобытия = Новый Структура;
    ПараметрыСобытия.Вставить("Ссылка", Объект.Ссылка);
    Оповестить("ЗаписанНовыйДокумент", ПараметрыСобытия, ЭтаФорма);
КонецПроцедуры

Код в форме-владельце:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗаписанНовыйДокумент" Тогда
        НоваяСсылка = Параметр.Ссылка;
        // Работаем с полученной ссылкой
    КонецЕсли;
КонецПроцедуры

Преимущество этого метода в его «чистоте»: формы максимально развязаны друг от друга. Недостаток — необходимость внесения изменений в форму документа (или использование подписок/расширений).

Способ 4. Передача ОписанияОповещения в параметры формы

Рассмотрим более продвинутый вариант с использованием ОписаниеОповещения. Хотя в обсуждении упоминалось, что стандартное оповещение о закрытии срабатывает на форме выбора операции, мы можем передать структуру оповещения в параметры открытия и вызвать её вручную именно тогда, когда нам нужно.

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

  1. Создаем объект ОписаниеОповещения.
  2. Передаем его в параметрах в открываемую форму.
  3. В форме документа, в коде после записи или при закрытии, проверяем наличие этого параметра и вызываем ВыполнитьОбработкуОповещения().

Этот метод требует аккуратности, так как промежуточные формы (выбора типа операции) должны корректно пробрасывать параметры дальше. В типовых конфигурациях 1С это реализовано не всегда, поэтому может потребоваться вмешательство в логику промежуточных окон через расширения.

Резюме

Для большинства задач оптимальным будет Способ 1 (Обработка записи нового), так как он поддерживается платформой на уровне ядра и автоматически связывает формы через свойство ВладелецФормы. Если же ваша конфигурация сильно кастомизирована или вы используете сложные цепочки открытия окон, рекомендуем обратить внимание на Способ 3 (Оповещения) или Способ 2 (Предустановка ГУИД) для гарантированного получения результата.

← На главную