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

В этой статье мы разберем процесс создания внешнего отчета с нуля: от подготовки шаблона до финальной настройки и тестирования. Особое внимание уделим работе с данными документа через запрос и программное формирование структуры отчета, что часто вызывает сложности у новичков. Материал будет полезен как разработчикам, так и продвинутым пользователям, которые хотят автоматизировать рутинные операции.

Прежде чем приступить, убедитесь, что у вас есть доступ к Конфигуратору 1С с правами на редактирование внешних обработок. Если вы работаете в облачной версии 1С:Фреш, некоторые шаги могут отличаться — проверьте ограничения вашей платформы.

1. Подготовка: что нужно знать перед созданием отчета

Перед тем как приступить к разработке, определитесь с ключевыми параметрами будущего отчета:

  • 📌 Цель отчета: для печати, анализа, выгрузки в Excel или интеграции с другой системой?
  • 📊 Источник данных: один документ, группа документов или связанные справочники?
  • 🔧 Формат вывода: таблица, диаграмма, текстовый документ или комбинированный вариант?
  • 🔒 Права доступа: кто будет использовать отчет (администраторы, бухгалтеры, менеджеры)?

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

Важно также учитывать версию платформы 1С. В 1С:Предприятие 8.3 доступны современные механизмы (например, Динамический список или Система компоновки данных), которые значительно упрощают разработку. Если вы работаете с устаревшими версиями (8.2 или ниже), часть функционала придется реализовывать вручную.

⚠️ Внимание: Если отчет планируется использовать в управляемом приложении (например, в 1С:ERP или 1С:УТ 11), избегайте прямых обращений к формам через ПолучитьФорму(). Вместо этого используйте серверные процедуры или Компоновщик настроек.
📊 Какой тип отчетов вы создаете чаще?
Для печати документов
Для анализа данных
Для выгрузки в Excel
Для интеграции с другими системами

2. Создание заготовки внешнего отчета в Конфигураторе

