Универсальная обработка восстановления нескольких последовательностей   

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

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

  • отображение позиций по всем имеющимся в системе последовательностям;
  • выбор режима обновления формы обработки во время перепроведения документов;
  • выбор режима вывода сообщений о проведении очередного документа;

 

По прежнему имеется возможность работать с транзакциями и паузами.

Ниже находится картинка формы обработки с примером работы:

Форма обработки восстановления последовательностей

 

Что нужно знать при вставке в новую конфигурацию.

 

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

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

:

Расшифровка флажков формы
  • Использовать транзакцию - используется транзакция на три документа.
  • Паузы - используются паузы: при включенных транзакциях пауза после каждых трех проведенных документов, при отключенных пауза после каждого. Время паузы - 5 секунд.
  • Выводить сообщения - включает/выключает режим вывода сообщения после каждого проведенного документа.
  • Смотреть за ГП - включает/выключает режим обновления формы обработки после каждого проведенного документа

 

Код модуля представлен ниже:

//Автор: Гусев Антон а.к.а Perlscript
//http://www.perlscript.ru
//===============================
//Универсальная обработка для восстановления последовательностей документов
//в разделенном режиме работы 1С-Предприятия 7.7
//Распространяется бесплатно. Ссылка на автора обязательна.
Перем ВремяПостроения;
Перем СписокВосстановления;
Перем СтрокаВидов;
Функция ТекстФормы()
    Перем ТекТекст;
    ТекТекст="";
    Для к=1 по СЗ.РазмерСписка() Цикл
        ТекПосл=Последовательность.ПолучитьАтрибут(СЗ.ПолучитьЗначение(к));
        ТекДок=ТекПосл.ПолучитьДокумент();
        ТекДата=ТекПосл.ПолучитьДату();
        ТекВремя=ТекПосл.ПолучитьВремя(,,);
        ТекТекст=ТекТекст+""+ТекДата+" "+ТекВремя+" "+?(ТекДок.Выбран()=1,ТекДок.Вид()+" № "+СокрЛП(ТекДок.НомерДок),"")+РазделительСтрок;
    КонецЦикла;
    Возврат ТекТекст;
КонецФункции
//*******************************************
Процедура Выполнить()
    глНачатьЗамер();
    МинимумПоз="";
    НомерМоз=0;
    Для к=1 по СписокВосстановления.РазмерСписка() Цикл
        ТекПосл=СписокВосстановления.ПолучитьЗначение(к);
        ТекПоз=ТекПосл.ПолучитьПозицию();
        Если к=1 Тогда
            МинимумПоз=ТекПоз;
        Иначе
            Если МинимумПоз>ТекПоз Тогда
                МинимумПоз=ТекПоз;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Док=СоздатьОбъект("Документ");
    Док.УстановитьФильтр(1,0);
    Док.ВыбратьДокументы(МинимумПоз,ПолучитьДокументТА());
    ИдетВосстановление=1;
    Ошибка=0;
    Колво=0;
    Если Тр=1 Тогда
        НачатьТранзакцию();
    КонецЕсли;
    Пока Док.ПолучитьДокумент()=1 Цикл
        Если Найти(СтрокаВидов,Док.Вид())>0 Тогда
            Если Док.Проведен()=1 Тогда
                //проверка на принадлежность последовательности и непрерывность
                ТекДок=Док.ТекущийДокумент();
                Проверки=-1;
                Для к=1 по СписокВосстановления.РазмерСписка() Цикл
                    ТекПосл=СписокВосстановления.ПолучитьЗначение(к);
                    Если ТекПосл.ПринадлежитПоследовательности(ТекДок)=1 Тогда
                        Проверки=ТекПосл.Сравнить(ТекДок);
                        Если Проверки=-1 Тогда
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                Если Проверки<>-1 Тогда
                    //не надо трогать этот документ
                    Продолжить;
                КонецЕсли;
                Если Док.Блокировка(1)=0 Тогда
                    Сигнал();
                    Сообщить("Заблокирован (открыт) документ: "+Док);
                    Сигнал();
                    Сообщить("Попробуйте позднее.");
                    Сигнал();
                    Прервать;
                КонецЕсли;
                Если Док.Провести()=1 Тогда
                    Если Выводить=1 Тогда
                        Сообщить("Документ проведен: "+Док.ТекущийДокумент()+" от "+Док.ДатаДок);
                    КонецЕсли;
                    Колво=Колво+1;
                    Если Смотреть=1 Тогда
                        Форма.Обновить();
                    КонецЕсли;
                Иначе
                    Сообщить("Ошибка проведения документа: "+Док.ТекущийДокумент()+" от "+Док.ДатаДок);
                    Ошибка=1;
                    Прервать;
                КонецЕсли;
                Если (Колво>=3) И (Тр=1) Тогда
                    ЗафиксироватьТранзакцию();
                    Если Пауза=1 Тогда
                        Предупреждение("Пауза - 5 секунд. Если не хотите ждать - жмите ОК",5);
                    КонецЕсли;
                    НачатьТранзакцию();
                    Колво=0;
                ИначеЕсли (Тр=0) И (Пауза=1) Тогда
                    Предупреждение("Пауза - 5 секунд. Если не хотите ждать - жмите ОК",5);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Если Тр=1 Тогда
        Если Ошибка=0 Тогда
            ЗафиксироватьТранзакцию();
        Иначе
            ОтменитьТранзакцию();
            Сигнал();
        КонецЕсли;
    КонецЕсли;
    ИдетВосстановление=0;
    ВремяПостроения=глЗакончитьЗамер();
