• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

TimeDontWait

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

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

puh14

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

TimeDontWait

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

Дайнеко

Решение со справочником заставит мучатся с синхронизацией документа и справочника. Ведь запрет нужно ставить, а нужно и снимать.
Я такой простой и железный механизм сделал:

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

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

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

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

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

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

Все процедуры глобальные, т.к. кнопки на всех журналах. Конт - контекст журнала или документа.
 
Д

Дайнеко

И еще добавлю. Данный механизм для индивидуальной защиты документа. Если агульно закрыть период - то классический метод: Константа.ДатаЗакрытогоПериод
 
V

vitfil

Дайнеко, а зачем все делать через "Попытка\Исключение"?
 
P

puh14

Решение со справочником заставит мучатся с синхронизацией документа и справочника. Ведь запрет нужно ставить, а нужно и снимать.
Я такой простой и железный механизм сделал:


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

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

Дайнеко

Дайнеко, а зачем все делать через "Попытка\Исключение"?

У нас во дворе все пацаны так делають, когда есть некоторая неопределенность в операции сейчас и завтра.

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

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

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

Дайнеко

Ну дело хозяйское. Мне перезаписывать документы ради одного реквизита не нравится.

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

TimeDontWait

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

Вложения

  • ArxivDoc.rar
    7 КБ · Просмотры: 118
V

vitfil

У нас во дворе все пацаны так делають, когда есть некоторая неопределенность в операции сейчас и завтра.

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!