Работа с ссылками на документы в 1С:Предприятие 8.3 — одна из самых частых задач как для разработчиков, так и для опытных пользователей. Без корректной ссылки невозможно организовать обмен данными, построить отчеты с детализацией или автоматизировать бизнес-процессы. Однако не все знают, что в платформе существует несколько способов получить ссылку на текущий документ — от простых встроенных методов до программного кода с использованием ЭтоЗначение() или ТекущийДокумент().

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

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

1. Стандартный способ: метод "Ссылка" в формах документов

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

В управляемых формах ссылка на документ хранится в свойстве Объект формы. Чтобы ее получить, достаточно вызвать:

ТекущаяСсылка = ЭтотОбъект.Ссылка;

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

  • 📌 Работает в: управляемых и обычных формах
  • Ограничение: для новых документов вернет Неопределено до первой записи
  • 🔧 Применимо: в обработчиках событий формы (например, ПриЗаписи)
💡

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

2. Программное получение ссылки через "ЭтоЗначение()"

Функция ЭтоЗначение() — универсальный инструмент для получения текущего значения в контексте выполнения кода. В случае с документами она возвращает объект документа, из которого можно извлечь ссылку. Этот метод особенно полезен в серверных процедурах или когда работа ведется не напрямую с формой, а с данными документа.

Пример кода для управляемой формы:

ТекущийДокумент = ЭтоЗначение();

ТекущаяСсылка = ТекущийДокумент.Ссылка;

Важный нюанс: ЭтоЗначение() работает только в контексте документа. Если вы пытаетесь вызвать эту функцию в общем модуле или обработке, она вернет Неопределено. Также она не сработает в фоновых заданиях или при программном создании документов через Документы.Имя.СоздатьДокумент().

Контекст ЭтоЗначение() работает? Примечание
Обработчик формы документа ✅ Да Возвращает объект текущего документа
Серверная процедура модуля документа ✅ Да Требует передачи параметра Объект
Общий модуль ❌ Нет Вернет Неопределено
Обработка (внешняя) ❌ Нет Нужно передавать ссылку явно
💡

Функция ЭтоЗначение() — самый надежный способ получить объект документа в его собственном модуле, но бесполезна вне контекста документа.

3. Использование "ТекущийДокумент()" в управляемых формах

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

Пример использования:

ТекущийДок = ТекущийДокумент();

Если ТекущийДок = Неопределено Тогда

Сообщить("Документ не найден!");

Иначе

СсылкаНаДок = ТекущийДок.Ссылка;

КонецЕсли;

Особенности метода:

  • 🔹 Работает только в управляемых формах (в обычных формах вызовет ошибку).
  • 🔹 Возвращает Неопределено, если форма не связана с документом (например, форма справочника или отчета).
  • 🔹 Не требует указания типа документа — определяет его автоматически.
📊 Какой способ получения ссылки вы используете чаще?
Метод "Ссылка" в форме
ЭтоЗначение()
ТекущийДокумент()
Другой способ

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

4. Получение ссылки в обработчиках событий (ПриЗаписи, ПередЗаписью)

Если вам нужно получить ссылку на документ в момент его записи, удобнее всего использовать обработчики событий ПриЗаписи или ПередЗаписью. В этих контекстах объект документа уже доступен через параметр Объект, и его ссылку можно получить напрямую.

Пример для управляемой формы:

&НаКлиенте

Процедура ПриЗаписи(Отказ, ПараметрыЗаписи)

ТекущаяСсылка = Объект.Ссылка;

// Дальнейшая логика работы со ссылкой

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

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

  • 📝 В ПередЗаписью ссылка может быть еще неактуальной (если документ новый).
  • 📝 В ПриЗаписи ссылка гарантированно доступна, но документ уже записан в базу.
  • 📝 Если запись отменяется (Отказ = Истина), ссылка может стать невалидной.
Что делать, если ссылка нужна до записи документа?

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

НовыйДок = Документы.ЗаказПокупателя.СоздатьДокумент();

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

НовыйДок.Номер = ""; // Пустой номер для нового документа

БудущаяСсылка = НовыйДок.Ссылка; // Ссылка с временным УИД

После записи реальная ссылка будет отличаться, но временный УИД позволит однозначно идентифицировать документ в текущей сессии.

Этот подход часто используется для автоматического создания связанных документов (например, счета на оплату при проведении заказа) или для логирования изменений.

5. Альтернативные методы: через запрос или программное создание

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

1. Получение ссылки через запрос

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

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

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

"ВЫБРАТЬ

| Ссылка КАК СсылкаНаДокумент

|ИЗ

| Документ.ЗаказПокупателя

|ГДЕ

| Номер = &Номер

| И Дата = &Дата";

Запрос.УстановитьПараметр("Номер", "000123");

Запрос.УстановитьПараметр("Дата", '2026-05-15');

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