КонецПроцедуры

Процедура ПриЗакрытии()
    ИдетВосстановление=0;
КонецПроцедуры

Процедура ПриОткрытии()
    Если СЗ.РазмерСписка()=0 Тогда
        Для к=1 по Метаданные.Последовательность() Цикл
            ТекТекст=СокрЛП(Метаданные.Последовательность(к).Синоним);
            СЗ.ДобавитьЗначение(Метаданные.Последовательность(к).Идентификатор,?(ПустаяСтрока(ТекТекст)=1,Метаданные.Последовательность(к).Идентификатор,ТекТекст));
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
Процедура Проверка()
    Перем ВремСЗ;
    Перем к,й;
    СписокВосстановления=СоздатьОбъект("СписокЗначений");
    ВремСЗ=СоздатьОбъект("СписокЗначений");
    Для к=1 по СЗ.РазмерСписка() Цикл
        Если СЗ.Пометка(к)=1 Тогда
            ТекТекст="";
            ТекПосл=СЗ.ПолучитьЗначение(к,ТекТекст);
            Для й=1 по Метаданные.Последовательность(ТекПосл).Документы.Количество() Цикл
                ТекВид=Метаданные.Последовательность(ТекПосл).Документы.Получить(й).Идентификатор;
                Если ВремСЗ.НайтиЗначение(ТекВид)=0 Тогда
                    ВремСЗ.ДобавитьЗначение(ТекВид);
                КонецЕсли;
            КонецЦикла;
            СписокВосстановления.ДобавитьЗначение(Последовательность.ПолучитьАтрибут(ТекПосл),ТекПосл);
        КонецЕсли;
    КонецЦикла;
    Если СписокВосстановления.РазмерСписка()=0 Тогда
        Предупреждение("Ни одна последовательность на выбрана!!!",10);
        Возврат;
    КонецЕсли;
    //создаем строку видов документов список, входящих в выбранные наши последовательности.
    СтрокаВидов=ВремСЗ.ВСтрокуСРазделителями();
    Выполнить();
КонецПроцедуры

Эту обработку можно загрузить в разделе "Скачать".

Внимание! Следует с осторожностью пользоваться этой или другими обработками восстановления последовательности или проведения документов в базах данных в формате MS-SQL. Ответ на вопрос «Почему?» вы найдете по этой ссылке.

 

 

Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").