Работа с ссылками на документы в 1С:Предприятие — одна из самых востребованных задач при разработке интеграций, отчетов и пользовательских интерфейсов. Часто требуется не просто получить объект документа, а именно его универсальную ссылку, которую можно передать по email, использовать в API или отобразить в веб-клиенте. В этой статье разберем все актуальные способы получения ссылок — от классических методов встроенного языка до современных подходов с REST и HTTP-Сервисами.
Особенность задачи в том, что понятие "ссылка" в 1С многозначно: это может быть внутренний идентификатор для работы внутри базы, URL для веб-клиента, или универсальная ссылка для внешних систем. Мы рассмотрим все варианты с примерами кода и таблицей сравнения методов. Если вы разрабатываете интеграцию с внешними сервисами или создаете кастомный интерфейс — эта инструкция поможет избежать типичных ошибок и выбрать оптимальный подход.
Предупреждение для новичков: не путайте ссылку на документ (объект в базе) и гиперссылку (URL для веб-доступа). В толстом клиенте первые работают всегда, а вторые требуют настройки веб-сервера. Об этом — в разделе про Получение URL для веб-клиента.
1. Стандартный метод: Получение ссылки через встроенный язык
Самый простой способ — использовать метод Ссылка() объекта документа. Он возвращает внутреннюю ссылку, которую можно использовать для работы внутри 1С, но не для внешних систем.
Пример кода для получения ссылки на текущий документ:
Док = Документы.ЗаказПокупателя.НайтиПоНомеру("000000001");
Если Не Док.Пустая() Тогда
СсылкаНаДокумент = Док.Ссылка();
Сообщить("Ссылка: " + СсылкаНаДокумент.УникальныйИдентификатор());
КонецЕсли;
Ключевые моменты:
- 🔹 Метод
Ссылка()работает для любых объектов метаданных (документы, справочники, регистры). - 🔹 Возвращаемая ссылка содержит УникальныйИдентификатор (UID) — это ключевое поле для поиска объекта в базе.
- 🔹 Внутри 1С такую ссылку можно передавать между формами, использовать в запросах и сравнениях.
Если нужно получить ссылку на документ из формы, используйте свойство ЭтотОбъект.Ссылка — оно содержит текущую ссылку на объект формы.
Ограничение метода: такая ссылка не работает вне контекста 1С. Например, ее нельзя вставить в письмо или передать во внешнюю систему — она понятна только внутри платформы 1С:Предприятие.
2. Получение URL для веб-клиента
Если ваша база опубликована на веб-сервере (например, Apache или IIS с модулем 1C:Enterprise), можно сформировать прямую ссылку для открытия документа в браузере. Для этого используется системный механизм ПолучениеURLИзСсылки().
Пример кода:
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ-00001").Ссылка();
URL = ПолучениеURLИзСсылки(СсылкаНаДокумент, "", Истина);
Сообщить("URL для веб-клиента: " + URL);
Разберем параметры функции:
- 📌
СсылкаНаДокумент— внутренняя ссылка на документ (см. раздел 1). - 📌 Второй параметр — имя публикации (если пусто, берется текущая).
- 📌 Третий параметр (
Истина) — признак использованияhttps(рекомендуется для безопасности).
Что делать если функция возвращает пустую строку?
Если ПолучениеURLИзСсылки() возвращает пусто, проверьте:
1. База опубликована на веб-сервере (в конфигураторе: Администрирование → Публикация на веб-сервере).
2. У пользователя есть права на доступ к документу через веб-интерфейс.
3. В настройках веб-сервера указан корректный виртуальный каталог для 1С.
⚠️ Внимание: Если ваша база работает в файловом варианте или не опубликована на веб-сервере, этот метод вернет пустую строку. Также URL может измениться при переносе базы на другой сервер — учитывайте это при разработке интеграций.
3. Универсальный идентификатор (UID) и его применение
Каждый объект в 1С имеет уникальный идентификатор (UID) — это глобально уникальный код, который не меняется при переносе базы или реструктуризации. Его можно использовать для надежной идентификации документа в интеграциях.
Как получить UID:
Док = Документы.ПоступлениеТоваров.НайтиПоНомеру("ПТ-123");
UID = Док.УникальныйИдентификатор();
Сообщить("UID документа: " + UID); // Пример: "a1b2c3d4-5678-90ef-1234-567890abcdef"
Преимущества UID:
- 🔐 Не зависит от номера или даты документа (в отличие от
НомериДата). - 🔄 Сохраняется при выгрузке/загрузке данных через
XMLилиJSON. - 🌍 Можно использовать для синхронизации с внешними системами (например, CRM или ERP).
Как найти документ по UID:
UID = Новый УникальныйИдентификатор("a1b2c3d4-5678-90ef-1234-567890abcdef");
Док = Документы.ПоступлениеТоваров.НайтиПоUID(UID);
⚠️ Внимание: В старых версиях 1С:Предприятие 7.7 UID не поддерживался. Если вы работаете с унаследованными системами, используйте составной ключ из Номер + Дата + ТипДокумента.
4. Использование HTTP-Сервисов и REST API
Для современных интеграций оптимальный способ — использование HTTP-Сервисов или REST API. Это позволяет получать ссылки на документы в формате, понятном внешним системам (например, JSON).
Пример создания HTTP-сервиса для выдачи ссылок:
- В конфигураторе создайте новый объект
HTTPСервис(разделОбщие → HTTP-Сервисы). - Добавьте операцию
ПолучитьСсылкуНаДокументс параметрамиТипДокументаиНомер. - Реализуйте логику поиска и возврата данных:
Функция ПолучитьСсылкуНаДокумент(ТипДокумента, Номер) ЭкспортДок = Документы[ТипДокумента].НайтиПоНомеру(Номер);
Если Док.Пустая() Тогда
Возврат Новый Структура("Успех, Ошибка", Ложь, "Документ не найден");
Иначе
URL = ПолучениеURLИзСсылки(Док.Ссылка());
Возврат Новый Структура("Успех, URL, UID",
Истина,
URL,
Док.УникальныйИдентификатор());
КонецЕсли;
КонецФункции;
- Опубликуйте сервис в модуле приложения:
ПараметрыПубликации = Новый Структура();ПараметрыПубликации.Вставить("Адрес", "/hs/document/link");
ПубликоватьHTTPСервис(ПараметрыПубликации, Новый ОписаниеТипов("КаталогHTTPСервисов.МойСервисДляСсылок"));
Теперь внешняя система может отправлять GET-запрос вида:
https://ваш-сервер/1c-hs/document/link?type=ЗаказПокупателя&number=000000001
и получать ответ:
{
"Успех": true,
"URL": "https://ваш-сервер/1c-ru/ru_RU?ref=7a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d#ЗаказПокупателя/000000001",
"UID": "7a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d"
}
Создать объект HTTPСервис в конфигураторе|Добавить операцию с параметрами ТипДокумента и Номер|Реализовать логику поиска документа|Опубликовать сервис в модуле приложения|Проверить права доступа для пользователей-->
⚠️ Внимание: При публикации HTTP-сервиса убедитесь, что:
- На веб-сервере настроен
HTTPS(обязательно для безопасности!). - В настройках 1С разрешено использование
HTTP-Сервисов(параметрразрешить_вызов_внешних_веб_сервисовв файле конфигурации). - Пользователь, от имени которого работает сервис, имеет права на чтение документов.
5. Альтернативные способы: Внешние компоненты и DirectLink
Если стандартные методы не подходят (например, нужна ссылка в нетипичном формате), можно использовать внешние компоненты или библиотеку DirectLink.
Популярные решения:
| Метод | Описание | Когда использовать |
|---|---|---|
1C:DirectLink |
Библиотека для работы с 1С через COM-соединение. Позволяет получать ссылки из внешних приложений (например, C# или Python). |
Интеграция с Windows-приложениями, когда нужна высокая производительность. |
| REST API через расширение | Самостоятельная разработка REST-интерфейса с использованием расширений конфигурации. |
Если требуется гибкая логика формирования ссылок (например, с дополнительными параметрами). |
WebHooks |
Настройка уведомлений о событиях (создание/изменение документа) с передачей ссылки во внешнюю систему. | Для автоматической синхронизации (например, отправка ссылки в Telegram-бот при проведении документа). |
Пример использования DirectLink на C#:
// Подключение к базе
var connection = new V8Connection("File=C:\\Bases\\MyBase;Usr=Администратор;Pwd=;");
connection.Connect();
// Получение ссылки на документ
var docRef = connection.NewObject("ДокументСсылка.ЗаказПокупателя.000000001");
var uid = docRef.UniqueID();
var url = connection.GetURLFromReference(docRef);
⚠️ Внимание: Внешние компоненты требуют дополнительной настройки безопасности. Всегда проверяйте:
- 🔒 Права доступа к базе через
COM-соединение (настройка в1cv81c.dll). - 🛡️ Наличие антивирусного исключения для рабочего каталога 1С.
- 🔄 Совместимость версии библиотеки с вашей платформой (например, DirectLink не поддерживает 1С:Предприятие 8.3.20+ без обновления).
6. Практические примеры и типичные ошибки
Рассмотрим реальные сценарии и распространенные проблемы при работе со ссылками.
Пример 1: Получение ссылки для email-рассылки
Задача: отправить клиенту письмо со ссылкой на его заказ.
Решение:
// 1. Получаем документ
Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру("000000001");
// 2. Формируем URL для веб-клиента
URL = ПолучениеURLИзСсылки(Заказ.Ссылка(), "", Истина);
// 3. Отправляем письмо
ТекстПисьма = "Ваш заказ №" + Заказ.Номер + " от " + Формат(Заказ.Дата, "ДФ=dd.MM.yyyy") + "
Ссылка для просмотра: " + URL;
ОтправитьПисьмо("client@example.com", "Ваш заказ №" + Заказ.Номер, ТекстПисьма);
Пример 2: Интеграция с CRM через REST
Задача: передать в Bitrix24 ссылку на документ 1С при создании лида.
Решение:
// 1. Получаем UID документа
UID = Док.УникальныйИдентификатор();
// 2. Формируем JSON для API Bitrix24
ДанныеДляCRM = Новый Структура();
ДанныеДляCRM.Вставить("TITLE", "Заказ №" + Док.Номер);
ДанныеДляCRM.Вставить("SOURCE", "1С");
ДанныеДляCRM.Вставить("UF_CRM_15_DOCUMENT_UID", UID); // Поле для хранения UID
// 3. Отправляем данные
HTTPЗапрос = Новый HTTPЗапрос("https://your-bitrix24.bitrix24.ru/rest/1/abcdefghijklmnop/crm.lead.add");
HTTPЗапрос.УстановитьТелоИзСтроки(СериализоватьJSON(ДанныеДляCRM));
Ответ = Новый HTTPСоединение().Получить(HTTPЗапрос);
Типичные ошибки и решения:
- ❌ Ошибка:
ПолучениеURLИзСсылки()возвращает пусто.
Решение: Проверьте публикацию базы на веб-сервере и права пользователя. - ❌ Ошибка: Ссылка ведет на страницу авторизации.
Решение: Включите анонимный доступ или передавайте токен авторизации в URL. - ❌ Ошибка: UID не находится после выгрузки/загрузки данных.
Решение: ИспользуйтеЗагрузкаДанныхXMLс параметромЗагружатьУникальныеИдентификаторы = Истина.
Всегда проверяйте формат ссылок при интеграции с внешними системами. Например, Bitrix24 ожидает UID в формате строки без дефисов, а некоторые CRM требуют URL с токеном доступа.
7. Сравнение методов: какой выбрать?
Выбор метода зависит от задачи. Ниже таблица сравнения с рекомендациями:
| Метод | Формат ссылки | Где работает | Сложность реализации | Когда использовать |
|---|---|---|---|---|
Ссылка() |
Внутренняя ссылка 1С | Только внутри 1С | ⭐ (просто) | Работа с документами в базе, передача между формами. |
ПолучениеURLИзСсылки() |
URL для веб-клиента | Только для опубликованных баз | ⭐⭐ | Отправка ссылок по email, открытие в браузере. |
УникальныйИдентификатор() |
UID (GUID) | Любые интеграции | ⭐ | Синхронизация с внешними системами, резервное копирование. |
HTTP-Сервис |
JSON/XML с URL и UID | Для внешних систем | ⭐⭐⭐ | API для мобильных приложений, CRM, ERP. |
| DirectLink | Любой формат | Внешние Windows-приложения | ⭐⭐⭐⭐ | Высокопроизводительные интеграции с C#/Python. |
Рекомендации по выбору:
- 🔧 Для внутренних задач (отчеты, обработки) хватит
Ссылка(). - 🌐 Для веб-доступа используйте
ПолучениеURLИзСсылки(). - 🤝 Для интеграций с внешними системами оптимален
UID+HTTP-Сервис. - 🚀 Для сложных сценариев (например, реального времени) — DirectLink или
WebHooks.
FAQ: Частые вопросы по работе со ссылками
Можно ли получить ссылку на документ из мобильного приложения 1С?
Да, но с ограничениями:
- В мобильном клиенте работает
ПолучениеURLИзСсылки(), но только если база опубликована на веб-сервере. - Для офлайн-работы используйте
UID— его можно синхронизировать при следующем подключении. - В 1С:Мобильная платформа (нативные приложения) ссылки формируются через
MobileAppURL.
Как передать ссылку на документ в Telegram-бот?
Оптимальный способ:
- Создайте
HTTP-Сервис, который возвращаетUIDи краткую информацию о документе. - В боте по команде
/documentзапрашивайте у пользователя номер документа. - Отправляйте
UIDв 1С через API, получайте данные и формируйте сообщение с ссылкой.
Пример кода для бота (Python):
import requests
def get_document_link(doc_number):
response = requests.get(
f"https://your-1c-server/hs/document/link?type=ЗаказПокупателя&number={doc_number}",
auth=("user", "password")
)
return response.json()["URL"]
Почему после обновления платформы перестали работать ссылки?
Вероятные причины:
- В 1С:Предприятие 8.3.18+ изменился формат
UIDдля некоторых объектов. Проверьте актуальность методов. - При обновлении мог сброситься флаг
ПубликоватьНаВебСерверев настройках базы. - В новых версиях по умолчанию может быть отключен протокол
HTTP(требуетсяHTTPS).
Решение: проверьте настройки публикации в конфигураторе (Администрирование → Публикация на веб-сервере) и обновите код, если используете устаревшие методы (например, ПолучитьURLДокумента() вместо ПолучениеURLИзСсылки()).
Как защитить ссылки от несанкционированного доступа?
Меры безопасности:
- 🔐 Используйте
HTTPSдля всех внешних ссылок. - 🛡️ Настройте проверку прав доступа в
HTTP-Сервисе(например, по токену или IP). - 🔄 Для чувствительных данных (например, финансовые документы) генерируйте одноразовые ссылки с ограниченным временем жизни.
- 📜 Ведите лог обращений к документам через внешние ссылки (модуль
ЖурналРегистрации).
Пример кода для проверки токена:
Функция ПроверитьТокен(ЗапрошенныйТокен) Экспорт
ДопустимыеТокены = ПолучитьДопустимыеТокеныИзБазы(); // Например, из регистра сведений
Возврат ДопустимыеТокены.Найти(ЗапрошенныйТокен) <> Неопределено;
КонецФункции;
Можно ли получить ссылку на документ из отчета?
Да, для этого:
- В схеме компоновки данных отчета добавьте поле типа
Ссылка. - В настройках поля укажите выражение вида
ВЫБРАТЬ Документ.Ссылка КАК СсылкаНаДокумент. - Для вывода в
HTML/Excelиспользуйте функциюПолучениеURLИзСсылки()в обработчикеПриКомпоновкеРезультата.
Пример для вывода в Excel:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Для Каждого Строка Из ДокументРезультат.ВыбранныеСтроки Цикл
Если ТипЗнч(Строка.СсылкаНаДокумент) = Тип("СсылкаНаДокумент") Тогда
Строка.URL = ПолучениеURLИзСсылки(Строка.СсылкаНаДокумент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры;