Канбан в 1С: от хранения задач до перетаскивания карточек
Содержание
Канбан в 1С — это своя форма, где задачи разложены по колонкам-статусам (Новая → В работе → Готово), а карточку можно перетащить мышью из одной колонки в другую. Готового объекта «Канбан-доска» в типовой платформе нет, поэтому доску собирают из обычных механизмов: справочник или бизнес-процесс для хранения задач, перечисление статусов и управляемая форма с перетаскиванием.
Разработка идёт в Конфигураторе (или в режиме «1С:EDT»). Ниже — рабочая схема для платформы 8.3 с интерфейсом «Такси»: какие объекты завести, как связать статусы с колонками, как включить drag-and-drop между динамическими списками и чем автоматизировать смену статуса. Подойдёт и для собственной конфигурации, и для доработки типовой через расширение.
Доска имеет смысл там, где у задачи есть жизненный цикл из 3–6 этапов и важно видеть всю очередь целиком: заявки техподдержки, задачи отдела, этапы сделки, контроль документов.
Какие объекты метаданных завести под задачи
Сначала решите, где живёт задача. Два практичных варианта:
- 📌 Справочник
Задачи— простой путь. Карточка задачи как элемент справочника с реквизитами. Подходит, когда маршрут свободный и не нужны автоматические поручения исполнителям. - 📌 Механизм «Бизнес-процессы и Задачи» — платформенный. Даёт карту маршрута, автоматическую адресацию задач исполнителям и историю. Сложнее в настройке, но закрывает автоматизацию переходов из коробки.
Для первого знакомства берите справочник — доску на нём соберёте за день. Минимальный набор реквизитов карточки:
| Реквизит | Тип | Зачем |
|---|---|---|
Наименование | Строка | Короткий заголовок карточки |
Статус | ПеречислениеСсылка.СтатусыЗадач | Колонка, в которой висит задача |
Исполнитель | СправочникСсылка.Пользователи | Кто ведёт |
Срок | Дата | Дедлайн, для подсветки просрочки |
Приоритет | Перечисление | Сортировка внутри колонки |
Описание | Строка (многострочная) | Тело карточки |
Если задач будет много и нужна история переходов, добавьте регистр сведений
ИсторияСтатусовЗадач с измерениями Задача, Статус и ресурсом-отметкой времени. Он пригодится для аналитики (раздел про отчёты). Без истории статус просто перезаписывается в карточке, и «время в колонке» посчитать будет нечем.
Не плодите реквизиты «на будущее». Доска читается тем легче, чем меньше полей на карточке. Всё лишнее уводите в форму элемента, а на доске оставляйте 3–4 поля.
Статусы колонок: перечисление и порядок
Колонки доски — это значения статуса. Заведите перечисление СтатусыЗадач со значениями по вашему процессу, например: Новая, ВРаботе, НаПроверке, Готово. Перечисление удобно тем, что значения фиксированы и их нельзя случайно переименовать из пользовательского режима.
Если колонки должны настраивать сами пользователи (добавлять, переименовывать, скрывать), замените перечисление на справочник КолонкиДоски с реквизитами Порядок (число) и Цвет. Тогда набор колонок меняется без участия программиста.
Порядок колонок слева направо задайте явно — полем Порядок в справочнике или кодом по значениям перечисления. Платформа сама порядок перечисления по смыслу процесса не угадает: в метаданных значения идут так, как вы их расставили в дереве конфигурации.
Решите заранее, разрешён ли переход «назад» (из НаПроверке в ВРаботе). От этого зависит логика проверки при перетаскивании — см. раздел про drag-and-drop. Если переходы строго последовательные, это нужно контролировать кодом, иначе карточку перетащат куда угодно.
Форма доски: колонки из динамических списков
Классическая доска — это одна форма с несколькими колонками, в каждой из которых видны только задачи своего статуса. Собрать её проще всего на динамических списках.
Порядок действий:
- Создайте общую форму (или форму списка справочника
Задачи). - Добавьте на форму реквизит типа
ДинамическийСписокдля каждой колонки:СписокНовые,СписокВРаботе,СписокНаПроверке,СписокГотово. Основная таблица у всех одна —Справочник.Задачи. - Для каждого списка задайте отбор по статусу: у
СписокВРаботе— условиеСтатус = Перечисления.СтатусыЗадач.ВРаботеи так далее. Отбор удобно задать в настройках динамического списка на вкладке с параметрами. - Разложите на форме таблицы этих списков в один горизонтальный ряд — это и будут колонки. Группа-контейнер с горизонтальным размещением держит их рядом.
- В каждой таблице оставьте на видимых колонках только поля карточки: заголовок, исполнителя, срок.
Чтобы карточка выглядела карточкой, а не строкой таблицы, включите у таблицы отображение в виде списка без заголовков колонок и соберите текст карточки в одно поле (реквизит с многострочным выводом) либо настройте условное оформление: просроченные — красным, высокий приоритет — жирным.
Количество задач в колонке показывайте в её заголовке. Для этого при открытии формы и после каждого перемещения считайте строки запросом по статусу и подставляйте число в заголовок группы: В работе (7).
Сортировку внутри колонки задайте в настройках динамического списка: сначала по Приоритет (убывание), затем по Срок (возрастание) — срочное и важное всплывает наверх колонки. Это настройка самого списка, кодом её трогать не нужно. А чтобы карточка в одном поле показывала и заголовок, и исполнителя, и срок, добавьте в основную таблицу списка вычисляемое поле на языке запросов СКД и выведите его единственной колонкой — текст соберётся как Наименование + исполнитель + дата.
Если колонок больше пяти, они не влезут по ширине. Тогда либо делайте горизонтальную прокрутку контейнера, либо уводите редкие статусы (Отменено, Архив) с доски в отдельный список-фильтр.
Перетаскивание карточек между колонками
Drag-and-drop в управляемой форме работает на событиях таблицы. На каждой таблице-колонке нужно:
- в свойствах разрешить начало перетаскивания (чтобы строку можно было «взять») и разрешить перетаскивание (чтобы в неё можно было «положить»);
- обработать событие
НачалоПеретаскиванияу источника — положить вПараметрыПеретаскивания.Значениессылку перетаскиваемой задачи; - обработать
ПроверкаПеретаскиванияу приёмника — разрешить или запретить бросок; - обработать
Перетаскиваниеу приёмника — записать новый статус.
Логика проста: куда бросили карточку — такой статус и присваиваем. Каждая колонка знает «свой» статус, поэтому в обработчике приёмника вызываем запись с нужным значением перечисления.
Сначала — источник. В НачалоПеретаскивания кладём в параметры ссылку текущей строки списка, чтобы приёмник знал, какую задачу двигают:
&НаКлиенте
Процедура СписокНовыеНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Выполнение = Ложь;
Возврат;
КонецЕсли;
ПараметрыПеретаскивания.Значение = ТекущаяСтрока.Ссылка;
КонецПроцедуры
Такой же обработчик вешается на каждую колонку-источник. Теперь приёмник — он читает это значение и записывает статус своей колонки:
&НаКлиенте
Процедура СписокВРаботеПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
ПеренестиЗадачу(ПараметрыПеретаскивания.Значение, ПредопределённоеЗначение("Перечисление.СтатусыЗадач.ВРаботе"));
КонецПроцедуры
&НаКлиенте
Процедура ПеренестиЗадачу(Задача, НовыйСтатус)
Если ПеренестиЗадачуНаСервере(Задача, НовыйСтатус) Тогда
Элементы.СписокВРаботе.Обновить();
Элементы.СписокНовые.Обновить();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПеренестиЗадачуНаСервере(Задача, НовыйСтатус)
Если Не ЗначениеЗаполнено(Задача) Тогда
Возврат Ложь;
КонецЕсли;
Объект = Задача.ПолучитьОбъект();
Объект.Статус = НовыйСтатус;
Объект.Записать();
Возврат Истина;
КонецФункции
Разберём ключевые места:
ПараметрыПеретаскивания.Значение— то, что вы положили в обработчикеНачалоПеретаскиванияисточника. Для динамического списка туда кладут ссылку текущей строки.СтандартнаяОбработка = Ложьотключает стандартное поведение платформы (попытку скопировать/переместить строки), чтобы сработала только ваша запись статуса.- После записи оба списка (источник и приёмник) обновляются методом
Обновить(), иначе карточка останется в старой колонке на экране.
Если переходы строго последовательные, добавьте в ПроверкаПеретаскивания проверку: сравните текущий статус задачи и статус колонки-приёмника, и при недопустимом переходе поставьте СтандартнаяОбработка = Ложь и выведите предупреждение — карточка не «прилипнет».
Запись статуса из формы доски проводит Объект.Записать() в транзакции платформы. Если на задаче висят подписки на событие или проверка заполнения — они сработают. Проверьте, что запись задачи с одним изменённым статусом не требует заполнения полей, которые на доске не видны, иначе бросок будет падать с ошибкой.
Автоматизация переходов и бизнес-процессы
Доска на справочнике хороша для ручного перекладывания. Как только появляются правила «после На проверке задача уходит руководителю» или «при переводе в Готово уведомить автора», ручного drag-and-drop мало. Два уровня автоматизации:
Правила на записи задачи. Простой случай. В модуле объекта Задачи, в обработчике ПередЗаписью, ловите смену статуса (сравнение с ЗначениеЗаполнено и прежним значением из базы) и выполняйте действие: проставляйте дату завершения, меняйте исполнителя, пишите в регистр истории. Отправку писем и уведомлений выносите в ПриЗаписи или в регламентное задание, чтобы не держать транзакцию.
Механизм «Бизнес-процессы и Задачи». Когда маршрут сложный и ветвится, задачи удобнее вести не справочником, а бизнес-процессом с картой маршрута. На карте вы расставляете точки действия (этапы), условия и точки завершения, а платформа сама создаёт задачи исполнителям и ведёт их по маршруту. Колонки доски тогда привязываются не к перечислению, а к точкам маршрута бизнес-процесса.
Выбор между подходами:
Доработку типовой конфигурации (БП, УТ, ЗУП) делайте расширением конфигурации — так доска переживёт обновления. Новое перечисление, реквизит Статус у нужного объекта и общую форму-доску можно добавить расширением, не снимая конфигурацию с поддержки. После загрузки .cfe выполните «Обновить конфигурацию
базы данных» — это отдельный шаг.
Отчёты по доске: загрузка и время в статусе
Доска показывает «сейчас». Чтобы понять, где задачи застревают и кто перегружен, нужны отчёты. Их строят на системе компоновки данных (СКД).
Что считать и откуда брать данные:
- Задач в каждой колонке — запрос к справочнику
Задачис группировкой по статусу. Простейший отчёт, дублирует счётчики на доске, но даёт срез на дату. - Загрузка исполнителей — группировка по
ИсполнительиСтатус, количество задач. Видно, у кого очередь в работе больше всех. - Просроченные — отбор
Срок < ТекущаяДата() И Статус <> Готово. - Время в статусе — вот ради этого и нужен регистр
ИсторияСтатусовЗадач. По паре соседних записей истории (вход в статус и выход из него) считается длительность. Средняя длительность по колонке показывает узкое место процесса: если задачи в среднем висят вНа проверкепо три дня — проверка и есть бутылочное горлышко.
Без регистра истории время в статусе не посчитать: в карточке хранится только текущий статус, момент предыдущего перехода нигде не зафиксирован. Поэтому если аналитика по длительности важна — заложите регистр с самого начала (раздел про объекты метаданных).
Отчёт «Время в статусе» удобно выводить диаграммой-воронкой или гистограммой по колонкам. СКД строит диаграмму из того же набора данных без отдельного кода.
Два отчёта — «Загрузка исполнителей» и «Просроченные» — есть смысл вывести на начальную страницу (рабочий стол) рядом с самой доской. Тогда руководитель видит и доску, и сводку в одном окне, не открывая отчёты вручную. Начальную страницу настраивают в разделе Главное → Настройки → Настройка начальной страницы либо через свойства конфигурации в Конфигураторе.
Частые вопросы
Можно ли сделать Канбан без программирования, только настройками?
Есть ли Канбан-доска в типовых конфигурациях 1С?
Как подсветить просроченные карточки?
Срок < &ТекущаяДата И Статус <> Готово, оформление — красный фон или шрифт. Параметр ТекущаяДата передавайте в список при открытии формы и обновляйте регламентно, чтобы подсветка не «замерзала» на дате открытия.Сколько колонок помещается на доске?
Отменено, Архив) в отдельный фильтр, иначе колонки станут узкими и карточки нечитаемыми.Как сделать несколько досок — по отделам или проектам?
Проект (или Отдел) и общий отбор формы по нему. Одна форма доски тогда показывает задачи выбранного проекта, а переключатель вверху формы меняет отбор у всех колонок сразу.