Как открыть форму нового элемента справочника с заданным УИД до его записи в 1С

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

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

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

Почему стандартные подходы не работают в управляемых формах

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

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

Решение: Передача УИД через параметры формы и обработка события «ПередЗаписьюНаСервере»

Чтобы гарантированно сохранить требуемый УИД при интерактивной записи элемента из формы, разберем корректный алгоритм решения:

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

Рассмотрим реализацию на примере кода.

Шаг 1. Вызов открытия формы из обработки или внешнего модуля:


&НаКлиенте
Процедура СоздатьНоменклатуруСЗаданнымУИД(УИДСтрока)

	// Формируем уникальный идентификатор и соответствующую ему ссылку
	НовыйУИД = Новый УникальныйИдентификатор(УИДСтрока);
	НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйУИД);

	// Подготавливаем структуру параметров для формы
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("СсылкаНового", НоваяСсылка);

	// Открываем форму нового элемента
	ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыОткрытия);

КонецПроцедуры

Шаг 2. Обработка события в модуле формы справочника (Справочник.Номенклатура.ФормаОбъекта):


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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

КонецПроцедуры

Альтернативные варианты решения

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

  1. Предварительное создание объекта-черновика: Создаем элемент справочника на сервере с помощью метода УстановитьСсылкуНового() и сразу записываем его в базу данных (Объект.Записать()). После этого открываем форму уже записанного объекта через параметр Ключ. Если пользователь отменяет редактирование или закрывает форму без сохранения, созданный черновик можно помечать на удаление или физически удалять из базы.
  2. Использование регистра сведений (соответствие объектов): В сложных сценариях синхронизации нет обязательной необходимости делать УИД объектов идентичными. Стандартным подходом является сохранение связи между УИД сторонней системы и ссылкой локальной базы в специальном регистре сведений (по аналогии с механизмами Библиотеки Стандартных Подсистем). При этом объект создается с новым случайным УИД, а пара идентификаторов фиксируется в регистре.
← На главную