СсылкаНаДок = Результат.Выгрузить()[0].СсылкаНаДокумент;

2. Программное создание документа со ссылкой

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

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

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

ВременнаяСсылка = НовыйДок.Ссылка; // Ссылка с временным УИД

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

ПостояннаяСсылка = НовыйДок.Ссылка; // Теперь ссылка с реальным УИД

🔍 Убедитесь, что документ записан в базу (для новых документов)

🔍 Проверьте, что ссылка не равна Неопределено

🔍 Если используете запрос, добавьте обработку случая, когда документ не найден

🔍 Для распределенных баз учтите, что УИД может отличаться в разных узлах

-->

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

6. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе со ссылками на документы. Вот самые распространенные ошибки и способы их решения:

1. Ошибка "Объект не найден" при использовании ЭтоЗначение()

Причина: вызов функции вне контекста документа (например, в общем модуле).

Решение: передавайте объект документа явным параметром или используйте ТекущийДокумент() в формах.

2. Ссылка возвращает Неопределено для нового документа

Причина: документ еще не записан в базу, и платформа не может сформировать постоянную ссылку.

Решение: используйте временную ссылку с УИД или запишите документ перед получением ссылки.

3. Несовпадение ссылок в распределенной базе

Причина: в разных узлах РИБ один и тот же документ может иметь разные УИД.

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

💡

Чтобы избежать проблем с ссылками в распределенных базах, настройте обмен данными с использованием регистра сведений "СоответствиеОбъектов". Это позволит сопоставлять объекты между узлами по уникальным признакам (номер+дата).

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

7. Практические примеры для типовых конфигураций

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

1. 1С:Бухгалтерия 8.3

В документе "Поступление (акты, накладные)" ссылку можно получить в обработчике ПриПроведении:

&НаСервере

Процедура ПриПроведении(Отказ, РежимПроведения)

ТекущаяСсылка = Объект.Ссылка;

// Пример: создание связанного документа "Счет-фактура"

НовыйСчетФактура = Документы.СчетФактураВыданный.СоздатьДокумент();

НовыйСчетФактура.Основание = ТекущаяСсылка;

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

2. 1С:Управление торговлей 11

В документе "Заказ клиента" для получения ссылки в модуле объекта:

&НаСервере

Функция ПолучитьСсылкуНаЗаказ()

Возврат ЭтотОбъект.Ссылка;

КонецФункции

3. 1С:Зарплата и управление персоналом 3.1

В документе "Начисление зарплаты" ссылку удобно получать через ЭтоЗначение() в обработчике формы:

&НаКлиенте

Процедура КнопкаВыполнитьНажатие(Кнопка)

ТекущийДок = ЭтоЗначение();

Сообщить("Ссылка: " + ТекущийДок.Ссылка);

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

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

FAQ: Частые вопросы по работе со ссылками

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

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

// В модуле документа:

Параметры = Новый Структура("СсылкаНаДок", ЭтотОбъект.Ссылка);

Обработки.ВнешняяОбработка.Выполнить(Параметры);

// В обработке:

Функция Выполнить(Параметры)

Ссылка = Параметры.СсылкаНаДок;

// Дальнейшая логика

КонецФункции

Почему ТекущийДокумент() возвращает Неопределено?

Это происходит в двух случаях:

  1. Форма не связана с документом (например, это форма справочника или отчета).
  2. Код выполняется не в контексте формы (например, в общем модуле или фоновом задании).

Проверьте тип текущей формы с помощью ТипЗнч(ЭтотОбъект).

Можно ли получить ссылку на документ по его номеру без даты?

Технически можно, но крайне не рекомендуется. Номера документов в 1С не уникальны — они повторяются каждый год. Правильный подход:

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1

| Ссылка КАК СсылкаНаДокумент

|ИЗ

| Документ.ЗаказПокупателя

|ГДЕ

| Номер = &Номер

|УПОРЯДОЧИТЬ ПО

| Дата УБЫВ";

Запрос.УстановитьПараметр("Номер", "000123");

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

Этот запрос вернет самый свежий документ с указанным номером.

Как передать ссылку на документ в HTTP-запрос?

Ссылки в 1С имеют бинарный формат, поэтому для передачи в HTTP или JSON их нужно конвертировать в строку. Используйте:

СтрокаСсылки = Строка(Объект.Ссылка.УникальныйИдентификатор());

// Или для полного представления:

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

Для обратного преобразования:

УИД = Новый УникальныйИдентификатор(СтрокаУИД);

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

Что делать, если ссылка стала невалидной после обновления конфигурации?

Это типичная проблема при изменении структуры метаданных. Решения:

  • Используйте поиск по уникальным реквизитам (номер+дата+контрагент).
  • Настройте обработку соответствия объектов в правилах обмена.
  • Для критичных данных создайте регистр сведений с сопоставлением старых и новых ссылок.