Как в 1С 8.3 из общего модуля открыть форму существующего элемента справочника?

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

При разработке в среде 1С:Предприятие 8.3 часто возникает задача программного открытия карточки объекта (например, контрагента, номенклатуры или договора). Казалось бы, процедура стандартная, но начинающие разработчики часто сталкиваются с тем, что вместо открытия уже существующей записи в базе данных система упорно предлагает создать новую. Рассмотрим подробнее, почему так происходит, и разберем по шагам правильные способы реализации этой задачи из общего модуля.

Почему открывается форма нового элемента вместо существующего?

Проанализируем ситуацию: когда мы используем метод ОткрытьФорму, платформа ожидает от нас указания на то, какой именно объект мы хотим увидеть. Если мы просто передаем путь к форме, например, Справочники.Контрагенты.ФормаЭлемента, система считает, что мы инициируем создание нового объекта. Чтобы «объяснить» платформе, что нам нужен конкретный контрагент, необходимо передать в параметрах его уникальный идентификатор — ссылку.

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

Способ №1: Использование метода ОткрытьФорму (Канонический вариант)

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

Предположим, у нас уже есть переменная СсылкаНаКонтрагента. Выясним причину, по которой код может не срабатывать, и напишем верный вариант:


// Параметры открытия формы
ПараметрыВыбора = Новый Структура;
// КРИТИЧЕСКИ ВАЖНО: имя ключа должно быть именно "Ключ"
ПараметрыВыбора.Вставить("Ключ", СсылкаНаКонтрагента);

// Вызываем открытие основной формы элемента справочника
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", ПараметрыВыбора);

В этом примере мы создаем структуру, передаем в нее ссылку и вызываем форму. Платформа, видя параметр Ключ, автоматически считывает данные объекта из базы и заполняет форму.

Способ №2: Использование метода ОткрытьЗначение

Если вам не нужно передавать в форму дополнительные настройки (например, режим «Только просмотр» или специфические параметры заполнения), можно воспользоваться упрощенным методом ОткрытьЗначение. Посмотрим на пример, который использовал автор темы для решения своей задачи:


// Допустим, у нас есть код клиента
СсылкаНаКлиента = Справочники.Контрагенты.НайтиПоКоду(КодКлиента);

Если Не СсылкаНаКлиента.Пустая() Тогда
    ОткрытьЗначение(СсылкаНаКлиента);
КонецЕсли;

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

Способ №3: Поиск объекта перед открытием

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


// Процедура в общем модуле (Клиент)
Процедура ОткрытьКарточкуПоКоду(КодКонтрагента) Экспорт
    
    // Получаем ссылку с сервера
    СсылкаНаОбъект = ПолучитьСсылкуНаСервере(КодКонтрагента);
    
    Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        Параметры = Новый Структура("Ключ", СсылкаНаОбъект);
        ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);
    Иначе
        Сообщить("Контрагент с кодом " + КодКонтрагента + " не найден!");
    КонецЕсли;
    
КонецПроцедуры

// Функция в общем модуле (Сервер)
Функция ПолучитьСсылкуНаСервере(Код)
    Возврат Справочники.Контрагенты.НайтиПоКоду(Код);
КонецФункции

Важный нюанс: при поиске по коду будьте осторожны. В справочниках 1С коды могут дублироваться, если это разрешено настройками конфигурации. В таких случаях поиск может вернуть «не того» контрагента. Безопаснее использовать поиск по Уникальному Идентификатору (GUID).

Работа с Уникальным Идентификатором (UUID)

Если у вас есть строковое представление ссылки (например, полученное из внешней системы), вы можете превратить его в ссылку прямо на клиенте, не обращаясь к серверу лишний раз (если у вас есть тип справочника). Проанализируем пример:


// Строка UUID, полученная извне
СтрокаИдентификатор = "550e8400-e29b-41d4-a716-446655440000";
НовыйUUID = Новый УникальныйИдентификатор(СтрокаИдентификатор);

// Формируем ссылку на клиенте
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(НовыйUUID);

// Теперь открываем форму
Параметры = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);

Дополнительные параметры при открытии формы

Метод ОткрытьФорму позволяет не только открыть объект, но и сразу настроить поведение окна. Рассмотрим, какие полезные свойства можно передать вместе с ключом:

  1. ТолькоПросмотр — если передать значение Истина, пользователь сможет увидеть данные, но не сможет их изменить.
  2. ЗакрыватьПриВыборе — актуально, если форма открывается для подбора значения.
  3. ВладелецФормы — позволяет указать, какое окно является родительским для открываемого.

Пример открытия формы в режиме чтения:


Параметры = Новый Структура;
Параметры.Вставить("Ключ", СсылкаОбъекта);
Параметры.Вставить("ТолькоПросмотр", Истина);

ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);

Особенности работы в общих модулях

Для того чтобы приведенный выше код работал корректно, необходимо убедиться, что свойства общего модуля настроены правильно. Если вы пытаетесь вызвать ОткрытьФорму в модуле, где стоит только флаг Сервер, система выдаст ошибку, так как на сервере форм не существует.

Проанализируем типичную структуру вызова:

  1. Общий модуль должен иметь флаг Клиент (управляемое приложение).
  2. Если логика поиска объекта сложная (запросы к БД), она выносится в функцию этого же или другого модуля с флагом Сервер.
  3. Результат (ссылка) возвращается на клиент, где и выполняется команда открытия интерфейсного окна.

Таким образом, мы разобрали основные способы открытия форм из программного кода. Помните о магическом слове Ключ в структуре параметров — это 90% успеха при решении данной задачи.

← На главную