Восстанавливаем последовательность в разделенном режиме   

Очень часто мы сталкиваемся с необходимостью восстановления последовательности документов. Для этого приходится выгонять всех пользователей из базы, открывать базу в монопольном режиме и затем восстанавливать последовательность с помощью встроенного механизма «1С-Предприятия 7.7».

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

Как это сделать? Легко! Создаем новую обработку, которая будет восстанавливать последовательность.

Вот диалоговая форма обработки (флажок «Использовать транзакцию» имеет идентификатор «Тр»):

Диалоговая форма обработки.

А вот и сам текст модуля обработки:

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

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

Что касается быстродействия - разумеется оно в несколько раз ниже, чем при использовании стандартных средств 1с. Причины две - необходимость расчета остатков на каждый проводимый документ и работа в разделенном режиме. При восстановлении последовательности средствами 1с в монопольном режиме происходит сдвиг «Точки Актуальности Итогов», в результате при проведении документов не требуется временный расчет регистров.

Но при большом количестве одновременно работающих пользователей бывает очень удобно пользоваться именно этой обработкой, так как нет возможности выгнать пользователей (все работать хотят), и лучше медленное восстановление последовательности, чем совсем никакого. При использовании терминального режима работы очень даже удобно пользоваться этим механизмом.

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

 


 

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