Ссылка на отчёт из кода 1С: навигационная, файловая и через HTTP-сервис
Содержание
Получить ссылку на отчет в 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>/<шаблон>.
Создаём сервис
- В Конфигураторе (лучше в расширении, чтобы не снимать типовую конфигурацию
с поддержки) откройте ветку
Общие → HTTP-сервисыи добавьте сервис. - Корневой URL — например,
reports. - Добавьте шаблон URL
/report/{name}и в нём методGET. - В свойствах метода нажмите лупу у обработчика — платформа создаст функцию в модуле сервиса.
Код обработчика
Функция Отчет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, собственный сайт. Последовательность такая:
- При публикации включите флажок публикации стандартного интерфейса OData.
- Один раз выполните в базе
УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектовМетаданных)— без этого объекты в интерфейс не попадут. - Проверьте адрес в браузере:
.../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?
/hs/ должен совпадать с ними посимвольно.Отчёт по ссылке пустой, хотя в 1С данные есть. Почему?
Можно ли отдать отчёт в Excel вместо PDF?
ТипФайлаТабличногоДокумента.XLSX и замените Content-Type на application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.