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

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

Что такое внешний отчет в 1С и зачем он нужен

Внешний отчет — это отдельный файл с расширением .erf (для обычных форм) или .epf (для управляемых форм), который подключается к базе как дополнительный модуль. Его ключевые преимущества:

  • 🔄 Независимость от конфигурации: можно обновлять типовую базу без потери кастомизированных отчетов.
  • 📊 Гибкость настроек: поддержка динамических параметров, пользовательских полей и сложных вычислений.
  • 🔗 Интеграция: выгрузка данных в XML, JSON, Excel или в другие системы через HTTP-запросы.
  • 🛡️ Безопасность: ограничение прав доступа на уровне ролей (например, только для бухгалтеров или администраторов).

Типичные сценарии использования:

  • 📈 Аналитика продаж с детализацией по менеджерам, регионам или периодам.
  • 📄 Регламентированная отчетность для ФНС, ПФР или Росстата (если стандартные формы не подходят).
  • 🔄 Обмен данными с CRM-системами (Bitrix24, АмоCRM) или ERP (SAP, Oracle).
  • 🖥️ Автоматизация рутинных задач (например, еженедельная рассылка отчетов по email).
⚠️ Внимание: Внешние отчеты, подключенные через Файл → Открыть, не сохраняются в базе автоматически. Чтобы они были доступны всем пользователям, их нужно загрузить в справочник "Внешние отчеты и обработки" (путь: Администрирование → Печатные формы, отчеты и обработки).
📊 Как часто вы создаете внешние отчеты в 1С?
Раз в неделю
Раз в месяц
Реже, по необходимости
Никогда не создавал

Подготовка к созданию: что нужно знать до начала работы

Прежде чем приступать к разработке, проверьте:

Установлена актуальная версия 1С:Предприятие (8.3.20+ рекомендуется)

Есть права администратора или роль"Конфигуратор"

Создана резервная копия базы (1Cv8.1CD)

Подключены необходимые расширения (например, "Библиотека стандартных подсистем")

Определены требования к отчету (формат вывода, периодичность, пользователи)

-->

Ошибки на этом этапе приводят к потере данных или несовместимости отчета с актуальной версией платформы. Например, если вы разрабатываете отчет в 1С 8.3.18, а пользователи работают на 8.3.21, могут возникнуть проблемы с открытием файла из-за изменений в механизме СКД.

Также важно понять, какой тип отчета вам нужен:

Тип отчета Когда использовать Сложность разработки
Простой отчет (на базе запроса) Выгрузка списков (номенклатура, контрагенты) Низкая
Отчет с СКД Сложная аналитика с группировками и диаграммами Средняя
Внешняя обработка с формой Интерактивные панели с кнопками и полями ввода Высокая
Отчет с HTTP-сервисом Интеграция с внешними API (например, Яндекс.Метрика) Очень высокая
⚠️ Внимание: Если отчет предполагает работу с большими объемами данных (например, обороты по счетам за 3 года), заранее продумайте индексы в базе и разбивку запросов на пакеты. Иначе выполнение может занять часы или привести к зависанию клиентского приложения.

Пошаговая инструкция: создаем простой внешний отчет

Рассмотрим создание отчета на примере выгрузки списка контрагентов с суммами продаж за текущий месяц.

Шаг 1. Создание нового файла отчета

Откройте Конфигуратор (1Cv8.cfg) и выполните:

  1. Перейдите в Файл → Новый.
  2. Выберите Внешний отчет.
  3. Укажите имя файла (например, КонтрагентыСПродажами.erf).
  4. Нажмите Готово.

Шаг 2. Настройка параметров

В окне редактирования отчета:

  1. Перейдите на вкладку Реквизиты.
  2. Добавьте параметр ДатаНачала (тип Дата) и ДатаОкончания.
  3. Настройте Значение по умолчанию для автоматического заполнения текущим месяцем:
    НачалоМесяца(ТекущаяДата)
    

    КонецМесяца(ТекущаяДата)

Шаг 3. Формирование запроса

