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

Программист 1С v8.3 (Управляемые формы)
← На главную

Часто перед начинающими разработчиками 1С встает задача по созданию собственного отчета на основе нетиповых, добавленных вручную объектов. Проанализируем типичную ситуацию: в базе создан справочник Оборудование, в котором хранятся реквизиты, такие как место эксплуатации, дата установки и дата профилактики. Требуется вывести список мест с общим количеством исправных устройств и их итоговой суммой.

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

Анализ архитектуры данных: исправляем ошибки проектирования

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

Рассмотрим подробнее, почему это плохая практика:

  1. Справочники предназначены для хранения условно-постоянной информации. Наименование, артикул, заводской номер — это то, что не меняется со временем.
  2. Даты установки, статусы профилактики и место эксплуатации — это динамические характеристики. Оборудование могут переместить в другой кабинет, а профилактика проводится регулярно. Если мы будем перезаписывать эти данные в реквизитах справочника, мы навсегда потеряем историю. Для таких задач в 1С используются Периодические регистры сведений.
  3. Количественный и суммовой учет. Если в задаче фигурирует "итоговая сумма всех устройств", хранить эту стоимость в регистре сведений (а тем более в справочнике) в корне неверно. Для получения итоговых сумм и остатков на любую дату используются Регистры накопления (вид регистра — "Остатки").

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

  1. Добавить ресурс Стоимость (или Сумма) в соответствующий регистр накопления.
  2. Настроить проведение документов (например, "Поступление оборудования" или "Ввод в эксплуатацию"), чтобы при проведении они делали движения в этот регистр.

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

После того как архитектура приведена в порядок, перейдем к созданию отчета. Для кастомных отчетов в 1С не нужно писать вывод макета программным кодом. Рассмотрим мощный встроенный механизм — СКД.

Создадим новый внешний или внутренний отчет, откроем основную схему компоновки данных и добавим "Набор данных - запрос". Нам предстоит написать запрос к нашей базе данных.

Написание запроса для выборки данных

Наш запрос должен обращаться к регистру сведений (для получения актуального статуса профилактики и места эксплуатации) и соединять его с регистром накопления (для получения остатков и сумм).

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


ВЫБРАТЬ
    ОстаткиОборудованияОстатки.МестоЭксплуатации КАК МестоЭксплуатации,
    ОстаткиОборудованияОстатки.Оборудование КАК Оборудование,
    ОстаткиОборудованияОстатки.КоличествоОстаток КАК Количество,
    ОстаткиОборудованияОстатки.СуммаОстаток КАК Сумма,
    СтатусыОборудованияСрезПоследних.ДатаПрофилактики КАК ДатаПрофилактики
ИЗ
    РегистрНакопления.ОстаткиОборудования.Остатки КАК ОстаткиОборудованияОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыОборудования.СрезПоследних КАК СтатусыОборудованияСрезПоследних
        ПО ОстаткиОборудованияОстатки.Оборудование = СтатусыОборудованияСрезПоследних.Оборудование
ГДЕ
    СтатусыОборудованияСрезПоследних.ДатаПрофилактики >= &ДатаОтсечения

Разберем этот код по частям. Мы используем виртуальную таблицу Остатки для регистра накопления, чтобы получить актуальные данные о количестве и сумме на текущий момент. Затем мы используем Левое соединение с виртуальной таблицей СрезПоследних регистра сведений, чтобы подтянуть актуальную дату профилактики. В секции ГДЕ (которую в СКД лучше перенести на вкладку "Отбор" для гибкости) мы отсекаем те устройства, которые не прошли профилактику.

Настройка ресурсов и группировок в СКД

Когда текст запроса готов, перейдем к настройке вывода.

  1. Откроем вкладку Ресурсы в схеме компоновки данных.
  2. Для подсчета общего количества устройств и их стоимости добавим поля Количество и Сумма.
  3. В колонке "Выражение" СКД автоматически подставит Сумма(Количество) и Сумма(Сумма). Если бы мы считали уникальные единицы оборудования списком, мы могли бы использовать выражение Количество(Различные Оборудование).

Теперь перейдем на вкладку Настройки и создадим структуру отчета:

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

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

← На главную