Иерархия проектов — ложный ход
Надоело мне писать в Word список задач по сферам жизни и я опять вернулся к мысли вести эти списки в 1С.
В общем, иерархию задач я продумал, выглядела она как-то так:
В 1С я решил это отображать с помощью интерактивного табличного документа:
И даже начал ваять код по выводу:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураПараметров = Параметры.СтруктураПараметров;
Контекст = ПустойКонтекстВыводаЗадачи(Контекст);
Контекст.Лево = 1;
Контекст.Верх = 1;
Контекст.Задача = СтруктураПараметров.Задача;
ОтобразитьЗадачу(Контекст);
КонецПроцедуры
&НаСервере
Функция ОтобразитьЗадачу(Контекст)
//Контекст
// Лево — левая точка
// Верх — верхняя точка
// Задача — ссылка на задачу
ОО = РеквизитФормыВЗначение(«Объект»);
Макет = ОО.ПолучитьМакет(«Макет»);
Область = Макет.ПолучитьОбласть(«Строка|Колонка»);
Область.Параметры.Задача = Контекст.Задача;
ТабличныйДокумент.Вывести(Область);
КонецФункции
&НаСервере
Функция ПустойКонтекстВыводаЗадачи(Контекст)
Возврат Новый Структура(«Лево, Верх, Задача»);
КонецФункции
//ДеревоВидов — дерево
//На первом уровне — конкретный вид
//В подчинении — элементы вида
//Каждый может иметь подчиненные элементы
Но слава богу, много не наваял, потому что приостановился и подумал, что в принципе, это можно все отобразить с помощью нескольких деревьев значений, которые класть на форму 1С.
Так что я не потратил много времени на ложный след и буду делать отображение просмотров иерархии задач с помощью встроенного объекта — дерева значений.
Потому уже, если структура подойдет, могу сам или заказать кому вывод с помощью макета, как это делается в Управлении Холдингом, например:
Довольно быстро я набросал черновик кода, который отображает мне дерево в удобном для меня виде:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураПараметров = Параметры.СтруктураПараметров;
Контекст = ПустойКонтекстВыводаЗадачи(Контекст);
Контекст.Задача = СтруктураПараметров.Задача;
Контекст.Дерево = «Дерево»;
ОтобразитьЗадачу(Контекст, Контекст.Задача);
//Для Каждого Идентификатор ИЗ Контекст.Развернуть Цикл
// РазвернутьИдентификаторы.Добавить(Идентификатор);
// ЭтаФорма.Элементы[Контекст.Дерево].Развернуть(Идентификатор, ложь);
//КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ОтобразитьЗадачу(Контекст, Задача, СтрокиДерева = Неопределено)
//Контекст
// Лево — левая точка
// Верх — верхняя точка
// Задача — ссылка на задачу
Если Контекст.ЭлементыЗадач[Задача] <> Неопределено Тогда
Возврат Неопределено;
Конецесли;
Если ЭтаФорма.Элементы.Найти(Контекст.Дерево) = Неопределено Тогда
СоздатьДеревоЗначений(Контекст.Дерево);
КонецЕсли;
Если СтрокиДерева = Неопределено Тогда
СтрокиДерева = ЭтаФорма[Контекст.Дерево].ПолучитьЭлементы();
КонецЕсли;
НСтр = СтрокиДерева.Добавить();
НСтр.Задача = Задача;
Контекст.ЭлементыЗадач.Вставить(Задача, Нстр);
З = Новый Запрос(
«ВЫБРАТЬ
| ПодчиненностьЗадач.Владелец КАК Владелец,
| ПодчиненностьЗадач.Задача КАК Задача,
| ПодчиненностьЗадач.Порядок КАК Порядок
|ИЗ
| РегистрСведений.ПодчиненностьЗадач КАК ПодчиненностьЗадач
|ГДЕ
| ПодчиненностьЗадач.Владелец = &Владелец
|
|УПОРЯДОЧИТЬ ПО
| Порядок»);
З.УстановитьПараметр(«Владелец», Задача);
ТЗ = З.Выполнить().Выгрузить();
Для Каждого Строка ИЗ ТЗ Цикл
ОтобразитьЗадачу(Контекст, Строка.Задача, НСтр.ПолучитьЭлементы());
КонецЦикла;
//Контекст.Развернуть.Добавить(Нстр.ПолучитьИдентификатор());
РСтр = РазвернутьИдентификаторы.Добавить();
РСтр.ИмяЭлемента = Контекст.Дерево;
РСтр.Идентификатор = Нстр.ПолучитьИдентификатор();
КонецФункции
&НаСервере
Процедура СоздатьДеревоЗначений(ИмяДерева)
//https://helpf.pro/faq/view/1745.html — отсюда
// Создание и заполнение «обычного» объекта прикладного типа ДеревоЗначений,
// который будет отображен на управляемой форме
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект.Колонки.Добавить(«Задача», Новый ОписаниеТипов(«СправочникСсылка.Задачи»));
//ДеревоОбъект.Колонки.Добавить(«Вид», Новый ОписаниеТипов(«СправочникСсылка.Задачи»));
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Дерево»,
Новый ОписаниеТипов(«ДеревоЗначений»)));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «Дерево»));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, ИмяДерева);
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить(ИмяДерева, Тип(«ТаблицаФормы»));
ЭлементДерево.ПутьКДанным = ИмяДерева;
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»),
ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = ИмяДерева + «.» + Колонка.Имя;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПустойКонтекстВыводаЗадачи(Контекст)
Контекст = Новый Структура(«Лево, Верх, Задача»);
Контекст.Вставить(«ЭлементыЗадач», Новый Соответствие());
Контекст.Вставить(«Дерево», );
Контекст.Вставить(«Развернуть», Новый Массив());
Возврат Контекст;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//Вставить содержимое обработчика
РазвернутьИдентификаторы();
КонецПроцедуры
&НаКлиенте
Процедура РазвернутьИдентификаторы()
Для Каждого Строка ИЗ РазвернутьИдентификаторы Цикл
ЭтаФорма.Элементы[Строка.ИмяЭлемента].Развернуть(Строка.Идентификатор, ложь);
КонецЦикла;
КонецПроцедуры
//ДеревоВидов — дерево
//На первом уровне — конкретный вид
//В подчинении — элементы вида
//Каждый может иметь подчиненные элементы
Для связей задач использую регистр сведений:
По сути у меня задачи, включающие другие не несут никакой особой смысловой нагрузки. Это просто списки. Список рабочих задач, домашних задач, список закупок и т.п.
Понятно, что одна задача может быть в нескольких списках, в этом и прелесть.
это тоже ложный ход, вот истинный:
tasks.yml:
— Цель:
— Проект:
— Подпроект
у меня нет жесткой структуры проектов. Скорее это списки.
Сравни форматы yaml или md со своими же словами «у меня нет жесткой структуры проектов. Скорее это списки.»
а при чем тут форматы файлов конфигураций. MD — это файл конфигурации 77, я так понимаю?
ну, как говорится, «кто не понял, тот поймет»
А если подзадача принадлежит двум/нескольким объектам?
Надо делать или табличную часть (как состав групп в пользователях) или РС и заботиться о ацикличности
дополнил статью организацией подчиненности задач, действительно, я использую регистр сведений.
Но об организации структуры я напишу чуть позже, когда реализую