В модуле отчета (Процедура Сформировать) добавьте следующий код:

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

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

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Контрагент,

| СУММА(Документ.СуммаДокумента) КАК СуммаПродаж

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Документ

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

| ПО Документ.Контрагент = Контрагенты.Ссылка

|ГДЕ

| Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

|СГРУППИРОВАТЬ ПО

| Контрагенты.Ссылка";

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

Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

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

Выборка = Результат.Выбрать;

Шаг 4. Вывод результатов в таблицу

Для отображения данных используем ТабличныйДокумент:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Очистить;

Таблица = ТабДок.Область;

Таблица.ВывестиСтроку("Контрагент;Сумма продаж");

Пока Выборка.Следующий Цикл

НоваяСтрока = ТабДок.ДобавитьСтроку;

НоваяСтрока.Текст = СтрШаблон("%1;%2",

Выборка.Контрагент.Наименование,

Формат(Выборка.СуммаПродаж,"ЧДЦ=2"));

КонецЦикла;

ТабДок.Показать("Продажи по контрагентам");

💡

Чтобы ускорить выполнение отчета на больших базах, добавьте в запрос условие ИНДЕКСИРОВАТЬ ПО Дата (если поле проиндексировано в конфигурации).

Работа с системой компоновки данных (СКД)

СКД — это мощный инструмент для создания сложных отчетов с группировками, диаграммами и динамическими параметрами. Его основные компоненты:

  • 📋 Схема компоновки — описание структуры отчета (поля, ресурсы, параметры).
  • 🔧 Настройки — пользовательские фильтры, сортировки, условное оформление.
  • 📊 Макет — визуальное представление (таблица, диаграмма, сводная таблица).

Пример создания отчета с СКД для анализа оборотов по счетам:

  1. В Конфигураторе создайте новый внешний отчет.
  2. Перейдите на вкладку Схемы компоновки данных и добавьте новый набор данных:
НаборДанных = КомпоновщикДанных.НаборыДанных.Добавить("Обороты");

НаборДанных.Запрос =

"ВЫБРАТЬ

| СчетаБухгалтерии.Ссылка КАК Счет,

| СчетаБухгалтерии.Наименование КАК НаименованиеСчета,

| РегистрБухгалтерии.Обороты.Период КАК Период,

| СУММА(РегистрБухгалтерии.Обороты.СуммаОборотДт) КАК Дебет,

| СУММА(РегистрБухгалтерии.Обороты.СуммаОборотКт) КАК Кредит

|ИЗ

| РегистрБухгалтерии.Обороты КАК РегистрБухгалтерии.Обороты

| ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.СчетаБухгалтерии КАК СчетаБухгалтерии

| ПО РегистрБухгалтерии.Обороты.Счет = СчетаБухгалтерии.Ссылка

|ГДЕ

| РегистрБухгалтерии.Обороты.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

|СГРУППИРОВАТЬ ПО

| СчетаБухгалтерии.Ссылка,

| СчетаБухгалтерии.Наименование,

| РегистрБухгалтерии.Обороты.Период";

  1. Настройте Ресурсы (поля для вычислений): добавьте Дебет и Кредит как числовые ресурсы.
  2. В Настройки компоновщика добавьте группировки по Счет и Период.
  3. Сохраните схему и скомпилируйте отчет.
Как добавить диаграмму в СКД?

1. В настройках компоновщика перейдите на вкладку "Диаграмма".

2. Выберите тип диаграммы (например, "Линейчатая").

3. Укажите Серии (например, "Счет") и Значения ("Дебет", "Кредит").

4. Настройте подписи осей и легенду.

Типичные ошибки при работе с СКД:

  • Отсутствие индексов в запросе — приводит к полному сканированию таблиц.
  • Слишком много ресурсов — увеличивает время выполнения.
  • Неправильные связи между наборами данных — данные не стыкуются.

Экспорт данных во внешние форматы: Excel, XML, JSON

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

1. Экспорт в Excel

Используйте объект ЗаписьXLS или ТабличныйДокумент.Записать:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать(ИмяФайлаШаблона); // Если есть шаблон

// Заполнение данными (пример)

Запрос = Новый Запрос("ВЫБРАТЬ Первые 10 Номенклатура.Наименование КАК Товар");

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

Выборка = Результат.Выбрать;

Строка = 1;

Пока Выборка.Следующий Цикл

ТабДок.Область(Строка, 1).Текст = Выборка.Товар;

Строка = Строка + 1;

КонецЦикла;

// Сохранение в Excel

ТабДок.Записать("C:\Отчеты\Номенклатура.xlsx", ТипФайлаТабличногоДокумента.XLSX);

2. Экспорт в XML

Для обмена с внешними системами (например, 1С:EDI или Диадок):

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл("C:\Отчеты\Данные.xml");

ЗаписьXML.ЗаписатьОбъявлениеXML;

ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");

ЗаписьXML.ЗаписатьАтрибут("Дата", ТекущаяДата);

// Пример записи данных

Запрос = Новый Запрос("ВЫБРАТЬ Первые 5 Контрагенты.Наименование КАК Контрагент");

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

Выборка = Результат.Выбрать;

Пока Выборка.Следующий Цикл

ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");

ЗаписьXML.ЗаписатьТекст(Выборка.Контрагент);

ЗаписьXML.ЗаписатьКонецЭлемента;

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем Документ

ЗаписьXML.Закрыть;

3. Экспорт в JSON

Для интеграции с REST API или JavaScript-приложениями:

МассивДанных = Новый Массив;

Запрос = Новый Запрос("ВЫБРАТЬ Первые 10 Товары.Наименование КАК Товар, Товары.Артикул");

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

Выборка = Результат.Выбрать;

Пока Выборка.Следующий Цикл

Элемент = Новый Структура;

Элемент.Вставить("Наименование", Выборка.Товар);

Элемент.Вставить("Артикул", Выборка.Артикул);

МассивДанных.Добавить(Элемент);

КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку;

ЗаписьJSON.ЗаписатьJSON(МассивДанных);

ТекстJSON = ЗаписьJSON.Закрыть;

// Сохранение в файл

ТекстJSON.Записать("C:\Отчеты\Товары.json");

⚠️ Внимание: При экспорте в XML или JSON учитывайте кодировку файла. Если данные содержат кириллицу, используйте UTF-8:
ЗаписьXML.КодировкаТекста = КодировкаТекста.UTF8;

Иначе символы превратятся в"кракозябры".

Оптимизация производительности внешних отчетов

Медленная работа отчетов — одна из самых распространенных проблем. Основные причины и способы их решения:

Проблема Причина Решение
Долгое выполнение запроса Отсутствие индексов, полное сканирование таблиц Добавьте ИНДЕКСИРОВАТЬ ПО в запрос или создайте индексы в конфигурации
Переполнение памяти Слишком большой результат выборки Используйте Пакетный режим или разбивайте запрос на части
Зависание клиента Выполнение тяжелых операций в основном потоке Перенесите расчеты в Фоновое задание
Медленная отрисовка Слишком много строк в ТабличномДокументе Используйте постраничный вывод или экспорт в файл без предварительного показа

Практические советы по оптимизации:

  • 🔍 Анализируйте план выполнения запроса:
    ОбъяснитьЗапрос = Новый ОбъяснениеЗапроса;
    

    ОбъяснитьЗапрос.Текст = ТекстЗапроса;

    РезультатОбъяснения = ОбъяснитьЗапрос.Выполнить;

    Это покажет, где происходят полные сканирования (TABLE SCAN) или временные таблицы (TEMP TABLE).

  • 🗃️ Используйте временные таблицы для промежуточных расчетов:
    Запрос = Новый Запрос;
    

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

    "ВЫБРАТЬ

    | Товары.Ссылка КАК Товар

    |ПОМЕСТИТЬ ВТТовары

    |ИЗ

    | Справочник.Номенклатура КАК Товары

    |ГДЕ

    | Товары.ЭтоГруппа = ЛОЖЬ";

    Запрос.Выполнить;

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

    ОсновнойЗапрос.Текст =

    "ВЫБРАТЬ

    | ВТТовары.Товар КАК Товар,

    | СУММА(Документ.Количество) КАК Количество

    |ИЗ

    | Документ.РеализацияТоваровУслуг КАК Документ

    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТТовары КАК ВТТовары

    | ПО Документ.Номенклатура = ВТТовары.Товар

    |ГДЕ

    | Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

    |СГРУППИРОВАТЬ ПО

    | ВТТовары.Товар";

  • Ограничивайте период данных: даже если пользователь не указал даты, задавайте разумный диапазон по умолчанию (например, последний год).
