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

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

Что такое регистр сведений и зачем нужен отчет по нему

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

Типичные примеры использования регистров сведений:

  • 📅 Курсы валют — хранение истории изменений курса доллара, евро и других валют по датам.
  • 👥 Штатное расписание — данные о должностях, окладах и подчинении сотрудников с привязкой к периодам.
  • 📦 Цены номенклатуры — актуальные и архивные цены товаров по складам и типам цен.
  • ⚙️ Настройки системы — параметры работы программы, которые могут меняться со временем.

Отчет по регистру сведений нужен для:

  • 📊 Аналитики — например, сравнение динамики цен за год.
  • 🔍 Контроля — проверка корректности введенных данных.
  • 📄 Экспорта — выгрузка данных в Excel для дальнейшей обработки.
  • 🤖 Автоматизации — использование в других алгоритмах (например, для расчета зарплаты на основе штатного расписания).
📊 Какой тип регистра сведений вы используете чаще?
Регистр сведений с периодом
Регистр сведений без периода
Не знаю, что это
Не работаю с регистрами

Важно понимать, что регистры бывают двух видов:

  • С периодом — хранят историю изменений (например, курсы валют по датам).
  • Без периода — хранят только актуальные данные (например, текущие настройки программы).
⚠️ Внимание: Если вы работаете с регистром с периодом, в отчете обязательно нужно учитывать Период как измерение. Иначе вы получите все записи за всю историю, что может привести к дублированию данных и ошибкам в аналитике.

Способы создания отчета по регистру сведений

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

Способ Сложность Когда использовать Плюсы Минусы
Конструктор запросов Низкая Для простых отчетов без сложной логики Быстро, не требует программирования Ограниченные возможности форматирования
Система компоновки данных (СКД) Средняя Для отчетов с группировками, отборами, диаграммами Гибкая настройка, удобный интерфейс Требует понимания структуры данных
Программное формирование (1С-код) Высокая Для нестандартных задач, интеграции с другими системами Максимальная гибкость, автоматизация Требует знаний встроенного языка
Внешние отчеты (Excel, Power BI) Высокая Для визуализации данных вне 1С Профессиональные инструменты анализа Требует выгрузки данных, настройка связей

Для большинства задач оптимальным решением будет использование Системы компоновки данных (СКД). Она позволяет создавать отчеты с группировками, сортировками, отборами и даже диаграммами без глубокого погружения в программирование. Однако если вам нужна максимальная гибкость (например, динамическое формирование структуры отчета или интеграция с внешними системами), придется писать код на встроенном языке.

Рассмотрим каждый способ подробнее.

Создание отчета с помощью конструктора запросов

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

  1. Откройте конфигуратор 1С:Предприятие в режиме 1С:Предприятие (не путать с режимом конфигуратора!).
  2. Перейдите в меню Сервис → Конструктор запросов (в некоторых конфигурациях путь может отличаться, например, Все функции → Запросы).
  3. В открывшемся окне нажмите Добавить таблицу и выберите нужный регистр сведений (например, РегистрСведений.КурсыВалют).
  4. В списке полей отметьте галочками измерения и ресурсы, которые нужно вывести в отчет (например, Валюта, Дата, Курс).
  5. При необходимости добавьте условия отбора (например, Дата >= &НачалоПериода И Дата <= &КонецПериода).
  6. Нажмите Выполнить — результат отобразится в таблице.

Пример простого запроса для регистра КурсыВалют:

ВЫБРАТЬ

КурсыВалют.Валюта КАК Валюта,

КурсыВалют.Дата КАК Дата,

КурсыВалют.Курс КАК Курс

ИЗ

РегистрСведений.КурсыВалют КАК КурсыВалют

ГДЕ

КурсыВалют.Дата МЕЖДУ &НачалоПериода И &КонецПериода

УПОРЯДОЧИТЬ ПО

Дата

Выбрать правильный регистр сведений|

Отметить все необходимые поля (измерения и ресурсы)|

Добавить отбор по периоду, если регистр периодический|

Проверить сортировку данных|

Сохранить запрос для повторного использования-->

Этот метод удобен для разовых проверок, но имеет ограничения:

  • 📉 Нет возможности сохранять настройки отчета (придется каждый раз настраивать заново).
  • 📊 Отсутствует гибкое форматирование (например, нельзя добавить диаграммы или сложные группировки).
  • 🔄 Нет возможности автоматизировать выполнение (например, отправлять отчет по расписанию).
⚠️ Внимание: Если в регистре сведений есть поле Период, но вы не указали его в условии отбора, запрос может вернуть дублирующиеся записи за разные даты. Всегда ограничивайте период, если работаете с периодическими регистрами!

Использование системы компоновки данных (СКД)

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

Чтобы создать отчет по регистру сведений с помощью СКД:

  1. В режиме конфигуратора создайте новый объект Отчет (например, ОтчетПоКурсамВалют).
  2. В открывшемся окне конструктора выберите Создать схему компоновки данных.
  3. Добавьте набор данных типа Запрос и напишите SQL-подобный запрос к регистру сведений (аналогично примеру из предыдущего раздела).
  4. В разделе Настройки добавьте поля для вывода, настройте группировки (например, по валюте) и сортировку.
  5. При необходимости добавьте параметры (например, НачалоПериода и КонецПериода) и настройте их типы.
  6. Сохраните отчет и запустите его в режиме 1С:Предприятие.

Пример схемы компоновки данных для отчета по курсам валют:

&НаСервере

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

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

"ВЫБРАТЬ

| КурсыВалют.Валюта КАК Валюта,

| КурсыВалют.Дата КАК Дата,

| КурсыВалют.Курс КАК Курс

|ИЗ

| РегистрСведений.КурсыВалют КАК КурсыВалют

|ГДЕ

| КурсыВалют.Дата МЕЖДУ &НачалоПериода И &КонецПериода

|УПОРЯДОЧИТЬ ПО

| Дата";

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

Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

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

ДокументРезультат.Вывести(Результат);

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

Преимущества СКД:

  • 📊 Гибкая настройка внешнего вида (цвета, шрифты, выравнивание).
  • 📅 Возможность добавления динамических параметров (даты, справочники и т.д.).
  • 📈 Поддержка диаграмм, сводных таблиц и других визуальных элементов.
  • 🔄 Легко модифицировать и расширять функционал.
💡

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

Программное формирование отчета (встроенный язык 1С)

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

Пример кода для формирования отчета по регистру ЦеныНоменклатуры с выводом в табличный документ:

&НаСервере

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

// Создаем запрос к регистру сведений

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

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

"ВЫБРАТЬ

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

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

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

| ЦеныНоменклатуры.Период КАК Период

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|ГДЕ

| ЦеныНоменклатуры.Период МЕЖДУ &НачалоПериода И &КонецПериода

| И ЦеныНоменклатуры.Номенклатура В (&СписокНоменклатуры)

|УПОРЯДОЧИТЬ ПО

| Номенклатура,

| ТипЦен";

// Устанавливаем параметры

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

Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

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

// Выполняем запрос

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

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

// Формируем табличный документ

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

ОбластьЗаголовок = ТабличныйДокумент.Область(0, 0, 0, 3);

ОбластьЗаголовок.Текст = "Отчет по ценам номенклатуры";

ОбластьЗаголовок.ПараметрыСтиля.Шрифт.Размер = 14;

ОбластьЗаголовок.ПараметрыСтиля.Шрифт.Начертание = НачертаниеШрифта.Полужирный;

// Добавляем шапку таблицы

ТабличныйДокумент.ВывестиСекцию("Номенклатура|Тип цен|Цена|Дата");

// Выводим данные

НомерСтроки = 1;

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

ТабличныйДокумент.ВывестиСекцию(

Выборка.Номенклатура.Наименование + "|" +

Выборка.ТипЦен.Наименование + "|" +

Формат(Выборка.Цена, "ЧДЦ=2") + "|" +

Формат(Выборка.Период, "ДФ=dd.MM.yyyy")

);

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

// Отображаем результат

ТабличныйДокумент.Показать("Отчет по ценам номенклатуры");

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

Этот код:

  1. Формирует запрос к регистру ЦеныНоменклатуры с отбором по периоду и списку номенклатуры.
  2. Выполняет запрос и получает выборку данных.
  3. Создает табличный документ и выводит в него заголовок и данные.
  4. Отображает результат пользователю.

Преимущества программного подхода:

  • 🤖 Полная автоматизация (можно запускать по расписанию или из другого кода).
  • 🔧 Возможность сложной обработки данных (например, расчет средних значений, сравнение с другими регистрами).
  • 📤 Интеграция с внешними системами (выгрузка в Excel, отправка по email, запись в базу данных).
Как оптимизировать запрос к большому регистру?

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

1. Используйте индексы по полям, которые участвуют в отборе (например, по Период и Номенклатура).

2. Ограничивайте выборку только необходимыми полями (не используйте ВЫБРАТЬ *).

3. Если нужно получить только актуальные данные, используйте функцию Последнее() для регистров с периодом:

ВЫБРАТЬ ПЕРВЫЕ 1

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

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|ГДЕ

| ЦеныНоменклатуры.Номенклатура = &Номенклатура

| И ЦеныНоменклатуры.Период <= &ТекущаяДата

|УПОРЯДОЧИТЬ ПО

| Период УБЫВ

4. Для сложных отчетов рассмотрите возможность использования временных таблиц.

⚠️ Внимание: При программном формировании отчетов по большим регистрам (более 100 000 записей) избегайте выгрузки всех данных в память. Используйте постраничную выборку или обрабатывайте данные пакетами, чтобы не перегружать сервер.

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

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

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

Другие распространенные проблемы:

  • 🔄 Неактуальные данные: Если вы запрашиваете данные из регистра сведений с периодом, но не указываете ПОСЛЕДНЕЕ(), вы можете получить устаревшие записи. Всегда проверяйте, нужна ли вам история или только актуальные значения.
  • 📅 Неправильный формат даты: При сравнении дат используйте функции НачалоДня() и КонецДня(), чтобы избежать проблем с временем. Например:
    ГДЕ Дата МЕЖДУ НачалоДня(&НачалоПериода) И КонецДня(&КонецПериода)
  • 🔄 Забытые параметры: Если в запросе используются параметры (например, &НачалоПериода), но они не установлены через УстановитьПараметр(), запрос вернет ошибку.