Начнем с создания пустого шаблона внешнего отчета. Для этого:

  1. Откройте Конфигуратор 1С в режиме 1С:Предприятие.
  2. Перейдите в меню Файл → Новый и выберите Внешняя обработка.
  3. В открывшемся окне укажите:
    • 📝 Имя: например, ВнешнийОтчетПоДокументу_Реализация.
    • 📌 Синоним: краткое название для пользователей (например, "Отчет по реализации").
    • 🔧 Тип: выберите Внешняя обработка (не путать с Внешний отчет, если нужна гибкость).
  4. Нажмите Готово — откроется окно редактирования обработки.
  5. Теперь добавьте основные реквизиты, которые понадобятся для работы с документом:

    • 🔹 Параметр "ДокументСсылка" (тип ДокументСсылка.РеализацияТоваровУслуг) — для передачи ссылки на документ.
    • 🔹 Реквизит "ТаблицаДанных" (тип ТаблицаЗначений) — для хранения результатов запроса.
    • 🔹 Команда "Сформировать" — для вызова процедуры формирования отчета.

    Пример кода для добавления команды в модуль объекта:

    
    

    Процедура Сформировать(Команда)

    // Основная логика формирования отчета

    ТаблицаДанных = Новый ТаблицаЗначений;

    // Здесь будет запрос к документу

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

    ☑️ Подготовка шаблона отчета

    Выполнено: 0 / 4

    3. Работа с данными документа: запросы и обработка

    Самый ответственный этап — извлечение данных из документа. Для этого используем язык запросов 1С. Рассмотрим пример для документа РеализацияТоваровУслуг:

    Допустим, нам нужно выгрузить:

    • 📄 Заголовок документа (номер, дата, контрагент).
    • 📦 Табличную часть с номенклатурой, количеством и суммами.
    • 💰 Итоговые суммы (включая НДС).

    Код запроса для табличной части:

    
    

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

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

    "ВЫБРАТЬ

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

    | РеализацияТоваровУслугТовары.Количество КАК Количество,

    | РеализацияТоваровУслугТовары.Цена КАК Цена,

    | РеализацияТоваровУслугТовары.Сумма КАК Сумма

    |ИЗ

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

    |ГДЕ

    | РеализацияТоваровУслугТовары.Ссылка = &ДокументСсылка";

    Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);

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

    ТаблицаДанных = РезультатЗапроса.Выгрузить();

    Для заголовка документа можно использовать прямой доступ к реквизитам:

    
    

    ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

    ДатаДокумента = ДокументОбъект.Дата;

    НомерДокумента = ДокументОбъект.Номер;

    Контрагент = ДокументОбъект.Контрагент;

    ⚠️ Внимание: При работе с большими документами (свыше 1000 строк в табличной части) избегайте выгрузки всех полей через ВЫБРАТЬ *. Указывайте только необходимые реквизиты — это ускорит выполнение запроса в 5-10 раз.
    Тип данных Метод извлечения Пример кода
    Заголовок документа Прямое обращение к объекту ДокументОбъект.Дата
    Табличная часть Запрос к виртуальной таблице ВЫБРАТЬ ... ИЗ Документ.ИмяДокумента.ТабличнаяЧасть
    Связанные справочники Запрос с соединением (ЛЕВОЕ СОЕДИНЕНИЕ) ВЫБРАТЬ Номенклатура.Наименование
    Итоги по документу Агрегатные функции (СУММА, МАКСИМУМ) ВЫБРАТЬ СУММА(Сумма) КАК ИтогоСумма

    4. Формирование структуры отчета: компоновка данных

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

    • 📈 Сгруппировывать данные по произвольным полям (например, по видам номенклатуры).
    • 📊 Строить диаграммы и сводные таблицы.
    • 🖨 Подготавливать данные для печати или экспорта в Excel/PDF.

    Пример кода для настройки СКД:

    
    

    Процедура СформироватьОтчет()

    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;

    Настройки = КомпоновщикНастроек.ПолучитьНастройкиПоУмолчанию();

    // Добавляем поля для вывода

    ПолеНоменклатура = Настройки.Поля.Добавить("Номенклатура");

    ПолеКоличество = Настройки.Поля.Добавить("Количество");

    ПолеСумма = Настройки.Поля.Добавить("Сумма");

    // Настраиваем группировку

    Группировка = Настройки.Группировки.Добавить("Номенклатура");

    Группировка.Поля.Добавить(ПолеНоменклатура);

    // Формируем отчет

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

    // Выводим результат

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

    ПроцессорВывода.УстановитьОбъект(Макет);

    ПроцессорВывода.Вывести();

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

    Если вам не нужна сложная компоновка, можно обойтись простым выводом в ТаблицуЗначений с последующим экспортом в Excel:

    
    

    Процедура ЭкспортВExcel()

    Excel = Новый COMОбъект("Excel.Application");

    Книга = Excel.Workbooks.Add();

    Лист = Книга.Worksheets(1);

    // Заполняем заголовки

    Лист.Cells(1, 1).Value = "Номенклатура";

    Лист.Cells(1, 2).Value = "Количество";

    Лист.Cells(1, 3).Value = "Сумма";

    // Заполняем данные

    Для Каждого Строка Из ТаблицаДанных Цикл

    Лист.Cells(Строка.Индекс + 2, 1).Value = Строка.Номенклатура;

    Лист.Cells(Строка.Индекс + 2, 2).Value = Строка.Количество;

    Лист.Cells(Строка.Индекс + 2, 3).Value = Строка.Сумма;

    КонецЦикла;

    Excel.Visible = Истина; // Показываем Excel

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

    💡

    Если при экспорте в Excel русские символы отображаются как "кракозябры", добавьте перед выводом строку Лист.Cells.NumberFormat = "@" — это приведет ячейки к текстовому формату.

    5. Тестирование и отладка: как избежать ошибок

    После написания кода обязательно протестируйте отчет на реальных данных. Типичные ошибки и способы их исправления:

    • 🔴 "Неопределенный идентификатор": проверьте названия реквизитов в запросе (например, РеализацияТоваровУслугТовары вместо Товары).
    • 🔴 "Ошибка при обращении к объекту": убедитесь, что документ не помечен на удаление (ДокументСсылка.ПометкаУдаления = Ложь).
    • 🔴 "Нет прав на чтение": добавьте проверку прав в начале процедуры:
      Если Не КаталогДокументов.РеализацияТоваровУслуг.ПроверитьПрава(ТипПравДоступа.Чтение) Тогда
      

      Предупреждение("Недостаточно прав для просмотра документа!");

      Возврат;

      КонецЕсли;

    Для отладки используйте точки останова в Конфигураторе или вывод в Сообщить():

    
    

    Сообщить("Количество строк в таблице: " + ТаблицаДанных.Количество());

    Если отчет формируется долго (более 30 секунд), оптимизируйте запрос:

    • 🛠 Замените ВЫБРАТЬ * на явный перечень полей.
    • 🛠 Добавьте индексы для полей, по которым идет фильтрация (например, Ссылка).
    • 🛠 Используйте ПОМЕСТИТЬ для промежуточных результатов:
      ВЫБРАТЬ РАЗРЕШЕННЫЕ Первые 1000 ...