💡

Использование ПОМЕСТИТЬ ВТ (временные таблицы) ускоряет повторные обращения к одним и тем же данным в сложных отчетах.

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

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

  1. Ошибка:"Поле не найдено"

    Причина: Опечатка в имени поля или изменение структуры базы после обновления.

    Решение: Проверьте актуальную структуру таблиц через Метаданные или Консоль запросов.

  2. Ошибка:"Недостаточно памяти"

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

    Решение:

    • Разбейте запрос на пакеты по периодам.
    • Используйте ЛИМИТ для тестирования.
    • Экспортируйте данные напрямую в файл без предварительной загрузки в память.

  3. Ошибка:"Нет прав на выполнение операции"

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

    Решение: Настройте права в Конфигураторе или запросите их у администратора.

  4. Ошибка:"Несовместимая версия файла"

    Причина: Отчет создан в новой версии платформы (например, 8.3.21), а открывается в старой (8.3.18).

    Решение: Укажите минимальную версию в свойствах отчета или обновите платформу у пользователей.

  5. ⚠️ Внимание: Если внешний отчет использует HTTP-Сервисы или COM-объекты, проверьте настройки безопасности . По умолчанию доступ к внешним ресурсам заблокирован (настройка "Безопасный режим" в параметрах запуска).

    FAQ: Ответы на частые вопросы

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

    1. В режиме 1С:Предприятие перейдите в Администрирование → Печатные формы, отчеты и обработки.

    2. Нажмите Создать и выберите Внешний отчет.

    3. Укажите путь к файлу .erf или .epf.

    4. Настройте права доступа для ролей (например, "Бухгалтер" или "Администратор").

    5. Сохраните. Теперь отчет будет доступен в меню Отчеты.

    Можно ли изменить внешний отчет без Конфигуратора?

    Да, но с ограничениями:

    • Через Внешние обработки можно редактировать настройки отчета (фильтры, сортировки), но не его логику.
    • Для изменения кода нужно открыть файл в Конфигураторе или текстовом редакторе (но это рискованно!).
    • Используйте Сохранить данные в отчете, чтобы пользователи могли настраивать часто используемые параметры.
Почему отчет работает медленно на большой базе?

Основные причины:

  1. Отсутствие индексов — добавьте ИНДЕКСИРОВАТЬ ПО для полей в условии ГДЕ.
  2. Слишком широкий период — ограничьте диапазон дат.
  3. Вложенные циклы — замените на временные таблицы.
  4. Вывод всех колонок — оставьте только необходимые поля.

Для диагностики используйте План выполнения запроса (кнопка Объяснить в Консоли запросов).

Как экспортировать отчет в PDF?

Используйте ТабличныйДокумент.Записать с параметром ТипФайлаТабличногоДокумента.PDF:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Отчеты\Шаблон.mxl"); // Если есть шаблон

//... заполнение данными...

ТабДок.Записать("C:\Отчеты\Отчет.pdf", ТипФайлаТабличногоДокумента.PDF);

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

Можно ли запускать внешний отчет по расписанию?

Да, для этого:

  1. Создайте Регламентное задание в Администрирование → Поддержка и обслуживание.
  2. Укажите путь к внешнему отчету и параметры запуска.
  3. Настройте расписание (ежедневно, еженедельно).
  4. Добавьте действие "Выполнить отчет и сохранить результат" (например, в Excel или PDF).

Для отправки результатов по email используйте Планы обмена или HTTP-Сервисы.