Канбан в 1С: от хранения задач до перетаскивания карточек

· 9 мин

Содержание

Канбан в 1С — это своя форма, где задачи разложены по колонкам-статусам (Новая → В работе → Готово), а карточку можно перетащить мышью из одной колонки в другую. Готового объекта «Канбан-доска» в типовой платформе нет, поэтому доску собирают из обычных механизмов: справочник или бизнес-процесс для хранения задач, перечисление статусов и управляемая форма с перетаскиванием.

Разработка идёт в Конфигураторе (или в режиме «1С:EDT»). Ниже — рабочая схема для платформы 8.3 с интерфейсом «Такси»: какие объекты завести, как связать статусы с колонками, как включить drag-and-drop между динамическими списками и чем автоматизировать смену статуса. Подойдёт и для собственной конфигурации, и для доработки типовой через расширение.

Доска имеет смысл там, где у задачи есть жизненный цикл из 3–6 этапов и важно видеть всю очередь целиком: заявки техподдержки, задачи отдела, этапы сделки, контроль документов.

Какие объекты метаданных завести под задачи

Сначала решите, где живёт задача. Два практичных варианта:

  • 📌 Справочник Задачи — простой путь. Карточка задачи как элемент справочника с реквизитами. Подходит, когда маршрут свободный и не нужны автоматические поручения исполнителям.
  • 📌 Механизм «Бизнес-процессы и Задачи» — платформенный. Даёт карту маршрута, автоматическую адресацию задач исполнителям и историю. Сложнее в настройке, но закрывает автоматизацию переходов из коробки.

Для первого знакомства берите справочник — доску на нём соберёте за день. Минимальный набор реквизитов карточки:

РеквизитТипЗачем
НаименованиеСтрокаКороткий заголовок карточки
СтатусПеречислениеСсылка.СтатусыЗадачКолонка, в которой висит задача
ИсполнительСправочникСсылка.ПользователиКто ведёт
СрокДатаДедлайн, для подсветки просрочки
ПриоритетПеречислениеСортировка внутри колонки
ОписаниеСтрока (многострочная)Тело карточки

Если задач будет много и нужна история переходов, добавьте регистр сведений ИсторияСтатусовЗадач с измерениями Задача, Статус и ресурсом-отметкой времени. Он пригодится для аналитики (раздел про отчёты). Без истории статус просто перезаписывается в карточке, и «время в колонке» посчитать будет нечем.

Не плодите реквизиты «на будущее». Доска читается тем легче, чем меньше полей на карточке. Всё лишнее уводите в форму элемента, а на доске оставляйте 3–4 поля.

Статусы колонок: перечисление и порядок

Колонки доски — это значения статуса. Заведите перечисление СтатусыЗадач со значениями по вашему процессу, например: Новая, ВРаботе, НаПроверке, Готово. Перечисление удобно тем, что значения фиксированы и их нельзя случайно переименовать из пользовательского режима.

Если колонки должны настраивать сами пользователи (добавлять, переименовывать, скрывать), замените перечисление на справочник КолонкиДоски с реквизитами Порядок (число) и Цвет. Тогда набор колонок меняется без участия программиста.

Порядок колонок слева направо задайте явно — полем Порядок в справочнике или кодом по значениям перечисления. Платформа сама порядок перечисления по смыслу процесса не угадает: в метаданных значения идут так, как вы их расставили в дереве конфигурации.

Решите заранее, разрешён ли переход «назад» (из НаПроверке в ВРаботе). От этого зависит логика проверки при перетаскивании — см. раздел про drag-and-drop. Если переходы строго последовательные, это нужно контролировать кодом, иначе карточку перетащат куда угодно.

Что подготовить до сборки доски
Выполнено: 0 / 5

Форма доски: колонки из динамических списков

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

Порядок действий:

  1. Создайте общую форму (или форму списка справочника Задачи).
  2. Добавьте на форму реквизит типа ДинамическийСписок для каждой колонки: СписокНовые, СписокВРаботе, СписокНаПроверке, СписокГотово. Основная таблица у всех одна — Справочник.Задачи.
  3. Для каждого списка задайте отбор по статусу: у СписокВРаботе — условие Статус = Перечисления.СтатусыЗадач.ВРаботе и так далее. Отбор удобно задать в настройках динамического списка на вкладке с параметрами.
  4. Разложите на форме таблицы этих списков в один горизонтальный ряд — это и будут колонки. Группа-контейнер с горизонтальным размещением держит их рядом.
  5. В каждой таблице оставьте на видимых колонках только поля карточки: заголовок, исполнителя, срок.

Чтобы карточка выглядела карточкой, а не строкой таблицы, включите у таблицы отображение в виде списка без заголовков колонок и соберите текст карточки в одно поле (реквизит с многострочным выводом) либо настройте условное оформление: просроченные — красным, высокий приоритет — жирным.

Количество задач в колонке показывайте в её заголовке. Для этого при открытии формы и после каждого перемещения считайте строки запросом по статусу и подставляйте число в заголовок группы: В работе (7).

Сортировку внутри колонки задайте в настройках динамического списка: сначала по Приоритет (убывание), затем по Срок (возрастание) — срочное и важное всплывает наверх колонки. Это настройка самого списка, кодом её трогать не нужно. А чтобы карточка в одном поле показывала и заголовок, и исполнителя, и срок, добавьте в основную таблицу списка вычисляемое поле на языке запросов СКД и выведите его единственной колонкой — текст соберётся как Наименование + исполнитель + дата.

Если колонок больше пяти, они не влезут по ширине. Тогда либо делайте горизонтальную прокрутку контейнера, либо уводите редкие статусы (Отменено, Архив) с доски в отдельный список-фильтр.

Перетаскивание карточек между колонками

Drag-and-drop в управляемой форме работает на событиях таблицы. На каждой таблице-колонке нужно:

  • в свойствах разрешить начало перетаскивания (чтобы строку можно было «взять») и разрешить перетаскивание (чтобы в неё можно было «положить»);
  • обработать событие НачалоПеретаскивания у источника — положить в ПараметрыПеретаскивания.Значение ссылку перетаскиваемой задачи;
  • обработать ПроверкаПеретаскивания у приёмника — разрешить или запретить бросок;
  • обработать Перетаскивание у приёмника — записать новый статус.

Логика проста: куда бросили карточку — такой статус и присваиваем. Каждая колонка знает «свой» статус, поэтому в обработчике приёмника вызываем запись с нужным значением перечисления.

Сначала — источник. В НачалоПеретаскивания кладём в параметры ссылку текущей строки списка, чтобы приёмник знал, какую задачу двигают:

&НаКлиенте
Процедура СписокНовыеНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Выполнение = Ложь;
        Возврат;
    КонецЕсли;
    ПараметрыПеретаскивания.Значение = ТекущаяСтрока.Ссылка;
КонецПроцедуры

Такой же обработчик вешается на каждую колонку-источник. Теперь приёмник — он читает это значение и записывает статус своей колонки:

&НаКлиенте
Процедура СписокВРаботеПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    СтандартнаяОбработка = Ложь;
    ПеренестиЗадачу(ПараметрыПеретаскивания.Значение, ПредопределённоеЗначение("Перечисление.СтатусыЗадач.ВРаботе"));
КонецПроцедуры

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

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

Разберём ключевые места:

  • ПараметрыПеретаскивания.Значение — то, что вы положили в обработчике НачалоПеретаскивания источника. Для динамического списка туда кладут ссылку текущей строки.
  • СтандартнаяОбработка = Ложь отключает стандартное поведение платформы (попытку скопировать/переместить строки), чтобы сработала только ваша запись статуса.
  • После записи оба списка (источник и приёмник) обновляются методом Обновить(), иначе карточка останется в старой колонке на экране.

Если переходы строго последовательные, добавьте в ПроверкаПеретаскивания проверку: сравните текущий статус задачи и статус колонки-приёмника, и при недопустимом переходе поставьте СтандартнаяОбработка = Ложь и выведите предупреждение — карточка не «прилипнет».

Запись статуса из формы доски проводит Объект.Записать() в транзакции платформы. Если на задаче висят подписки на событие или проверка заполнения — они сработают. Проверьте, что запись задачи с одним изменённым статусом не требует заполнения полей, которые на доске не видны, иначе бросок будет падать с ошибкой.

Автоматизация переходов и бизнес-процессы

Доска на справочнике хороша для ручного перекладывания. Как только появляются правила «после На проверке задача уходит руководителю» или «при переводе в Готово уведомить автора», ручного drag-and-drop мало. Два уровня автоматизации:

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

Механизм «Бизнес-процессы и Задачи». Когда маршрут сложный и ветвится, задачи удобнее вести не справочником, а бизнес-процессом с картой маршрута. На карте вы расставляете точки действия (этапы), условия и точки завершения, а платформа сама создаёт задачи исполнителям и ведёт их по маршруту. Колонки доски тогда привязываются не к перечислению, а к точкам маршрута бизнес-процесса.

Выбор между подходами:

Какой механизм взять под вашу доску?

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

Отчёты по доске: загрузка и время в статусе

Доска показывает «сейчас». Чтобы понять, где задачи застревают и кто перегружен, нужны отчёты. Их строят на системе компоновки данных (СКД).

Что считать и откуда брать данные:

  • Задач в каждой колонке — запрос к справочнику Задачи с группировкой по статусу. Простейший отчёт, дублирует счётчики на доске, но даёт срез на дату.
  • Загрузка исполнителей — группировка по Исполнитель и Статус, количество задач. Видно, у кого очередь в работе больше всех.
  • Просроченные — отбор Срок < ТекущаяДата() И Статус <> Готово.
  • Время в статусе — вот ради этого и нужен регистр ИсторияСтатусовЗадач. По паре соседних записей истории (вход в статус и выход из него) считается длительность. Средняя длительность по колонке показывает узкое место процесса: если задачи в среднем висят в На проверке по три дня — проверка и есть бутылочное горлышко.

Без регистра истории время в статусе не посчитать: в карточке хранится только текущий статус, момент предыдущего перехода нигде не зафиксирован. Поэтому если аналитика по длительности важна — заложите регистр с самого начала (раздел про объекты метаданных).

Отчёт «Время в статусе» удобно выводить диаграммой-воронкой или гистограммой по колонкам. СКД строит диаграмму из того же набора данных без отдельного кода.

Два отчёта — «Загрузка исполнителей» и «Просроченные» — есть смысл вывести на начальную страницу (рабочий стол) рядом с самой доской. Тогда руководитель видит и доску, и сводку в одном окне, не открывая отчёты вручную. Начальную страницу настраивают в разделе Главное → Настройки → Настройка начальной страницы либо через свойства конфигурации в Конфигураторе.

Частые вопросы

Можно ли сделать Канбан без программирования, только настройками?
Полноценную доску с перетаскиванием — нет, drag-and-drop требует обработчиков в форме. Но «псевдодоску» можно собрать на одном динамическом списке с группировкой по статусу: задачи встанут группами-колонками по вертикали, статус меняется из карточки, а не перетаскиванием. Настраивается в пользовательском режиме без Конфигуратора.
Есть ли Канбан-доска в типовых конфигурациях 1С?
В типовой платформе отдельного объекта «Канбан» нет. В конфигурациях с развитым управлением задачами (например, в «1С:Документооборот») задачи и маршруты есть, но классической доски с колонками-перетаскиванием там из коробки нет — её добавляют доработкой или сторонним решением.
Как подсветить просроченные карточки?
Условным оформлением динамического списка: условие Срок < &ТекущаяДата И Статус <> Готово, оформление — красный фон или шрифт. Параметр ТекущаяДата передавайте в список при открытии формы и обновляйте регламентно, чтобы подсветка не «замерзала» на дате открытия.
Сколько колонок помещается на доске?
Комфортно — до пяти по ширине экрана. Больше статусов лучше объединить логически или увести редкие (Отменено, Архив) в отдельный фильтр, иначе колонки станут узкими и карточки нечитаемыми.
Как сделать несколько досок — по отделам или проектам?
Добавьте в карточку реквизит Проект (или Отдел) и общий отбор формы по нему. Одна форма доски тогда показывает задачи выбранного проекта, а переключатель вверху формы меняет отбор у всех колонок сразу.