При разработке в среде 1С:Предприятие 8.3 часто возникает задача программного открытия карточки объекта (например, контрагента, номенклатуры или договора). Казалось бы, процедура стандартная, но начинающие разработчики часто сталкиваются с тем, что вместо открытия уже существующей записи в базе данных система упорно предлагает создать новую. Рассмотрим подробнее, почему так происходит, и разберем по шагам правильные способы реализации этой задачи из общего модуля.
Проанализируем ситуацию: когда мы используем метод ОткрытьФорму, платформа ожидает от нас указания на то, какой именно объект мы хотим увидеть. Если мы просто передаем путь к форме, например, Справочники.Контрагенты.ФормаЭлемента, система считает, что мы инициируем создание нового объекта. Чтобы «объяснить» платформе, что нам нужен конкретный контрагент, необходимо передать в параметрах его уникальный идентификатор — ссылку.
Главная техническая тонкость здесь заключается в названии ключа в структуре параметров. Платформа жестко зарезервировала слово Ключ для этих целей. Если вы назовете параметр Ссылка, Объект или как-то иначе, система проигнорирует его и откроет пустую форму.
Этот метод является наиболее гибким и правильным с точки зрения архитектуры управляемого приложения. Разберем пример кода, который можно разместить в общем модуле (обязательно с флагом Клиент).
Предположим, у нас уже есть переменная СсылкаНаКонтрагента. Выясним причину, по которой код может не срабатывать, и напишем верный вариант:
// Параметры открытия формы
ПараметрыВыбора = Новый Структура;
// КРИТИЧЕСКИ ВАЖНО: имя ключа должно быть именно "Ключ"
ПараметрыВыбора.Вставить("Ключ", СсылкаНаКонтрагента);
// Вызываем открытие основной формы элемента справочника
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", ПараметрыВыбора);
В этом примере мы создаем структуру, передаем в нее ссылку и вызываем форму. Платформа, видя параметр Ключ, автоматически считывает данные объекта из базы и заполняет форму.
Если вам не нужно передавать в форму дополнительные настройки (например, режим «Только просмотр» или специфические параметры заполнения), можно воспользоваться упрощенным методом ОткрытьЗначение. Посмотрим на пример, который использовал автор темы для решения своей задачи:
// Допустим, у нас есть код клиента
СсылкаНаКлиента = Справочники.Контрагенты.НайтиПоКоду(КодКлиента);
Если Не СсылкаНаКлиента.Пустая() Тогда
ОткрытьЗначение(СсылкаНаКлиента);
КонецЕсли;
Метод ОткрытьЗначение удобен тем, что он самостоятельно определяет, какую форму нужно открыть для данного типа данных. Однако стоит помнить, что в современном веб-клиенте или при работе в мобильном приложении более предпочтительным является асинхронный аналог — ПоказатьЗначение.
Часто в общий модуль передается не сама ссылка, а некий идентификатор: код, артикул или ИНН. В этом случае нам сначала нужно получить ссылку на сервере, а затем открыть ее на клиенте. Рассмотрим совместную работу клиентской и серверной части:
// Процедура в общем модуле (Клиент)
Процедура ОткрытьКарточкуПоКоду(КодКонтрагента) Экспорт
// Получаем ссылку с сервера
СсылкаНаОбъект = ПолучитьСсылкуНаСервере(КодКонтрагента);
Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Параметры = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);
Иначе
Сообщить("Контрагент с кодом " + КодКонтрагента + " не найден!");
КонецЕсли;
КонецПроцедуры
// Функция в общем модуле (Сервер)
Функция ПолучитьСсылкуНаСервере(Код)
Возврат Справочники.Контрагенты.НайтиПоКоду(Код);
КонецФункции
Важный нюанс: при поиске по коду будьте осторожны. В справочниках 1С коды могут дублироваться, если это разрешено настройками конфигурации. В таких случаях поиск может вернуть «не того» контрагента. Безопаснее использовать поиск по Уникальному Идентификатору (GUID).
Если у вас есть строковое представление ссылки (например, полученное из внешней системы), вы можете превратить его в ссылку прямо на клиенте, не обращаясь к серверу лишний раз (если у вас есть тип справочника). Проанализируем пример:
// Строка UUID, полученная извне
СтрокаИдентификатор = "550e8400-e29b-41d4-a716-446655440000";
НовыйUUID = Новый УникальныйИдентификатор(СтрокаИдентификатор);
// Формируем ссылку на клиенте
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(НовыйUUID);
// Теперь открываем форму
Параметры = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);
Метод ОткрытьФорму позволяет не только открыть объект, но и сразу настроить поведение окна. Рассмотрим, какие полезные свойства можно передать вместе с ключом:
Истина, пользователь сможет увидеть данные, но не сможет их изменить.Пример открытия формы в режиме чтения:
Параметры = Новый Структура;
Параметры.Вставить("Ключ", СсылкаОбъекта);
Параметры.Вставить("ТолькоПросмотр", Истина);
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);
Для того чтобы приведенный выше код работал корректно, необходимо убедиться, что свойства общего модуля настроены правильно. Если вы пытаетесь вызвать ОткрытьФорму в модуле, где стоит только флаг Сервер, система выдаст ошибку, так как на сервере форм не существует.
Проанализируем типичную структуру вызова:
Таким образом, мы разобрали основные способы открытия форм из программного кода. Помните о магическом слове Ключ в структуре параметров — это 90% успеха при решении данной задачи.