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

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

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

Выбор архитектуры хранения данных

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

Проанализируем два подхода к организации регистра:

  1. Периодический регистр сведений с шагом в 1 час. Это кажется простым решением, если планирование идет строго по часам. Однако на практике сотрудники могут выполнять задачи разной длительности (например, 15 минут или 2.5 часа). Жесткая периодичность создаст избыточность записей или потерю точности.
  2. Непериодический регистр сведений с интервальным хранением. Это более гибкий и профессиональный подход. Мы создаем регистр со следующей структурой:
    • Измерения: Сотрудник, Дата.
    • Ресурсы/Реквизиты: ВремяНачала, ВремяОкончания, ВидРаботы, Комментарий.

Рассмотрим пример кода для записи данных в такой регистр:


МенеджерЗаписи = РегистрыСведений.ЗанятостьСотрудников.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Сотрудник = ВыбранныйСотрудник;
МенеджерЗаписи.Дата = НачалоДня(ТекущаяДата());
МенеджерЗаписи.ВремяНачала = ТекущаяДата();
МенеджерЗаписи.ВремяОкончания = ТекущаяДата() + 3600; // Добавляем 1 час
МенеджерЗаписи.ВидРаботы = Справочники.ВидыРабот.Разгрузка;
МенеджерЗаписи.Записать();

Визуализация через Табличный документ

Хотя платформа предлагает объект ДиаграммаГанта, опытные разработчики для обычных форм рекомендуют использовать ТабличныйДокумент. Он позволяет добиться максимального сходства с интерфейсами в стиле Excel и дает полный контроль над оформлением каждой ячейки.

Разберем по шагам процесс построения такого отчета:

Шаг 1. Формирование сетки. Проанализируем рабочий график организации. Если компания работает с 08:00 до 20:00, нам достаточно вывести 12 колонок. Первой колонкой выводим ФИО сотрудника. Для фиксации заголовков при прокрутке используем свойство ФиксацияСверху и ФиксацияСлева.

Шаг 2. Заполнение данными. Мы делаем запрос к нашему регистру сведений за выбранный день. Пройдемся в цикле по сотрудникам (строки) и по часам (колонки). Если интервал работы сотрудника пересекается с конкретным часом, мы раскрашиваем ячейку.

Пример алгоритма раскраски:


Для Каждого СтрокаСотрудник Из СписокСотрудников Цикл
    ТекущаяСтрока = ТабДок.Вывести(ОбластьСтрока);
    Для Час = 8 По 19 Цикл
        ТекущаяЯчейка = ТекущаяСтрока.Область(1, Час - 6); // Смещение индекса колонки
        Если СотрудникЗанятВЭтотЧас(СтрокаСотрудник.Ссылка, Час) Тогда
            ТекущаяЯчейка.ЦветФона = ЦветаСтиля.ЭлементСпискаВыбранный;
            ТекущаяЯчейка.Текст = "Работа";
            ТекущаяЯчейка.ПараметрРасшифровки = ДанныеЗаписи;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Интерактивность и расшифровка

Чтобы система была не просто картинкой, а инструментом управления, реализуем реакцию на действия пользователя. В свойствах табличного документа включим ТолькоПросмотр = Истина, но оставим доступной расшифровку.

Проанализируем событие Выбор (двойной клик) в табличном документе. Если пользователь кликает по закрашенной ячейке, мы можем получить ПараметрРасшифровки и открыть форму записи регистра или документа-основания. Если клик по пустой ячейке — открываем форму создания новой записи, где Сотрудник и Время уже заполнены на основании координат ячейки.

Использование Диаграммы Ганта

Если требуется отображать длительные процессы, которые длятся несколько дней, стоит рассмотреть объект ДиаграммаГанта. Рассмотрим ее особенности:

Для настройки диаграммы Ганта в коде используется следующий подход:


ЭлементГанта = ДиаграммаГанта.УстановитьЗначение(Сотрудник, Задача);
Интервал = ЭлементГанта.Добавить();
Интервал.Начало = ДатаНачала;
Интервал.Конец = ДатаОкончания;
Интервал.Текст = "Описание работы";

Альтернатива: Поле HTML документа

Выясним причину, почему иногда стандартных средств 1С недостаточно. Если заказчику нужна современная анимация или Drag-and-Drop (перетаскивание задачи от одного сотрудника другому мышкой), стандартный ТабличныйДокумент на обычных формах с этим не справится. В этом случае мы можем использовать элемент формы ПолеHTMLДокумента.

В этом сценарии 1С выступает как "бэкенд", подготавливая данные в формате JSON, а визуализация происходит с помощью JavaScript-библиотек (например, простых CSS-Grid систем). Это решение требует знаний веб-технологий, но позволяет создать максимально эргономичный интерфейс.

Рекомендации по оптимизации

При большом количестве сотрудников (более 100) формирование таблицы может замедлиться. Рассмотрим способы ускорения:

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

Подводя итог, можно сказать, что связка Регистр сведений + Табличный документ является "золотым стандартом" для подобных задач на обычных формах 1С 8.3. Она сочетает в себе простоту реализации, высокую производительность и привычный для пользователей интерфейс.

← На главную