После размещения на сайте моей статьи о восстановлении последовательности в разделенном режиме я получил в свой адрес ряд отзывов и предложений. В частности, были заданы вопросы о том, что лучше было бы сделать работу с последовательностью, не зависящей от конкретной конфигурации, названия последовательности, а также пожелание, чтобы обработка могла восстанавливать сразу несколько последовательностей.
В своей новой обработке я постарался учесть все вышеперечисленные требования, плюс к тому добавил несколько полезных для пользователя моментов, таких как:
- отображение позиций по всем имеющимся в системе последовательностям;
- выбор режима обновления формы обработки во время перепроведения документов;
- выбор режима вывода сообщений о проведении очередного документа;
По прежнему имеется возможность работать с транзакциями и паузами.
Ниже находится картинка формы обработки с примером работы:
Что нужно знать при вставке в новую конфигурацию.
Обработка использует вызов двух глобальных процедур, служащих для замера времени выполнения. Эти процедуры можно либо вставить в глобальный модуль конфигурации, либо непосредственно в модуль формы обработки, либо удалить из модуля ссылки на них. Почитать подробнее об этих процедурах можно здесь.
Также в обработке устанавливается переменная ИдетВосстановление . Она устанавливается в 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 возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").
|