⚠️ Внимание: В управляемых формах избегайте длительных операций на клиенте. Переносите тяжелые вычисления на сервер с помощью директивы &НаСервере.
Как ускорить запрос к большому документу?

Используйте конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1000, если не нужны все строки. Также помогает разбиение запроса на части с помощью ОБЪЕДИНИТЬ ВСЕ и фильтрация по датам (например, ГДЕ Дата МЕЖДУ &Начало И &Конец).

6. Сохранение и подключение внешнего отчета

После тестирования сохраните обработку:

  1. В Конфигураторе нажмите Файл → Сохранить как.
  2. Выберите формат .epf (для внешней обработки) или .erf (для отчета).
  3. Укажите путь сохранения (например, C:\Отчеты\ОтчетПоРеализации.epf).

Чтобы подключить отчет в пользовательском режиме:

  1. Откройте 1С:Предприятие в режиме 1С:Предприятие.
  2. Перейдите в меню Файл → Открыть и выберите сохраненный файл .epf.
  3. В открывшемся окне укажите документ, по которому нужно сформировать отчет, и нажмите Сформировать.

Для удобства можно добавить отчет в панель навигации:

  • 📌 Перейдите в Администрирование → Печатные формы, отчеты и обработки.
  • 📌 Нажмите Создать и выберите Внешняя обработка.
  • 📌 Загрузите файл .epf и сохраните настройку.

Если отчет будет использоваться несколькими пользователями, разместите его на сетевом диске или в общей базе 1С (в справочнике Внешние обработки).

💡

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

7. Распространенные ошибки и их решения

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

Ошибка Причина Решение
Отчет не открывается в пользовательском режиме Не хватает прав или неверный формат файла Проверьте расширение (.epf) и права доступа в ролях 1С
Данные в отчете не актуальны Запрос выполняется по неверной дате или ссылке Добавьте вывод параметров запроса в Сообщить()
Ошибка "Поле не найдено" Опечатка в имени реквизита или таблицы Сверьте названия с метаданными в Конфигураторе
Медленное формирование отчета Слишком большой объем данных или неоптимизированный запрос Используйте ИНДЕКСИРОВАТЬ ПО и ограничивайте выборку

Если отчет должен работать в разных конфигурациях 1С (например, в УТ 11 и ERP 2), учитывайте различия в структурах документов. Например, в УТ 11 табличная часть документа РеализацияТоваровУслуг называется Товары, а в ERP 2ТоварыУслуги. Для универсальности используйте псевдонимы:


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

"ВЫБРАТЬ

| Товары.Номенклатура КАК Товар,

| Товары.Количество КАК Колво

|ИЗ

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

Еще одна частая проблема — разрывы связей между документами и справочниками. Например, если номенклатура была удалена, запрос вернет ошибку. Чтобы избежать этого, добавьте проверку:


Если Номенклатура.Пустая() Тогда

Продолжить; // Пропускаем строку с удаленной номенклатурой

КонецЕсли;

8. Дополнительные возможности: расширение функционала

Базовый отчет можно дополнить полезными функциями:

  • 📅 Фильтрация по датам: добавьте параметры ДатаНачала и ДатаОкончания в форму отчета.
  • 📤 Экспорт в разные форматы: реализуйте кнопки для выгрузки в PDF, Excel или JSON.
  • 🔄 Автообновление: настройте периодическое формирование отчета по расписанию (через регламентные задания).
  • 📧 Отправка по email: интегрируйте отправку готового отчета на почту через ПотоковыйЗаписьФайла и ИнтернетПочта.

Пример кода для отправки отчета по email:


