При обновлении конфигурации 1С:Документооборот с релиза 2.1.7.9 на релизы 2.1.8–2.1.9 многие администраторы и разработчики сталкиваются с неприятной ситуацией: ранее утвержденные внутренние документы внезапно получают статус «Не утвержден», несмотря на то, что по ним успешно завершены соответствующие бизнес-процессы и в истории зафиксирован факт утверждения. Разберем детально, почему это происходит, как устроена новая архитектура и какими способами можно восстановить корректные данные.
Выясним причину возникновения проблемы
В релизах ветки 2.1.8 и 2.1.9 разработчики платформенного решения существенно переработали логику согласования, подписания и утверждения документов:
Справочник.ВнутренниеДокументы использовался единый реквизит Утвердил (хотя на форме он мог отображаться с подписью «Подписал»). В новой концепции эти процессы строго разделены: появился отдельный реквизит Подписал для подписания и табличная часть ГрифыУтверждения для множественного утверждения.ГрифыУтверждения и настроек конкретного вида документа. Если табличная часть пуста, статус автоматически сбрасывается в «Не утвержден», даже если в регистре сведений СостоянияДокументов или в бизнес-процессах записано иное.Рассмотрим подробнее доступные варианты решения проблемы.
Разработчики фирмы «1С» зарегистрировали данную проблему как штатную ошибку обновления и устранили ее в релизе 2.1.10. В состав конфигурации был включен исправленный обработчик обновления информационной базы, выполняющий корректный перенос данных.
Разберем по шагам порядок действий:
Если оперативное обновление на новый релиз невозможно, либо часть документов всё равно осталась без грифов утверждения, исправим данные с помощью внешней обработки. Проанализируем алгоритм:
СостоянияДокументов.ГрифыУтверждения. Если строк нет, добавим новую запись с указанием пользователя и даты утверждения.Посмотрим на пример программной обработки таких документов:
Выборка = Справочники.ВнутренниеДокументы.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверяем необходимость заполнения
Если Выборка.ПометкаУдаления Или Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
// Если в табличной части уже есть грифы, пропускаем документ
Если Выборка.ГрифыУтверждения.Количество() > 0 Тогда
Продолжить;
КонецЕсли;
// Получаем состояние документа из регистра
Отбор = Новый Структура("Документ", Выборка.Ссылка);
Состояние = РегистрыСведений.СостоянияДокументов.ПолучитьПоследнее(Дата(1, 1, 1), Отбор);
// Проверяем, был ли документ фактически утвержден
Если Состояние.Состояние = Перечисления.СостоянияДокументов.Утвержден Тогда
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
НоваяСтрока = ДокументОбъект.ГрифыУтверждения.Добавить();
// Заполняем реквизиты грифа из регистра или старого реквизита
Если ЗначениеЗаполнено(ДокументОбъект.Утвердил) Тогда
НоваяСтрока.Утвердил = ДокументОбъект.Утвердил;
ИначеЕсли ЗначениеЗаполнено(Состояние.Установил) Тогда
НоваяСтрока.Утвердил = Состояние.Установил;
КонецЕсли;
НоваяСтрока.Дата = ?(ЗначениеЗаполнено(Состояние.Период), Состояние.Период, ДокументОбъект.Дата);
Попытка
ДокументОбъект.Записать();
Исключение
ЗаписьЖурналаРегистрации("ИсправлениеГрифов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
При восстановлении данных обратим внимание на следующие особенности конфигурации:
ОбменДанными.Загрузка = Истина является обязательным. Это позволяет избежать ошибок валидации обязательных полей, ограничений по правам доступа и запретов изменения документов, находящихся в архивных делах.Подписал аналогичным скриптом.