четверг, 22 октября 2009 г.

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


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

Первое что необходимо сделать создать параметр "Ошибки" в правиле конвертации.
Это простая ТЗ, в которой мы будем собирать ошибки(сообщения) и выводить после обмена именно уникальные сообщения (предварительно свернув таблицу ошибок) .
Инициализируем параметр в обработчике "Перед загрузкой данных"
Параметры.Ошибки=Новый ТаблицаЗначений();
Параметры.Ошибки.Колонки.Добавить("Ошибка");



Теперь нам нужно создать алгоритм "ПроверитьВозможностьЗаписи", который мы будем использовать при загрузке.

Если ОбъектНайден И НеЗамещатьОбъект=Ложь Тогда
    мОтказ=Ложь;
    НастройкаПравДоступа.ПроверкаПериодаДокумента(Объект, мОтказ, Неопределено);
    Если мОтказ Тогда
        Если ОбъектНайден Тогда
            Новая=Параметры.Ошибки.Добавить();
            НеЗамещатьОбъект=Истина;
            Новая.Ошибка="Изменения документа "+Объект+" не могут быть записаны. Документ находится в закрытом периоде.";
        КонецЕсли;
    КонецЕсли;
КонецЕсли;
Что он делает? Если существующий документ мы изменить не можем, тогда мы устанавливаем признак не замещать и записываем сообщение в таблицу ошибок.
Пропишем для всех необходимых ПКО вызов данного алгоритма в обработчике  "При загрузке"

Выполнить(Алгоритмы.ПроверитьВозможностьЗаписи);

Теперь создание нового документа пропишем в глобальном обработчике правила обмена "После загрузки объекта"

Если Лев(ИмяТипаОбъекта, 8) = "Документ" Тогда
    Если Не ОбъектНайден Тогда
        //проверка у найденого объекта производстся при загрузке
        Отказ=Ложь;
        НастройкаПравДоступа.ПроверкаПериодаДокумента(Объект, Отказ, Неопределено);
        Если Отказ Тогда
            Новая=Параметры.Ошибки.Добавить();
            Новая.Ошибка="Ошибка создания документа "+Объект+". Документ не может быть создан в закрытом периоде."
        КонецЕсли;
    КонецЕсли;
КонецЕсли;
В этом обработчике также проверяется возможность записи, и если она невозможна документ записан не будет (Отказ=Истина).  
Ну и по окончании  (обработчик правила обмена "После загрузки данных") выводим ошибки (сообщения) пользователю.

Параметры.Ошибки.Свернуть("Ошибка");
Для Каждого Строка из Параметры.Ошибки Цикл
    Сообщить(Строка.Ошибка,?(Найти(Нрег(Строка.Ошибка),"ошибка")>0,
    СтатусСообщения.ОченьВажное,СтатусСообщения.Обычное));
КонецЦикла;


P.S. Процедура НастройкаПравДоступа.ПроверкаПериодаДокумента в конфигурации 1C:УПП не экспортирована, поэтому для ее использования в КД ее нужно сделать экспортной.