Применение метода УстановитьСсылкуНового для управляемой формы документа

17.08.26

Разработка - Механизмы платформы 1С

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

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Конфигурация для примера
.cf 25,19Kb
7 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Возникла задача прикреплять файл счета, уже загруженный в один документ, в другой, создаваемый на основании этого. Причем в этом втором документе файл нужен даже больше и выбрать надо только один из файлов, прикрепленных к первому документу, поэтому вариант показывать файлы основания отпадает. Дробить процесс создания на основании также не хотелось, хотя сейчас понимаю, что это тоже вариант, поскольку можно перед записью заполнить состояние мЭтоНовый и после записи предлагать выбрать файл для прикрепления. Поскольку был знаком с механизмом установки ссылки нового, решил действовать по этому сценарию, однако оказалось, что стандартные процедуры ЗначениеВРеквизитФормы и РеквизитФормыВЗначение не дают инструментов для работы с ссылкой нового! Но путем чтения форумов и экспериментов решение таки нашлось и очень простое!

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

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

Итак, РеквизитФормыВЗначение и ЗначениеВРеквизитФормы не передают ссылку нового, в том числе проверял сценарий с установкой ссылки нового в Обработке Заполнения, также не подхватывается при сохранении. Значит, нужно добавить реквизиты формы и использовать уже его:

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

Таким образом, реквизит будет того же типа, что и рассматриваемый документ.

Далее, в случае необходимости, то есть когда нужно прикреплять файл, мы присваиваем этому реквизиту значение в соответствии с типом документа / справочника:

&НаСервере
Функция УстановитьСсылкуНового()
	Если ЭтаФорма["СсылкаНового"].Пустая() Тогда
		ЭтаФорма["СсылкаНового"] = Документы.СчетНаОплату.ПолучитьСсылку(Новый УникальныйИдентификатор);
	КонецЕсли;
КонецФункции

При записи присоединенного файла в качестве объекта используем не Объект.Ссылка, а реквизит СсылкаНового:

&НаСервере
Процедура ПеренестиФайлИзОснования(Знач ВыбранныйФайл)
	
	ПрисоединенныйФайл = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
	ПрисоединенныйФайл.Наименование = ВыбранныйФайл.Наименование;
	ПрисоединенныйФайл.Объект = ?(Объект.Ссылка.Пустая(), ЭтаФорма["СсылкаНового"], Объект.Ссылка);
	ПрисоединенныйФайл.ИмяФайла = ВыбранныйФайл.ИмяФайла;
	ПрисоединенныйФайл.Хранилище = ВыбранныйФайл.Хранилище;
	ПрисоединенныйФайл.Записать();

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

А теперь главное, что почерпнуто из форумов: полученную ссылку нового нужно присвоить в событии ПередЗаписьюНаСервере:

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	// +++ Этот код только для проверки текущего релиза 1С - вдруг поправили, в основном не нужен
	СсылкаНового = ТекущийОбъект.ПолучитьСсылкуНового();
	Если Не СсылкаНового.Пустая() Тогда
		Сообщить("Ух-ты! В вашем релизе что-то работает по другому, ПолучитьСсылкуНового работает!");
	КонецЕсли;
	// ---
	Если ТекущийОбъект.ЭтоНовый() И Не ЭтаФорма["СсылкаНового"].Пустая() Тогда
		ТекущийОбъект.УстановитьСсылкуНового(ЭтаФорма["СсылкаНового"]);
	КонецЕсли;
КонецПроцедуры

Тогда записанный объект наконец-таки получит подобранную ранее ссылку!

Ну и чтобы не хранить прикрепленные файлы без записанного владельца, при закрытии удаляем запись о файле, если документ так и не был записан:

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	Если Объект.Ссылка.Пустая() И Не ЭтаФорма["СсылкаНового"].Пустая() Тогда
		Если ЗавершениеРаботы Тогда
			Отказ = Истина;
			ТекстПредупреждения = "Сперва сохраните или закройте указанный счет";
			Активизировать();
		Иначе		
			УдалитьПрисоединенныйФайл();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УдалитьПрисоединенныйФайл()

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПрисоединенныеФайлы.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
		|ГДЕ
		|	ПрисоединенныеФайлы.Объект = &СсылкаНового";
	
	Запрос.УстановитьПараметр("СсылкаНового", ЭтаФорма["СсылкаНового"]);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	УстановитьПривилегированныйРежим(Истина);
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ПрисоединенныйФайл = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
		ПрисоединенныйФайл.ОбменДанными.Загрузка = Истина;
		ПрисоединенныйФайл.Удалить();
	КонецЦикла;
	
КонецПроцедуры

Обратите внимание! В том, что касается конфигурации для примера, то там два типа документов и один справочник (присоединенные файлы). Чтобы испытать пример, нужно создать служебную записку и прикрепить к ней два и более PDF-файлов, а затем на основании этой служебки сделать счет на оплату. Чтобы исключить неизбежные ошибки при просмотре приложенного к счету pdf, использую не встроенный просмотрщик, а основанный на библиотеке pdf.js, выцарапанный у ИИ. В интернете есть статьи с полноценным просмотром pdf на той же библиотеке, но они работают помедленней.

Ну и, в конце, мне интересно ваше мнение, какое утверждение Вы считаете правильным:

1. Все время так делаю, стоило ли статью писать?

2. Ух-ты! Так это все-таки возможно!

3. Все это неправильно, нужно переносить выбор присоединенного счета в событие ПослеЗаписи! Иначе при завершении работы может остаться хвост.

4. Другое (в комментарии)

Вступайте в нашу телеграмм-группу Инфостарт

УстановитьСсылкуНового ПолучитьСсылкуНового ПолучитьСсылку Управляемые формы Присоединенный файл

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    42301    TitanLuchs    109    

152

Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)

Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.

19.06.2025    16039    zeegin    15    

61

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    23998    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    30213    user2122906    10    

67

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    50456    user2122906    12    

63

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    43115    dsdred    108    

155

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    37780    bayselonarrend    22    

179
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 13 17.08.26 13:10 Сейчас в теме
Обычно делают наоборот конечно. В конце, когда запись уже идет, дозаписывают еще и связанную информацию. Можно же в данных формы хранить ссылку на файл и обработать ее.
2. n_mezentsev 134 17.08.26 16:46 Сейчас в теме
В принципе я согласен, что нет ничего плохого в том, чтобы прикреплять уже после записи, когда пользователь только собирается подгружать счет, а мы ему готовенький показываем, но сам факт, что можно обойти это, меня лично вдохновляет. Ведь так можно отнестись к скану как к части заполнения на основании, то есть подтягиваем все, что можно сразу)
У вас третий вариант, понятно)
Для отправки сообщения требуется регистрация/авторизация