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

Тип ДокументСсылка представляет собой уникальный идентификатор объекта, который существует независимо от самого объекта. В отличие от полноценного объекта документа, ссылка занимает значительно меньше памяти и загружается мгновенно. Понимание механики работы со ссылками критически важно для оптимизации производительности сложных конфигураций и правильной организации межобъектных связей.

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

Природа типа ДокументСсылка и его отличия от Объекта

В архитектуре 1С:Предприятие каждый документ имеет две основные формы представления: как объект метаданных и как ссылку на этот объект. Когда вы открываете форму документа и работаете с его реквизитами, вы имеете дело с объектом. Однако, когда этот документ записывается в базу, он получает уникальный идентификатор, который и является ДокументСсылка.

Ссылка обладает собственным набором свойств и методов, отличным от объекта. Она «легковесна» и не требует загрузки табличных частей или сложных вычисляемых полей при обращении к ней. Это делает тип ДокументСсылка.СчетФактураВыданный идеальным кандидатом для хранения в регистрах сведений, где не требуется полная информация о документе, а нужен только факт его существования.

Важно отметить, что ссылка является неизменяемым типом данных после создания. Вы не можете изменить номер или дату документа, имея только ссылку — для этого необходимо получить полный объект. Однако вы можете получить важные служебные данные, такие как уникальный идентификатор (UUID), напрямую из ссылки без лишних затрат ресурсов системы.

💡

Используйте тип ссылки вместо полного объекта в циклах обработки больших массивов данных — это ускорит выполнение кода в разы за счет отсутствия загрузки лишних данных из базы.

Разработчики часто путают концепции, пытаясь вызвать методы записи у ссылки. Запомните: ДокументСсылка — это указатель, а не сам документ. Операции модификации данных доступны только после получения объекта через метод ПолучитьОбъект().

Получение ссылки из существующего объекта документа

Самая распространенная задача в программировании — получить ссылку на документ, который уже открыт в форме или создан в коде. Если у вас есть переменная, содержащая объект документа, получение ссылки осуществляется тривиально через обращение к свойству Ссылка.

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

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Дата = ТекущаяДата();

НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

// Записываем документ в базу

НовыйДокумент.Записать();

// Получаем ссылку сразу после записи

СсылкаНаДокумент = НовыйДокумент.Ссылка;

После выполнения метода Записать() объекту присваивается уникальный идентификатор, и свойство Ссылка становится валидным. До момента записи ссылка может существовать только в виде временного объекта с неопределенным UUID, что может вызвать ошибки при попытке использовать её в запросах к базе данных.

☑️ Алгоритм безопасного получения ссылки

Выполнено: 0 / 4

Существует также ситуация, когда документ уже записан в базе, и вам нужно получить на него ссылку по номеру. В этом случае используется метод НайтиПоНомеру, который сразу возвращает объект типа ДокументСсылка, экономя ресурсы на загрузку полного объекта.

Создание новой ссылки программным способом

Иногда возникает необходимость сгенерировать ссылку на документ, который еще не существует, или сослаться на документ из внешней системы. Платформа предоставляет конструкторы для создания новых экземпляров типа ДокументСсылка. Это полезно при формировании структур данных перед массовой загрузкой товаров или документов.

Для создания новой ссылки используется метод НоваяСсылка() у менеджера документов. Этот метод генерирует новый уникальный идентификатор (UUID), но сам документ в базе данных при этом не создается. Вы получаете «пустую» ссылку, которую можно передать в другие подсистемы.

МенеджерДокументов = Документы.ЗаказКлиента;

// Создаем новую пустую ссылку

НоваяСсылка = МенеджерДокументов.НоваяСсылка();

// Теперь переменная НоваяСсылка имеет тип ДокументСсылка.ЗаказКлиента

Такой подход часто применяется в механизмах обмена данными, когда нужно заранее зарезервировать идентификаторы или построить иерархию ссылок перед фактической записью объектов. Важно понимать, что попытка получить реквизиты (например, номер или дату) у такой «новой» ссылки вернет значения по умолчанию или пустые строки.

Особенности работы с новыми ссылками

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

Также стоит упомянуть возможность создания ссылки из строкового представления UUID, если вы работаете с внешними базами данных или файлами выгрузки. Однако это требует осторожности, так как формат строки должен строго соответствовать внутреннему представлению GUID в .

Преобразование ссылки в строку и URL для веб-клиента

В современных веб-ориентированных интерфейсах 1С:Предприятие часто требуется сформировать прямую ссылку на документ, которую можно открыть в браузере или отправить пользователю в мессенджере. Тип ДокументСсылка предоставляет для этого специальные методы, зависящие от контекста выполнения.

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

Метод Возвращаемое значение Область применения
Ссылка.УникальныйИдентификатор() Строка (GUID) Внутренний обмен, ключи в регистрах
Ссылка.ПолучитьНавигационнуюСсылку() Строка (URL) Веб-клиент, внешние интеграции
Строка(Ссылка) Строка (Представление) Отображение в отчетах (номер и дата)

