Как правильно организовать хранение и вывод часов через перечисления в отчетах 1С?

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

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

Проблема именования значений перечисления

Первое, с чем мы сталкиваемся при создании перечисления Часы — это ограничение именования идентификаторов. В 1С идентификатор объекта метаданных не может начинаться с цифры. Если мы попытаемся создать значение с именем "1" или "10", конфигуратор выдаст ошибку.

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

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

Подготовка данных в запросе

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

Посмотрим на пример запроса, который собирает данные для такой задачи:


ВЫБРАТЬ
    День.Порядок КАК Порядок,
    День.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Дни
ИЗ
    Перечисление.День КАК День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Дни.Ссылка КАК День,
    Данные.Контрагент КАК Контрагент,
    Данные.Час КАК Час
ИЗ
    ВТ_Дни КАК ВТ_Дни
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказыКонтрагентам КАК Данные
    ПО ВТ_Дни.Ссылка = Данные.День

В данном запросе мы сначала формируем временную таблицу всех дней недели, чтобы в отчете отобразились даже те дни, по которым нет заказов. Обратите внимание, что использование функции ЕстьNull(Данные.Час, 0), как пытался сделать автор темы, является ошибкой, так как Час имеет тип ПеречислениеСсылка, а 0 — это число. В СКД лучше оставлять значение NULL, которое потом можно заменить на прочерк в настройках оформления.

Настройка СКД: почему пропадают данные в кросс-таблице?

Типичная проблема при работе с кросс-таблицами в СКД заключается в том, что на пересечении строки (Контрагент) и колонки (День) может стоять только Ресурс. Если вы просто добавите поле Час в выбранные поля, но не определите его как ресурс, СКД может вывести только одну запись или вовсе оставить ячейку пустой при наличии нескольких записей на один и тот же день.

Выясним причину: когда мы создаем кросс-отчет, система группирует данные. Если для одного контрагента на понедельник есть две записи (например, 14:00 и 17:00), СКД должна знать, как их "схлопнуть" в одну ячейку. По умолчанию используется агрегатная функция (Сумма, Минимум, Максимум).

Рассмотрим два варианта решения:

Вариант 1: Вывод всех значений через запятую

Если нам нужно увидеть все назначенные часы в одной ячейке, воспользуемся функцией СоединитьСтроки. В СКД на закладке "Ресурсы" для поля Час укажем следующее выражение:


СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Представление(Час)"), ", ")

Это позволит превратить набор значений перечисления в красивую строку вида "14, 17", при этом данные не будут теряться.

Вариант 2: Детализация до каждой записи

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

  1. В строках отчета добавьте группировку Контрагент.
  2. Внутри нее добавьте детальные записи или группировку по полю Час.
  3. В колонках оставьте группировку День.

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

Использование справочника вместо перечисления

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

Преимущества справочника:

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

← На главную