💡

Всегда тестируйте запрос в конструкторе запросов перед тем, как встраивать его в отчет или программный код. Это позволит быстро выявить синтаксические ошибки и проверить логику отбора.

Если отчет работает медленно, попробуйте следующие оптимизации:

  • 🛠️ Используйте ИНДЕКСИРОВАТЬ ПО для полей, по которым часто идет отбор.
  • 📉 Ограничивайте количество возвращаемых полей (выбирайте только те, которые нужны для отчета).
  • 🔄 Разбивайте сложные запросы на несколько простых с использованием временных таблиц.

Примеры готовых отчетов по регистрам сведений

Рассмотрим несколько практических примеров отчетов для разных типов регистров сведений. Эти примеры можно адаптировать под свою конфигурацию.

1. Отчет по курсам валют

Задача: показать динамику курса доллара и евро за последний месяц.

ВЫБРАТЬ

КурсыВалют.Валюта КАК Валюта,

КурсыВалют.Дата КАК Дата,

КурсыВалют.Курс КАК Курс

ИЗ

РегистрСведений.КурсыВалют КАК КурсыВалют

ГДЕ

КурсыВалют.Валюта В (&СписокВалют)

И КурсыВалют.Дата МЕЖДУ НачалоМесяца(ТекущаяДата()) И ТекущаяДата()

УПОРЯДОЧИТЬ ПО

Валюта,

Дата

2. Отчет по штатному расписанию

Задача: показать актуальное штатное расписание с указанием должностей, окладов и количества ставок.

ВЫБРАТЬ

ШтатноеРасписание.Подразделение КАК Подразделение,

ШтатноеРасписание.Должность КАК Должность,

ШтатноеРасписание.Оклад КАК Оклад,

ШтатноеРасписание.КоличествоСтавок КАК КоличествоСтавок

ИЗ

РегистрСведений.ШтатноеРасписание КАК ШтатноеРасписание

ГДЕ

ШтатноеРасписание.Период =

(ВЫБРАТЬ МАКСИМУМ(Период)

ИЗ РегистрСведений.ШтатноеРасписание

ГДЕ Подразделение = &Подразделение И Должность = &Должность)

3. Отчет по ценам номенклатуры с сравнением

Задача: сравнить цены номенклатуры на начало и конец месяца.

ВЫБРАТЬ

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

ЦеныНоменклатуры.ТипЦен КАК ТипЦен,

МАКСИМУМ(ВЫБОР

КОГДА ЦеныНоменклатуры.Период = НачалоМесяца(&Месяц)

ТОГДА ЦеныНоменклатуры.Цена

ИНАЧЕ NULL

END) КАК ЦенаНаНачалоМесяца,

МАКСИМУМ(ВЫБОР

КОГДА ЦеныНоменклатуры.Период = КонецМесяца(&Месяц)

ТОГДА ЦеныНоменклатуры.Цена

ИНАЧЕ NULL

END) КАК ЦенаНаКонецМесяца

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

ГДЕ

ЦеныНоменклатуры.Период МЕЖДУ НачалоМесяца(&Месяц) И КонецМесяца(&Месяц)

И ЦеныНоменклатуры.Номенклатура В (&СписокНоменклатуры)

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

ЦеныНоменклатуры.Номенклатура,

ЦеныНоменклатуры.ТипЦен

Эти примеры можно использовать как основу для своих отчетов. Не забывайте адаптировать имена регистров, полей и параметров под свою конфигурацию.

Экспорт отчета в Excel и другие форматы

Часто данные из отчетов по регистрам сведений требуется выгрузить в Excel, PDF или другие форматы для дальнейшего анализа. В 1С:Предприятие есть несколько способов экспорта:

1. Экспорт из табличного документа

Если отчет сформирован в табличном документе, его можно сохранить в Excel:

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

2. Экспорт из СКД

В отчетах на основе СКД экспорт настраивается в параметрах компоновки:

КомпоновщикМакета.Вывести(Результат, ДокументРезультат, Тип("ТабличныйДокумент"));

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

3. Использование ЗаписьJSON для интеграции

Если данные нужно передать в другую систему, удобно использовать формат JSON:

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

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

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

ЗаписьJSON.ЗаписатьКлюч("ДатаОтчета");

ЗаписьJSON.ЗаписатьЗначение(Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"));

ЗаписьJSON.ЗаписатьКлюч("Данные");

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

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

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

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

ЗаписьJSON.ЗаписатьЗначение(Выборка.Номенклатура.Наименование);

ЗаписьJSON.ЗаписатьКлюч("Цена");

ЗаписьJSON.ЗаписатьЗначение(Выборка.Цена);

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

КонецЦикла;

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

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

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

ЗаписьТекста = Новый ЗаписьТекста;

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

ЗаписьТекста.ЗаписатьСтроку(РезультатJSON);

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