Как в 1С открыть несколько форм нового объекта параллельно?

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

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

Проблема, описанная в исходной задаче, заключается в следующем: при попытке открыть вторую форму нового объекта, после записи первого, система открывает не пустую форму, а дубликат только что сохраненного документа. Это происходит из-за внутреннего механизма уникальности форм 1С. Когда мы открываем форму для нового объекта, у него еще нет уникальной ссылки в базе данных. Платформа считает все "пустые" формы одного и того же объекта идентичными. Чтобы избежать этого, нам нужно явно указать системе, что каждая открываемая форма является уникальным экземпляром.

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

Решение 1: Использование параметра `Уникальность` в методе `ОткрытьФорму`

Это самый надежный, универсальный и рекомендуемый способ управления уникальностью форм. Метод ОткрытьФорму имеет четвертый необязательный параметр — Уникальность. Он предназначен как раз для таких случаев.

Принцип работы: Когда мы вызываем ОткрытьФорму, платформа проверяет, есть ли уже открытая форма с таким же значением, которое мы передали в параметр Уникальность.

  1. Если форма с таким идентификатором уникальности уже существует, она будет просто активирована (переведена на передний план).
  2. Если формы с таким идентификатором нет, будет создана и открыта новая, а переданное значение будет присвоено ей в качестве ключа уникальности.

Чтобы гарантированно открывать новый экземпляр формы каждый раз, нам нужно при каждом вызове передавать в этот параметр заведомо уникальное значение. Идеальным инструментом для этого является функция Новый УникальныйИдентификатор(), которая при каждом вызове генерирует новое, неповторяющееся значение.

Посмотрим на пример кода. Предположим, нам нужно открыть две формы нового документа "РеализацияТоваровУслуг".


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

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

Важные моменты:

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

Решение 2: Использование параметра формы `Ключ`

Другой распространенный способ управления уникальностью — это работа со стандартным параметром формы Ключ. Этот параметр обычно содержит ссылку на объект базы данных (документ, элемент справочника), данные которого отображаются в форме. У нового, еще не записанного объекта, ссылки нет, поэтому по умолчанию этот параметр пуст.

Мы можем вручную задать этот параметр при открытии формы, передав в него уникальное значение. Система будет считать, что мы открываем формы для разных, хоть и не сохраненных, объектов.

Для этого нужно сформировать структуру параметров и передать ее вторым аргументом в метод ОткрытьФорму. В качестве значения для ключа мы снова используем Новый УникальныйИдентификатор().

Посмотрим на пример:


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

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

Этот способ особенно удобен, когда кроме обеспечения уникальности нам нужно передать в форму и другие начальные значения. Например, данные для заполнения.


// Готовим параметры для формы: уникальный ключ и данные для заполнения
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", Новый УникальныйИдентификатор());
ПараметрыФормы.Вставить("Контрагент", СсылкаНаКонтрагента);
ПараметрыФормы.Вставить("Склад", СсылкаНаСклад);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Этот метод так же надежен, как и первый, и дает больше гибкости при передаче параметров в открываемую форму.

Выводы

Мы проанализировали стандартную задачу по открытию нескольких форм нового объекта и выяснили причину некорректного поведения платформы. Для ее решения существует два надежных и правильных подхода:

  1. Использовать четвертый параметр Уникальность метода ОткрытьФорму, передавая в него Новый УникальныйИдентификатор(). Это самый прямой и универсальный способ.
  2. Передавать структуру параметров со свойством Ключ, в которое также помещено значение Новый УникальныйИдентификатор(). Этот способ удобен, когда нужно передать и другие данные для инициализации формы.

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

← На главную