Иерархия проектов — ложный ход

Надоело мне писать в Word список задач по сферам жизни и я опять вернулся к мысли вести эти списки в 1С.

В общем, иерархию задач я продумал, выглядела она как-то так:

В 1С я решил это отображать с помощью интерактивного табличного документа:

И даже начал ваять код по выводу:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
СтруктураПараметров = Параметры.СтруктураПараметров;

   
Контекст = ПустойКонтекстВыводаЗадачи(Контекст);
   
Контекст.Лево = 1;
   
Контекст.Верх = 1;
   
Контекст.Задача = СтруктураПараметров.Задача;

   
ОтобразитьЗадачу(Контекст);

КонецПроцедуры

&НаСервере
Функция ОтобразитьЗадачу(Контекст)
   
//Контекст
    //  Лево — левая точка
    //  Верх — верхняя точка
    //  Задача — ссылка на задачу

   
ОО = РеквизитФормыВЗначение(«Объект»);
   
Макет = ОО.ПолучитьМакет(«Макет»);
   
Область = Макет.ПолучитьОбласть(«Строка|Колонка»);
   
Область.Параметры.Задача = Контекст.Задача;

   
ТабличныйДокумент.Вывести(Область);
КонецФункции

&НаСервере
Функция ПустойКонтекстВыводаЗадачи(Контекст)
    Возврат Новый
Структура(«Лево, Верх, Задача»);
КонецФункции

//ДеревоВидов — дерево
//На первом уровне — конкретный вид
//В подчинении — элементы вида
//Каждый может иметь подчиненные элементы

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

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

Потому уже, если структура подойдет, могу сам или заказать кому вывод с помощью макета, как это делается в Управлении Холдингом, например:

Довольно быстро я набросал черновик кода, который отображает мне дерево в удобном для меня виде:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
СтруктураПараметров = Параметры.СтруктураПараметров;

   
Контекст = ПустойКонтекстВыводаЗадачи(Контекст);
   
Контекст.Задача = СтруктураПараметров.Задача;
   
Контекст.Дерево = «Дерево»;

   
ОтобразитьЗадачу(Контекст, Контекст.Задача);

   
//Для Каждого Идентификатор ИЗ Контекст.Развернуть Цикл
    //  РазвернутьИдентификаторы.Добавить(Идентификатор);
    //  ЭтаФорма.Элементы[Контекст.Дерево].Развернуть(Идентификатор, ложь);
    //КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ОтобразитьЗадачу(Контекст, Задача, СтрокиДерева = Неопределено)
   
//Контекст
    //  Лево — левая точка
    //  Верх — верхняя точка
    //  Задача — ссылка на задачу

   
Если Контекст.ЭлементыЗадач[Задача] <> Неопределено Тогда
        Возврат Неопределено;
    Конецесли;


    Если
ЭтаФорма.Элементы.Найти(Контекст.Дерево) = Неопределено Тогда
       
СоздатьДеревоЗначений(Контекст.Дерево);
    КонецЕсли;

    Если
СтрокиДерева = Неопределено Тогда
       
СтрокиДерева = ЭтаФорма[Контекст.Дерево].ПолучитьЭлементы();
    КонецЕсли;

   
НСтр = СтрокиДерева.Добавить();
   
НСтр.Задача = Задача;
   
Контекст.ЭлементыЗадач.Вставить(Задача, Нстр);

   
З = Новый Запрос(
   
«ВЫБРАТЬ
    |   ПодчиненностьЗадач.Владелец КАК Владелец,
    |   ПодчиненностьЗадач.Задача КАК Задача,
    |   ПодчиненностьЗадач.Порядок КАК Порядок
    |ИЗ
    |   РегистрСведений.ПодчиненностьЗадач КАК ПодчиненностьЗадач
    |ГДЕ
    |   ПодчиненностьЗадач.Владелец = &Владелец
    |
    |УПОРЯДОЧИТЬ ПО
    |   Порядок»
);
   
З.УстановитьПараметр(«Владелец», Задача);
   
ТЗ = З.Выполнить().Выгрузить();


    Для Каждого
Строка ИЗ ТЗ Цикл
       
ОтобразитьЗадачу(Контекст, Строка.Задача, НСтр.ПолучитьЭлементы());
    КонецЦикла;

   
//Контекст.Развернуть.Добавить(Нстр.ПолучитьИдентификатор());
   
РСтр = РазвернутьИдентификаторы.Добавить();
   
РСтр.ИмяЭлемента = Контекст.Дерево;
   
РСтр.Идентификатор = Нстр.ПолучитьИдентификатор();


КонецФункции


&НаСервере
Процедура СоздатьДеревоЗначений(ИмяДерева)
   
//https://helpf.pro/faq/view/1745.html — отсюда

    // Создание и заполнение «обычного» объекта прикладного типа ДеревоЗначений,
    // который будет отображен на управляемой форме
   
ДеревоОбъект = Новый ДеревоЗначений;
   
ДеревоОбъект.Колонки.Добавить(«Задача», Новый ОписаниеТипов(«СправочникСсылка.Задачи»));
   
//ДеревоОбъект.Колонки.Добавить(«Вид», Новый ОписаниеТипов(«СправочникСсылка.Задачи»));


    // Создание Реквизита формы типа ДанныеФормыДерево
   
МассивДобавляемыхРеквизитов = Новый Массив;
   
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Дерево»,
        Новый
ОписаниеТипов(«ДеревоЗначений»)));
    Для Каждого
Колонка Из ДеревоОбъект.Колонки Цикл
       
МассивДобавляемыхРеквизитов.Добавить(
           Новый
РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «Дерево»));
    КонецЦикла;
   
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);


   
// Преобразование объекта прикладного типа ДеревоЗначений
    // в реквизит управляемой формы (данные формы)
   
ЗначениеВРеквизитФормы(ДеревоОбъект, ИмяДерева);


   
// Создание элемента формы типа ТаблицаФормы для отображения дерева
   
ЭлементДерево = Элементы.Добавить(ИмяДерева, Тип(«ТаблицаФормы»));
   
ЭлементДерево.ПутьКДанным = ИмяДерева;
   
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;


    Для Каждого
Колонка Из ДеревоОбъект.Колонки Цикл
       
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»),
           
ЭлементДерево);
       
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
       
НовыйЭлемент.ПутьКДанным = ИмяДерева + «.» + Колонка.Имя;
    КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ПустойКонтекстВыводаЗадачи(Контекст)
   
Контекст = Новый Структура(«Лево, Верх, Задача»);
   
Контекст.Вставить(«ЭлементыЗадач», Новый Соответствие());
   
Контекст.Вставить(«Дерево», );
   
Контекст.Вставить(«Развернуть», Новый Массив());
    Возврат
Контекст;
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
//Вставить содержимое обработчика
   
РазвернутьИдентификаторы();
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьИдентификаторы()
    Для Каждого
Строка ИЗ РазвернутьИдентификаторы Цикл
       
ЭтаФорма.Элементы[Строка.ИмяЭлемента].Развернуть(Строка.Идентификатор, ложь);
    КонецЦикла;
КонецПроцедуры


//ДеревоВидов — дерево
//На первом уровне — конкретный вид
//В подчинении — элементы вида
//Каждый может иметь подчиненные элементы

Для связей задач использую регистр сведений:

По сути у меня задачи, включающие другие не несут никакой особой смысловой нагрузки. Это просто списки. Список рабочих задач, домашних задач, список закупок и т.п.

Понятно, что одна задача может быть в нескольких списках, в этом и прелесть.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

комментариев 7

  1. fajij28770:

    это тоже ложный ход, вот истинный:
    tasks.yml:
    — Цель:
    — Проект:
    — Подпроект

  2. Zuko:

    А если подзадача принадлежит двум/нескольким объектам?

    Надо делать или табличную часть (как состав групп в пользователях) или РС и заботиться о ацикличности

    • дополнил статью организацией подчиненности задач, действительно, я использую регистр сведений.
      Но об организации структуры я напишу чуть позже, когда реализую

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *