Сегодня я расскажу о том как эту ситуацию сгладить с использованием стандарных обработчиков в Конвертации Данных.
Первое что необходимо сделать создать параметр "Ошибки" в правиле конвертации.
Это простая ТЗ, в которой мы будем собирать ошибки(сообщения) и выводить после обмена именно уникальные сообщения (предварительно свернув таблицу ошибок) .
Инициализируем параметр в обработчике "Перед загрузкой данных"
Параметры.Ошибки=Новый ТаблицаЗначений();
Параметры.Ошибки.Колонки.Добавить("Ошибка");
Теперь нам нужно создать алгоритм "ПроверитьВозможностьЗаписи", который мы будем использовать при загрузке.
Если ОбъектНайден И НеЗамещатьОбъект=Ложь Тогда
мОтказ=Ложь;
НастройкаПравДоступа.ПроверкаПериодаДокумента(Объект, мОтказ, Неопределено);
Если мОтказ Тогда
Если ОбъектНайден Тогда
Новая=Параметры.Ошибки.Добавить();
НеЗамещатьОбъект=Истина;
Новая.Ошибка="Изменения документа "+Объект+" не могут быть записаны. Документ находится в закрытом периоде.";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Что он делает? Если существующий документ мы изменить не можем, тогда мы устанавливаем признак не замещать и записываем сообщение в таблицу ошибок.
Пропишем для всех необходимых ПКО вызов данного алгоритма в обработчике "При загрузке"
Выполнить(Алгоритмы.ПроверитьВозможностьЗаписи);
Теперь создание нового документа пропишем в глобальном обработчике правила обмена "После загрузки объекта"
Если Лев(ИмяТипаОбъекта, 8) = "Документ" Тогда
Если Не ОбъектНайден Тогда
//проверка у найденого объекта производстся при загрузке
Отказ=Ложь;
НастройкаПравДоступа.ПроверкаПериодаДокумента(Объект, Отказ, Неопределено);
Если Отказ Тогда
Новая=Параметры.Ошибки.Добавить();
Новая.Ошибка="Ошибка создания документа "+Объект+". Документ не может быть создан в закрытом периоде."
КонецЕсли;
КонецЕсли;
КонецЕсли;
В этом обработчике также проверяется возможность записи, и если она невозможна документ записан не будет (Отказ=Истина). Ну и по окончании (обработчик правила обмена "После загрузки данных") выводим ошибки (сообщения) пользователю.
Параметры.Ошибки.Свернуть("Ошибка");
Для Каждого Строка из Параметры.Ошибки Цикл
Сообщить(Строка.Ошибка,?(Найти(Нрег(Строка.Ошибка),"ошибка")>0,
СтатусСообщения.ОченьВажное,СтатусСообщения.Обычное));
КонецЦикла;
P.S. Процедура НастройкаПравДоступа.ПроверкаПериодаДокумента в конфигурации 1C:УПП не экспортирована, поэтому для ее использования в КД ее нужно сделать экспортной.
Комментариев нет:
Отправить комментарий