Работа с внешними отчетами в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и опытных пользователей. Часто требуется выгрузить данные из конкретного документа (например, реализации, поступления или заказа клиента) в удобный формат для анализа, печати или интеграции с другими системами. Внешний отчет позволяет гибко настраивать вывод информации без изменения основной конфигурации, что критично для типового решения.
В этой статье мы разберем процесс создания внешнего отчета с нуля: от подготовки шаблона до финальной настройки и тестирования. Особое внимание уделим работе с данными документа через запрос и программное формирование структуры отчета, что часто вызывает сложности у новичков. Материал будет полезен как разработчикам, так и продвинутым пользователям, которые хотят автоматизировать рутинные операции.
Прежде чем приступить, убедитесь, что у вас есть доступ к Конфигуратору 1С с правами на редактирование внешних обработок. Если вы работаете в облачной версии 1С:Фреш, некоторые шаги могут отличаться — проверьте ограничения вашей платформы.
1. Подготовка: что нужно знать перед созданием отчета
Перед тем как приступить к разработке, определитесь с ключевыми параметрами будущего отчета:
- 📌 Цель отчета: для печати, анализа, выгрузки в Excel или интеграции с другой системой?
- 📊 Источник данных: один документ, группа документов или связанные справочники?
- 🔧 Формат вывода: таблица, диаграмма, текстовый документ или комбинированный вариант?
- 🔒 Права доступа: кто будет использовать отчет (администраторы, бухгалтеры, менеджеры)?
Например, если вам нужно сформировать акт сверки на основе документа Поступление (акт, накладная), потребуется выгрузить не только заголовок документа, но и табличную часть с номенклатурой, количеством и ценами. Для этого придется написать запрос, который свяжет документ со справочником Номенклатура и регистром Цены номенклатуры.
Важно также учитывать версию платформы 1С. В 1С:Предприятие 8.3 доступны современные механизмы (например, Динамический список или Система компоновки данных), которые значительно упрощают разработку. Если вы работаете с устаревшими версиями (8.2 или ниже), часть функционала придется реализовывать вручную.
⚠️ Внимание: Если отчет планируется использовать в управляемом приложении (например, в 1С:ERP или 1С:УТ 11), избегайте прямых обращений к формам черезПолучитьФорму(). Вместо этого используйте серверные процедуры илиКомпоновщик настроек.
2. Создание заготовки внешнего отчета в Конфигураторе
Начнем с создания пустого шаблона внешнего отчета. Для этого:
- Откройте
Конфигуратор 1Св режиме 1С:Предприятие. - Перейдите в меню
Файл → Новыйи выберитеВнешняя обработка. - В открывшемся окне укажите:
- 📝 Имя: например,
ВнешнийОтчетПоДокументу_Реализация. - 📌 Синоним: краткое название для пользователей (например, "Отчет по реализации").
- 🔧 Тип: выберите
Внешняя обработка(не путать сВнешний отчет, если нужна гибкость).
- 📝 Имя: например,
- Нажмите
Готово— откроется окно редактирования обработки. - 🔹 Параметр "ДокументСсылка" (тип
ДокументСсылка.РеализацияТоваровУслуг) — для передачи ссылки на документ. - 🔹 Реквизит "ТаблицаДанных" (тип
ТаблицаЗначений) — для хранения результатов запроса. - 🔹 Команда "Сформировать" — для вызова процедуры формирования отчета.
- 📄 Заголовок документа (номер, дата, контрагент).
- 📦 Табличную часть с номенклатурой, количеством и суммами.
- 💰 Итоговые суммы (включая НДС).
- 📈 Сгруппировывать данные по произвольным полям (например, по видам номенклатуры).
- 📊 Строить диаграммы и сводные таблицы.
- 🖨 Подготавливать данные для печати или экспорта в Excel/PDF.
- 🔴 "Неопределенный идентификатор": проверьте названия реквизитов в запросе (например,
РеализацияТоваровУслугТоварывместоТовары). - 🔴 "Ошибка при обращении к объекту": убедитесь, что документ не помечен на удаление (
ДокументСсылка.ПометкаУдаления = Ложь). - 🔴 "Нет прав на чтение": добавьте проверку прав в начале процедуры:
Если Не КаталогДокументов.РеализацияТоваровУслуг.ПроверитьПрава(ТипПравДоступа.Чтение) ТогдаПредупреждение("Недостаточно прав для просмотра документа!");
Возврат;
КонецЕсли;
- 🛠 Замените
ВЫБРАТЬ *на явный перечень полей. - 🛠 Добавьте индексы для полей, по которым идет фильтрация (например,
Ссылка). - 🛠 Используйте
ПОМЕСТИТЬдля промежуточных результатов:ВЫБРАТЬ РАЗРЕШЕННЫЕ Первые 1000 ...
Теперь добавьте основные реквизиты, которые понадобятся для работы с документом:
Пример кода для добавления команды в модуль объекта:
Процедура Сформировать(Команда)
// Основная логика формирования отчета
ТаблицаДанных = Новый ТаблицаЗначений;
// Здесь будет запрос к документу
КонецПроцедуры
☑️ Подготовка шаблона отчета
3. Работа с данными документа: запросы и обработка
Самый ответственный этап — извлечение данных из документа. Для этого используем язык запросов 1С. Рассмотрим пример для документа РеализацияТоваровУслуг:
Допустим, нам нужно выгрузить:
Код запроса для табличной части:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровУслугТовары.Количество КАК Количество,
| РеализацияТоваровУслугТовары.Цена КАК Цена,
| РеализацияТоваровУслугТовары.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &ДокументСсылка";
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДанных = РезультатЗапроса.Выгрузить();
Для заголовка документа можно использовать прямой доступ к реквизитам:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДатаДокумента = ДокументОбъект.Дата;
НомерДокумента = ДокументОбъект.Номер;
Контрагент = ДокументОбъект.Контрагент;
⚠️ Внимание: При работе с большими документами (свыше 1000 строк в табличной части) избегайте выгрузки всех полей через ВЫБРАТЬ *. Указывайте только необходимые реквизиты — это ускорит выполнение запроса в 5-10 раз.
| Тип данных | Метод извлечения | Пример кода |
|---|---|---|
| Заголовок документа | Прямое обращение к объекту | ДокументОбъект.Дата |
| Табличная часть | Запрос к виртуальной таблице | ВЫБРАТЬ ... ИЗ Документ.ИмяДокумента.ТабличнаяЧасть |
| Связанные справочники | Запрос с соединением (ЛЕВОЕ СОЕДИНЕНИЕ) |
ВЫБРАТЬ Номенклатура.Наименование |
| Итоги по документу | Агрегатные функции (СУММА, МАКСИМУМ) |
ВЫБРАТЬ СУММА(Сумма) КАК ИтогоСумма |
4. Формирование структуры отчета: компоновка данных
После извлечения данных их нужно представить в удобном виде. В 1С:Предприятие 8.3 для этого используется Система компоновки данных (СКД). Она позволяет:
Пример кода для настройки СКД:
Процедура СформироватьОтчет()
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
Настройки = КомпоновщикНастроек.ПолучитьНастройкиПоУмолчанию();
// Добавляем поля для вывода
ПолеНоменклатура = Настройки.Поля.Добавить("Номенклатура");
ПолеКоличество = Настройки.Поля.Добавить("Количество");
ПолеСумма = Настройки.Поля.Добавить("Сумма");
// Настраиваем группировку
Группировка = Настройки.Группировки.Добавить("Номенклатура");
Группировка.Поля.Добавить(ПолеНоменклатура);
// Формируем отчет
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Настройки, ТаблицаДанных);
// Выводим результат
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТаблицу;
ПроцессорВывода.УстановитьОбъект(Макет);
ПроцессорВывода.Вывести();
КонецПроцедуры
Если вам не нужна сложная компоновка, можно обойтись простым выводом в ТаблицуЗначений с последующим экспортом в 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, если не нужны все строки. Также помогает разбиение запроса на части с помощью ОБЪЕДИНИТЬ ВСЕ и фильтрация по датам (например, ГДЕ Дата МЕЖДУ &Начало И &Конец).
6. Сохранение и подключение внешнего отчета
После тестирования сохраните обработку:
- В Конфигураторе нажмите
Файл → Сохранить как. - Выберите формат
.epf(для внешней обработки) или.erf(для отчета). - Укажите путь сохранения (например,
C:\Отчеты\ОтчетПоРеализации.epf).
Чтобы подключить отчет в пользовательском режиме:
- Откройте 1С:Предприятие в режиме 1С:Предприятие.
- Перейдите в меню
Файл → Открытьи выберите сохраненный файл.epf. - В открывшемся окне укажите документ, по которому нужно сформировать отчет, и нажмите
Сформировать.
Для удобства можно добавить отчет в панель навигации:
- 📌 Перейдите в
Администрирование → Печатные формы, отчеты и обработки. - 📌 Нажмите
Создатьи выберитеВнешняя обработка. - 📌 Загрузите файл
.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);
Для тонкой настройки шрифтов и полей используйте ПараметрыМакета:
Настройки.ПараметрыМакета.ОриентацияСтраницы = ОриентацияСтраницы.Альбомная;
Можно ли в внешнем отчете изменять данные документа?
Технически да, но это крайне не рекомендуется. Внешние обработки предназначены для чтения и анализа данных. Если вам нужно изменить документ: