Работа с ссылками на документы в 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С не уникальны — они повторяются каждый год. Правильный подход:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Ссылка КАК СсылкаНаДокумент
|ИЗ
| Документ.ЗаказПокупателя
|ГДЕ
| Номер = &Номер
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
Запрос.УстановитьПараметр("Номер", "000123");
Результат = Запрос.Выполнить();
Этот запрос вернет самый свежий документ с указанным номером.
Как передать ссылку на документ в HTTP-запрос?
Ссылки в 1С имеют бинарный формат, поэтому для передачи в HTTP или JSON их нужно конвертировать в строку. Используйте:
СтрокаСсылки = Строка(Объект.Ссылка.УникальныйИдентификатор());
// Или для полного представления:
СтрокаСсылки = Объект.Ссылка.ПолучитьСтроку();
Для обратного преобразования:
УИД = Новый УникальныйИдентификатор(СтрокаУИД);
Ссылка = СсылкаНаОбъект.ПолучитьСсылку(УИД);
Что делать, если ссылка стала невалидной после обновления конфигурации?
Это типичная проблема при изменении структуры метаданных. Решения:
- Используйте поиск по уникальным реквизитам (номер+дата+контрагент).
- Настройте обработку соответствия объектов в правилах обмена.
- Для критичных данных создайте регистр сведений с сопоставлением старых и новых ссылок.