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

Тема в разделе "1C и всё что с ней связано", создана пользователем TimeDontWait, 17 май 2010.

  1. TimeDontWait

    TimeDontWait Well-Known Member

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Либо всё время менять процедурку блокировки, подставляя всё больше условий, либо завести отдельный справочник, в элементы которого писать ссылки на документы и на основании , например, пометки на удаление элемента этого справочника ( или какого-нибуть реквизита этого элемента) разрешать или запрещать редактирование документа. Мжно не справочник, а файлик текстовый в каталог базы положить и работать с ним.
     
  3. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Большое thank you. Попробую со справочником
     
  4. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Решение со справочником заставит мучатся с синхронизацией документа и справочника. Ведь запрет нужно ставить, а нужно и снимать.
    Я такой простой и железный механизм сделал:

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

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

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

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

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

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    И еще добавлю. Данный механизм для индивидуальной защиты документа. Если агульно закрыть период - то классический метод: Константа.ДатаЗакрытогоПериод
     
  6. TimeDontWait

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    Даю подарки :)
     
  7. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Дайнеко, а зачем все делать через "Попытка\Исключение"?
     
  8. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0

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

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    У нас во дворе все пацаны так делають, когда есть некоторая неопределенность в операции сейчас и завтра.

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

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

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

    Дайнеко Well-Known Member
    1C Team

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

    TimeDontWait Well-Known Member

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

    Вложения:

    • ArxivDoc.rar
      Размер файла:
      7 КБ
      Просмотров:
      3
  12. vitfil

    vitfil IT-интегратор

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    На провокацию не подамся. :p
     
Загрузка...

Поделиться этой страницей