При разработке учетных систем на платформе 1С часто возникает задача планирования, где время (часы) должно быть представлено не просто как число, а как фиксированный набор значений. Одной из типичных проблем является использование перечислений для представления часов (от 1 до 24) и последующий вывод этих данных в сложные аналитические отчеты, такие как кросс-таблицы в Системе компоновки данных (СКД). Разберем по шагам, как обойти ограничения платформы при именовании объектов и как добиться корректного отображения всех данных в отчете.
Первое, с чем мы сталкиваемся при создании перечисления Часы — это ограничение именования идентификаторов. В 1С идентификатор объекта метаданных не может начинаться с цифры. Если мы попытаемся создать значение с именем "1" или "10", конфигуратор выдаст ошибку.
Проанализируем ситуацию: нам нужно, чтобы программно мы могли обращаться к значениям, а пользователь видел привычные цифры. Для этого мы используем свойство Синоним. Рассмотрим правильную структуру заполнения перечисления:
_1, _2 ... _24 (или Час01, Час02).1, 2 ... 24.Как отмечают опытные разработчики, платформа 1С по умолчанию в выпадающих списках, полях ввода и стандартных отчетах показывает именно Представление объекта, которое формируется из синонима. Поэтому, назвав значение перечисления "слоном", но установив синоним "1", вы добьетесь нужного визуального эффекта. Важно помнить: чтобы часы в списках шли по порядку, их нужно расположить в дереве метаданных строго последовательно, так как сортировка перечислений в запросах по умолчанию идет по их внутреннему порядку (индексу).
Перейдем к формированию данных для отчета. Допустим, у нас есть регистр сведений ЗаказыКонтрагентам, где измерениями являются Контрагент и День (перечисление), а реквизитом — Час (наше перечисление). Нам нужно получить таблицу, где строки — это контрагенты, а колонки — дни недели.
Посмотрим на пример запроса, который собирает данные для такой задачи:
ВЫБРАТЬ
День.Порядок КАК Порядок,
День.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Дни
ИЗ
Перечисление.День КАК День
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Дни.Ссылка КАК День,
Данные.Контрагент КАК Контрагент,
Данные.Час КАК Час
ИЗ
ВТ_Дни КАК ВТ_Дни
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказыКонтрагентам КАК Данные
ПО ВТ_Дни.Ссылка = Данные.День
В данном запросе мы сначала формируем временную таблицу всех дней недели, чтобы в отчете отобразились даже те дни, по которым нет заказов. Обратите внимание, что использование функции ЕстьNull(Данные.Час, 0), как пытался сделать автор темы, является ошибкой, так как Час имеет тип ПеречислениеСсылка, а 0 — это число. В СКД лучше оставлять значение NULL, которое потом можно заменить на прочерк в настройках оформления.
Типичная проблема при работе с кросс-таблицами в СКД заключается в том, что на пересечении строки (Контрагент) и колонки (День) может стоять только Ресурс. Если вы просто добавите поле Час в выбранные поля, но не определите его как ресурс, СКД может вывести только одну запись или вовсе оставить ячейку пустой при наличии нескольких записей на один и тот же день.
Выясним причину: когда мы создаем кросс-отчет, система группирует данные. Если для одного контрагента на понедельник есть две записи (например, 14:00 и 17:00), СКД должна знать, как их "схлопнуть" в одну ячейку. По умолчанию используется агрегатная функция (Сумма, Минимум, Максимум).
Рассмотрим два варианта решения:
Если нам нужно увидеть все назначенные часы в одной ячейке, воспользуемся функцией СоединитьСтроки. В СКД на закладке "Ресурсы" для поля Час укажем следующее выражение:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойТаблицаЗначений("Представление(Час)"), ", ")
Это позволит превратить набор значений перечисления в красивую строку вида "14, 17", при этом данные не будут теряться.
Если же мы хотим, чтобы под каждым контрагентом выводились отдельные строки для каждого часа, нам нужно изменить структуру настроек СКД:
Контрагент.Час.День.В этом случае поле Час не обязательно делать ресурсом, так как оно само выступает в роли группировки, и каждая запись найдет свое место в сетке отчета.
Проанализировав ситуацию, стоит рассмотреть альтернативный подход. Если количество "часов" или интервалов может измениться в будущем (например, добавятся получасовые интервалы), использование Справочника вместо Перечисления будет более гибким решением.
Преимущества справочника:
Порядок.Вне зависимости от выбранного объекта (справочник или перечисление), принципы работы с СКД остаются прежними: правильная настройка ресурсов и группировок — залог того, что ваши данные будут отображены корректно и в полном объеме.