Процедура ОтправитьНаПочту(АдресПочты)

// Формируем файл отчета

ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";

ТаблицаДанных.Записать(ИмяФайла, ТипФайлаExcel);

// Настраиваем почту

Почта = Новый ИнтернетПочта;

Сообщение = Новый ИнтернетПочтаСообщение;

Сообщение.Адресат = АдресПочты;

Сообщение.Тема = "Отчет по реализации от " + ТекущаяДата();

Сообщение.Текст = "Во вложении отчет по документам реализации.";

Сообщение.Вложения.Добавить(ИмяФайла);

// Отправляем

Почта.Отправить(Сообщение);

УдалитьФайлы(ИмяФайла); // Удаляем временный файл

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

Для работы с JSON (актуально для интеграции с веб-сервисами) используйте ЗаписьJSON:


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

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

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("ДатаОтчета");

Запись.ЗаписатьЗначение(ТекущаяДата());

Запись.ЗаписатьИмяСвойства("Данные");

Запись.ЗаписатьНачалоМассива();

Для Каждого Строка Из ТаблицаДанных Цикл

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("Номенклатура");

Запись.ЗаписатьЗначение(Строка.Номенклатура);

// ... другие поля

Запись.ЗаписатьКонецОбъекта();

КонецЦикла;

Запись.ЗаписатьКонецМассива();

Запись.ЗаписатьКонецОбъекта();

Результат = Запись.Закрыть();

💡

При интеграции с внешними системами всегда проверяйте кодировку данных. В 1С по умолчанию используется UTF-8, но некоторые сервисы требуют Windows-1251. Для конвертации используйте СтрокаВДвоичныеДанные() с указанием нужной кодировки.

Если вам нужно объединить данные из нескольких документов, используйте временные таблицы:


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

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

"ВЫБРАТЬ

| Реализация.Ссылка КАК Ссылка,

| Реализация.Дата КАК Дата

|ПОМЕСТИТЬ ВТДокументы

|ИЗ

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

|ГДЕ

| Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания;

|//////////////////////////////////////////////////

|ВЫБРАТЬ

| ВТДокументы.Ссылка КАК Документ,

| Товары.Номенклатура КАК Номенклатура,

| СУММА(Товары.Количество) КАК ИтогоКоличество

|ИЗ

| ВТДокументы КАК ВТДокументы

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары

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

|ГРУППИРОВКА ПО

| ВТДокументы.Ссылка,

| Товары.Номенклатура";

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

Можно ли создать внешний отчет без прав администратора?

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

Как сделать отчет, который работает и в УТ 11, и в ERP 2?

Используйте универсальные псевдонимы для таблиц и полей, а также проверяйте наличие реквизитов через Метаданные. Пример:


Если Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Найти("Контрагент") = Неопределено Тогда

Предупреждение("В вашей конфигурации нет реквизита 'Контрагент'!");

Возврат;

КонецЕсли;

Также избегайте жесткой привязки к именам табличных частей — используйте ТипЗнч() для проверки структуры.

Почему отчет формируется очень долго?

Чаще всего это связано с:

  • 🔹 Большим объемом данных (например, запрос возвращает 100 000 строк). Решение: добавьте фильтр по дате или контрагенту.
  • 🔹 Отсутствием индексов на полях, по которым идет соединение. Решение: проверьте индексы в Конфигураторе (Все функции → Индексы).
  • 🔹 Выполнением тяжелых операций на клиенте. Решение: перенесите логику на сервер с помощью &НаСервере.

Для диагностики используйте ПланЗапроса():

Объяснение = Запрос.Выполнить().Объяснить();
Как экспортировать отчет в PDF с сохранением форматирования?

Используйте Систему компоновки данных (СКД) с настройкой макета для печати:


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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВФайлPDF;

ПроцессорВывода.УстановитьОбъект(Макет);

ПроцессорВывода.Вывести(ИмяФайлаPDF);

Для тонкой настройки шрифтов и полей используйте ПараметрыМакета:

Настройки.ПараметрыМакета.ОриентацияСтраницы = ОриентацияСтраницы.Альбомная;
Можно ли в внешнем отчете изменять данные документа?

Технически да, но это крайне не рекомендуется. Внешние обработки предназначены для чтения и анализа данных. Если вам нужно изменить документ: