Ссылка на отчёт из кода 1С: навигационная, файловая и через HTTP-сервис

· 9 мин

Содержание

Получить ссылку на отчет в 1С программно можно тремя принципиально разными способами. Для пользователя внутри базы хватает навигационной ссылки вида e1cib/app/Отчет.ИмяОтчета — её строят одной строкой кода. Если нужен готовый файл, отчёт формируют на сервере, сохраняют в PDF или XLSX и отдают адрес временного хранилища. Если ссылку открывает внешняя система или человек без клиента 1С — публикуют HTTP-сервис, который по адресу /hs/... возвращает сформированный отчёт.

Выбор простой. Нужно «открыть отчёт в 1С» — навигационная ссылка. Нужно «скачать отчёт» внутри базы — временное хранилище. Нужно «отправить ссылку по почте или в чат, сайт, BI» — HTTP-сервис с токеном. Всё ниже относится к платформе 8.3 и работает в любой конфигурации: БП, ЗУП, УТ, ERP.

СпособЧто получает адресатНужен клиент 1СКогда выбирать
Навигационная ссылка e1cib/app/...Открытая форма отчётаДа (тонкий или веб-клиент)Ссылка в письме коллеге, в задаче, в рабочем столе
Адрес временного хранилищаФайл PDF/XLSXДаКнопка «Скачать» на форме своей обработки
HTTP-сервисФайл или JSON по URLНетВнешние системы, рассылки, сайт, мессенджеры
ODataДанные регистров и справочниковНетBI-системы, которые строят отчёт сами
COM-соединениеДанные или файл из внешней программыНет, но нужна платформа на WindowsСтарые интеграции, скрипты на Windows-сервере

Перед тем как писать код, посмотрите, какую ссылку платформа даёт сама. Откройте отчёт, нажмите Shift+F11 — в окне «Получить ссылку» будет строка e1cib/app/Отчет..... Ровно такую строку и нужно собрать программно.

Навигационная ссылка на отчёт встроенным языком

Навигационная ссылка — это строка, по которой платформа открывает объект. Для отчёта она состоит из префикса e1cib/app/ и полного имени объекта метаданных.

Строим ссылку по имени отчёта

&НаСервереБезКонтекста
Функция НавигационнаяСсылкаНаОтчет(ИмяОтчета)

	МетаОтчет = Метаданные.Отчеты.Найти(ИмяОтчета);
	Если МетаОтчет = Неопределено Тогда
		ВызватьИсключение СтрШаблон("Отчет %1 не найден в конфигурации", ИмяОтчета);
	КонецЕсли;

	// ПолноеИмя() вернёт строку вида "Отчет.ПродажиПоКлиентам"
	Возврат "e1cib/app/" + МетаОтчет.ПолноеИмя();

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

Открыть отчёт по такой ссылке на клиенте — ПерейтиПоНавигационнойСсылке(Ссылка). Для внешнего отчёта навигационной ссылки по имени нет: его открывают через ОткрытьФорму после подключения файла.

Полный адрес для письма или мессенджера

Строка e1cib/... работает только внутри открытого клиента. Чтобы ссылка открывалась кликом из письма, к ней добавляют адрес самой базы:

ПолныйАдрес = ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "#" + НавигационнаяСсылкаНаОтчет("ПродажиПоКлиентам");

Для базы, опубликованной на веб-сервере, получится http(s)-адрес веб-клиента. Для базы без публикации — адрес с протоколом e1c://, который поймёт установленный тонкий клиент.

Открыть отчёт сразу сформированным

Навигационная ссылка открывает пустую форму. Если отчёт нужно сразу сформировать с нужным вариантом, используйте стандартные параметры формы отчёта:

&НаКлиенте
Процедура ОткрытьОтчетПродаж(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("КлючВарианта", "Основной");
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
	ОткрытьФорму("Отчет.ПродажиПоКлиентам.Форма", ПараметрыФормы);
КонецПроцедуры

Ключ варианта смотрите в Конфигураторе: схема компоновки отчёта → вкладка «Варианты».

Ссылка на сформированный файл отчёта: временное хранилище

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

Формирование отчёта на СКД в PDF

&НаСервере
Функция СформироватьОтчетВФайл(ИмяОтчета, НачалоПериода, КонецПериода, ТипФайла) Экспорт

	Схема = Отчеты[ИмяОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки = Схема.НастройкиПоУмолчанию;
	Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоПериода);
	Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецПериода);

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);

	Процессор = Новый ПроцессорКомпоновкиДанных;
	Процессор.Инициализировать(МакетКомпоновки);

	ТабДок = Новый ТабличныйДокумент;
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДок);
	ПроцессорВывода.Вывести(Процессор);

	ИмяФайла = ПолучитьИмяВременногоФайла("tmp");
	ТабДок.Записать(ИмяФайла, ТипФайла);
	Данные = Новый ДвоичныеДанные(ИмяФайла);
	УдалитьФайлы(ИмяФайла);

	Возврат Данные;

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

Тип файла передают значением системного перечисления: ТипФайлаТабличногоДокумента.PDF, ТипФайлаТабличногоДокумента.XLSX или ТипФайлаТабличногоДокумента.HTML5.

Три момента, на которых спотыкаются:

  • 🔹 Имя макета ОсновнаяСхемаКомпоновкиДанных — типичное, но не единственное. Проверьте его в дереве отчёта в Конфигураторе.
  • 🔹 Имена параметров (НачалоПериода, Период, ДатаОтчета) берите из вкладки «Параметры» схемы. Если параметра нет, УстановитьЗначениеПараметра ничего не установит, и отчёт сформируется за весь период.
  • 🔹 Если у отчёта есть своя логика в модуле объекта (обработчик ПриКомпоновкеРезультата), голая цепочка её обойдёт. Тогда создайте объект: ОтчетОбъект = Отчеты[ИмяОтчета].Создать(); и вызовите ОтчетОбъект.СкомпоноватьРезультат(ТабДок); — обработчик сработает.

Отдаём файл пользователю

Двоичные данные кладут во временное хранилище. Функция ПоместитьВоВременноеХранилище возвращает адрес — это и есть «ссылка на файл» для клиента.

&НаСервере
Функция АдресОтчета()
	Данные = СформироватьОтчетВФайл("ПродажиПоКлиентам",
		НачалоМесяца(ТекущаяДатаСеанса()), КонецМесяца(ТекущаяДатаСеанса()),
		ТипФайлаТабличногоДокумента.PDF);
	Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура СкачатьОтчет(Команда)
	Адрес = АдресОтчета();
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Продажи.pdf");
КонецПроцедуры

ФайловаяСистемаКлиент — модуль Библиотеки стандартных подсистем, он есть в БП 3.0, ЗУП 3.1, УТ 11 и ERP. В самописной конфигурации без БСП используйте платформенные методы получения файла с сервера.

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

HTTP-сервис: ссылка на отчёт для внешних систем

Чтобы ссылку можно было открыть в браузере, отправить в Telegram или забрать скриптом, нужен HTTP-сервис. Это объект конфигурации, который отвечает на запросы по адресу http(s)://сервер/база/hs/<корневой URL>/<шаблон>.

Создаём сервис

  1. В Конфигураторе (лучше в расширении, чтобы не снимать типовую конфигурацию с поддержки) откройте ветку Общие → HTTP-сервисы и добавьте сервис.
  2. Корневой URL — например, reports.
  3. Добавьте шаблон URL /report/{name} и в нём метод GET.
  4. В свойствах метода нажмите лупу у обработчика — платформа создаст функцию в модуле сервиса.

Код обработчика