Метод ПолучитьНавигационнуюСсылку() формирует строку вида v8:1c:enterprise://... или HTTP-ссылку в зависимости от настроек публикации веб-сервера. Это позволяет пользователю кликнуть по ссылке в письме и сразу попасть в карточку нужного документа в тонком клиенте или браузере.

📊 Какой формат ссылки вы чаще всего используете в интеграции?
UUID (GUID)
Навигационная ссылка (URL)
Строковое представление (Номер)
Ссылка на форму списка

При формировании навигационных ссылок учитывайте, что они могут содержать параметры авторизации или требовать определенной конфигурации IIS или Apache веб-сервера для корректной обработки протокола v8. В некоторых случаях проще сформировать обычную HTTP-ссылку на веб-клиент с параметрами открытия формы.

Использование ссылок в запросах и отчетах

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

В тексте запроса вы можете напрямую обращаться к полям ссылки, таким как Ссылка, ЭтоГруппа (для справочников) или ПометкаУдаления. Это позволяет фильтровать данные на стороне СУБД, не выгружая лишние записи в память приложения.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацииТоваровУслуг.Ссылка КАК Ссылка,

| РеализацииТоваровУслуг.Контрагент КАК Контрагент,

| РеализацииТоваровУслуг.СуммаДокумента КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацииТоваровУслуг

|ГДЕ

| РеализацииТоваровУслуг.Проведен = ИСТИНА";

Результат = Запрос.Выполнить();

Обратите внимание на выборку поля Ссылка. В результате выполнения запроса вы получите набор значений типа ДокументСсылка.РеализацияТоваровУслуг. Эти значения можно сразу использовать для открытия форм или передачи в другие процедуры обработки.

⚠️ Внимание: При использовании ссылок в запросах избегайте неявных преобразований типов. Если поле в базе имеет тип СправочникСсылка, а вы сравниваете его со строкой, запрос может не использовать индексы, что приведет к полному сканированию таблицы и тормозам системы.

Также в запросах удобно использовать псевдонимы для ссылок, чтобы код оставался читаемым. Ссылки в запросах ведут себя как скалярные величины, что позволяет сортировать по ним или группировать документы по контрагентам, используя ссылку на справочник.

Обработка ошибок и проверка валидности ссылок

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

Перед использованием ссылки, особенно полученной из внешнего источника или хранилища настроек, рекомендуется проверить её валидность. Самый надежный способ — попытаться получить объект или проверить существование записи в базе через запрос.

Если вы пытаетесь открыть форму по ссылке, используйте конструкцию Попытка...Исключение. Это позволит корректно обработать ситуацию, когда документ был удален, и сообщить пользователю об этом, вместо показа системного окна ошибки.

Попытка

ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();

Если ОбъектДокумента = Неопределено Тогда

Сообщить("Документ не найден в базе данных или удален.");

КонецЕсли;

Исключение

Сообщить("Ошибка при получении объекта: " + ОписаниеОшибки());

КонецПопытки;

💡

Всегда проверяйте существование объекта по ссылке перед попыткой чтения его реквизитов, особенно если ссылка хранилась долгое время или пришла из внешней системы.

Также существует метод Пустая(), который позволяет проверить, не является ли ссылка пустой (неинициализированной). Пустая ссылка не указывает ни на какой объект и часто используется как значение по умолчанию в переменных типа ДокументСсылка.

⚠️ Внимание: Интерфейс и доступные методы работы со ссылками могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие 8 и режима совместимости конфигурации. Всегда сверяйте синтаксис с актуальной синтаксической справкой вашей версии платформы, особенно при миграции со старых релизов.

Часто задаваемые вопросы (FAQ)

Как получить ссылку на текущий документ из формы?

В модуле формы документа ссылка на текущий открываемый объект доступна через предопределенную переменную Объект.Ссылка. Если форма еще не записана, ссылка может быть временной. Для гарантированного получения ссылки используйте событие ПриЗаписиНаСервере или вызовите метод Записать() перед обращением к свойству.

Можно ли изменить номер документа, имея только ссылку?

Нет, тип ДокументСсылка неизменяем. Он содержит только идентификатор. Чтобы изменить номер, дату или другие реквизиты, необходимо получить полный объект документа методом ПолучитьОбъект(), внести изменения и вызвать метод Записать(). После этого ссылка останется той же (UUID не меняется), но данные в базе обновятся.

В чем разница между ДокументСсылка и ДокументОбъект?

ДокументСсылка — это легкий указатель на запись в базе (содержит только UUID и тип). ДокументОбъект — это полноценный объект в памяти, содержащий все реквизиты, табличные части и логику проведения. Ссылка загружается мгновенно, объект требует запроса данных из БД. Ссылку можно превратить в объект, но не наоборот без потери данных.

Как передать ссылку на документ во внешнюю обработку?

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

Что вернет метод Пустая() для новой ссылки?

Метод Пустая() вернет Истина только если ссылка не инициализирована (создана через Новый ДокументСсылка... без параметров или является значением по умолчанию). Ссылка, созданная через Менеджер.НоваяСсылка(), уже имеет UUID и метод Пустая() вернет для неё Ложь, хотя сам документ в базе еще не существует.