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