Как исправить ошибку «Значение не является значением объектного типа (Ссылка)» в 1С:Документообороте при завершении задачи?

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

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

Анализ технической причины ошибки

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

{ОбщийМодуль.РаботаСПроектами.Модуль(618)}: МассивИзмененныхЗадач.Добавить(ДанныеПроектнойЗадачи.Ссылка);

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

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

Способ 1. Программное исправление через расширение (Рекомендуется)

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

Рассмотрим пример кода, который необходимо внедрить в общении модуле РаботаСПроектами с помощью расширения (используя аннотацию &Вместо или &ИзменениеИКонтроля):


Процедура ОтметитьОкончаниеВыполненияПроектнойЗадачи(Источник)
    
    ДанныеПроектнойЗадачи = ПолучитьДанныеПроектнойЗадачи(Источник);
    
    // Вставка проверки на корректность данных и пометку удаления
    Если ДанныеПроектнойЗадачи <> Неопределено 
        И НЕ ДанныеПроектнойЗадачи.Родитель.ПометкаУдаления Тогда 
        
        Если ЗначениеЗаполнено(ДанныеПроектнойЗадачи.Родитель) Тогда
            РассчитатьПланПроекта(ДанныеПроектнойЗадачи.Roditel);
        КонецЕсли;
        
        Если ДанныеПроектнойЗадачи.АвтоматическиОтправлятьПроектныеЗадачиНаИсполнение Тогда
            ПродолжитьИсполнениеПроекта(ДанныеПроектнойЗадачи);
        КонецЕсли;
        
    КонецЕсли;
    // Конец вставки
    
КонецПроцедуры

Разберем, что делает этот код. Мы добавляем проверку Если НЕ ДанныеПроектнойЗадачи.Родитель.ПометкаУдаления. Это позволяет системе корректно «пропустить» этап пересчета плана для тех задач, которые фактически уже не актуальны (удалены из плана проекта). Это самый безопасный способ, так как он не нарушает логику работы с живыми данными.

Способ 2. Использование безопасного добавления в массив

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


// Заменяем проблемную строку:
// МассивИзмененныхЗадач.Добавить(ДанныеПроектнойЗадачи.Ссылка);

Попытка
    МассивИзмененныхЗадач.Добавить(ДанныеПроектнойЗадачи.Ссылка);
Исключение
    // Если ссылки нет, просто ничего не добавляем в массив пересчета
КонецПопытки;

Важно помнить: после применения такой «заплатки» рекомендуется выполнить полный пересчет плана проекта вручную из карточки проекта, чтобы убедиться, что сроки в иерархии отображаются корректно.

Способ 3. Административное исправление данных

Если вы не хотите вносить изменения в программный код, можно попытаться решить проблему через интерфейс или стандартные обработки. Основная задача — снять пометку удаления с проектной задачи, завершить процесс и затем снова пометить задачу на удаление.

Однако часто пользователи сталкиваются с тем, что «Объект заблокирован». Это происходит потому, что по задаче есть активный бизнес-процесс. Разберем шаги по обходу блокировки:

  1. Воспользуйтесь стандартной обработкой «Групповое изменение реквизитов».
  2. Выберите справочник «Проектные задачи» и установите отбор по нужной задаче.
  3. В «Дополнительных параметрах» обработки обязательно включите флаг «Записывать объекты с установленным флагом ОбменДанными.Загрузка = Истина».
  4. Установите значение реквизита Пометка удаления в Ложь.
  5. После успешного выполнения обработки попробуйте завершить задачу в бизнес-процессе.

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

Диагностика через Технологический журнал

Если ни один из способов не помогает и причина блокировки объекта остается неясной, проанализируем ситуацию с помощью Технологического журнала (ТЖ). Настройте сбор событий EXCP (исключения) и SDBL (запросы к БД). Это позволит увидеть, на какой именно таблице происходит откат транзакции (ROLLBACK) и какая именно процедура блокирует запись в базу данных.

Подведем итог: ошибка возникает из-за несогласованности состояния проектной задачи и запущенного по ней процесса. Наиболее стабильным решением является программная проверка в расширении, которая предотвращает попытку обращения к удаленным данным при расчете плана проекта.

← На главную