Как корректно изменить дату выполнения задачи в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

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

Где в системе фиксируется дата выполнения задачи

Прежде чем приступать к написанию программного кода, нам необходимо разобраться в архитектуре хранения данных. Ошибка многих начинающих разработчиков заключается в предположении, что дата хранится только в самой задаче. На самом деле в современных версиях «1С:Документооборот» (2.1, 3.0) информация дублируется в нескольких местах:

  1. Объект «Задача» (ЗадачаОбъект): Это основной ссылочный тип. Дата фактического завершения фиксируется в стандартном реквизите ДатаИсполнения (или ДатаЗавершения).
  2. Регистр сведений «Сведения о задачах»: Данный регистр является основным источником данных для построения большинства отчетов по исполнительской дисциплине. Если вы измените дату в объекте, но забудете обновить запись в этом регистре, в отчетах для руководства по-прежнему будет фигурировать старая дата.
  3. Регистр сведений «Данные бизнес-процессов»: Здесь хранятся агрегированные сведения о состоянии всего процесса. Дата завершения последней задачи этапа может влиять на общую дату завершения бизнес-процесса, зафиксированную в этом регистре.
  4. Регистры расчета KPI и метрик: В некоторых внедрениях используются дополнительные регистры для учета времени работы сотрудников, которые также требуют корректировки.

Программное изменение даты через внешнюю обработку

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

Проанализируем примерный алгоритм действий в коде:


// Пример изменения даты выполнения задачи
Процедура ИзменитьДатуЗадачи(СсылкаНаЗадачу, НоваяДата)
    
    // 1. Получаем объект задачи для редактирования
    ЗадачаОбъект = СсылкаНаЗадачу.ПолучитьОбъект();
    
    // Устанавливаем режим загрузки, чтобы не срабатывали лишние проверки
    ЗадачаОбъект.ОбменДанными.Загрузка = Истина;
    
    // Устанавливаем новую дату исполнения
    ЗадачаОбъект.ДатаИсполнения = НоваяДата;
    
    Попытка
        ЗадачаОбъект.Записать();
        Сообщить("Дата в объекте задачи успешно изменена.");
    Исключение
        Сообщить("Ошибка при записи задачи: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    // 2. Обновление сведений в регистре "Сведения о задачах"
    // В некоторых конфигурациях это требует вызова специальных процедур
    // программного интерфейса (API) конфигурации
КонецПроцедуры

Рассмотрим подробнее использование свойства ОбменДанными.Загрузка = Истина. Это критически важный момент. При выполнении задачи стандартная логика системы может инициировать старт следующих задач по маршруту. Если мы просто перезаписываем объект, нам нужно гарантировать, что система не попытается повторно запустить механизмы бизнес-процесса, которые уже были отработаны ранее.

Синхронизация с регистрами сведений

Как мы выяснили ранее, простого изменения ЗадачаОбъект недостаточно. Проанализируем ситуацию с регистрами. В «1С:Документооборот» существует механизм актуализации данных в регистрах сведений. После программного изменения реквизитов задачи может потребоваться вызов процедур обновления. В типовых решениях часто используются фоновые задания для обновления этих регистров, но при ручной корректировке лучше инициировать обновление программно для конкретного объекта.

Выясним причину, по которой это важно: если отчет «Список просроченных задач» строится по регистру СведенияОЗадачах, то ваша корректировка в объекте Задача никак не повлияет на результат отчета, пока данные в регистре не совпадут с данными в объекте.

Анализ рисков и скрытые «следы» в системе

Перед тем как приступать к массовому изменению дат, необходимо осознать риски. Посмотрим на ситуацию с точки зрения аудита системы:

  1. Журнал регистрации: Любое изменение объекта фиксируется в журнале регистрации. Даже если вы успешно подменили дату выполнения внутри задачи на «01.01.2023», запись в журнале регистрации покажет, что транзакция изменения была произведена «15.10.2023» пользователем «Администратор». Служба безопасности или опытный аудитор легко выявят факт манипуляции.
  2. Версионирование объектов: Если в базе данных включена подсистема «Версионирование объектов», то система сохранит историю изменений. В истории будет четко видно: версия №1 имела одну дату выполнения, а версия №2 — уже другую. При этом дата создания самой версии №2 будет текущей.
  3. Логические парадоксы: В сложных бизнес-процессах задачи идут строго друг за другом. Если вы измените дату выполнения первой задачи на более позднюю, может возникнуть ситуация, когда вторая задача (следующая по маршруту) началась раньше, чем закончилась первая. Это создает логическую ошибку в аналитике и может привести к сбоям в работе некоторых алгоритмов расчета длительности этапов.

Рекомендации по выполнению задачи

Рассмотрим правильный алгоритм действий, если изменение даты все же необходимо:

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

← На главную