При работе с Планировщиком 1С часто возникает задача динамического формирования его структуры, в частности, добавления новых колонок (измерений) и заполнения их конкретными значениями. Это позволяет гибко настраивать отображение данных, например, для визуализации расписания сотрудников, загрузки оборудования или занятости кабинетов.
Давайте вместе разберем, как эффективно решить эту задачу, опираясь на опыт коллег и официальную документацию.
Прежде чем перейти к коду, выясним причину, по которой возникают сложности, и проанализируем базовые принципы работы Планировщика. Важно понимать, что Планировщик в 1С — это визуальный компонент, предназначенный для отображения задач, событий, встреч и расписаний. Он не является объектом конфигурации и не имеет собственной структуры для хранения данных в базе данных. Все данные, которые мы видим в Планировщике, загружаются в него программно с помощью встроенного языка и существуют только в оперативной памяти.
Для группировки и структурирования отображаемых событий Планировщик использует коллекцию Измерения. Каждое измерение по сути является "колонкой" или категорией, по которой можно группировать элементы (события) Планировщика. Например, измерением может быть "Сотрудник", "Кабинет" или "Учебная группа".
Внутри каждого измерения находятся ЭлементыИзмеренияПланировщика — это конкретные значения, которые будут отображаться в этой "колонке". Например, для измерения "Сотрудник" элементами будут конкретные сотрудники: "Иванов И.И.", "Петров П.П." и т.д.
Ключевые моменты:
Измерения (колонки): Добавляются через коллекцию Планировщик.Измерения с помощью метода Добавить(). Метод принимает строку — имя измерения.
Измерение = Планировщик.Измерения.Добавить("ИмяИзмерения");
Элементы Измерений (значения в колонках): Добавляются в коллекцию Измерение.Элементы с помощью метода Добавить(). Именно здесь часто возникают ошибки, если передать некорректный параметр. Этот метод ожидает значение произвольного типа, которое будет служить идентификатором элемента измерения. Чаще всего это ссылка на объект информационной базы (например, Выборка.Ссылка), но может быть и строка, число или дата.
ЗначениеИзмерения = Измерение.Элементы.Добавить(ЗначениеДляИдентификации);
Свойства ЭлементаИзмеренияПланировщика: После добавления элемента мы можем настроить его отображение и поведение:
Значение: Не отображается в форме, но служит для связи элемента с конкретным объектом данных. Это то, что мы передали в метод Добавить().Текст: Текст, который будет отображаться в колонке Планировщика.ЦветРамки, ЦветФона: Визуальное оформление.Картинка: Может быть задана для элемента.Рассмотрим подробнее типичную ситуацию, когда нам нужно добавить измерение "Сотрудник" и заполнить его списком сотрудников из справочника. Мы будем использовать запрос для получения данных и затем программно заполнять Планировщик.
Предположим, у нас есть процедура, выполняющаяся на сервере, где доступен объект Планировщик.
Шаг 1: Инициализация запроса и получение данных
Сначала нам необходимо получить список сотрудников, которых мы хотим отобразить в качестве элементов измерения. Мы используем объект Запрос для выборки необходимых полей из справочника "Сотрудники".
&НаСервере
Процедура СоздатьИзмеренияПланировщикаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|УПОРЯДОЧИТЬ ПО
| Сотрудники.Наименование"; // Добавим упорядочивание для наглядности
Выборка = Запрос.Выполнить().Выбрать();
Мы выбираем Ссылка (для внутреннего значения элемента измерения), Наименование (для отображаемого текста) и ГоловнаяОрганизация (для дополнительной информации в тексте).
Шаг 2: Добавление нового измерения
Теперь добавим само измерение в Планировщик. В нашем случае это будет измерение с именем "Сотрудник".
Измерение = Планировщик.Измерения.Добавить("Сотрудник");
Переменная Измерение теперь содержит объект типа ИзмерениеПланировщика, к которому мы будем добавлять элементы.
Шаг 3: Заполнение измерения элементами
Далее мы итерируемся по результатам запроса и для каждой записи создаем новый ЭлементИзмеренияПланировщика, добавляя его в коллекцию Измерение.Элементы.
Пока Выборка.Следующий() Цикл
ЗначенияИзмерений = Измерение.Элементы.Добавить(Выборка.Ссылка);
ЗначенияИзмерений.Текст = Выборка.Наименование + Символы.ПС + Выборка.ГоловнаяОрганизация;
ЗначенияИзмерений.ЦветРамки = WebЦвета.ГолубойСоСтальнымОттенком;
КонецЦикла;
КонецПроцедуры
Давайте разберем этот фрагмент кода:
Пока Выборка.Следующий() Цикл: Этот цикл проходит по каждой записи, полученной из запроса.
ЗначенияИзмерений = Измерение.Элементы.Добавить(Выборка.Ссылка);: Это самый важный шаг. Мы вызываем метод Добавить() для коллекции Измерение.Элементы. В качестве параметра мы передаем Выборка.Ссылка. Эта ссылка будет храниться в свойстве Значение созданного элемента измерения. Это позволяет нам в дальнейшем однозначно идентифицировать, какому сотруднику соответствует данный элемент в Планировщике.
ЗначенияИзмерений.Текст = Выборка.Наименование + Символы.ПС + Выборка.ГоловнаяОрганизация;: Здесь мы задаем текст, который будет отображаться в соответствующей колонке Планировщика. Мы объединяем наименование сотрудника и его головную организацию, используя Символы.ПС для переноса строки.
ЗначенияИзмерений.ЦветРамки = WebЦвета.ГолубойСоСтальнымОттенком;: Мы устанавливаем цвет рамки для визуального оформления элемента. Можно использовать другие свойства, такие как ЦветФона или Картинка.
Полный пример кода:
&НаСервере
Процедура СоздатьИзмеренияПланировщикаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|УПОРЯДОЧИТЬ ПО
| Сотрудники.Наименование";
Выборка = Запрос.Выполнить().Выбрать();
// Добавляем новое измерение в Планировщик
Измерение = Планировщик.Измерения.Добавить("Сотрудник");
// Заполняем измерение элементами на основе выборки из справочника
Пока Выборка.Следующий() Цикл
// Добавляем элемент измерения, передавая ссылку как его значение
ЗначенияИзмерений = Измерение.Элементы.Добавить(Выборка.Ссылка);
// Устанавливаем отображаемый текст и цвет рамки
ЗначенияИзмерений.Текст = Выборка.Наименование + Символы.ПС + Выборка.ГоловнаяОрганизация;
ЗначенияИзмерений.ЦветРамки = WebЦвета.ГолубойСоСтальнымОттенком;
КонецЦикла;
КонецПроцедуры
При работе с большим количеством данных (например, сотнями сотрудников или множеством измерений) следует учитывать производительность. Наш пример уже использует оптимизированный подход, когда все необходимые данные выбираются одним запросом, а затем обрабатываются в памяти. Это гораздо эффективнее, чем выполнять запросы к базе данных внутри цикла.
Помните, что Планировщик — это инструмент для отображения. Для постоянного хранения информации о событиях, задачах или расписаниях, которые вы отображаете, необходимо создать соответствующие объекты в конфигурации (например, справочники "События", "Расписания"). После того как пользователь изменит элемент Планировщика, платформа генерирует событие ПриОкончанииРедактирования, в котором вы можете сохранить изменения обратно в базу данных.
Если вам требуется более сложная структура колонок, например, группировка сотрудников по отделам, Планировщик позволяет создавать вложенные элементы измерений. Для этого у типа ЭлементИзмеренияПланировщика есть свойство Элементы (типа КоллекцияЭлементовИзмеренияПланировщика) для подчиненных элементов и свойство Родитель. Это позволяет создавать иерархические структуры в колонках Планировщика.
Например, если бы мы хотели сгруппировать сотрудников по головной организации, мы могли бы сначала добавить элементы для организаций, а затем уже в их коллекцию Элементы добавлять сотрудников:
// ... (начало процедуры и запроса)
// Добавляем новое измерение
Измерение = Планировщик.Измерения.Добавить("Сотрудник");
// Используем структуру для хранения уже добавленных организаций
// чтобы не добавлять их повторно
СтруктураОрганизаций = Новый Соответствие;
Пока Выборка.Следующий() Цикл
// Проверяем, добавлена ли уже головная организация
Если НЕ СтруктураОрганизаций.Содержит(Выборка.ГоловнаяОрганизация) Тогда
// Если нет, добавляем её как родительский элемент
ЭлементОрганизация = Измерение.Элементы.Добавить(Выборка.ГоловнаяОрганизация);
ЭлементОрганизация.Текст = Выборка.ГоловнаяОрганизация.Наименование;
СтруктураОрганизаций.Вставить(Выборка.ГоловнаяОрганизация, ЭлементОрганизация);
КонецЕсли;
// Получаем родительский элемент (организацию)
РодительскийЭлемент = СтруктураОрганизаций.Получить(Выборка.ГоловнаяОрганизация);
// Добавляем сотрудника как дочерний элемент к организации
ЗначенияИзмерений = РодительскийЭлемент.Элементы.Добавить(Выборка.Ссылка);
ЗначенияИзмерений.Текст = Выборка.Наименование;
ЗначенияИзмерений.ЦветРамки = WebЦвета.ГолубойСоСтальнымОттенком;
КонецЦикла;
// ... (конец процедуры)
Этот пример демонстрирует, как можно создать иерархическую структуру в колонках Планировщика, что делает его еще более гибким и информативным для пользователя.
Таким образом, мы видим, что программное добавление колонок и их значений в Планировщик 1С — это достаточно прямолинейная задача, если понимать его архитектуру и правильно использовать методы Планировщик.Измерения.Добавить() и Измерение.Элементы.Добавить(). Главное — передавать в метод Добавить() осмысленные значения, которые будут служить идентификаторами для ваших элементов.