Архивирование документа

  • Автор темы TimeDontWait
  • Дата начала
T

TimeDontWait

#1
7.7
Может у кого-то есть решение или совет. Мне нужно каким-нибудь образом "архивировать" документы, блокировать на перезапись, перепроведение. Загвоздка лишь в том, что нужно блокировать только определенные(например за период 2 квартал 2009 г. док.ВидДок). Сделал для проведенных запрет, но это не то
Код:
Процедура ПроверкаЗапретаРедактирования(Конт) Экспорт 
Если Конт.Проведен()=1 Тогда 
Конт.Форма.ТолькоПросмотр(1); 
КонецЕсли; 
КонецПроцедуры

Процедура ПриОткрытии() 
ПроверкаЗапретаРедактирования(Контекст);
КонецПроцедуры
КонецПроцедуры
Может есть какие-то вк?
 

puh14

Well-known member
11.07.2008
1 412
0
#2
Либо всё время менять процедурку блокировки, подставляя всё больше условий, либо завести отдельный справочник, в элементы которого писать ссылки на документы и на основании , например, пометки на удаление элемента этого справочника ( или какого-нибуть реквизита этого элемента) разрешать или запрещать редактирование документа. Мжно не справочник, а файлик текстовый в каталог базы положить и работать с ним.
 
T

TimeDontWait

#3
Большое thank you. Попробую со справочником
 

Дайнеко

Well-known member
19.11.2009
951
0
#4
Решение со справочником заставит мучатся с синхронизацией документа и справочника. Ведь запрет нужно ставить, а нужно и снимать.
Я такой простой и железный механизм сделал:

- У всех документов реквизит "Проверен"
- Человек в журнале нажимает кнопочку одноименную (а можно и процедурой обработать период):
Код:
//	Отметка "Проверен"
Процедура ЖурналПроверен(Конт) Экспорт
Перем ДокР;

Попытка
Конт_Док = Конт.ТекущийДокумент;
Исключение
Попытка
Конт_Док = Конт.Документ;
Исключение
Возврат;
КонецПопытки;
КонецПопытки;

Если НЕ(Конт_Док.Выбран()=1) Тогда
Возврат;
КонецЕсли;

Если НЕ(Пользователь.П_Проверять = 1) Тогда
Предупреждение("Нет права", 1);
Возврат;
КонецЕсли;

ДокР = СоздатьОбъект("Документ");
ДокР.НайтиДокумент(Конт_Док);
Попытка
ДокР.Проверил = Инв(Конт_Док.Проверил);
Исключение
Возврат;
КонецПопытки;

Попытка
ДокР.Записать();
Исключение
Предупреждение (ОписаниеОшибки(), 2);
КонецПопытки;
КонецПроцедуры
Инв() это моя ф-ия: 0 в 1, 1 в 0.
- В журнале пиктограмма показывается.
- А вот если у документа Проверен = 1, то анализируется в 2 местах:
- ПриОткрытии просто предупредить человека.
Код:
		Метка = 0;
Попытка
Метка = Конт.Проверил;
Исключение	КонецПопытки;
Если Метка = 1 Тогда
Предупреждение("Проверен! Только для просмотра", 1);
КонецЕсли;
1
- ПриЗаписи
Код:
	Метка = 0;
Попытка
Метка = Конт.Проверил;
Исключение	КонецПопытки;
Если Метка = 1 Тогда
Предупреждение("Указана отметка <Проверен>!", 1);
СтатусВозврата(0);
Возврат 0;
КонецЕсли;
Все процедуры глобальные, т.к. кнопки на всех журналах. Конт - контекст журнала или документа.
 

Дайнеко

Well-known member
19.11.2009
951
0
#5
И еще добавлю. Данный механизм для индивидуальной защиты документа. Если агульно закрыть период - то классический метод: Константа.ДатаЗакрытогоПериод
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#7
Дайнеко, а зачем все делать через "Попытка\Исключение"?
 

puh14

Well-known member
11.07.2008
1 412
0
#8
Решение со справочником заставит мучатся с синхронизацией документа и справочника. Ведь запрет нужно ставить, а нужно и снимать.
Я такой простой и железный механизм сделал:

Ну дело хозяйское. Мне перезаписывать документы ради одного реквизита не нравится. А справочник заполняется элементарно - либо при записи документа, либо обработкой. Простановка запретов через обработку. И ничего перезаписывать не надо. Плюс в журнале регистрации видно какая №?$## отменила/поставила только просмотр.

Правда через реквизит на больших базах будет работать быстрее.
 

Дайнеко

Well-known member
19.11.2009
951
0
#9
Дайнеко, а зачем все делать через "Попытка\Исключение"?
У нас во дворе все пацаны так делають, когда есть некоторая неопределенность в операции сейчас и завтра.

