Как использовать объект «Планировщик» в 1С:Предприятии 8.3: примеры программной настройки и работы с кодом

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

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

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

Где Планировщик используется в реальных конфигурациях?

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

  1. 1С:Управление нашей фирмой (УНФ) и 1С:Розница: Здесь планировщик выступает основой рабочего места «Планировщик ресурсов». С его помощью пользователи распределяют загрузку сотрудников, планируют работу оборудования, цехов, автотранспорта и ведут запись клиентов на услуги.
  2. 1С:ERP Управление предприятием: Инструмент применяется в проектном менеджменте для наглядной визуализации и оперативной корректировки планов по трудовым ресурсам на проектных задачах.
  3. Отраслевые CRM-решения (например, 1С:Салон красоты, 1С:Медицина. Стоматологическая клиника, 1С:Фитнес-клуб): В этих программах планировщик является главным рабочим местом администратора, заменяя собой традиционный журнал предварительной записи клиентов к специалистам на определенное время.

Архитектура и суть объекта

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

У данного объекта нет собственных таблиц в базе данных СУБД. Он не хранит информацию сам по себе. Архитектурный паттерн работы с ним выглядит следующим образом: разработчик должен программно прочитать данные из СУБД (например, из документов «Заказ-наряд» или регистров сведений) и загрузить их в коллекции планировщика. И наоборот: при интерактивном перемещении элементов пользователем на форме, измененные данные необходимо перехватить и программно записать обратно в базу данных.

Для полноценного отображения сетки планировщика в базе данных источника обязательно должны присутствовать как минимум два реквизита типа Дата — дата начала и дата окончания планируемого события.

Структура объекта и ключевые коллекции

Взаимодействие с планировщиком в программном коде строится вокруг четырех ключевых коллекций. Рассмотрим их подробнее:

  1. Элементы (коллекция Планировщик.Элементы): Это непосредственно сами плитки (события), отображаемые на сетке календаря. Каждый элемент обладает свойствами Начало, Конец, Текст, Значение (обычно сюда записывают ссылку на документ базы данных для последующей идентификации), а также визуальными свойствами ЦветФона и Картинка.
  2. Измерения (коллекция Планировщик.Измерения): Сущности, по которым группируется сетка планировщика. Например, это могут быть колонки с мастерами, кабинетами, автомобилями или производственным оборудованием.
  3. Шкала (свойство Планировщик.Шкала): Управляет шагом времени (минуты, часы, дни) и форматом отображения. Платформа позволяет гибко настраивать шкалу, выводя как один день, так и прерывистые интервалы (например, только рабочие часы или определенные дни недели для сравнения).
  4. Интервалы фона (коллекция Планировщик.ИнтервалыФона): Позволяют визуально выделить (закрасить) нерабочие часы, праздничные дни или перерывы, создавая интуитивно понятную сетку занятости.

Разберем по шагам: Заполнение планировщика данными из базы

Посмотрим на пример того, как заполнить планировщик данными при открытии формы. Для этого мы напишем процедуру, которая будет выполняться на сервере. Мы выберем запросом документы «Заказ-наряд» и добавим их в планировщик.


&НаСервере
Процедура ЗаполнитьПланировщикНаСервере()
    
    // Очищаем старые элементы перед заполнением
    ЭлементыПланировщика = Планировщик.Элементы;
    ЭлементыПланировщика.Очистить();
    
    // Запрос к документам-источникам
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЗаказНаряд.Ссылка КАК Ссылка,
        |   ЗаказНаряд.ДатаНачала КАК ДатаНачала,
        |   ЗаказНаряд.ДатаОкончания КАК ДатаОкончания,
        |   ЗаказНаряд.Мастер КАК Мастер
        |ИЗ
        |   Документ.ЗаказНаряд КАК ЗаказНаряд";
        
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого Строка Из Результат Цикл
        // Создаем плитку на сетке планировщика
        НовыйЭлемент = ЭлементыПланировщика.Добавить(Строка.ДатаНачала, Строка.ДатаОкончания);
        НовыйЭлемент.Текст = Строка(Строка.Ссылка);
        НовыйЭлемент.Значение = Строка.Ссылка; // сохраняем ссылку для последующего изменения
        
        // Связываем элемент с конкретной колонкой (измерением "Мастер")
        НовыйЭлемент.ЗначенияИзмерений.Вставить("Мастер", Строка.Мастер);
        
        // Оформление
        НовыйЭлемент.ЦветФона = WebЦвета.СветлоЗеленый;
    КонецЦикла;
    
КонецПроцедуры

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

Настройка интервалов фона (подсветка нерабочего времени)

По умолчанию сетка планировщика однотонная. Чтобы сделать интерфейс эргономичным, необходимо визуально отделить рабочие часы от нерабочих. Выясним, как закрасить утренние часы (до 9:00) и вечерние (после 18:00) в серый цвет.

Рассмотрим код настройки интервалов фона:


&НаСервере
Процедура НастроитьНерабочееВремя()
    
    // Очищаем старые интервалы фона
    Планировщик.ИнтервалыФона.Очистить();
    
    // Пример для конкретного дня: красим утро до начала работы
    НачалоДня = НачалоДня(ТекущаяДата());
    НачалоРаботы = НачалоДня + 9 * 3600; // 09:00
    
    ИнтервалУтро = Планировщик.ИнтервалыФона.Добавить(НачалоДня, НачалоРаботы);
    ИнтервалУтро.Цвет = WebЦвета.СветлоСерый;
    
    // Красим вечер после работы
    КонецРаботы = НачалоДня + 18 * 3600; // 18:00
    КонецДня = КонецДня(ТекущаяДата());
    
    ИнтервалВечер = Планировщик.ИнтервалыФона.Добавить(КонецРаботы, КонецДня);
    ИнтервалВечер.Цвет = WebЦвета.СветлоСерый;
    
КонецПроцедуры

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

Обработка интерактивного редактирования (Drag-and-Drop)

Одним из ключевых преимуществ планировщика является возможность перетаскивать события мышкой, изменять их длительность «растягиванием» границ или переносить на другие измерения (например, назначать заказ другому мастеру). Чтобы эти изменения сохранились в информационной базе, мы должны обработать событие формы ПриОкончанииРедактирования.

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


&НаКлиенте
Процедура ПланировщикПриОкончанииРедактирования(Элемент, НовыйЭлемент, ОтменаРедактирования, СтандартнаяОбработка)
    
    Если ОтменаРедактирования Тогда
        Возврат;
    КонецЕсли;
    
    // Передаем измененные границы времени на сервер для записи в документ
    ЗаписатьИзмененияНаСервере(НовыйЭлемент.Значение, НовыйЭлемент.Начало, НовыйЭлемент.Конец);
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаписатьИзмененияНаСервере(СсылкаНаДокумент, НовоеНачало, НовыйКонец)
    
    Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
        ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
        ДокОбъект.ДатаНачала = НовоеНачало;
        ДокОбъект.ДатаОкончания = НовыйКонец;
        ДокОбъект.Записать();
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание на важный нюанс: запись изменений выполняется в процедуре с директивой компиляции &НаСервереБезКонтекста. Это позволяет существенно повысить производительность решения, так как серверу не требуется передавать и обрабатывать весь контекст тяжелой управляемой формы.

Полезные фичи для продвинутой разработки

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

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

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

← На главную