Создание сторонних отчетов в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и администраторов системы. Такие отчеты позволяют расширить стандартный функционал платформы, адаптировать его под специфические бизнес-процессы компании или автоматизировать рутинные операции. Однако процесс их разработки и внедрения требует не только знания языка 1С, но и понимания архитектуры конфигурации, механизмов обмена данными и правил безопасности.
В этой статье мы разберем весь цикл создания стороннего отчета — от формулировки технического задания до тестирования и внедрения. Особое внимание уделим типичным ошибкам, которые допускают новички, и способам их избежать. Материал будет полезен как программистам 1С, так и IT-специалистам, которые хотят понять, как работают кастомизированные решения в экосистеме 1С:Предприятие 8.3.
Прежде чем приступить к практике, важно уточнить: термин "сторонний отчет" в контексте 1С может означать два разных понятия:
внешний отчет (файл с расширением .erf или .epf, подключаемый к базе) и встроенный отчет (разработанный непосредственно в конфигурации). Мы рассмотрим оба варианта, но основной фокус сделаем на внешних решениях, так как они более универсальны и безопасны для типовых конфигураций.
1. Подготовка: определяем цель и инструменты
Первый шаг — четко сформулировать, зачем нужен новый отчет. Часто заказчики просят "сделать как в Excel", не понимая, что 1С работает с данными иначе. Ваша задача — трансформировать бизнес-требования в технические:
- 📊 Какие данные должны отображаться? (например, остатки товаров с разбивкой по складам и партиям)
- 🔍 Какие фильтры нужны? (период, контрагент, номенклатурная группа)
- 📈 В каком виде представить результат? (таблица, диаграмма, сводная ведомость)
- 🔗 Нужна ли интеграция с другими системами? (выгрузка в Excel, отправка по email)
Для разработки внешнего отчета вам потребуется:
- 💻 1С:Предприятие 8.3 (версия не ниже 8.3.10 — в более ранних могут отсутствовать нужные механизмы)
- 🛠️ Конфигуратор 1С с правами администратора
- 📝 Текстовый редактор для работы с кодом (например, Notepad++ или VS Code)
- 🔧 Отладчик 1С для поиска ошибок
Критический момент: если вы работаете с типовой конфигурацией (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11), изменение конфигурации напрямую может привести к потере поддержки от 1С. В таких случаях внешние отчеты — единственный безопасный способ расширения функционала.
2. Выбор типа отчета: внешний vs встроенный
Прежде чем приступить к разработке, решите, какой тип отчета вам нужен. Сравним их ключевые особенности:
| Критерий | Внешний отчет (.erf/.epf) |
Встроенный отчет (в конфигурации) |
|---|---|---|
| 🔄 Совместимость с обновлениями | Не ломается при обновлении конфигурации | Может требовать доработок после обновлений |
| 🔒 Безопасность | Меньше рисков для целостности базы | Ошибки в коде могут повлиять на работу всей системы |
| 🛠️ Сложность разработки | Требует знания механизмов внешних обработок | Полный доступ к объектам конфигурации |
| 📦 Переносимость | Легко копируется между базами | Привязан к конкретной конфигурации |
Для большинства задач мы рекомендуем начинать с внешнего отчета. Он проще в поддержке и не требует изменений в основной конфигурации. Однако есть случаи, когда без встроенного отчета не обойтись:
- 🔗 Необходимость интеграции с другими объектами конфигурации (например, добавление кнопки вызова отчета в форму документа)
- 📊 Использование нестандартных механизмов платформы, недоступных во внешних обработках
- 🔒 Требуется строгий контроль прав доступа на уровне конфигурации
Если вы разрабатываете отчет для типовой конфигурации, всегда проверяйте его работу на демонстрационной базе перед внедрением в рабочую систему. Это поможет избежать конфликтов с будущими обновлениями.
3. Разработка внешнего отчета: пошаговый процесс
Создание внешнего отчета состоит из нескольких этапов. Рассмотрим их на примере отчета по остаткам товаров с возможностью фильтрации по складам.
Шаг 1: Создание заготовки
Откройте Конфигуратор 1С и выполните:
- Перейдите в
Файл → Новый - Выберите
Внешняя обработка - Укажите имя файла (например,
ОстаткиТоваров.erf) - В открывшемся окне выберите
Отчеткак основной тип объекта
Шаг 2: Настройка параметров
В модуле объекта (Отчет.МодульОбъекта) определите параметры, которые будет принимать отчет:
Перем ДатаНачала, ДатаОкончания, Склад;
Процедура УстановитьПараметры(Знач Параметры)
ДатаНачала = Параметры.ДатаНачала;
ДатаОкончания = Параметры.ДатаОкончания;
Склад = Параметры.Склад;
КонецПроцедуры
Шаг 3: Формирование данных
Основная логика отчета реализуется в процедуре Сформировать(). Здесь мы получаем данные из базы и формируем результат:
Процедура Сформировать()
// Получаем остатки товаров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Номенклатура,
| Склады.Наименование КАК Склад,
| РегистрыНакопления.ОстаткиТоваров.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНачала, &ДатаОкончания) КАК РегистрыНакопления.ОстаткиТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО РегистрыНакопления.ОстаткиТоваров.Номенклатура = Номенклатура.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
| ПО РегистрыНакопления.ОстаткиТоваров.Склад = Склады.Ссылка
|ГДЕ
| РегистрыНакопления.ОстаткиТоваров.Склад = &Склад";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Формируем таблицу результатов
ТаблицаРезультатов = Новый ТаблицаЗначений;
ТаблицаРезультатов.Колонки.Добавить("Номенклатура");
ТаблицаРезультатов.Колонки.Добавить("Склад");
ТаблицаРезультатов.Колонки.Добавить("Остаток");
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаРезультатов.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Склад = Выборка.Склад;
НоваяСтрока.Остаток = Выборка.Остаток;
КонецЦикла;
// Возвращаем результат
Возврат ТаблицаРезультатов;
КонецПроцедуры
Шаг 4: Создание формы отчета
Чтобы пользователь мог взаимодействовать с отчетом, нужна форма с элементами управления:
- В дереве объектов конфигуратора найдите
Формы → ОсновнаяФорма - Добавьте элементы:
- 📅 Поле ввода для
ДатаНачалаиДатаОкончания(типПолеКалендаря) - 🏭 Поле выбора для
Склад(типПолеВводаСправочника) - 🖨️ Кнопку
Сформироватьс обработчиком события - 📊 Табличное поле для вывода результата
- 📅 Поле ввода для
Данные запрашиваются с учетом прав пользователя|
Все параметры имеют значения по умолчанию|
Обработаны возможные ошибки (например, отсутствие данных)|
Форма адаптирована под разные разрешения экрана-->
4. Подключение и тестирование отчета
Готовый отчет нужно подключить к базе и проверить его работу. Для этого:
- Сохраните файл отчета (например,
ОстаткиТоваров.erf) в доступном месте - В пользовательском режиме 1С:Предприятия перейдите в
Файл → Открытьи выберите ваш файл - Отчет откроется в отдельном окне. Заполните параметры и нажмите
Сформировать - ❌ Ошибка доступа — проверьте, что у пользователя есть права на чтение регистров накопления
- ❌ Пустой результат — убедитесь, что в запросе правильно указаны параметры и связи между таблицами
- ❌ Долгое выполнение — оптимизируйте запрос, добавив индексы или ограничив период выборки
Типичные ошибки при тестировании:
Как ускорить выполнение тяжелых отчетов?
Используйте временные таблицы для промежуточных результатов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Номенклатура.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Запрос.Выполнить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| СУММА(Регистр.ОстаткиТоваров.КоличествоОстаток) КАК Остаток
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК Регистр
| ПО ВТНоменклатура.Номенклатура = Регистр.Номенклатура
|СГРУППИРОВАТЬ ПО
| ВТНоменклатура.Номенклатура";
Это снизит нагрузку на сервер за счет уменьшения объема обрабатываемых данных.
После успешного тестирования можно сохранять отчет в базе для постоянного использования:
- В пользовательском режиме откройте отчет через
Файл → Открыть - Нажмите
Файл → Сохранить как...и выберитеСохранить в базе - Укажите имя (например, "Остатки товаров по складам") и папку для сохранения
Всегда тестируйте отчет на копии рабочей базы. Даже небольшая ошибка в запросе может привести к блокировке данных или падению производительности.
5. Оптимизация и доработка отчета
Первая версия отчета редко бывает идеальной. После тестирования обычно требуется:
- ⚡ Оптимизация производительности:
- Добавьте индексы для полей, используемых в условиях
ГДЕ - Ограничьте период выборки (например, последние 3 месяца вместо "все время")
- Используйте
РАЗРЕШЕННЫЕиПОМЕСТИТЬдля сложных запросов
- Добавьте индексы для полей, используемых в условиях
- 🎨 Улучшение юзабилити:
- Добавьте подсказки к полям ввода
- Реализуйте сохранение последних параметров
- Добавьте возможность экспорта в Excel/PDF
- 🔒 Безопасность:
- Проверяйте права пользователя перед выполнением критичных операций
- Ограничьте доступ к конфиденциальным данным (например, себестоимости)
Пример оптимизированного запроса с учетом прав пользователя:
Процедура Сформировать()
// Проверяем права
Если НЕ Пользователь.Профиль.РазрешеноПросматриватьОстатки Тогда
Предупреждение("У вас недостаточно прав для просмотра этого отчета!");
Возврат;
КонецЕсли;
// Используем временные таблицы для ускорения
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Номенклатура.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.ЭтотУзел.ПометкаУдаления = ЛОЖЬ";
Запрос.Выполнить();
// Основной запрос с ограничением по дате
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| Склады.Наименование КАК Склад,
| СУММА(Регистр.КоличествоОстаток) КАК Остаток
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНачала, &ДатаОкончания) КАК Регистр
| ПО ВТНоменклатура.Номенклатура = Регистр.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
| ПО Регистр.Склад = Склады.Ссылка
|ГДЕ
| Регистр.Склад = &Склад
|СГРУППИРОВАТЬ ПО
| ВТНоменклатура.Номенклатура,
| Склады.Наименование";
// Устанавливаем параметры с проверкой
Если ДатаНачала > ДатаОкончания Тогда
Предупреждение("Дата начала не может быть позже даты окончания!");
Возврат;
КонецЕсли;
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Запрос.УстановитьПараметр("Склад", Склад);
// ... остальной код формирования результата
КонецПроцедуры
6. Внедрение отчета в рабочую базу
Перед внедрением в рабочую систему выполните следующие шаги:
- 📋 Документирование:
- Создайте инструкцию для пользователей (где найти отчет, как им пользоваться)
- Опишите параметры отчета и их влияние на результат
- Укажите возможные ошибки и способы их устранения
- 🔄 Тестирование на продуктивных данных:
- Проверьте работу отчета на полной копии рабочей базы
- Убедитесь, что отчет не конфликтует с другими обработками
- Протестируйте производительность при большом объеме данных
- Сохраните отчет в базе под понятным именем
- Настройте права доступа для пользователей
- Добавьте ссылку на отчет в панели навигации (если нужно)
Важный нюанс: если отчет будет использоваться несколькими пользователями одновременно, убедитесь, что он корректно работает в режиме управляемого блокирования. Для этого:
- Используйте транзакции только там, где это необходимо
- Минимизируйте время блокировки данных
- Тестируйте работу отчета при параллельном доступе
Для отчетов, которые запускаются по расписанию (например, ежедневная выгрузка остатков), настройте регламентные задания в 1С. Это разгрузит пользователей от рутинных операций.
7. Типичные ошибки и их решение
Даже опытные разработчики сталкиваются с проблемами при создании сторонних отчетов. Рассмотрим самые распространенные:
| Ошибка | Причина | Решение |
|---|---|---|
| Отчет не открывается | Несовместимая версия платформы или поврежденный файл .erf |
Проверьте версию 1С и пересохраните файл отчета |
| Данные не обновляются | Кэширование результатов или ошибка в датах | Добавьте Запрос.УстановитьПараметр("ИгнорироватьКэш", Истина); |
| Медленная работа | Слишком широкий период выборки или отсутствие индексов | Ограничьте период и оптимизируйте запрос (см. раздел 5) |
| Ошибка доступа | Недостаточно прав у пользователя | Проверьте роли пользователя в конфигураторе |
| Неверные данные | Ошибка в логике запроса или неверные связи между таблицами | Пошагово проверьте каждый блок запроса в отладчике |
Особое внимание уделите ошибкам блокировки. Если отчет долго выполняется и блокирует данные, это может парализовать работу других пользователей. Чтобы избежать проблемы:
- Разбивайте сложные отчеты на несколько более простых
- Используйте механизм фоновых заданий для длительных операций
- Ограничивайте глубину истории (например, не более 1 года)
Если отчет должен работать с большими объемами данных (более 100 000 строк), рассмотрите возможность использования механизма ПакетныйЗапрос или выгрузки данных в промежуточную базу.
8. Альтернативные способы создания отчетов
Помимо классического подхода с использованием 1С:Предприятие, есть и другие способы создания отчетов:
- 📊 Система компоновки данных (СКД):
Встроенный в платформу механизм, позволяющий гибко настраивать отчеты без программирования. Подходит для типовых задач, где не нужна сложная логика.
Преимущества: быстрота разработки, встроенные возможности группировки и сортировки.
Недостатки: ограниченная функциональность для нестандартных задач.
- 🌐 Внешние системы (Power BI, Tableau):
Интеграция 1С с внешними BI-инструментами через ODBC или REST API.
Преимущества: мощные возможности визуализации, работа с большими данными.
Недостатки: требует настройки обмена данными, возможны проблемы с актуальностью.
- 🤖 Генераторы отчетов (FastReport, Stimulsoft):
Специализированные инструменты для создания отчетов с последующей интеграцией в 1С.
Преимущества: гибкость дизайна, поддержка сложных визуальных элементов.
Недостатки: дополнительные затраты на лицензии, необходимость обучения.
Выбор инструмента зависит от задачи:
- Для простых отчетов по остаткам или оборотам хватит СКД или стандартного внешнего отчета
- Для аналитики с визуализацией лучше подойдет Power BI
- Для документов со сложным дизайном (например, договоров) удобнее FastReport
Когда стоит использовать СКД вместо программного кода?
Система компоновки данных (СКД) оптимальна в следующих случаях:
- Нужно быстро создать простой отчет без программирования
- Требуется гибкая настройка группировок и сортировок пользователем
- Отчет строится на основе стандартных регистров (например, обороты по счетам)
- Нужна возможность сохранять пользовательские настройки отчета
Однако СКД имеет ограничения:
- Сложно реализовать нестандартную логику (например, расчеты по алгоритму)
- Ограниченные возможности по работе с внешними данными
- Меньшая производительность по сравнению с оптимизированными запросами
FAQ: Частые вопросы по созданию отчетов в 1С
❓ Как сделать отчет с диаграммой?
Для добавления диаграммы в отчет:
- В форме отчета добавьте элемент
ПолеДиаграммы - Настройте источник данных для диаграммы (обычно это таблица значений с результатами)
- Выберите тип диаграммы (столбчатая, круговая и т.д.) и настройте оси
Пример кода для настройки диаграммы:
Диаграмма = ЭлементыФормы.Диаграмма1;
Диаграмма.ИмяГрафика = "Гистограмма";
Диаграмма.Заголовок = "Остатки по складам";
Диаграмма.ИсточникДанных = Новый ИсточникДанныхДиаграммы(ТаблицаРезультатов);
Диаграмма.Серии.Очистить();
Серия = Диаграмма.Серии.Добавить();
Серия.Имя = "Остаток";
Серия.Значение = Новый ПолеИсточникДанныхДиаграммы("Остаток");
Серия.Аргумент = Новый ПолеИсточникДанныхДиаграммы("Склад");
❓ Можно ли сделать отчет, который будет отправлять данные по email?
Да, для этого:
- Добавьте в форму отчета кнопку "Отправить по email"
- Используйте объект
Почтадля отправки:
Процедура ОтправитьПоEmail(Команда)
Почта = Новый Почта;
Сообщение = Почта.СоздатьСообщение();
Сообщение.Текст = "Отчет по остаткам на " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
// Прикрепляем отчет в Excel
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Вывести(ТаблицаРезультатов);
Вложение = Новый ВложениеФайла(ТабличныйДокумент.СохранитьВФайл(), "Остатки.xlsx");
Сообщение.Вложения.Добавить(Вложение);
Сообщение.Адресаты.Добавить("director@company.ru");
Почта.Отправить(Сообщение);
Сообщить("Отчет отправлен!");
КонецПроцедуры
Внимание: для работы почты нужно настроить параметры SMTP-сервера в 1С (раздел "Администрирование → Настройки почты").
❓ Как сделать отчет, который будет работать в веб-клиенте?
Для совместимости с веб-клиентом:
- Используйте управляемые формы (обычные формы в веб-клиенте не работают)