В процессе работы с конфигурациями, использующими подсистему «Бизнес-процессы и задачи» (например, 1С:Документооборот), нередко возникают ситуации, когда пользователь ошибочно завершает задачу не той датой или забывает отметить выполнение вовремя. Простое редактирование даты в форме задачи зачастую невозможно или не приводит к желаемому результату в отчетах. В этой статье мы подробно разберем, как технически реализовать изменение даты выполнения и какие нюансы системы необходимо учитывать, чтобы не нарушить логику бизнес-процессов.
Прежде чем приступать к написанию программного кода, нам необходимо разобраться в архитектуре хранения данных. Ошибка многих начинающих разработчиков заключается в предположении, что дата хранится только в самой задаче. На самом деле в современных версиях «1С:Документооборот» (2.1, 3.0) информация дублируется в нескольких местах:
ДатаИсполнения (или ДатаЗавершения).Рассмотрим ситуацию, когда нам необходимо изменить дату выполнения «задним числом». Поскольку интерактивное редактирование закрытых задач в интерфейсе обычно заблокировано, нам потребуется внешняя обработка. При написании кода важно использовать режим загрузки данных, чтобы обойти стандартные проверки (подписки на события), которые могут помешать записи или вызвать нежелательные побочные эффекты в связанных бизнес-процессах.
Проанализируем примерный алгоритм действий в коде:
// Пример изменения даты выполнения задачи
Процедура ИзменитьДатуЗадачи(СсылкаНаЗадачу, НоваяДата)
// 1. Получаем объект задачи для редактирования
ЗадачаОбъект = СсылкаНаЗадачу.ПолучитьОбъект();
// Устанавливаем режим загрузки, чтобы не срабатывали лишние проверки
ЗадачаОбъект.ОбменДанными.Загрузка = Истина;
// Устанавливаем новую дату исполнения
ЗадачаОбъект.ДатаИсполнения = НоваяДата;
Попытка
ЗадачаОбъект.Записать();
Сообщить("Дата в объекте задачи успешно изменена.");
Исключение
Сообщить("Ошибка при записи задачи: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 2. Обновление сведений в регистре "Сведения о задачах"
// В некоторых конфигурациях это требует вызова специальных процедур
// программного интерфейса (API) конфигурации
КонецПроцедуры
Рассмотрим подробнее использование свойства ОбменДанными.Загрузка = Истина. Это критически важный момент. При выполнении задачи стандартная логика системы может инициировать старт следующих задач по маршруту. Если мы просто перезаписываем объект, нам нужно гарантировать, что система не попытается повторно запустить механизмы бизнес-процесса, которые уже были отработаны ранее.
Как мы выяснили ранее, простого изменения ЗадачаОбъект недостаточно. Проанализируем ситуацию с регистрами. В «1С:Документооборот» существует механизм актуализации данных в регистрах сведений. После программного изменения реквизитов задачи может потребоваться вызов процедур обновления. В типовых решениях часто используются фоновые задания для обновления этих регистров, но при ручной корректировке лучше инициировать обновление программно для конкретного объекта.
Выясним причину, по которой это важно: если отчет «Список просроченных задач» строится по регистру СведенияОЗадачах, то ваша корректировка в объекте Задача никак не повлияет на результат отчета, пока данные в регистре не совпадут с данными в объекте.
Перед тем как приступать к массовому изменению дат, необходимо осознать риски. Посмотрим на ситуацию с точки зрения аудита системы:
Рассмотрим правильный алгоритм действий, если изменение даты все же необходимо:
Подводя итог, можно сказать, что технически изменить дату выполнения задачи в 1С вполне реально с помощью внешней обработки и прямого обращения к реквизитам объекта в режиме загрузки данных. Однако сложность заключается не в написании кода, а в обеспечении идентичности данных во всех связанных регистрах и сохранении логической целостности всей цепочки бизнес-процесса.