Функция ОтчетGET(Запрос)

	Разрешенные = СтрРазделить("ПродажиПоКлиентам,ОстаткиТоваров", ",");
	ИмяОтчета = Запрос.ПараметрыURL.Получить("name");
	СтрокаС = Запрос.ПараметрыЗапроса.Получить("from");
	СтрокаПо = Запрос.ПараметрыЗапроса.Получить("to");

	Если Разрешенные.Найти(ИмяОтчета) = Неопределено
		Или СтрокаС = Неопределено Или СтрокаПо = Неопределено Тогда
		Возврат Новый HTTPСервисОтвет(400);
	КонецЕсли;

	// Даты приходят как 2026-01-31
	НачалоПериода = НачалоДня(Дата(СтрЗаменить(СтрокаС, "-", "")));
	КонецПериода = КонецДня(Дата(СтрЗаменить(СтрокаПо, "-", "")));

	Данные = ОтчетыНаСервере.СформироватьОтчетВФайл(ИмяОтчета,
		НачалоПериода, КонецПериода, ТипФайлаТабличногоДокумента.PDF);

	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
	Ответ.Заголовки.Вставить("Content-Disposition", "inline; filename=report.pdf");
	Ответ.УстановитьТелоИзДвоичныхДанных(Данные);
	Возврат Ответ;

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

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

Публикуем и проверяем

Публикация: Конфигуратор, Администрирование → Публикация на веб-сервере, флажок публикации HTTP-сервисов. После этого ссылка выглядит так:

curl -u report_user:пароль -o sales.pdf \
  "https://1c.example.ru/trade/hs/reports/report/ПродажиПоКлиентам?from=2026-01-01&to=2026-01-31"

Если нужно, чтобы ссылку открывал человек без логина, делают двухшаговую схему. Первый запрос (с авторизацией) формирует файл, кладёт его в регистр сведений с полями «Токен», «Данные» (ХранилищеЗначения), «Срок действия» и возвращает адрес вида .../hs/reports/file/<токен>. Второй метод по токену отдаёт файл, пока не истёк срок.

Кто будет открывать ссылку на отчёт?

REST-доступ через OData: когда нужен не отчёт, а данные

Стандартный интерфейс OData публикуется по адресу /odata/standard.odata/. Он отдаёт справочники, документы и регистры, в том числе виртуальные таблицы остатков и оборотов. Готовый отчёт с группировками и итогами OData не формирует.

Подход подходит, когда отчёт строит внешняя сторона: Power BI, Excel, собственный сайт. Последовательность такая:

  1. При публикации включите флажок публикации стандартного интерфейса OData.
  2. Один раз выполните в базе УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектовМетаданных) — без этого объекты в интерфейс не попадут.
  3. Проверьте адрес в браузере: .../odata/standard.odata/?$format=json вернёт список доступных наборов.

Если внешней системе нужна именно «ссылка на отчёт», а не таблица данных, OData не поможет. Делайте HTTP-сервис из предыдущего раздела: он возвращает и PDF, и JSON с результатом компоновки.

Внешние компоненты, COM и расширения

Под «внешними» способами обычно понимают три вещи.

  • 🧩 Расширение конфигурации. Лучшее место для HTTP-сервиса и общего модуля формирования отчётов. Типовая остаётся на поддержке, обновления ставятся без ручного сравнения. Расширения доступны с платформы 8.3.6.
  • 🔌 COM-соединение. Внешняя программа на Windows создаёт объект V83.COMConnector, подключается к базе и вызывает экспортную функцию общего модуля, которая вернёт двоичные данные отчёта или путь к файлу. Работает только на Windows и требует установленной платформы той же версии, что и сервер.
  • 📁 Файловая система и облако. Сформированный файл можно не держать в 1С, а выгрузить в сетевую папку или в объектное хранилище через HTTPСоединение и отдать ссылку оттуда. Это снимает нагрузку с сервера 1С при частых скачиваниях.

В веб-клиенте для прямой записи файлов на диск пользователя нужно расширение для работы с файлами в браузере. Схема с временным хранилищем и СохранитьФайл обходится без него: браузер скачивает файл обычным способом.

Очистка временных файлов и устаревших ссылок

Каждый сформированный отчёт — это файл или запись в базе. Без очистки через месяц каталог временных файлов сервера разрастается на гигабайты.

  • 🧹 В функции формирования файл удаляется сразу: УдалитьФайлы(ИмяФайла) после чтения в ДвоичныеДанные.
  • 🧹 Временное хранилище привязывайте к УникальныйИдентификатор формы — данные уйдут при закрытии формы. Большие объёмы чистите явно: УдалитьИзВременногоХранилища(Адрес).
  • 🧹 Для токенов и файлов в общем каталоге заведите регламентное задание, которое раз в час удаляет просроченное.
Процедура ОчиститьСтарыеОтчеты() Экспорт

	Каталог = "D:\1C_Reports\";
	Граница = ТекущаяДата() - 24 * 3600; // старше суток

	Для Каждого Файл Из НайтиФайлы(Каталог, "*.pdf") Цикл
		Если Файл.ПолучитьВремяИзменения() < Граница Тогда
			УдалитьФайлы(Файл.ПолноеИмя);
		КонецЕсли;
	КонецЦикла;

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

Здесь ТекущаяДата() уместна: сравниваем с временем файла на том же сервере. Для записей регистра со сроком действия используйте ТекущаяДатаСеанса().

Безопасность программных ссылок на отчёты

Ссылка на отчёт — это доступ к данным. Финансовый отчёт, утёкший по пересланной ссылке, — частая история.

  • 🔐 Не публикуйте HTTP-сервис с пользователем по умолчанию в default.vrd: тогда отчёт откроет любой, кто знает адрес.
  • 🔐 Заведите отдельного пользователя ИБ с ролью только на чтение нужных отчётов. Код сервиса выполняется с его правами, ограничения доступа на уровне записей работают.
  • 🔐 Не включайте привилегированный режим в обработчике без необходимости: он отключает проверку прав.
  • 🔐 Принимайте имя отчёта только из белого списка, как в примере выше. Иначе по ссылке можно запросить любой отчёт базы.
  • 🔐 Только HTTPS. Логин и пароль в базовой авторизации без шифрования передаются открыто.
  • 🔐 Токен — Новый УникальныйИдентификатор, а не номер или дата. Срок жизни — часы, а не месяцы.
  • 🔐 Пишите выдачу в журнал регистрации через ЗаписьЖурналаРегистрации: кто, какой отчёт, за какой период.

Производительность при массовой генерации

Один отчёт за месяц формируется за секунды. Пятьсот отчётов по менеджерам в 9:00 понедельника кладут сервер.

ПроблемаЧто делать
Пользователь ждёт, интерфейс виситФормируйте в фоне: ФоновыеЗадания.Выполнить("ОтчетыНаСервере.СформироватьИСохранить", Параметры)
Одинаковые отчёты строятся десятки разКешируйте результат по ключу «отчёт + период + отбор» на 10–30 минут
Пик в начале рабочего дняФормируйте типовые отчёты ночью регламентным заданием, ссылки отдавайте на готовые файлы
Медленный отчёт сам по себеУберите лишние поля и группировки из варианта, ограничьте период, проверьте отборы по индексированным реквизитам
Много сеансов от HTTP-сервисаВ свойствах сервиса настройте повторное использование сеансов

Фоновые задания запускают пачками по 4–8 штук, а не все сразу: каждое занимает рабочий процесс и память.

Массовую генерацию сначала прогоните на копии базы. Оцените время одного отчёта и умножьте на количество — так вы поймёте, уложится ли ночное окно.

Частые вопросы

Можно ли получить навигационную ссылку на конкретный вариант отчёта?
Строка e1cib/app/ открывает отчёт с вариантом по умолчанию. Конкретный вариант надёжнее открывать через ОткрытьФорму с параметром КлючВарианта.
Почему HTTP-сервис отвечает 404?
Сервис не опубликован или в адресе ошибка. Проверьте флажок публикации HTTP-сервисов, корневой URL и шаблон: путь после /hs/ должен совпадать с ними посимвольно.
Отчёт по ссылке пустой, хотя в 1С данные есть. Почему?
У пользователя, под которым работает сервис, нет прав на данные, или ограничение доступа на уровне записей отсекает строки. Сформируйте отчёт под этим пользователем в обычном клиенте.
Можно ли отдать отчёт в Excel вместо PDF?
Да. Передайте ТипФайлаТабличногоДокумента.XLSX и замените Content-Type на application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
Работает ли это в файловой базе?
Навигационные ссылки и временное хранилище — да. HTTP-сервис и OData требуют публикации базы на веб-сервере Apache или IIS.