1) Я заметил, что признак "Проверил" создал почти у всех документов. А кнопка для его изменения есть и в полном журнале. Значит пользователь может нажать на доке без реквизита. Выходит при чтении реквизита без Попытки ну никак. По-молодости писал: Если Док.Вид()="Расходная.... Но это не надежно: система эволюционирует, новые виды документов, вплоть до переименования.

2) При работе в журнале "Попытка" перед "Конт_Док = Конт.ТекущийДокумент;" нужно делать всегда. Проверьте обращение к "ТекущийДокумент" когда журнал пустой.

3) Ну а "Попытка" перед "ДокР.Записать();" это уже стандарт. В момент записи Док открыт другим пользователем.
 

Дайнеко

Well-known member
19.11.2009
951
0
#10
Ну дело хозяйское. Мне перезаписывать документы ради одного реквизита не нравится.
Ну не надо дуться. Я же не отрицаю Вашу идею, а говорю о проблемности синхронизации. Например, документ прописан в справочнике как "Защищенный". Пользователь удаляет Док. Нужно не забыть запрограммировать удалить запись спр-ка. А снял пометку?. А если документ удаляется не интерактивно, а программно?. Всегда вспомним об этом? А если другой программер написал внешнюю обработку удаления документов. Да вообще не догадается.
Еще один аспект. Я очень жадный. Убедить меня создать новый вид док-та или спр-к стоит большого. А количество полей (реквизитов) на производительности не ощутимо. Размерчик в 1 байт на каждый документ вообще незначителен. В отличии от количества файлов БД. Пользователь интуитивно чувствует громоздкость программы и ценит её шустрость и компактность. Аргументы про мощь нынешних компов не принимаются. Красота и изящество от этого не зависят.
 
T

TimeDontWait

#11
Аргументы про мощь нынешних компов не принимаются. Красота и изящество от этого не зависят.
У нас половина клиентов сидят на win98se.
Всем спасибо ;)
Кому интересно, сделал я простенькую обработку. В документы внес реквизит "Архивирован", т.Число,1,0
Код:
Процедура ПриОткрытии()
Если архивирован=1 тогда
СтатусВозврата(0); // не открываем форму
Возврат;
ИначеЕсли архивирован=0 тогда
СтатусВозврата(1);
КонецЕсли;
КонецПроцедуры
Ну или по желанию - просто просмотр.
 

Вложения

vitfil

IT-интегратор
02.04.2004
2 062
0
#12
У нас во дворе все пацаны так делають, когда есть некоторая неопределенность в операции сейчас и завтра.

1) Я заметил, что признак "Проверил" создал почти у всех документов. А кнопка для его изменения есть и в полном журнале. Значит пользователь может нажать на доке без реквизита. Выходит при чтении реквизита без Попытки ну никак. По-молодости писал: Если Док.Вид()="Расходная.... Но это не надежно: система эволюционирует, новые виды документов, вплоть до переименования.

2) При работе в журнале "Попытка" перед "Конт_Док = Конт.ТекущийДокумент;" нужно делать всегда. Проверьте обращение к "ТекущийДокумент" когда журнал пустой.

3) Ну а "Попытка" перед "ДокР.Записать();" это уже стандарт. В момент записи Док открыт другим пользователем.
Позволю себе не согласиться. Частично.
Конструкция Попытка\Исключение придумана для перехвата исключительных ситуаций. Процессы создания отдельной области выполнения кода исключительный ситуации, а также генерация самой исключительной ситуации достаточно ресурсоемки. Гораздо выгоднее в некоторых случаях применять Если\Тогда. Мне пришлось править конфигурацию за одним умельцем (без кавычек, потому как действительно достаточно новаторская была конфигурация), в которой практически все было сделано через исключительные ситуации. За счет замены Попытки на Если удалось достигнуть прирост производительности порядка 35%.
Теперь по пунктам...
1. Разумеется, Если Док.Вид() = "Расходная" пишут только по молодости.
Гораздо правильней будет объявить глобальную функцию глЕстьРеквизитШапки(ИмяРеквизита,ВидДок) (есть в ТиС) и использовать ее. Верить мне вовсе не обязательно. Сделайте замер производительности двух вариантов.
2. Если ТекущийДокумент.Выбран() отработает раз в 5-6 быстрее обработки исключительной ситуации.
3. А вот тут я с вами полностью согласен! Только не потому как это уже стандарт (стандарт - это когда 1 кило = 1000 единиц, да и то не всегда до некоторых пор), а именно по причине НЕВОЗМОЖНОСТИ уследить за действиями драйвера, отвечающего за соединение с базой данных.
Вот как-то так...