Структурированная система хранения документов предприятия

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    66,7 Кб
  • Опубликовано:
    2016-01-27
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Структурированная система хранения документов предприятия

Реферат

 

Пояснительная записка к дипломной работе бакалавра на тему "Структурированная система хранения документов предприятия" оформлена на 134 страницах, содержит 14 рисунков, 26 таблиц.

Ключевыми словами в данной работе являются: документ, каталог, документооборот, учет, хранение, сканирование, отчеты.

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

В результате разработана структурированная система хранения документов предприятия, которая позволяет:

создавать документы определенных типов;

назначать документам позицию в картотеке, где хранятся их оригинал;

создавать отчет о документах, лежащих в выбранной позиции картотеки;

сканировать документ непосредственно из пользовательского приложения;

прикреплять изображения к документу;

создавать отчет о документах, срок которых подходит к концу;

вести поиск по различным параметрам документа;

помещать документы в архив;

распечатывать копию документа;

создавать и загружать резервные копии базы.

Система успешно внедрена и используется в полной мере.

Содержание

 

Введение

1. Разработка структурированной системы хранения документов предприятия

1.1 Обоснование целесообразности разработки системы

1.1.1 Назначение объекта автоматизации

1.1.2 Обоснование цели создания системы

1.1.3 Обоснование состава автоматизируемых задач, комплексов задач

1.2 Аналитический обзор

1.2.1 Программа "Документ плюс"

1.2.2 Программа "Архив документов"

1.2.3 Программа "ДокПартнер 2012"

1.2.4 Выводы по аналитическому обзору

1.3 Основные требования к системе

1.3.1 Цель создания системы и критерии эффективности её функционирования

1.3.2 Функциональное назначение системы

1.3.3 Требование к функциональной структуре системы

1.3.4 Состав типовых проектных решений и пакетов прикладных программ, применяемых в системе

1.3.5 Требования к техническому обеспечению

1.3.6 Требования к информационному обеспечению

1.3.7 Требования к программному обеспечению

1.3.8 Перспективность системы, возможность ее развития

1.4 Основные технические решения проекта системы

1.4.1 Описание организации информационной базы

1.4.2 Описание системы программного обеспечения

2. Разработка задачи структрированной системы хранения документов предприятия

2.1 Описание постановки задачи

2.1.1 Характеристика задачи

2.1.2 Описание выходной информации

2.1.3 Математическая постановка задачи

2.2 Описание алгоритма добавления документа

2.2.1 Назначение и характеристика

2.2.2 Используемая информация

2.2.3 Результаты решения

2.2.4 Математическое описание

2.2.5 Алгоритм решения

2.3 Описание алгоритма изменения документа

2.3.1 Назначение и характеристика

2.3.2 Используемая информация

2.3.3 Результаты решения

2.3.4 Математическое описание

2.3.5 Алгоритм решения

2.4 Описание алгоритма помещения документа в корзину

2.4.1 Назначение и характеристика

2.4.2 Используемая информация

2.4.3 Результаты решения

2.4.4 Математическое описание

2.4.5 Алгоритм решения

2.5 Описание алгоритма очистки корзины

2.5.1 Назначение и характеристика

2.5.2 Используемая информация

2.5.3 Результаты решения

2.5.4 Математическое описание

2.5.5 Алгоритм решения

2.6 Описание программы структурированной системы хранения документов предприятия

2.6.1 Функциональное назначение

2.6.2 Описание информации

2.6.3 Используемые подпрограммы

2.6.4 Описание логики

2.7 Описание контрольного примера

2.7.1 Назначение

2.7.2 Исходные данные

2.7.3 Результаты расчета

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

3. Организационно-экономическая часть

3.1 Обоснование необходимости разработки структурированной системы хранения документов предприятия

3.2 Перечень этапов работ

3.3 Нормирование работ

3.4 Расчет сметной стоимости на разработку ПП

3.5 Расчёт срока окупаемости единовременных затрат и экономической выгоды от внедрения программного продукта на предприятии

3.6 Результат по организационно-экономической части

4. Охрана труда

4.1 Обеспечение безопасных условий труда инженера-разработчика

4.2 Расчет искусственного освещения рабочего места

Заключение

Список использованных источников

Приложение 1. Тексты программ

Приложение 2. Результаты работы программ

Приложение 3. Руководство оператора структурированной системы хранения документов предприятия

Введение

С каждым днем растет степень внедрения программных продуктов в сферу управления делопроизводством в организациях. Особенно актуально введение электронного документооборота на предприятиях.

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

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

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

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

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

Основные задачи, решенные в представленной работе:

проработка логики управления документами;

разработка гибкой структуры базы данных, которая позволяет вести быстрый поиск по разным документам;

обеспечение простоты эксплуатации системы и настройки системы;

разработка механизма резервного копирования.

электронная база хранение документ

1. Разработка структурированной системы хранения документов предприятия


1.1 Обоснование целесообразности разработки системы


1.1.1 Назначение объекта автоматизации

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

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

 

1.1.2 Обоснование цели создания системы

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

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

 

1.1.3 Обоснование состава автоматизируемых задач, комплексов задач

Приведем список наиболее частых операций при работе с бумажной документацией:

ввод нового документа в системы. В него входят создание и заполнение карточки документа, а так же сканирование с бумажного носителя;

поиск документа в картотеке. Кроме названия, поиск может осуществляться по другим параметрам документа;

печать копии документа.

Таким образом, анализ предметной области [1] определил, что система хранения документов предприятия должна позволять следующее:

создавать документы определенных типов;

назначать документам позицию в картотеке, где хранятся их оригинал;

создавать отчет о документах, лежащих в выбранной позиции картотеки;

сканировать документ непосредственно из пользовательского приложения;

прикреплять изображения к документу;

создавать отчет о документах, срок которых подходит к концу;

вести поиск по различным параметрам документа;

помещать документы в архив;

распечатывать копию документа;

создавать и загружать резервные копии базы.

 

1.2 Аналитический обзор


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

При анализе существующих программных продуктов брались в расчет системы того же класса, что и разрабатываемая, т.е. ориентированные на малые предприятия Характеристики некоторых из проанализированных систем представлены в табл. 1.1.

Таблица 1.1

Сводная таблица характеристик программ-аналогов

Параметр

Документ плюс

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

ДокПартнер 2012

Расширенный поиск

+

+

-

Настраиваемые типы документов

-

+

-

Простота внедрения

+

-

+

Дружелюбный интерфейс

-

+

-

Сканирование бумажных документов

-

-

-

Стоимость (на 1 пользователя)

9300 руб.

3000 руб.

5100 руб.


1.2.1 Программа "Документ плюс"

Программа встречает пользователя нагромождением таблиц и форм. Очень сложно освоиться в такой программе, поэтому потребуется продолжительное обучение сотрудника [2].

В целом, судя по обилию разных меню, программа многофункциональна и, вероятно, находит своего покупателя. Однако весь функционал надежно скрыт под слоем невменяемого интерфейса, что ведет к излишним затратам при внедрении системы (обучение сотрудника, настройка системы) и может отпугнуть покупателя.

Недостатки: перегруженный интерфейс, ограниченный набор типов документов, не настраиваемая электронная карточка документов.

 

1.2.2 Программа "Архив документов"

Программа встречает пользователя стандартным строгим оформлением, о котором нельзя сказать ничего положительного и ничего отрицательного.

Главная проблема программы в том, что она все время напоминает сотруднику, что он работает с базой данных и, соответственно, требует определенной квалификации. Чтобы добавить новый тип документов, нужно буквально создать таблицу в базе; чтобы отфильтровать документы, нужно построить запрос по SQL-правилам. Это хорошая система, но ориентирована только на программистов [3].

Недостатки: сложное развертывание системы, для настройки программы требуется специалист.

 

1.2.3 Программа "ДокПартнер 2012"

Интерфейс программы выполнен в непонятной синеватой цветовой гамме и выглядит очень пусто [4].

В программе нет возможности настраивать карточки типов документов (единственное, что можно изменить - имя типа документов), и она не позволяет делать выборки документов по специфичным критериям. Это очень простая программа с очень скромными возможностями.

Недостатки: не интуитивный интерфейс, не настраиваемая форма ввода документа, универсальная карточка для всех разновидностей документов.

 

1.2.4 Выводы по аналитическому обзору

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

Основными преимуществами разрабатываемой структурированной системы хранения документов предприятия являются:

         гибкая и в то же время простая настройка системы, позволяющая адаптировать ее под актуальные для организации бизнес-процессы;

-        простота внедрения и эксплуатации системы. Для установки и поддержания в рабочем состоянии системы не требуется вмешательство специалиста;

         удобство и лаконичность интерфейса, что, во-первых, обеспечивает быструю адаптацию сотрудника к системе, а, во-вторых, увеличивает скорость обработки документа.

 

1.3 Основные требования к системе


1.3.1 Цель создания системы и критерии эффективности её функционирования

Целью создания системы является увеличение производительности труда при обработке бумажных документов.

Критериями эффективности данной системы являются:

скорость и удобство ввода нового документа в систему;

скорость поиска документов, а так же количество критериев для поиска;

гибкость настройки системы под существующие бизнес-процессы в организации;

надежность хранения информации в системе;

простота внедрения системы и затраты на обучение сотрудников;

простота эксплуатации.

 

1.3.2 Функциональное назначение системы

Структурированная система хранения документов предприятия предназначена для хранения и поиска документов, предоставляет следующие функции:

создание документов определенных типов (договора, приказы, свидетельства);

назначение документам позиции в картотеке, где хранятся их оригинал;

создавание отчетов о документах, лежащих в выбранной позиции картотеки;

сканирование документа непосредственно из пользовательского приложения;

прикрепление изображения к документу;

создавание отчета о документах, срок которых подходит к концу;

поиск по различным параметрам документа;

перемещение документов в архив;

распечатка копии документа;

создание и загрузка резервных копий базы.

 

1.3.3 Требование к функциональной структуре системы

Структурная схема структурированной системы хранения документов предприятия представлена на рис.1.1.

Структурированная система хранения документов предприятия подразделяется на следующие подсистемы:

подсистема обслуживания приложения. Состоит из модулей: модуль резервного копирования (позволяет сохранить текущее состояние базы данных и хранилища файлов и восстановить его) и модуль обновления структуры базы данных (изменяет структуру базы данных для совместимости с новой версией приложения);

подсистема управления документами. Состоит их модулей: модуль логики обработки документов (инкапсулирует в себе правила обращения с документами - ввод нового документа, поиск, удаление) и модуль печати и сканирования документов (обеспечивает взаимодействие с принтером и сканером пользователя);

подсистема обращения к источникам данных. Состоит из модулей: модуль хранения прикрепленных файлов (позволяет хранить прикрепленные файлы в одном общем хранилище) и модуль обращения к базе данных (обеспечивает связь приложения с базой данных).

В целом система предоставляет следующие основные функциональные возможности:

) Заведение документа

Входные данные: описание документа по атрибутам.

Выходные данные: электронная карточка документа, записанная в базу данных;

) Поиск документа

Входные данные: критерии поиска.

Выходные данные: список найденных документов;

) Сканирование документа

Входные данные: изображение со сканера.

Выходные данные: прикрепленное к документу изображение записывается в хранилище файлов;

) Прикрепление файла к документу

Входные данные: выбранный пользователь файл.

Выходные данные: прикрепленный файл записывается в хранилище файлов;

) Уведомление о документах с истекающим сроком

Входные данные: заведенные в базе данных электронные карточки документов.

Выходные данные: список документов с истекающим сроком;

) Подключение модуля расширения состава документов

Входные данные: файл модуля, помещенный в специальную папку.

Выходные данные: изменение структуры базы данных, добавление нового типа документов в систему;

) Резервное копирование

Входные данные: база данных и хранилище файлов

Выходные данные: сжатый файл - резервная копия.

 


1.3.4 Состав типовых проектных решений и пакетов прикладных программ, применяемых в системе

Структурированная система хранения документов предприятия написана на языке C# и использует библиотеку WPF, для визуализации графического интерфейса. Эта библиотека основана на языке разметки xaml, что позволяет при разработке внешнего вида приложения использовать специализированные программные продукты.

В качестве базы данных была выбрана SQLite - эффективное решение, не требующее наличия выделенного сервера.

 

1.3.5 Требования к техническому обеспечению

Для работы структурированной системы хранения документов предприятия требуется персональный компьютер со следующими характеристиками и устройствами:

процессор: 1 ГГц (или выше);

ОЗУ: 1024 Мб (или выше);

жесткий диск: 10 Гб (или выше);

видеоадаптер;

монитор;

клавиатура;

мышь.

Для доступа к функциям печати и сканирования требуются соответствующие устройства.

 

1.3.6 Требования к информационному обеспечению

Во время работы структурированная система хранения документов предприятия использует базу данных SQLite (main. db);

Основные требования к базе данных:

надежность хранения данных;

развитая система транзакций;

большая скорость выполнения сложных запросов выбора;

отсутствие необходимости в выделенном сервере;

наличие развитых средств управления и проектирования базой данных;

наличие обширной документации.

 

1.3.7 Требования к программному обеспечению

Для работы структурированной системы хранения документов предприятия на компьютере пользователя должно быть установлено следующее программное обеспечение:

Операционная система: Windows XP SP 3, Windows Vista, Windows 7 (или выше)

.net Framework 4.5 Client Profile;Installer 3.1 (или выше).

Для доступа к функциям печати и сканирования требуется установка драйверов соответствующих устройств.

 

1.3.8 Перспективность системы, возможность ее развития

Структурированная система хранения документов предприятия, в отличие от многих аналогичных программных продуктов, ориентируется на нишу электронного документооборота для малых предприятий. Для таких предприятий вопрос о переходе на электронный документооборот становится все более актуальным в связи с инициативами государства о создании электронного правительства.

Дальнейшее развитие системы будет включать в себя:

разработку многопользовательской версии приложения;

разграничение прав доступа пользователей;

добавление истории операций над документами;

развитие пользовательского интерфейса;

работу с электронными документами (создание по шаблону, электронно-цифровая подпись)

добавление интеграции с существующими CRM-системами.

 

1.4 Основные технические решения проекта системы

 

1.4.1 Описание организации информационной базы

База данных организована с помощью СУБД SQLite.

Для описания ключей таблиц использованы следующие сокращения:

) ПК - первичный ключ;

) ВК - внешний ключ.

Таблица document содержит базовую информацию о документе. Структура таблицы приведена в табл. 1.2.

Таблица 1.2

Структура таблицы document

Тип ключа

Название поля

Тип

Описание

ПК

id_document

Integer

Уникальный номер документа

ВК

id_d_type

Integer

Тип документа (doc_type)


name_document

Varchar

Внутреннее имя документа


title_document

Varchar

Заголовок документа


added_time

Datetime

Дата и время добавления документа


updated_time

Datetime

Дата и время последнего изменения документа


elapsing_date

Datetime

Дата окончания действия документа


is_in_recyclebin

Boolean

Документ помещен в корзину


comment

Text

Комментарий к документу

ВК

id_card_folder

Integer

Позиция в картотеке (card_folder)


Таблица doc_type содержит информацию о подключенных типах документов. Структура таблицы приведена в табл. 1.3.

Таблица 1.3

Структура таблицы doc_type

Тип ключа

Название поля

Тип

Описание

ПК

id_doc_type

Integer

Уникальный номер типа документов


name_doc_type

Varchar

Внутреннее имя типа документов


title_doc_type

Varchar

Отображаемое имя типа документов


plural_title

Varchar

Отображаемое имя типа документов во множественном числе


char_doc_type

Char (8)

Префикс для имени документа

Тип ключа

Название поля

Тип

Описание


is_deleted

Boolean

Тип документа отключен


can_elapse

Boolean

Документы этого типа могут истекать


plugin_name

Varchar

Имя библиотеки, откуда тип документа взят


Таблица doc_file_folder содержит данные о прикрепленных к документу папках. Структура таблицы приведена в табл. 1.4.

Таблица 1.4

Структура таблицы doc_file_folder

Тип ключа

Название поля

Тип

Описание

ПК

id_doc_file_folder

Integer

Идентификатор папки

ВК

id_document

Integer

Документ. к которому прикреплена папка (document)

ВК

parent_id_doc_file_folder

Integer

Родительская папка (doc_file_folder)

Varchar

Отображаемое имя папки


Таблица doc_file содержит данные о прикрепленных к документу файлах. Структура таблицы приведена в табл. 1.5.

Таблица 1.5

Структура таблицы doc_file

Тип ключаНазвание поляТипОписание




ПК

id_doc_file

Integer

Идентификатор файла

ВК

id_document

Integer

Документ. к которому прикреплена папка (document)

ВК

parent_id_doc_file_folder

Integer

Родительская папка (doc_file_folder)


title_doc_file

Varchar

Отображаемое имя файла


orig_name

Varchar

Оригинальное имя папки


storage_path

Varchar

Путь до файла в хранилище файлов


Таблица search_tag содержит теги для быстрого поиска. Структура таблицы приведена в табл. 1.6.

Таблица 1.6

Структура таблицы search_tag

Тип ключаНазвание поляТипОписание




ПК

id_search_tag

Integer

Идентификатор тега


title_search_tag

Varchar

Текстовое содержимое тега


Таблица lnk_document_and_search_tag обеспечивает связь тегов с документами. Структура таблицы приведена в табл. 1.7.

Таблица 1.7

Структура таблицы lnk_document_and_search_tag

Тип ключаНазвание поляТипОписание




ВК

id_document

Integer

Документ (document)

ВК

id_search_tag

Varchar

Тег поиска (search_tag)

 

Таблица card_case содержит данные о ящиках в картотеке. Структура таблицы приведена в табл. 1.8.

Таблица 1.8

Структура таблицы card_case

Тип ключаНазвание поляТипОписание




ПК

id_card_case

Integer

Идентификатор ящика


title_card_case

Varchar

Текстовое название ящика


is_deleted

Boolean

Ящик удален


Таблица card_folder содержит данные о папках в картотеке. Структура таблицы приведена в табл. 1.9.

Таблица 1.9

Структура таблицы card_folder

Тип ключаНазвание поляТипОписание




ПК

id_card_folder

Integer

Идентификатор папки

ВК

id_card_case

Integer

Родительский ящик


title_card_folder

Varchar

Текстовое название папки


is_deleted

Boolean

Папка удалена


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

Таблица 1.10

Структура таблицы concrete_doc1

Тип ключаНазвание поляТипОписание




ПК

id_ concrete_doc1

Integer

Идентификатор документа данного типа

ВК

id_doc

Integer

Ссылка на общую информацию о документе (document)

ВК

id_cd1_addtional

Integer

Ссылка на дополнительный словарь (cd1_additional)


data1

Type

Дополнительная информация 1


data2

Type

Дополнительная информация 2



dataN

Type

Дополнительная информация N


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

Таблица 1.11

Структура таблицы cd1_additonal

Тип ключа

Название поля

Тип

Описание

ПК

id_ cd1_additonal

Integer

Идентификатор элемента дополнительного словаря


data1

Type

Дополнительная информация 1


data2

Type

Дополнительная информация 2



dataN

Type

Дополнительная информация N


Структура и связи между таблицами представлена на рис. 1.2.

Структура базы данных

 

1.4.2 Описание системы программного обеспечения

Для функционирования разрабатываемой системы необходимо следующее программное обеспечение:

Операционная система: Windows XP SP 3, Windows Vista, Windows 7 (или выше);

.net Framework 4.5 Client Profile;Installer 3.1 (или выше).

Для работы функций печати и сканирования документов может потребоваться установка драйверов соответствующих устройств.

В качестве языка программирования был выбран C# - современный быстроразвивающийся язык, который несет в себе высокую скорость разработки приложений, строгий однозначный синтаксис и обширную документацию [5]. Этот язык компилируется в управляемый код и работает под управлением среды.net Framework, при этом немногим теряя в скорости выполнения.

В качестве СУБД используется SQLite, которая не требует наличия выделенного сервера. В этой базе данных хорошо сочетаются скорость доступа к информации, поддержка возможностей языка SQL и простота использования [6]. Библиотека SQLite является свободно распространяемой и может поставляться вместе с программным продуктом.

2. Разработка задачи структрированной системы хранения документов предприятия


2.1 Описание постановки задачи


2.1.1 Характеристика задачи

Структурированная система хранения документов предприятия предназначена для хранения и поиска документов, предоставляет возможности для сканирования и печати документов и обеспечивает резервное копирование данных.

Целесообразность автоматизации решения задачи обосновывается необходимостью оперативного доступа к документу в условии большого потока входящих документов.

Задача включает в себя следующие подзадачи:

разработка структуры базы данных;

разработка пользовательских форм;

разработка классов доступа к базе данных.

Подзадача "Разработка структуры базы данных" заключается в организации структуры базы данных, создании таблиц и связей между ними.

Подзадача "Разработка пользовательских форм". Пользовательские формы предназначены для организации взаимодействия пользователя с функциями системы. Подзадача включает в себя: определение количества и состава форм, разработку дизайна интерфейса и написание кода логики взаимодействия пользователя с элементами управления.

Подзадача "Разработка классов доступа к базе данных". Вспомогательные классы доступа к базе данных предназначены для упрощения доступа к данным, унификации контроля ошибок выполнения, оптимизации скорости доступа за счет кэширования и избавления от повторяемости кода.

Входной информацией являются:

события пользовательского интерфейса;

вводимые пользователем атрибуты документов. Каждый подключаемый тип документов может иметь свой набор атрибутов. Перечень общих атрибутов представлен в табл. 2.1;

прикрепляемые файлы.

Таблица 2.1

Общие атрибуты документа

Название

Тип

Описание

Тип документа

Элемент из списка

Тип документа, определяющий специфичные поля документа. Выбирается из списка подключенных модулей расширения состава документов.

Краткое содержание

Текст

Краткое содержание документа или комментарий о нем.

Позиция в картотеке

Два текстовых значения: номер ящика и номер папки

Физическое местоположение бумажного документа.

Прикрепленные файлы

Множество элементов - имен файлов

Список прикрепленных к документу файлов. Это может быть файл из хранилища, файл на диске пользователя или отсканированный файл.


2.1.2 Описание выходной информации

Выходной информацией являются: список документов; сводная информация о документе, которая кроме общих атрибутов документа (см. табл. 2.1) включает и специфичные для каждого типа документов поля; прикрепленные файлы.

 

2.1.3 Математическая постановка задачи

Каждый документ может быть описан ограниченным множеством параметров [7]. Представим документ как набор его атрибутов:

где Рс - набор атрибутов, характерных для каждого документа,

Рs - набор атрибутов, характерных для конкретного типа документа.

Документы одного и того же типа могут быть объединены в соответствующие множества вида:

где Ci - множество документов i-го типа,- количество документов i-го типа.

Введем на множествах  операцию добавления документа:

Все введенные в систему документы могут быть объедены в универсальное множество:

где C1 - универсальное множество документов, Ci - множество документов i-го типа, k - количество типов документов.

Выделим на множестве и подмножества. Очевидно, что:

Введем на множествах операцию поиска по фильтру:

Кроме этого, введем операцию удаления документов:

 

2.2 Описание алгоритма добавления документа


2.2.1 Назначение и характеристика

Алгоритм предназначен для добавления документа в базу данных.

 

2.2.2 Используемая информация

В качестве входной информации используются введенные пользователем данные с форм.

Кроме общих атрибутов (см. табл. 2.1) каждый тип документов может иметь набор специфичных полей.

 

2.2.3 Результаты решения

Результатом решения алгоритма является добавление новой записи в таблицу document, а так же другие таблицы, связанные с конкретным типом документов.

Если к документу были прикреплены файлы, то так же обновляются таблицы doc_file и doc_file_folder, а так же хранилище файлов.

В случае возникновения ошибки пользователю выводится сообщение. Перечень сообщений представлен в таблице 2.2.

Таблица 2.2

Перечень сообщений алгоритма добавления документа

Причина

Сообщение

Ошибка при добавлении в базу данных

Ошибка БД. Документ не добавлен

Ошибка при прикреплении файлов или папок

Документ был добавлен. Однако в процессе создания возникли ошибки и не все данные были сохранены. Рекомендуется повторно отредактировать документ


2.2.4 Математическое описание

Алгоритм реализует операцию добавления документа в множество документов заданного типа, которая определена в формуле (2.4)

 

2.2.5 Алгоритм решения

Алгоритм представлен графически в виде схемы на рис. 2.1.

Схема алгоритма добавления документа

2.3 Описание алгоритма изменения документа

 

2.3.1 Назначение и характеристика

Алгоритм предназначен для изменения значений атрибутов документа, уже добавленного в базу данных.

 

2.3.2 Используемая информация

В качестве входной информации используются:

идентификатор редактируемого документа;

данные из таблиц: document, doc_file, doc_file_folder и других, специфичных для каждого типа документов

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

 

2.3.3 Результаты решения

Результатом решения алгоритма является изменение записи в таблице document, а так же в других таблицах, связанных с конкретным типом документов.

Если к документу были прикреплены файлы, то так же обновляются таблицы doc_file и doc_file_folder, а так же хранилище файлов.

В случае возникновения ошибки пользователю выводится сообщение. Перечень сообщений представлен в табл. 2.3.

Таблица 2.3

Перечень сообщений алгоритма изменения документа

Причина

Сообщение

Ошибка при изменении в базе данных

Ошибка БД. Документ не отредактирован

Причина

Сообщение

Ошибка при прикреплении файлов или папок

Документ был отредактирован. Однако в процессе создания возникли ошибки и не все данные были сохранены. Рекомендуется повторно отредактировать документ


2.3.4 Математическое описание

Операция изменения документа может быть представлена следующим образом:

 

2.3.5 Алгоритм решения

Алгоритм представлен графически в виде схемы на рис. 2.2.

Схема алгоритма изменения документа.

2.4 Описание алгоритма помещения документа в корзину


2.4.1 Назначение и характеристика

Алгоритм предназначен для помещения документов в корзину. Документы, помещенные в корзину, в дальнейшем можно безвозвратно удалить.

 

.4.2 Используемая информация

В качестве входной информации выступает идентификатор помещаемого в корзину документа.

 

2.4.3 Результаты решения

Результатом решения является установка признака помещения в корзину у записи в таблице document.

 

2.4.4 Математическое описание

Основываясь на формуле 2.8, операция помещения документа в корзину можно выразить следующим образом:

2.4.5 Алгоритм решения

Алгоритм представлен графически в виде схемы на рис. 2.3.

Схема алгоритма помещения документа в корзину

 

2.5 Описание алгоритма очистки корзины


2.5.1 Назначение и характеристика

Алгоритм предназначен для корректного безвозвратного удаления документов, помещенных в корзину.

 


2.5.2 Используемая информация

Алгоритм использует информацию из таблицы document.

 

.5.3 Результаты решения

Результатом работы алгоритма является исключение из таблицы document (и связанных с конкретным документом таблиц) записей, помеченных как помещенные в корзину.

 

2.5.4 Математическое описание

Используя формулы (2.4), (2.6) и (2.7) алгоритм можно описать так:

2.5.5 Алгоритм решения

Алгоритм представлен графически в виде схемы на рис. 2.4.

Схема алгоритма очистки корзины:

 

.6 Описание программы структурированной системы хранения документов предприятия


2.6.1 Функциональное назначение

Программа StructDoc предназначена для ведения электронного учета бумажной документации. Ее функции включают:

добавление, изменение и удаление документов;

поиск документов;

прикрепление файлов к документам;

архивация и восстановление базы данных;

сканирование документов;

печать документов.

 


2.6.2 Описание информации

Программа использует файлы: documents. sqlite (база данных); storage. ind и storage. dat (хранилище файлов); user. config (файл настроек).

Кроме этого, к входной информации можно отнести: события пользовательского интерфейса; вводимые пользователем атрибуты документов. Кроме общих атрибутов (см. табл. 2.1) каждый подключаемый тип документов может иметь свой набор атрибутов.

прикрепляемые файлы.

К выходной информации можно отнести:

список документов;

сводная информация о документе, которая кроме общих атрибутов документа (см. табл. 2.1) включает и специфичные для каждого типа документов поля;

прикрепленные файлы.

 

.6.3 Используемые подпрограммы

Программа разбита на классы:- стартовая точка приложения;- класс базы данных, содержит базовые функции работы с базой и механизм расширения функциональности по средствам включения модулей;- базовый класс для всех фильтров документов;- фильтр документа по общим свойствам;- вспомогательный класс обращения к базе данных. Все запросы к базе данных проходят через него;- класс конструирования запросов;- класс, представляющий схему базы данных (набор таблиц и связей между ними);- класс, представляющий таблицу в схеме базы данных;- класс, представляющий связи между таблицами в схеме базы данных;- базовый класс для модулей - дополнительных функций работы с базой;- модуль логики, реализующий функции печати;- модуль логики, реализующий функции сканирования;- класс, реализующий функции взаимодействия приложения с хранилищем файлов;- класс вызова функций библиотеки, которая позволяет обратиться к TWAIN-драйверу (для сканирования на старых устройствах);- класс, предоставляющий функции обработки изображений;- класс, реализующий обращение либо к интерфейсу WIA, либо к TWAIN-драйверу;

 

.6.4 Описание логики

Логика описана в виде схемы работы системы на рис. 2.5.

Схема работы системы:

2.7 Описание контрольного примера


2.7.1 Назначение

Контрольный пример предназначен для проверки правильности работы следующих функций структурированной системы хранения документов предприятия:

добавление документа;

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

прикрепление к документу файла с диска;

прикрепление к документу отсканированного изображения;

поиск документов;

удаление документа;

печать документа;

архивация базы данных;

восстановление базы данных.

 

2.7.2 Исходные данные

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

Тест 1 "Добавление документов". В структурированную систему хранения документов предприятия вводятся 4 документа. Их параметры представлены в табл. 2.4.

Таблица 2.4

Первоначальный перечень документов

Тип документа

Краткое содержание

Дополнительно

Договор

Договор аренды 1

Сумма договора: 200 000 руб.

Договор

Договор аренды 2

Сумма договора: 400 000 руб.

Тип документа

Краткое содержание

Дополнительно

Тип документа

Краткое содержание

Дополнительно

Договор

Договор аренды 3

Сумма договора: 600 000 руб.

Приказ

Приказ 4

Прикрепление файла с диска и отсканированного изображения


Тест 2 "Редактирование документа". Параметры документа "Договор аренды 2" корректируются согласно табл. 2.5.

Таблица 2.5

Редактирование параметров документа "Договор аренды 2"

Имя параметра

Старое значение

Новое значение

Краткое описание

Договор аренды 2

Договор аренды 2 (ред. )

Сумма договора

400 000 руб.

800 000 руб.


Тест 3 "Поиск документов". Выполняются 2 запроса поиска:

все договора;

договора с суммой больше 500 000 руб и все приказы.

Тест 4 "Удаление документа". Удаляется документ "Договор аренды 3".

Тест 5 "Печать документа". Сводная информация о документе "Приказ 4" выводится на печать.

Тест 6 "Архивация и восстановление базы". База сохраняется в файл "backup. bkp", удаляются все договора и затем база восстанавливается из архива "backup. bkp".

 

2.7.3 Результаты расчета

Результат выполнения теста 1 "Добавление документов" представлен на рис. 2.6.

Результат выполнения теста 1 "Добавление документов"

Результат выполнения теста 2 "Редактирование документа" представлен на рис. 2.7.

Результат выполнения теста 2 "Редактирование документа"

Результат выполнения теста 3 "Поиск документов" представлен на рис. 2.8 (запрос 1: все договора) и рис. 2.9 (запрос 2: договора с суммой больше 500 000 руб и все приказы).

Результат выполнения теста 3 "Поиск документов" для запроса 1

Результат выполнения теста 3 "Поиск документов" для запроса 2

Результат выполнения теста 4 "Удаление документа" представлен на рис. 2.10.

Результат выполнения теста 4 "Удаление документа"

Результатом выполнения теста 5 "Печать документа" является печать документа представленного рис. 2.11.

Результат выполнения теста 5 "Печать документа"

Результатом выполнения теста 6 "Архивация и восстановление базы" является создание резервной копии базы (файл backup. bkp) и последующее восстановление базы из этой копии.

 

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

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

Следовательно, программа работает правильно и может быть внедрена в реальные организации.

3. Организационно-экономическая часть


3.1 Обоснование необходимости разработки структурированной системы хранения документов предприятия


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

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

Структурированная система хранения документов предприятия предназначена для хранения и поиска документов, предоставляет возможности для сканирования и печати документов и обеспечивает резервное копирование данных.

Целесообразность автоматизации решения задачи обосновывается необходимостью оперативного доступа к документу в условии большого потока входящих документов.

 

3.2 Перечень этапов работ


Разработка задачи предусматривает несколько этапов. Порядок разработки программного обеспечения приведен в табл. 3.1.

Таблица 3.1

Перечень этапов работ

Наименование этапов и содержание работ

Исполнитель

1. Подготовительная стадия


1.1 Формулировка технического задания

Программист

1.2 Анализ темы, эффективности, возможностей, проработка содержания

Программист

2. Теоретико - информационная часть


2.1 Выбор средств разработки

Программист

2.2 Формирование пояснительной записки: Введение; Описание разработки

Программист

3. Практическая часть


3.1 Разработка базы данных

Программист

3.2 Разработка пользовательского интерфейса

Программист

3.3 Реализация алгоритмов работы с документами

Программист

3.4 Реализация алгоритмов печати и сканирования документов

Программист

3.5 Испытние и отладка системы

Программист

3.6 Доработка подсистемы по результатам испытаний, предложений руководителя разработки

Программист


4.1 Описание алгоритма

Программист

4.2 Описание функций и процедур подсистемы

Программист

4.3 Сборка пояснительной записки

Программист

5. Оформление графической части

Программист

 

3.3 Нормирование работ


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

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

В данной работе приводится расчет трудоемкости разработки, методом экспертных оценок.

С помощью формул, принятых в системе сетевого планирования и управления (СПУ), определяется ожидаемая трудоемкость выполнения работы:

где

 - минимально возможная трудоемкость работы при наиболее благоприятных условиях ее выполнения;

 - наиболее вероятная трудоемкость работы;

 - максимально возможная трудоемкость работы при наиболее неблагоприятных условиях ее выполнения.

Здесь i - номер (обозначение) работы или этапа;- условный номер специалиста - эксперта.

Далее определяется среднее значение трудоемкости каждой i-ой этапа:

где n - количество человек, входящих в группу экспертов.

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

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

В условиях научно-технической организации, рациональным является, индивидуальный метод. Используя результаты индивидуального метода экспертного опроса, получают общую экспертную оценку. Данные опроса и рассчитанные значения ожидаемого и среднего времени приведены в таблице 3.2

Таблица 3.2

Экспертные оценки трудоемкости работ

№ этапа

Эксперт 1, ч/ч

Эксперт 2, ч/ч

Эксперт 3, ч/ч

tср, ч/ч


tmin

tНВ

tmax

tОЖ

tmin

tНВ

tmax

tОЖ

tmin

tНВ

tmax

tОЖ


1.













1.1

13

18

26

18,5

18

21

31

22,2

18

25

32

25,0

21,9

1.2

16

20

24

20,0

17

26

29

25,0

20

24

32

24,7

23,2

Итого:

29

38

50

38,5

35

47

60

47,2

38

49

64

49,7

45,1

2.










2.1

6

8

11

8,2

7

9

11

9,0

8

8

11

8,5

8,6

2.2

8

9

10

9,0

6

9

10

8,7

7

8

10

8,2

8,6

Итого:

14

17

21

17,2

13

18

21

17,7

15

16

21

16,7

17,2

3.

 

 

 

 

 

 

 

 

 

 

 

 

 

3.1

37

55

66

53,8

28

48

63

47,2

38

53

69

53,2

51,4

3.2

34

47

63

47,5

44

55

73

56,2

28

42

52

41,3

48,3

3.3

35

49

66

49,5

38

52

65

51,8

47

59

79

60,3

53,9

3.4

32

46

64

46,7

33

45

56

44,8

28

44

60

44,0

45,2

3.5

43

56

75

57,0

31

50

70

50,2

28

45

62

45,0

50,7

3.6

34

49

67

49,5

23

41

58

40,8

27

47

64

46,5

45,6

Итого:

215

302

401

304,0

197

291

385

291,0

196

290

386

290,3

295,1

4.

 

 

 

 

 

 

 

 

 

 

 

 

 

4.1

3

13

20

12,5

1

11

18

10,5

2

10

18

10,0

11,0

4.2

38

50

59

49,5

35

47

62

47,5

36

46

54

45,7

47,6

4.3

17

31

39

30,0

22

37

43

35,5

29

39

51

39,3

34,9

4.4

2

11

16

10,3

9

16

26

16,5

9

18

27

18,0

14,9

Итого:

60

105

134

102,3

67

111

149

110,0

76

113

150

113,0

108,4

5.

64

80

102

81,0

80

96

130

99,0

64

80

81

77,5

85,8

Итого:

64

80

102

81,0

80

96

130

99,0

64

80

81

77,5

Всего:

382

542

708

543,0

392

563

745

564,8

389

548

702

547,2

551,7


Таким образом, плановые трудозатраты на реализацию всего программного продукта составляют 551,7 н/часа.

Продолжительность выполнения работ по каждому этапу приведена в табл. 3.3 В графе "Трудозатраты" приведены рассчитанные в п.3.3 трудозатраты. В графе "Продолжительность" приведена примерная продолжительность выполнения каждого этапа в рабочих днях, рассчитанная по формуле:

где P - продолжительность выполнения этапа;- трудозатраты на выполнение этапа.

Таблица 3.3

Продолжительность выполнения этапов работ

№ этапа

Трудозатраты, н/ч

Продолжительность, раб. дн.

1.1

21,9

3

1.2

23,2

3

Итого

45,1

6

2.1

8,6

2

2.2

8,6

2

Итого

17,2

4

3.1

51,4

7

3.2

48,3

7

3.3

53,9

7

3.4

45,2

6

3.5

50,7

7

3.6

45,6

6

Итого

295,1

40

4.1

11,0

2

4.2

47,6

6

4.3

34,9

5

4.4

14,9

2

Итого

108,4

14

5.

85,8

11

Итого

85,8

11

Итого

551,7

75



3.4 Расчет сметной стоимости на разработку ПП


Расчет затрат на разработку системы состоит из следующих статей:

Статья: "Материальные расходы"

К статье "Материальные расходы" относятся покупные изделия, необходимые для выполнения работы, они перечислены в табл. 3.4.

Таблица 3.4

Материальные расходы

Наименование материала

Количество

Стоимость, р

Бумага для принтера (формат А4)

1упаковка

200

Тонер для лазерного принтера

100 гр.

200

Дополнительные канцелярские принадлежности


90

Итого


490


Статья: "Расходы на оплату труда с учётом отчислений"

Заработная плата складывается из двух составляющих: основной заработной платы и дополнительной.

Основная заработная плата рассчитывается по формуле (3.4):

tΣ - суммарные затраты труда, вычисляемые по формуле (3.2),ср - среднее число дней в месяце, равно 21 дню, умножается на количество часов в рабочем дне - 8,

ТС - тарифная ставка.

Тарифная ставка представляет собой МРОТ, увеличенный в зависимости от тарифного коэффициента, соответствующего данному виду работ. Для 12-го разряда работ, который соответствует работе программиста, тарифный коэффициент равен 2,423.

Таким образом, основная заработная плата будет составлять:

Дополнительная заработная плата составляет 20% от основной заработной платы, рассчитывается по формуле (3.5):

Суммарная заработная плата (или фонд заработной платы, ФЗП) вычисляется как сумма основной и дополнительной заработных плат по формуле (3.6):

Отчисления на социальное страхование составляют 34% от всей заработной платы, вычисляются по формуле (3.7):

Статья: "Расходы на амортизацию"

Стоимость оборудования хоть и не включается в себестоимость разработки программного обеспечения, но все же используется при расчете некоторых других дополнительных статей расходов. При написании программы на ЭВМ в качестве оборудования предполагается персональный компьютер, а также необходим системный блок, клавиатура, мышь и монитор, стоимость которых составляет: .

Амортизационные отчисления, процесс постепенного перенесения стоимости средств труда по мере их физического и морального износа на стоимость производимых с их помощью продукции в целях аккумуляции денежных средств для последующего полного восстановления. Амортизационные отчисления производятся по установленным нормам амортизации, выражаются, в процентах к балансовой стоимости оборудования и рассчитываются по формуле (3.8):

Где Cобор - стоимость компьютера,

Тнорм - нормативный срок службы (для персонального компьютера примем Тнорм = 6 [лет]. Таким образом, получаем:

Статья: "Накладные расходы"

Накладные расходы, связанные с управлением и обслуживанием, содержанием и эксплуатацией оборудования и прочими дополнительными затратами на обеспечение процессов производства и обращения, составляют 50% от фонда заработной платы, вычисляются по формуле (3.9):

Таблица 3.5

Статьи затрат

Затраты, руб.

1. Материальные расходы

490 руб.

2. Расходы на оплату труда с учётом отчислений по социальному страхованию

32801 руб.

3. Расходы на амортизацию

1305 руб.

4. Накладные расходы

86000 руб.

Социальное страхование

19432 руб.

Итого

140030 руб.


3.5 Расчёт срока окупаемости единовременных затрат и экономической выгоды от внедрения программного продукта на предприятии


Рассчитаем экономию от внедрения программного продукта на предприятии.

Расчет трудоемкости до и после внедрения ПП представлен в таблице 3.6.

Таблица 3.6

Трудоемкость до и после внедрения ПП

Наименование этапов и работ

Исполнитель

Трудоемкость, час



До

После

1. Заполненение карточки документа

Оператор

0,2

0,1

2. Помещение документа в архив

Оператор

0,2

0,2

3. Поиск документа

Оператор

0,3

0,05

4. Печать копии документа

Оператор

0,4

0,1

Итог


1,1

0,45

Результаты расчета затрат на оплату труда ПП приведены в таблице 3.7.

Таблица 3.7

Расходы на оплату труда до и после внедрения ПП

Исполнители

Разряд

Тариф. коэф.

Суммарная трудоемкость, час.

Час. тариф. ставка, руб

Сумма, руб.




до

после


До

После

Оператор до внедрения

12

2,423

1,1

0,45

100

266,53

109,04

Итог

266,53

109,04


Экономия от обслуживания одного документа составила 157,49 руб.

Внедрение ПП предположительно снизит затраты на обработку одного документа до внедрения на 53.86%. Предприятие обычно обрабатывает около 200 документов в месяц, что составляет 2400 в год. Таким образом, годовая экономия затрат от внедрения ПП составляет:

 

Эгод = 157,49* 2400 = 377,976 руб.

 

Рассчитаем срок окупаемости ПП:

3.6 Результат по организационно-экономической части


В ходе проведенного маркетингового исследования программного продукта были исполнены следующие пункты:

определены основные технические и потребительские отличительные свойства системы;

произведен расчет сметы затрат на разработку;

рассчитана годовая экономия от внедрения программного продукта на предприятии.

Срок окупаемости продукта составил чуть больше 2 месяцев, что указывает на целесообразность внедрения ПП на предприятии.

4. Охрана труда


4.1 Обеспечение безопасных условий труда инженера-разработчика


Одним из основных направлений научно технического прогресса является развитие электронной вычислительной техники и ее широкое применение в производстве, научно-исследовательских и проектно-конструкторских работах, плановых расчетах и сфере управления. Уменьшение стоимости, габаритов, потребляемой энергии вместе с ростом вычислительных возможностей позволяет использовать ЭВМ в гораздо более широких масштабах и существенно улучшить условия труда обслуживающего персонала. Охрана труда выявляет и изучает опасные и вредные производственные факторы, степень их воздействия на работающих с ЭВМ. Разрабатывает организационные и технические мероприятия, направленные на профилактику производственного травматизма и профессиональных заболеваний. Охрана труда создает технические средства защиты, устраняющие или уменьшающие воздействие на работающих этих факторов окружающей среды, предупреждает несчастные случаи, создает высокопроизводительные, здоровые и безопасные условия труда в ВЦ (вычислительный центр) /7,8,9,10/.

На организм человека и работу оборудования ВЦ большое влияние оказывает относительная влажность воздуха. При влажности воздуха до 40% выходит из строя изоляция проводов, а также возникает статическое электричество при движении носителей информации на ЭВМ. При относительной влажности воздуха более 75-80% снижается сопротивление изоляции, изменяются рабочие характеристики элементов ЭВМ, возрастает интенсивность отказов элементов ЭВМ.

Оптимальные и допустимые микроклиматические параметры должны учитывать специфику технологического процесса в ВЦ, в частности, условия по обеспечению надежной работы ЭВМ. Поэтому действующие санитарные нормы для ВЦ устанавливают конкретные оптимальные и допустимые значения температуры, относительной влажности для рабочей зоны машинного зала ВЦ (табл. 4.1).

Таблица 4.1

Нормы температуры и относительной влажности воздуха в рабочей зоне машинного зала ВЦ

Наименование

Параметры


Оптимальные

Допустимые


Т-ра,°С

Отн. Влажность, %

Т-ра,°С

Отн. влажность, %

Воздух в рабочей зоне машинного зала

20-22°С зимой, 20-24°С летом

50-60%

18-25°С (кратковременно не более чем на 3°С выше средней температуры наружного воздуха в 13 ч. дня самого жаркого месяца, но не выше 28°С)

45-70%

Охлаждающий воздух на входе в стойки ЭВМ: - при заборе воздуха из машинного зала

18-20°С

60-65%

18-20°С (кратковременно до 28°С)

45-70%

 - при подаче воздуха от кондиционера в стойки

14-16°С

60-70%

То же

0-70%


В машинном зале и хранилище носителей информации рекомендуется поддерживать температуру и влажность воздуха постоянными, с относительно малыми колебаниями. Значительные колебания приводят к изменению рабочих характеристик узлов и устройств ЭВМ.

К современному освещению помещений, где работают с вычислительной техникой, предъявляют высокие требования как гигиенического, так и технического характера. Правильно спроектированное и выполненное освещение обеспечивает высокий уровень работоспособности, оказывает положительное психологическое воздействие, способствует повышению производительности труда. Условия деятельности пользователя в системе "человек-машина" связаны с явным преобладанием зрительной информации - до 90% общего объема. Режим освещения, его нормы регламентируются согласно СНиП РФ 23-5-95 "Естественное и искусственное освещение. Нормы проектирования".

В помещениях с компьютерной техникой применяется совмещенная система освещения. К этим системам предъявляют следующие требования:

)        соответствие уровня освещенности рабочих мест характеру выполняемых зрительных работ;

2)      достаточно равномерное распределение яркости на рабочих поверхностях и в окружающем пространстве;

)        отсутствие резких теней, прямой и отраженной блеклости;

)        постоянство освещенности во времени;

)        оптимальная направленность излучаемого осветительными приборами светового потока;

)        долговечность, экономичность, электро- и пожаробезопасность, эстетичность, удобство и простота эксплуатации.

Для искусственного освещения помещений с вычислительной техникой следует использовать главным образом люминесцентные лампы. У этих ламп высокая световая отдача (до 75 лм/Вт и более), продолжительный срок службы (до 10 000 ч), малая яркость светящейся поверхности, близкий к естественному спектр излучения, что обеспечивает хорошую цветопередачу. Наиболее приемлемыми являются люминесцентные лампы белого света и тепло-белого света мощностью 20, 40, 80 Вт.

Для исключения засветки экранов дисплеев прямым световым потоком, светильники общего освещения располагают сбоку от рабочего места, параллельно линии зрения оператора и стене с окнами. Такое расположение светильников позволяет производить их последовательное включение по мере необходимости и исключает раздражение глаз чередующимися полосами света и тени, возникающими при поперечном расположении светильников.

Для обеспечения оптимальных условий зрительных работ пользователей с дисплейными устройствами, необходима определенная световая отделка помещения. Рекомендуемая освещенность для работы с экраном дисплея составляет 150 лк, а при работе с экраном в сочетании с работой над документами - 300 лк.

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

По происхождению шум делят на механический, аэродинамический и шум электрических машин. Для рабочих мест операторов характерно наличие всех видов шумов. Технические средства, например принтер, плоттер создают механический шум, установки кондиционирования - аэродинамический шум, преобразователи напряжения - электромагнитный.

В соответствии с ГОСТ 12.1.003-83 "Шум, общие требования безопасности" уровень шума на рабочем месте операторов видеотерминалов не должен превышать 50дБ, а в помещениях, где работают инженерно-технические работники, осуществляющие лабораторный, аналитический и измерительный контроль - 60дБ.

Для снижения шума и вибрации в помещениях ВЦ оборудование, аппараты и приборы необходимо устанавливать на специальные фундаменты и амортизирующие прокладки, предусмотренные нормативными документами. Стены и потолки должны быть облицованы звукопоглощающим материалом, независимо от количества единиц установленного оборудования. В качестве звукопоглощающего материала должны использоваться специальные перфорированные плиты, панели и другой материал аналогичного назначения, а так же плотная хлопчатобумажная ткань, которой драпируются потолок и стены.

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

Графики сменности регламентируют время начала и окончания рабочего дня (дня смены), перерывов для отдыха и питания, порядок чередования смен.

Время отдыха включает в перерывы для отдыха и питания, междусменные перерывы, выходные и праздничные дни и отпуска. Перерыв для отдыха и питания предоставляется в течение рабочего дня. Перерыв для отдыха и питания предоставляется, как правило, через 4ч. после начала работы.

Согласно СанПиН 2.2.2.542-96, в зависимости от вида работ выделяют три группы работ с видеотерминалами:

.        работа по считыванию информации с экрана ЭВМ с предварительным запросом;

2.      работа по вводу информации;

.        творческая работа в режиме диалога с ЭВМ.

Для видов трудовой деятельности, связанной с работой на ЭВМ устанавливается три категории тяжести и напряженности работы с ЭВМ. Для первой группы определяются по суммарному числу считываемых знаков, но не более 60000, для второй группы - по суммарному числу введенных знаков, но не более 40000 и для третьей группы - по суммарному времени работы за смену, но не более 6 часов.

Для обеспечения оптимальной работоспособности и сохранения здоровья работника на протяжении рабочей смены должны устанавливаться регламентированные перерывы. Продолжительность и время регламентированных перерывов устанавливается в зависимости от продолжительности, вида и категории трудовой деятельности.

Всем работникам ежегодно предоставляется отпуск с сохранением места работы (должности) и среднего заработка. Право на ежегодный отпуск (за первый год работы) они приобретают по истечении 11 месяцев непрерывной работы на данном предприятии. Очередные отпуска (за второй и последующие годы работы) предоставляются в любое время рабочего года в соответствии с графиками отпусков.

Таким образом, рациональная организация рабочего времени позволит сохранить работоспособность человека и сбережет его здоровье.

Для наиболее эффективной защиты здоровья и жизни работающих в ВЦ людей необходимо выполнять общие требования безопасности:

)        к эксплуатации персональных компьютеров допускаются лица, прошедшие инструктаж по технике безопасности;

2)      все пользователи персональных компьютеров (ПК), находясь в компьютерном классе, обязаны:

-       использовать только исправные ПК, указанные преподавателем или дежурным оператором;

-       соблюдать тишину, чистоту и порядок как на рабочем месте, так и в компьютерном классе;

-       соблюдать правила пожарной безопасности, а при возгорании вызвать пожарную охрану;

-       работать на ПК не более 4-х часов в день, с 15-минутными перерывами через каждый час работы.

3)      пользователям ПК запрещается:

-       вносить без разрешения системного администратора какие-либо изменения в настройке ПК;

-       самостоятельно устранять сбои в работе ПК;

-       самостоятельно производить изменения в конфигурации периферийных устройств ПК (принтера, монитора, клавиатуры);

-       курить в помещении компьютерного класса.

4)      обслуживание и ремонт ПК:

-       техническое обслуживание и ремонт производится персоналом с соответствующей подготовкой;

-       мониторы обеспечиваются защитными экранами при их несоответствии санитарным нормам;

-       во время технических перерывов класс должен проветриваться.

5)      первоначальное подключение всех периферийных устройств (монитора, принтера, клавиатуры) производится специалистом, который предварительно проверяет их исправность и надежность коммуникационных соединений;

6)      пользователь должен убедиться в том, что ПК находится в состоянии готовности к работе, а именно:

-       соединительные кабеля не имеют повреждений;

-       корпус ПК закрыт.

7)      включение ПК осуществляется в следующей последовательности:

-       включить стабилизатор напряжения (если ПК подключен через него);

-       включить принтер (если он нужен);

-       включить монитор (если включается отдельно);

-       включить ПК переключателем на его корпусе.

8)      категорически запрещается:

-       производить изменение в конфигурации периферийных устройств ПК (принтера, монитора, клавиатуры) во время его работы;

-       вскрывать корпус ПК, если он находится во включенном состоянии.

9)      перед тем, как выключить компьютер надо завершить выполнение всех загруженных программ;

10)    при коротком замыкание, перегреве или при возникновении других отклонений от нормального режима работы ПК, необходимо обесточить компьютер и обратиться к дежурному оператору;

)        при возникновении возгорания, необходимо обесточить компьютер и вызвать пожарную охрану;

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

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

В современных ЭВМ очень высокая плотность размещения элементов электронных схем. В непосредственной близости друг от друга располагаются соединительные провода, коммуникационные кабели. При протекании по ним электрического тока выделяется значительное количество тепла, что может привести к повышению температуры отдельных узлов до 80-100°С. При этом возможно оплавление изоляции проводов, их оголение, и как следствие, короткое замыкание, которое сопровождается искрением, ведет к перегрузкам элементов электронных схем.

Для отвода избыточной теплоты от ЭВМ служат системы вентиляции и кондиционирования воздуха. Однако постоянно действующие системы вентиляции и кондиционирования представляют дополнительную пожарную опасность для ВЦ.

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

Для ликвидации пожаров в машинных залах недопустимо применять такие первичные средства пожаротушения, как вода и пенные огнетушители. В этом случае существует опасность повреждения или полного выхода из строя ЭВМ и другого дорогостоящего оборудования. Для тушения пожаров на ВЦ наиболее эффективно применение порошковых огнетушителей типа ОП-5-01. Преимуществом использования данного средства пожаротушения является также и то, что в момент тушения пожара устройство может находиться под напряжением.

Таким образом, производственная среда, являющаяся предметным окружением человека, должна сочетать в себе рациональное архитектурно-планировочное решение, оптимальные санитарно-гигиенические условия (микроклимат, освещение, отопление, вентиляция и другие). Должна обеспечиваться надежность и безопасность оборудования и приборов в эксплуатации, а также должны проводиться мероприятия по предотвращению пожаров. Рассмотренное рабочее место пользователя ВЦ практически полностью соответствует вышеперечисленным нормам. Создание и поддержание оптимального микроклимата на рабочем месте, выполнение условий электро- и пожаробезопасности, соблюдение необходимых мер предосторожности при работе с техникой позволяет увеличить трудоспособность, снизить риск возникновения различных заболеваний и травматизм.

 

4.2 Расчет искусственного освещения рабочего места


Как уже было сказано выше, освещение является одним из важнейших факторов, от которого зависит здоровье работника. Поэтому необходимо правильно и точно произвести расчет искусственного освещения на рабочем месте. При расчете освещенности обязательно необходимо учесть наименьший размер объекта различения, характеристику фона, контраст объекта различия с фоном; нужно определить разряд и подразряд зрительной работы, нормируемый уровень минимальности освещённости на рабочем месте.

Наименьший размер объекта размещения = 2 мм., контраст объекта с общим фоном - большой, характеристика фона - светлый, характеристика зрительной работы высокой точности. Основываясь на этих характеристиках, делаем вывод, разряд зрительной работы - 3, подразряд - Г. Следовательно, нормам проектирования искусственного освещения комбинированное освещение - 400 лм., общее освещение - 200 лм.

Рассчитаем число светильников N. Равномерное освещение горизонтальной поверхности достигается при определённом отношении расстояния между центрами светильников L, м (L = 1,75Н) к высоте их подвеса над рабочей поверхностью Нр, м (в расчётах Нр = Н). Число светильников с люминесцентными лампами, которые приняты в качестве источника света:

где S - площадь помещения, м2, L - расстояния между центрами светильников, м, М - расстояние между параллельными рядами, м.

В соответствии с рекомендациями

 

М ≥ 0,6Нр.

Оптимальное значение М = 2.3 м. Для достижения равномерной освещённости светильники с люминесцентными лампами рекомендуется располагать сплошными рядами, параллельными стенам с окнами или длинным сторонам помещения.

Площадь помещения:

S = a*b,

где а - длина помещения, м, b - ширина помещения, м, а = 8м, b = 5м,

 = 8*5 = 40 м2.

Расстояние между опорами светильников: L = 1,75Н при Нp = 4, L = 1,75 * 4 = 7 м.

Вычисляем расстояние между параллельными рядами:

 

М ≥ 0,6 * 4 = 2,4 м.

Число светильников:

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

Расчетный световой поток для группы светильников с люминесцентными лампами, лм:

где Ен - нормированная минимальная освещённость, лк, S - площадь помещения, м2, Z - коэффициент минимальной освещённости, , для люминесцентных ламп Z = 1,1.

К - коэффициент запаса (значение зависит от характеристики помещения), для помещения с малым выделением тепла К = 1,5,  - коэффициент использования светового потока ламп,  = 0,3.

По полученному значению светового потока, подбираем лампы, учитывая, что в светильнике с люминесцентными лампами может быть больше одной лампы, т.е. n может быть равно 2 или 4. В этом случае, световой поток группы люминесцентных ламп необходимо уменьшить в 2 или 4 раза. Световой поток выбранной лампы должен соответствовать соотношению Фл. расч. = (0,9.1,2) Фл. табл., где Фл. расч. - расчётный световой поток, лм, Фл. табл. - световой поток, определённый по табличным значениям, лм.

В соответствии с проведенными расчетами выбираем лампу (4070 лм.) ЛДЦ 80.

Рассчитаем потребляемую мощность осветительной установки.

 

Р = p*N*n,

где р - мощность лампы, Вт, N - число светильников, шт., n - число ламп в светильнике, для люминесцентных ламп n = 2, 4.

Потребляемая мощность:

 

Р = 80*3*2 = 480 Вт.

Для данного помещения требуются 3 светильника с люминесцентными лампами, в каждом по 2 лампы. Тип и мощность лампы - ЛДЦ80. Общая потребляемая мощность осветительной установки - 480 Вт.

Заключение


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

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

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

Дальнейшее развитие системы будет включать в себя:

разработку многопользовательской версии приложения;

разграничение прав доступа пользователей;

добавление истории операций над документами;

развитие пользовательского интерфейса;

работу с электронными документами (создание по шаблону, электронно-цифровая подпись)

добавление интеграции с существующими CRM-системами.

Система очень перспективна и будет развиваться дальше.

Список использованных источников


1.      Якобсон А., Буч Г., Рамбо Дж. Унифицированный процесс разработки программного обеспечения. - СПб.: Питер, 2002. - 496 с: ил.

2.      Документ Плюс - URL: http://www.documentplus.ru/ (дата обращения: 11.11.2012)

.        Программа "Архив документов" - URL: http://www.simple-soft.ru/DocumentsCount. htm (дата обращения: 11.11.2012)

.        Докпартнер 2012 - URL: http://docpartner.ru/ (дата обращения: 11.11.2012)

.        Мак-Дональд М. WPF 4: Windows Presentation Foundation в.net 4.0 с примерами на С# 2010 для профессионалов.: Пер. с англ. - М.: ООО "И.Д. Вильяме", 2011. - 1024 c.

.        Jay Kreibich. Using SQLite - O’Reilly Media, 2010 - 528 с.

.        А.И. Мальцев. Алгебраические системы, - М., Наука, 1970 г., 392 стр. с илл.

.        М.А. Сенилов, С.В. Почерняев, И.В. Килин Методические указания по дипломному проектированию. - Ижевск: Изд-во ИжГТУ, 2000.

.        Соболева В.П. Методические указания по оформлению курсовых и дипломных работ. - Ижевск: Изд-во ИжГТУ, 2008. - 25с.

.        ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

.        ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.

Приложение 1. Тексты программ


Файл AppManager. cppSystem;System. Collections. Generic;System. Linq;System. Text;System. Reflection;DKCore. DataBase;DKCore. DataBase. Objects;DKCore. ConcreteDocuments. Interfaces;DKCore. FormsI;System. Windows;DKCore

{class AppManager

{static bool IsInited { get; private set; }

// Классы комплексных функций системыstatic Dictionary<Type, APIBase> apiObjects;

// Объект приложенияstatic ApplicationI appObject;

// Свойства приложенияstatic object applicationPropertiesObject;

{{ return db; }

}

// Дополнительные типы документовstatic Dictionary<string, CDocAddinBase> concreteDocAddins;static Dictionary<string, CDocAddinBase> ConcreteDocAddins

{{ return concreteDocAddins; }

}AppManager ()

{= new Dictionary<string, CDocAddinBase> ();= new Dictionary<Type, APIBase> ();

}

// Инициализирует менеджер приложенияpublic void Init (ApplicationI app, object application_properties)

{= application_properties;= app;

// = new DBDocuments ( (string) getApplicationProperty ("DBConnectionString"));. Init ();. CheckVersion ();

// Инициализация загруженных объектов(var api_object in apiObjects)

{_object. Value. Init ();

}

// Плагины(! PluginManager. LoadInstalledPlugins ())

{res = MessageBox. Show ("Некоторые дополнительные типы документов не могут быть загружены. Хотите изменить настройки? (Нет - продолжить работу)", "Ошибка загрузки дополнений", MessageBoxButton. YesNo);(res == MessageBoxResult. Yes)

{. ShowPluginSettingsForm ();;

}

}

// (var addin in ConcreteDocAddins)

{. Value. Init ();

}= true;

}

// Возвращает значение свойства приложения по имени

// Если свойство не задано, кидает исключениеpublic object getApplicationProperty (string property)

{prop = applicationPropertiesObject. GetType (). GetProperty (property);(prop! = null) return prop. GetValue (applicationPropertiesObject, null);throw new Exception ("Trying read not defined proprty '" + property + "'");

}

// Открывают форму ошибкиstatic void ShowExceptionForm (Exception e)

{. ShowExceptionForm (e);

}

// Создать форму изменения списка объектов (связанных с доп. типами)static EditListFormI CreateEditListForm (EditListSettingsBase settings, string title)

{appObject. createEditListForm (settings, title);

}

// Регистрирует новый дополнительный тип документовstatic void RegisterConcreteDocAddin (CDocAddinBase addin)

{. Add (addin. Name, addin);(IsInited) addin. Init ();

}

// Возвращает указанный дополнительный тип документовstatic CDocAddinBase Addin (string name, bool quiet = false)

{(concreteDocAddins. ContainsKey (name)) return concreteDocAddins [name];if (quiet) return null;throw new Exception ("Доступ к несуществующему дополнительному типу документов");

}static CDocAddinBase Addin (DBO_DocType doctype, bool quiet = false)

{Addin (doctype. Name, quiet);

}static CDocAddinBase AddinByDocTypeID (long? doctype_id, bool quiet = false)

{(var addin in concreteDocAddins)

{(addin. Value. DocTypeDBO. ID == doctype_id) return addin. Value;

}(quiet) return null;throw new Exception ("Доступ к несуществующему дополнительному типу документов");

}static bool IsAddinExist (DBO_DocType doctype)

{concreteDocAddins. ContainsKey (doctype. Name);

}

// Регистрирует новый дополнительный тип документовstatic void RegisterAPI (APIBase api_object)

{. Add (api_object. GetType (), api_object);(IsInited) api_object. Init ();

}

// Возвращает apistatic APIObject API<APIObject> () where APIObject: APIBase

{(apiObjects. ContainsKey (typeof (APIObject))) return (APIObject) apiObjects [typeof (APIObject)];return null;

}

// Перезапустить приложениеstatic void RestartApplication ()

{. Diagnostics. Process. Start (Application. ResourceAssembly. Location);. Current. Shutdown ();

}

}

}

Файл ApplicationI. csSystem;System. Collections. Generic;System. Linq;System. Text;DKCore. FormsI;System. Windows;DKCore

{

// Интерфейс для WPF-шного приложения, с которым взаимодействует AppManagerinterface ApplicationI

{

// Отобразить форму ошибкиShowExceptionForm (Exception e);

// Отобразить форму настройки плагиновShowPluginSettingsForm ();

// Создать форму изменения списка объектов (связанных с доп. типами)createEditListForm (EditListSettingsBase settings, string title);

// Проверка версии базыCheckVersion ();

// Завершить работуShutdown ();

}

}

Файл DBHelper. csSystem;System. Collections. Generic;System. Linq;System. Text;System. Collections. ObjectModel;System. Reflection;System. Data. SQLite;System. Windows;DKCore. DataBase. Attributes;DKCore. DataBase

{class DBHelper: IDisposable

{conn;transact;throwExceptions;

//

// throw_exeptions - если false - подавлять исключения

// DBHelper (bool throw_exceptions = false)

{= null;= null;= throw_exceptions;

}

// Открыть соединение с базой

// connection_string - строка подключения

// is_transaction - запустить транзакциюvoid Open (string connection_string, bool is_transaction = false)

{

{= new SQLiteConnection (connection_string);. Open ();= (is_transaction)? conn. BeginTransaction (): null;

}(Exception e)

{(e);

}

}

// Обрабатывает возникшее исключениеvoid handleException (Exception e)

{

#if DEBUG. Diagnostics. Debugger. Break ();

#endif(throwExceptions) throw e;AppManager. ShowExceptionForm (e);

}

// Подтвердить, если была запущена транзакцияvoid Commit ()

{(transact! = null) transact.commit ();

}

// Отменить, если была запущена транзакцияvoid Rollback ()

{(transact! = null) transact. Rollback ();

}void Dispose ()

{(conn! = null) conn. Close ();(transact! = null) transact. Dispose ();

}

// Возвращает названия полей, ассоцированных со свойствами объекта db_object, значения которых не равно null (если skip_null = true)

// Если задан field, составляет список из свойств этого объекта ({ PropertyField = <col_desc>,. })

// <col_desc> = "column_name": берется указанное поле

// <col_desc> = null - берется из атрибутов

// Если задано must_be_primary, включает в себя поля только из свойств, помеченных атрибутом как ключевые

// Dictionary<string, PropertyInfo> getInsertingFields (object db_object, object fields = null, bool skip_null = true, bool? must_be_primary = null)

{result = new Dictionary<string, PropertyInfo> ();type = db_object. GetType ();(fields! = null)

{

// Заданы конкретные поля[] fields_props = fields. GetType (). GetProperties (BindingFlags. Public | BindingFlags. Instance);(var fprop in fields_props)

{tprop = type. GetProperty (fprop. Name);(tprop! = null)

{fprop_val = fprop. GetValue (fields, null) as string;(fprop_val == null)

{

// Имя столбца таблицы взять из атрибутовres = getInsertingFields_OneProperty (db_object, tprop, false, null);(res! = null) result. Add (res, tprop);

}

{. Add (fprop_val, tprop);

}

}

}

}

{

// Получить поля из атрибутов[] target_props = type. GetProperties (BindingFlags. Public | BindingFlags. Instance);(var tprop in target_props)

{res = getInsertingFields_OneProperty (db_object, tprop, skip_null, must_be_primary);(res! = null) result. Add (res, tprop);

}

}result;

}string getTablePostfix (Type type)

{attributes = type. GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length > 0) return ( (DBTableNameAttribute) attributes [0]). TablePostfix;return null;

}string getInsertingFields_OneProperty (object db_object, PropertyInfo tprop, bool skip_null = true, bool? must_be_primary = null)

{attributes = tprop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);(attributes. Length > 0)

{attr = (DBFieldNameAttribute) attributes [0];(must_be_primary == null || must_be_primary == attr. IsPrimaryKey)

{(skip_null == false || tprop. GetValue (db_object, null)! = null)

{field_name = attr. FieldName;(attr. UsePostfix) field_name += "_" + getTablePostfix (db_object. GetType ());field_name;

}

}

}null;

}

// Выбирает все записи по запросу и заполняет объектами T результирующий список

// com - sql-запрос у базе

// fields - поля, которые будут заполнены у элемента типа T.

// Должен быть представлен обхектом вида: { PropertyField = "column_name",. }

// Если only_first = true, возвращает список, состоящи только из первого элемента

// ObservableCollection<T> fetchAll<T> (DBCommand com, object fields = null, bool only_first = false) where T: class, new ()

{result = new ObservableCollection<T> ();

{. Connection = conn;. Transaction = transact;(var reader = new DBHelperReader (com. ExecuteReader ()))

{

// MessageBox. Show ("a1");

// Получаем список запрашиваемых полей и связанных с ними свойст Tretrieve_fields = reader. getRetrievedFields (typeof (T), fields);

// MessageBox. Show ("a2");

// Записываем данные в список результа(reader. Read ())

{elem = new T ();(var field in retrieve_fields)

{. Value. SetValue (elem, reader. readFieldWithType (field. Key, field. Value. PropertyType), null);

}. Add (elem);(only_first) break;

}

}

// MessageBox. Show ("a3");

}(Exception e)

{(e);

}result;

}T fetchOne<T> (DBCommand com, object fields = null) where T: class, new ()

{list = fetchAll<T> (com, fields, true);(list. Count > 0)? list [0]: null;

}T getByID<T> (long? id, string table = null, string id_field_name = null) where T: class, new ()

{[] class_attrs = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);

// Имя таблицы(table == null)

{(class_attrs. Length > 0) table = ( (DBTableNameAttribute) class_attrs [0]). TableName;throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

// Имя поля id(id_field_name == null)

{id_prop = typeof (T). GetProperty ("ID", BindingFlags. Public | BindingFlags. Instance);(id_prop! = null)

{[] id_attrs = id_prop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);(id_attrs. Length > 0)

{_field_name = ( (DBFieldNameAttribute) id_attrs [0]). FieldName;( ( (DBFieldNameAttribute) id_attrs [0]). UsePostfix)

{(class_attrs. Length > 0) id_field_name += "_" + ( (DBTableNameAttribute) class_attrs [0]). TablePostfix;throw new Exception ("Ошибка вставки: невозможно определить поле ID: постфикс таблицы не указан");

}

}throw new Exception ("Ошибка вставки: невозможно определить поле ID: в атрибутах не указано поле в таблице");

}throw new Exception ("Ошибка вставки: невозможно определить таблицу: не найдено свойство ID");

}(var com = new DBCommand ("SELECT * FROM " + table + " WHERE " + id_field_name + " = @" + id_field_name))

{. Parameters. AddWithValue ("@" + id_field_name, id);fetchOne<T> (com);

}

}

// Вставляет объект db_object в базу данных:

// Если указан table, в таблицу table (иначе берется из атрибутов)

// Если указан fields - вставляются только указанные свойства (иначе свойства, которые не равны null)

// void insert<T> (T db_object, string table = null, object fields = null) where T: class, new ()

{

{

// Имя таблицы(table == null)

{[] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

// inserting_fields = getInsertingFields (db_object, fields);(DBCommand com = new DBCommand ())

{. Connection = conn;. Transaction = transact;(inserting_fields. Count > 0)

{query = "INSERT INTO " + table + " (";values = " VALUES (";first = true;(var field in inserting_fields)

{(first) first = false;

{+=", ";+=", ";

}+= field. Key;+= "@" + field. Key;. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}.commandText = query + ")" + values + ")";

}com.commandText = "INSERT INTO " + table + " DEFAULT VALUES";. ExecuteNonQuery ();

}

}(Exception e)

{(e);

}

}

// Формирует и выполняет запрос на вставку в таблицу table из полей и значений словаря field_values

// Если values = null вставляет запись со значениями по умолчанию

// void insertValues (string table, Dictionary<string, object> field_values = null)

{

{(DBCommand com = new DBCommand ())

{. Connection = conn;. Transaction = transact;(field_values! = null && field_values. Count > 0)

{query = "INSERT INTO " + table + " (";values = " VALUES (";first = true;(var field in field_values)

{(first) first = false;

{+=", ";+=", ";

}+= field. Key;+= "@" + field. Key;. Parameters. AddWithValue ("@" + field. Key, field. Value);

}.commandText = query + ")" + values + ")";

}com.commandText = "INSERT INTO " + table + " DEFAULT VALUES";. ExecuteNonQuery ();

}

}(Exception e)

{(e);

}

}

// Удаляет объект db_object в базу данных:

// Если указан table, из таблицы table (иначе берется из атрибутов)

// Если указан keys - ключевые поля берутся из него

// void delete<T> (T db_object, string table = null, object keys = null) where T: class, new ()

{

{

// Имя таблицы(table == null)

{[] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

// key_fields = getInsertingFields (db_object, keys, false, true);(key_fields. Count > 0)

{(DBCommand com = new DBCommand ())

{. Connection = conn;. Transaction = transact;query = "DELETE FROM " + table + " WHERE ";first = true;(var field in key_fields)

{(first) first = false;query +=", ";+= field. Key + " = " + "@" + field. Key;. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}.commandText = query;. ExecuteNonQuery ();

}

}

}(Exception e)

{(throwExceptions) throw e;MessageBox. Show (e. ToString ());

}

}

// Обновляет объект db_object в базу данных:

// Если указан table, в таблицу table (иначе берется из атрибутов)

// Если указан keys - ключевые поля берутся из него

// Если указан fields - обновляются только указанные свойства (иначе все свойства)

// void update<T> (T db_object, object fields = null, string table = null, object keys = null) where T: class, new ()

{

{

// Имя таблицы(table == null)

{[] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

// key_fields = getInsertingFields (db_object, keys, false, true);data_fields = getInsertingFields (db_object, fields, false, false);(data_fields. Count > 0)

{(DBCommand com = new DBCommand ())

{. Connection = conn;. Transaction = transact;query = "UPDATE " + table + " SET ";first = true;(var field in data_fields)

{(first) first = false;query +=", ";+= field. Key + " = " + "@" + field. Key;. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}+= " WHERE ";= true;(var field in key_fields)

{(first) first = false;query +=", ";+= field. Key + " = " + "@" + field. Key;. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}.commandText = query;. ExecuteNonQuery ();

}

}

}(Exception e)

{(throwExceptions) throw e;MessageBox. Show (e. ToString ());

}

}

// Возвращает id, сгенерированное последим запросом на вставку

// table - имя таблицы, куда вставлялась запись

// id_field_name - имя ключевого поля (должно быть autoincrement)

// long? getLastInsertedID (string table, string id_field_name)

{

{(var com = new DBCommand ("SELECT last_insert_rowid ()", conn, transact))

{com. ExecuteScalar () as long?;

}

}(Exception e)

{(e);null;

}

}

// Выполнить команду в текущей транзакции

// void executeNonQuery (DBCommand com)

{

{. Connection = conn;. Transaction = transact;. ExecuteNonQuery ();

}(Exception e)

{(throwExceptions) throw e;MessageBox. Show (e. ToString ());

}

}

// Выполнить команду в текущей транзакции и получить reader для прочтения возвращенных запросом данных

// DBHelperReader executeReader (DBCommand com)

{

{. Connection = conn;. Transaction = transact;new DBHelperReader (com. ExecuteReader ());

}(Exception e)

{(e);null;

}

}

}

// / <summary>

// / Предоставляет упрощенный доступ к полям

// / </summary>class DBHelperReader: IDisposable

{reader;DBHelperReader (SQLiteDataReader rd)

{= rd;

}void Dispose ()

{. Close ();

}

// Читает поле с именем col_name из reader как значение типа T

// T readField<T> (string col_name)

{col_index = reader. GetOrdinal (col_name);readField<T> (col_index);

}

// T readField<T> (int col_index)

{(T) readFieldWithType (col_index, typeof (T));

}

// Читает поле с именем col_name из reader как значение типа type

// object readFieldWithType (string col_name, Type type)

{col_index = reader. GetOrdinal (col_name);readFieldWithType (col_index, type);

}

// Читает поле с индексом col_index из reader как значение типа type

// object readFieldWithType (int col_index, Type type)

{is_nullable = false; // Может ли принимать nullrtype = type; // Если type - Nullable, значение равно будет типу, переданному в шаблон Nullable(type. IsGenericType && type. GetGenericTypeDefinition () == typeof (Nullable<>))

{_nullable = true;= Nullable. GetUnderlyingType (type);

}is_nullable = type. IsClass;

// Если значение в базе равно NULL и тип переменной Nullable

// Возвращаем null(reader. IsDBNull (col_index) && is_nullable) return null;

// В любом другом случае:

// type_code = Type. GetTypeCode (rtype);(type_code)

{TypeCode. Boolean: return Convert. ToBoolean (reader. GetValue (col_index));TypeCode. Decimal: return reader. GetDecimal (col_index);TypeCode. DateTime: return reader. GetDateTime (col_index);TypeCode. Int16: return Convert. ToInt16 (reader. GetValue (col_index));TypeCode. Int32: return Convert. ToInt32 (reader. GetValue (col_index));TypeCode. Int64: return Convert. ToInt64 (reader. GetValue (col_index));:

// Другие типыreader. GetValue (col_index);

}

}T readObject<T> (object fields = null) where T: class, new ()

{retrieve_fields = getRetrievedFields (typeof (T), fields);elem = new T ();(var field in retrieve_fields)

{. Value. SetValue (elem, readFieldWithType (field. Key, field. Value. PropertyType), null);

}elem;

}

// Возвращает список индексов полей reader, которые нужно извлечь для объекта типа type

// Если задан field, составляет список из свойств этого объекта ({ PropertyField = "column_name",. })

// иначе берет из атрибутов типа type (DBFieldNameAttribute, DBTableNameAttribute)

// Пример fields:

// new

// {

// ID = "id_doc_type",

// Title = "title_doc_type",

// Name = "name_doc_type",

// CharPrefix = "char_doc_type",

// IsDeleted = "is_deleted"

// }

// Dictionary<int, PropertyInfo> getRetrievedFields (Type type, object fields = null)

{result = new Dictionary<int, PropertyInfo> ();(fields! = null)

{

// Заданы конкретные поля[] fields_props = fields. GetType (). GetProperties (BindingFlags. Public | BindingFlags. Instance);(var fprop in fields_props)

{tprop = type. GetProperty (fprop. Name);(tprop! = null)

{

// try

// {field_index = reader. GetOrdinal ( (string) fprop. GetValue (fields, null));. Add (field_index, tprop);

// }

// NOTE:

// Возможно в этом случае переъватывать исключение не стоит

// catch (IndexOutOfRangeException) { }

}

}

}

{

// Получить поля из атрибутов[] attributes;= type. GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length > 0)

{= tprop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);(attributes. Length > 0)

{attr = (DBFieldNameAttribute) attributes [0];field_name = attr. FieldName;(attr. UsePostfix) field_name += "_" + postfix;

{field_index = reader. GetOrdinal (field_name);(field_index! = - 1) result. Add (field_index, tprop);

}(IndexOutOfRangeException) { }

}

}

}

}result;

}

// / <summary>

// / Читает следующую строку результата

// / </summary>

// / <returns>

// / Возвращает true, если данные считаны, false - если данных нет

// / </returns>bool Read ()

{reader. Read ();

}

}

}

Файла DBEntityObjectBaseSystem;System. Collections. Generic;System. Linq;System. Text;System.componentModel;DKCore. DataBase. Attributes;DKCore. DataBase

{public class DBEnityObjectBase: INotifyPropertyChanged

{DBEnityObjectBase (long id)

{= id;

}DBEnityObjectBase ()

{= null;

}bool existInDB

{{ return ID! = null; }

}

//

// Поля:

// long? id;

[DBFieldName ("id", true, true)]long? ID

{{ return id; }

{= value;(new PropertyChangedEventArgs ("ID"));

}

}

//

// Уведомление об изменениях (INotifyPropertyChanged)

// event PropertyChangedEventHandler PropertyChanged;void OnPropertyChanged (PropertyChangedEventArgs e)

{(PropertyChanged! = null) PropertyChanged (this, e);

}

}

}

Файл DBDocumentsSystem;System. Collections. Generic;System. Text;System. Data. SQLite;System. Windows;System. Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore. DataBase

{class DBDocuments

{string connectionStr;

// Инициализирован?bool isInited;bool IsInited

{{ return isInited; }

}

// Подключенные к базе модулиDictionary<Type, DBModuleBase> modules;

// Схема базыDBSchema schema;DBSchema Schema

{{ return schema; }

}DBDocuments (string connection_string)

{= false;= new Dictionary<Type, DBModuleBase> ();= connection_string;. RegisterFunction (typeof (SQLiteCaseInsensitiveCollation));. RegisterFunction (typeof (SQLiteRusUpper));

// Схема базы (заполняется модулями)= new DBSchema ();

// Модули:(new Modules. DBModule_CardCase ());(new Modules. DBModule_Documents ());(new Modules. DBModule_Files ());(new Modules. DBModule_FastSearch ());

}

// Подготавливает базу для работы

// Загружает наиболее часто используемые данныеvoid Init ()

{(var module in modules)

{. Value. Init ();

}= true;

}

// Регистрирует новый модуль DBModule для работы с базой

// void RegisterModule (DBModuleBase module)

{(! modules. ContainsKey (module. GetType ()))

{. Add (module. GetType (), module);

// module. GrantBeginTransaction (BeginTransaction);. DB = this;(IsInited) module. Init ();

}

}

// Возвращает объект модуля базы или false

// DBModule Module<DBModule> () where DBModule: DBModuleBase

{(modules. ContainsKey (typeof (DBModule))) return (DBModule) modules [typeof (DBModule)];return null;

}

// Запускает транзакцию для обращения к базе

// Возвращает объект DBHelper:

// Чтобы подтвердить транзакцию необъодимо вызвать DBHelper.commit ();

// Чтобы откатить транзакуию, необходимо вызвать DBHelper. Rollback ();

// DBHelper BeginTransaction (bool transaction_mode = false, bool throw_exception = false)

{dbhelper = new DBHelper (throw_exception);. Open (connectionStr, transaction_mode);dbhelper;

}

// Возвращает версию подсистемыstring getSysVersion (string subsystem, DBHelper dbhelper)

{(var com = new DBCommand ("SELECT version FROM sys_versions WHERE subsystem = @subsystem"))

{. Parameters. AddWithValue ("@subsystem", subsystem);(var reader = dbhelper. executeReader (com))

{(reader. Read ()) return reader. readField<string> ("version");return null;

}

}

}string getSysVersion (string subsystem)

{(var dbhelper = BeginTransaction ())

{getSysVersion (subsystem, dbhelper);

}

}

// Загружает объект с заданным idT loadByID<T> (long? id) where T: DBEnityObjectBase, new ()

{(var dbhelper = BeginTransaction ())

{dbhelper. getByID<T> (id);

}

}

}

}

Файла DBDocumentSelector. csSystem;System. Collections. Generic;System. Linq;System. Text;System.componentModel;System. Data. SQLite;DKCore. ConcreteDocuments. Interfaces;DKCore. ConcreteDocuments. Interfaces. DB;DKCore. DataBase. Objects;DKCore. DataBase

{class DBDocumentSelector

{DBDocumentSelector ()

{= new Dictionary<DBO_DocType, DBConcreteInfoFilter> ();

}

// Фильтр 1 (по документам в целом)DBDocumentFilter DocumentFilter { get; set; }

// Фильтр 1 (по документам в целом)DBCommonInfoFilter CommonInfoFilter { get; set; }

// Фильтры по каждому из типов документовDictionary<DBO_DocType, DBConcreteInfoFilter> ConcreteDocFilters { get; set; }

}

}

Файл DBCompleFieldAttributeSystem;System. Collections. Generic;System. Linq;System. Text;DKCore. DataBase. Attributes

{

// / <summary>

// / Атрибут указывает, что при извлечении объекта из источника (базы) значение этого свойства

// / должно так же интерпретироваться как объект базы, поля которого рекурсивно заполняются

// / из источника с добавлением префикса

// / </summary>

[AttributeUsage (AttributeTargets. Property, Inherited = true, AllowMultiple = false)]class DBComplexField: System. Attribute

{DBComplexField (string _prefix = "")

{= _prefix;

}

// Префикс к полямstring prefix;string Prefix

{{ return prefix; }

}

}

}

Файл DBFieldNameAttributeSystem;System. Collections. Generic;System. Linq;System. Text;DKCore. DataBase. Attributes

{

[AttributeUsage (AttributeTargets. Property, Inherited = true, AllowMultiple = false)]class DBFieldNameAttribute: System. Attribute

{DBFieldNameAttribute (string field_name, bool use_postfix = false, bool is_primary_key = false)

{= field_name;= use_postfix;= is_primary_key;

}

// Имя поля в базеstring fieldName;string FieldName

{{ return fieldName; }

}

// Использовать постфикс к полям таблицыbool usePostfix;bool UsePostfix

{{ return usePostfix; }

}

// Это поле ключевоеbool isPrimaryKey;bool IsPrimaryKey

{{ return isPrimaryKey; }

}

}

}

Фала DBTableName. csSystem;System. Collections. Generic;System. Linq;System. Text;DKCore. DataBase. Attributes

{

[AttributeUsage (AttributeTargets. Class, Inherited = false, AllowMultiple = false)]class DBTableNameAttribute: System. Attribute

{DBTableNameAttribute (string table_name, string table_postfix)

{= table_name;= table_postfix;

}

// Имя таблицы в базеstring tableName;string TableName

{{ return tableName; }

}

// Префикс к полям таблицыstring tablePostfix;string TablePostfix

{{ return tablePostfix; }

}

}

}

Файл DBModule_DocumentsSystem;System. Collections. Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System. Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules

{class DBModule_Documents: DBModuleBase

{

// Типы документов

// Загружаются при старте программы (init)Dictionary<string, DBO_DocType> docTypes; // Имя типа => типDictionary<long?, DBO_DocType> docTypesByID; // ID типа => типObservableCollection<DBO_DocType> docTypeList; // Список типовpublic void Init ()

{

// Тип документа. Schema. addTable (new DBTable ("doc_type", "id_doc_type"));

// Картотека. Schema. addTable (new DBTable ("card_case", "id_card_case"));table = DB. Schema. addTable (new DBTable ("card_folder", "id_card_folder"));. addForeignKey (new DBForeighLink ("id_card_case", DB. Schema. getTable ("card_case"), "id_card_case"));

// Документ= DB. Schema. addTable (new DBTable ("document", "id_document"));. addForeignKey (new DBForeighLink ("id_d_type", DB. Schema. getTable ("doc_type"), "id_doc_type"));. addForeignKey (new DBForeighLink ("id_card_folder", DB. Schema. getTable ("card_folder"), "id_card_folder"));

// Получение списка типов документов(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_type"))

{= dbhelper. fetchAll<DBO_DocType> (com);= new Dictionary<string, DBO_DocType> ();= new Dictionary<long?, DBO_DocType> ();(var dt in docTypeList)

{. Add (dt. Name, dt);. Add (dt. ID, dt);

}

}

}

// FoundedCount getFoundedCount (DBDocumentFilter doc_filter, DBO_DocType doc_type)

{(var dbhelper = BeginTransaction ())

{

// query = new DBQueryBuilder (DB. Schema);. SELECT ("COUNT (*) count"). FROM ("document"). LIMIT (1);_filter. apply (query);

// (var com = new DBCommand (query. BuildQuery ()))

{_filter. passParams (com);

// (var reader = dbhelper. executeReader (com))

{(reader. Read ())

{res = new FoundedCount ();. DocType = doc_type;. Count = reader. readField<long> ("count");res;

}return null;

}

}

}

}

// Возвращает список годов, которые присуствует в архиве (+days дней от текущего момента)ObservableCollection<int> getArchiveYears (int days)

{(var dbhelper = BeginTransaction ())

{<int> result = new ObservableCollection<int> ();(var com = new DBCommand ())

{(DBDocumentFilter. IsAutoArchiveEnabled)

{.commandText =

"SELECT ifnull (elapsing_year, force_year) AS elapsing_year, ifnull (force_year, elapsing_year) AS force_year " +

"FROM v_documents_year " +

"WHERE elapsing_min IS NOT NULL AND elapsing_min < date (CURRENT_TIMESTAMP, '-" + days. ToString () + " days') OR " +

"force_min IS NOT NULL " +

"ORDER BY elapsing_year DESC, force_year DESC";

}

{.commandText =

"SELECT DISTINCT force_year AS elapsing_year, force_year AS force_year " +

"FROM v_documents_year " +

"WHERE force_min IS NOT NULL " +

"ORDER BY elapsing_year DESC, force_year DESC";

}(var reader = dbhelper. executeReader (com))

{last_year = int. MaxValue;(reader. Read ())

{elapsing_year = reader. readField<int> ("elapsing_year");force_year = reader. readField<int> ("force_year");year = (elapsing_year > force_year)? force_year: elapsing_year;(year < last_year)

{. Add (year);_year = year;

}

}

}

}result;

}

}

// Удалить все документы, удовлетворяющие фильтру

// Связанные файлы НЕ удаляютсяvoid deleteAllDocWithFilter (DBDocumentFilter filter, DBHelper dbhelper)

{query = new DBQueryBuilder (DB. Schema);. FROM ("document");. apply (query);(var com = new DBCommand ("DELETE" + query. BuildQuery ()))

{. passParams (com);. executeNonQuery (com);

}

}void deleteAllDocWithFilter (DBDocumentFilter filter)

{(var dbhelper = BeginTransaction ())

{(filter, dbhelper);

}

}

// Поместить в корзину документ docvoid throwDocumentToBin (DBO_Document doc)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("UPDATE document SET is_in_recycle_bin = 1 WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", doc. ID);. IsInRecycleBin = true;. executeNonQuery (com);

}

}

// Принудительно поместить документ в архивvoid forcePutInArchive (DBO_Document doc)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("UPDATE document SET force_close_time = @force_close_time WHERE id_document = @id_document"))

{close_time = DateTime. Now;. Parameters. AddWithValue ("@force_close_time", close_time);. Parameters. AddWithValue ("@id_document", doc. ID);. ForceCloseDate = close_time;. executeNonQuery (com);

}

}

// Отменить принудительное помещение в архивvoid forceGetFromArchive (DBO_Document doc)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("UPDATE document SET force_close_time = @force_close_time WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@force_close_time", null);. Parameters. AddWithValue ("@id_document", doc. ID);. ForceCloseDate = null;. executeNonQuery (com);

}

}

// Восстановить из корзины документ docvoid restoreDocumentFromBin (DBO_Document doc)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("UPDATE document SET is_in_recycle_bin = 0 WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", doc. ID);. IsInRecycleBin = false;. executeNonQuery (com);

}

}

// Возвращает список документов указнного типа в выбранный периодObservableCollection<DBO_Document> getDocumentsWithFilter (DBDocumentFilter filter, DBHelper dbhelper)

{query = new DBQueryBuilder (DB. Schema);. SELECT ("*"). FROM ("document", "d"). JOIN ("doc_type", "t"). WHERE (" [is_deleted] = 0", "doc_type"). ORDER_BY ("name_document");. apply (query);(var com = new DBCommand (query. BuildQuery ()))

{. passParams (com);dbhelper. fetchAll<DBO_Document> (com);

}

}ObservableCollection<DBO_Document> getDocumentsWithFilter (DBDocumentFilter filter)

{(var dbhelper = BeginTransaction ())

{getDocumentsWithFilter (filter, dbhelper);

}

}

// Возвращает список типов документа в выбранный период

// (либо за указанный год в архиве, когда year! = null, либо +days дней от текущего момента)ObservableCollection<DBO_DocType> getDocTypesWithFilter (DBDocumentFilter filter)

{(var dbhelper = BeginTransaction ())

{query = new DBQueryBuilder (DB. Schema);. SELECT ("t. *"). FROM ("document", "d"). JOIN ("doc_type", "t"). WHERE (" [is_deleted] = 0", "doc_type"). GROUP_BY (" [id_doc_type]", "doc_type");. apply (query);(var com = new DBCommand (query. BuildQuery ()))

{. passParams (com);dbhelper. fetchAll<DBO_DocType> (com);

}

}

}

// Возаращет тип документа с заданным именемDBO_DocType getDocTypeWithName (string name)

{(docTypes. ContainsKey (name)) return docTypes [name];return null;

}

// Возаращет тип документа с заданным IDDBO_DocType getDocTypeWithID (long? id)

{(docTypesByID. ContainsKey (id)) return docTypesByID [id];return null;

}

// Возвращает все типы документовObservableCollection<DBO_DocType> getDocTypes ()

{docTypeList;

}

}

}

Файл DBModule_CardCase. csSystem;System. Collections. Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System. Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules

{class DBModule_CardCase: DBModuleBase

{public void Init ()

{

// Картотека. Schema. addTable (new DBTable ("card_case", "id_card_case"));table = DB. Schema. addTable (new DBTable ("card_folder", "id_card_folder"));. addForeignKey (new DBForeighLink ("id_card_case", DB. Schema. getTable ("card_case"), "id_card_case"));

}

// Возвращает все ящики в картотекеObservableCollection<DBO_CardCase> getCardCases ()

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_card_case"))

{dbhelper. fetchAll<DBO_CardCase> (com);

}

}

// Удаляет.

// Физически запись не удаляетсяbool deleteCardCase (DBO_CardCase obj)

{(var dbhelper = BeginTransaction ())

{. IsDeleted = true;. update<DBO_CardCase> (obj, new { IsDeleted = 0 });

}true;

}

// Переименовывает ящик

// Возвращает false, если ящик с таким именем уже существуетbool renameCardCase (DBO_CardCase obj, string new_name)

{(var dbhelper = BeginTransaction (true, true))

{

{already_exist = false;

// Проверка на повтор(var com_sel = new DBCommand ("SELECT 1 FROM v_notdel_card_case WHERE title_card_case = @title_card_case"))

{_sel. Parameters. AddWithValue ("@title_card_case", new_name);(var reader = dbhelper. executeReader (com_sel)) already_exist = reader. Read ();

}(! already_exist)

{

// Изменение в базе(var com_upd = new DBCommand ("UPDATE card_case SET title_card_case = @title_card_case WHERE id_card_case = @id_card_case"))

{_upd. Parameters. AddWithValue ("@title_card_case", new_name);_upd. Parameters. AddWithValue ("@id_card_case", obj. ID);. executeNonQuery (com_upd);.commit ();. Title = new_name;true;

}

}return false;

}(Exception e)

{. Rollback ();. Show (e. ToString ());false;

}

}

}

// Возвращает все отсортированные по имениObservableCollection<DBO_CardCase> getCardCasesSortedByTitle ()

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_card_case ORDER BY title_card_case"))

{dbhelper. fetchAll<DBO_CardCase> (com);

}

}

// Добавление нового

// dbhelper - объект текущей транзакцииbool addCardCase (DBO_CardCase obj, DBHelper dbhelper)

{. insert<DBO_CardCase> (obj);. ID = dbhelper. getLastInsertedID ("card_case", "id_card_case");true;

}bool addCardCase (DBO_CardCase obj)

{(var dbhelper = BeginTransaction ())

{addCardCase (obj, dbhelper);

}

}

// Возвращает все ящики в картотекеObservableCollection<DBO_CardFolder> getCardFolders (DBO_CardCase card_case)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_card_folder WHERE id_card_case = @id_card_case"))

{. Parameters. AddWithValue ("@id_card_case", card_case. ID);dbhelper. fetchAll<DBO_CardFolder> (com);

}

}

// Возвращает все отсортированные по имениObservableCollection<DBO_CardFolder> getCardFoldersSortedByTitle (DBO_CardCase card_case)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_card_folder WHERE id_card_case = @id_card_case ORDER BY title_card_folder"))

{. Parameters. AddWithValue ("@id_card_case", card_case. ID);dbhelper. fetchAll<DBO_CardFolder> (com);

}

}

// Добавление нового

// dbhelper - объект текущей транзакцииbool addCardFolder (DBO_CardFolder obj, DBHelper dbhelper)

{. insert<DBO_CardFolder> (obj);. ID = dbhelper. getLastInsertedID ("card_folder", "id_card_folder");true;

}bool addCardFolder (DBO_CardFolder obj)

{(var dbhelper = BeginTransaction ())

{addCardFolder (obj, dbhelper);

}

}

// Удаляет.

// Физически запись не удаляетсяbool deleteCardFolder (DBO_CardFolder obj)

{(var dbhelper = BeginTransaction ())

{. IsDeleted = true;. update<DBO_CardFolder> (obj, new { IsDeleted = 0 });

}true;

}

// Переименовывает папку в ящике

// Возвращает false, если ящик с таким именем уже существуетbool renameCardFolder (DBO_CardFolder obj, string new_name)

{(var dbhelper = BeginTransaction (true, true))

{

{already_exist = false;

// Проверка на повтор(var com_sel = new DBCommand ("SELECT 1 FROM v_notdel_card_folder WHERE id_card_case = @id_card_case AND title_card_folder = @title_card_folder"))

{_sel. Parameters. AddWithValue ("@title_card_folder", new_name);_sel. Parameters. AddWithValue ("@id_card_case", obj. CardCaseID);(var reader = dbhelper. executeReader (com_sel)) already_exist = reader. Read ();

}(! already_exist)

{

{_upd. Parameters. AddWithValue ("@title_card_folder", new_name);_upd. Parameters. AddWithValue ("@id_card_folder", obj. ID);. executeNonQuery (com_upd);.commit ();. Title = new_name;true;

}

}return false;

}(Exception e)

{. Rollback ();. Show (e. ToString ());false;

}

}

}

// Возвращает "Пустую запись"DBO_CardFolder whitespaceCardFolder;DBO_CardFolder getWhiteSpaceCardFolder (DBHelper dbhelper)

{(whitespaceCardFolder == null)

{(var com = new DBCommand ("SELECT * FROM card_folder WHERE title_card_folder = '' LIMIT 1"))

{= dbhelper. fetchOne<DBO_CardFolder> (com);(whitespaceCardFolder == null)

{= new DBO_CardFolder () { Title = "", IsDeleted = true };(whitespaceCardFolder, dbhelper);

}

}

}whitespaceCardFolder;

}

}

}

Файл DBModule_FastSearch. csSystem;System. Collections. Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System. Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules

{class DBModule_FastSearch: DBModuleBase

{public void Init ()

{

// Поисковый тег. Schema. addTable (new DBTable ("search_tag", "id_search_tag"));

// Связь документов и тегов:table = DB. Schema. addTable (new DBTable ("lnk_document_and_search_tag", "id_document"));. addForeignKey (new DBForeighLink ("id_document", DB. Schema. getTable ("document")));. addForeignKey (new DBForeighLink ("id_search_tag", DB. Schema. getTable ("search_tag")));

}

// Быстрый поиск текст search_text, возвращающий count результатовObservableCollection<DBO_Document> fastSearch (string search_text, int count)

{(var dbhelper = BeginTransaction ())

{query = new DBQueryBuilder (DB. Schema);. SELECT_DISTINCT (" [*]", "document")

. FROM ("document", "d"). JOIN_LEFT ("lnk_document_and_search_tag", "lnk"). JOIN_LEFT ("search_tag", "s")

. WHERE ("UnicodeUpper ([1. title_search_tag]) LIKE @tag_like OR UnicodeUpper ([2. name_document]) LIKE @name_like", "search_tag", "document")

. ORDER_BY (" [updated_time]", true, "document")

. LIMIT (count);(var com = new DBCommand (query. BuildQuery ()))

{. Parameters. AddWithValue ("@tag_like", "%" + search_text. ToUpper () + "%");. Parameters. AddWithValue ("@name_like", search_text. ToUpper () + "%");dbhelper. fetchAll<DBO_Document> (com);

}

}

}

// Добавляет тег поиска search_tag к документу documentvoid addSearchTag (DBO_Document document, string search_tag, DBHelper dbhelper)

{(search_tag! = null)

{(var com = new DBCommand ("SELECT * FROM search_tag WHERE title_search_tag = @title_search_tag"))

{. Parameters. AddWithValue ("@title_search_tag", search_tag);st = dbhelper. fetchOne<SearchTag> (com);(st == null)

{= new SearchTag () { Title = search_tag };. insert<SearchTag> (st);. ID = dbhelper. getLastInsertedID ("search_tag", "id_search_tag");

}. insertValues

(

"lnk_document_and_search_tag",Dictionary<string, object> () { { "id_document", document. ID }, { "id_search_tag", st. ID } }

);

}

}

}

// Добавляет информацию для поиска, специфичную documentvoid addDocumentSearchInfo (DBO_Document document, DBHelper dbhelper)

{

// addSearchTag (document, document. Name, dbhelper);

}

// Удаление старых поисковых тегов для докумета с ID = idvoid clearSearchInfo (long? id, DBHelper dbhelper)

{(var com = new DBCommand ("DELETE FROM lnk_document_and_search_tag WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", id);. executeNonQuery (com);

}

}

}

}

Файл DBModule_FIles. csSystem;System. Collections. Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System. Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules

{class DBModule_Files: DBModuleBase

{public void Init ()

{

// Файлы:table = DB. Schema. addTable (new DBTable ("doc_file", "id_doc_file"));. addForeignKey (new DBForeighLink ("id_document", DB. Schema. getTable ("document")));

// Кол-во файлов в документе= DB. Schema. addTable (new DBTable ("v_documents_file_count", "id_document"));. addForeignKey (new DBForeighLink ("id_document", DB. Schema. getTable ("document")));

}

// Добавление нового файла в базу, назначение ему IDbool addDocFile (DBO_DocFile file, DBHelper dbhelper)

{. insert<DBO_DocFile> (file);. ID = dbhelper. getLastInsertedID ("doc_file", "id_doc_file");true;

}

// Добавление новой папки в базу, назначение ей IDbool addDocFileFolder (DBO_DocFileFolder folder, DBHelper dbhelper)

{. insert<DBO_DocFileFolder> (folder);. ID = dbhelper. getLastInsertedID ("doc_file_folder", "id_doc_file_folder");true;

}

// Обновление пути файла в хранилищеvoid updateStoragePath (DBO_DocFile file, DBHelper dbhelper)

{. update<DBO_DocFile> (file, new { StoragePath = 0 });

}

// Обновление данных файлаvoid updateFileInfo (DBO_DocFile file)

{(var dbhelper = BeginTransaction ())

{. update<DBO_DocFile> (file);

}

}

// Обновление данных папкиvoid updateFolderInfo (DBO_DocFileFolder file)

{(var dbhelper = BeginTransaction ())

{. update<DBO_DocFileFolder> (file);

}

}

// Возвращает все файлы, связанные с документомObservableCollection<DBO_DocFile> getDocFiles (DBO_Document doc)

{(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_file WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", doc. ID);dbhelper. fetchAll<DBO_DocFile> (com);

}

}

// Возвращает все файлы, связанные с документом, находящиеся в заданной папкеObservableCollection<DBO_DocFile> getDocFiles (DBO_Document doc, long? folder_id)

{getDocFiles (doc. ID, folder_id);

}ObservableCollection<DBO_DocFile> getDocFiles (long? doc_id, long? folder_id)

{folder_id_query = "parent_id_doc_file_folder = @folder_id";(folder_id == null) folder_id_query = "parent_id_doc_file_folder IS NULL";(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_file WHERE id_document = @id_document AND " + folder_id_query))

{. Parameters. AddWithValue ("@id_document", doc_id);. Parameters. AddWithValue ("@folder_id", folder_id);dbhelper. fetchAll<DBO_DocFile> (com);

}

}

// Возвращает все папки, находящиеся в указаннойObservableCollection<DBO_DocFileFolder> getDocFolders (DBO_Document doc, long? folder_id)

{getDocFolders (doc. ID, folder_id);

}ObservableCollection<DBO_DocFileFolder> getDocFolders (long? doc_id, long? folder_id)

{folder_id_query = "parent_id_doc_file_folder = @folder_id";(folder_id == null) folder_id_query = "parent_id_doc_file_folder IS NULL";(var dbhelper = BeginTransaction ())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_file_folder WHERE id_document = @id_document AND " + folder_id_query))

{. Parameters. AddWithValue ("@id_document", doc_id);. Parameters. AddWithValue ("@folder_id", folder_id);dbhelper. fetchAll<DBO_DocFileFolder> (com);

}

}

// Удалитьвсе записи о прикрепленных файлах для документаvoid deleteAllFiles (DBO_Document doc, DBHelper dbhelper)

{(var com = new DBCommand ("DELETE FROM doc_file WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", doc. ID);. executeNonQuery (com);

}

}

// Удалитьвсе записи о прикрепленных папках для документаvoid deleteAllFolders (DBO_Document doc, DBHelper dbhelper)

{(var com = new DBCommand ("DELETE FROM doc_file_folder WHERE id_document = @id_document"))

{. Parameters. AddWithValue ("@id_document", doc. ID);. executeNonQuery (com);

}

}

}

}

Файла AddDocument. xaml. csSystem;System. Collections. Generic;System. Linq;System. Text;System. Windows;System. Windows. Controls;System. Windows. Data;System. Windows. Documents;System. Windows. Input;System. Windows. Media;System. Windows. Media. Imaging;System. Windows. Shapes;System. Collections. ObjectModel;System.runtime. Serialization;System.runtime. Serialization. Formatters;System.runtime. Serialization. Formatters. Binary;DKCore. DataBase. Objects;DKeeper. Logic. API;DKeeper. Forms. EditListForm;DKCore. ConcreteDocuments. Interfaces. Forms;DKeeper. Forms.common;DKCore. DataBase. Modules;DKCore. FormsI;DKeeper. Forms. AddDocument

{

// / <summary>

// / Interaction logic for AddDocument. xaml

// / </summary>partial class AddDocument: Window

{Dictionary<DBO_DocType, ICDocAddPage> recentDocTypes;ICDocAddPage currentDocPage;ObservableCollection<DBO_DocFile> editedFiles;ObservableCollection<DBO_DocFileFolder> editedFolders;DBO_Document CurrentDocument

{{ return DataContext as DBO_Document; }

}bool OpenAfterClose { get; set; }AddDocument ()

{= new Dictionary<DBO_DocType, ICDocAddPage> ();= new DBO_Document ();= new ObservableCollection<DBO_DocFile> ();= new ObservableCollection<DBO_DocFileFolder> ();();

// lstAttachedFiles. ItemsSource = attachedFiles;= false;

}void Window_Loaded (object sender, RoutedEventArgs e)

{

// Загрузка типов документовdoctype_list = new ObservableCollection<DBO_DocType> ();(var addin in App. ConcreteDocAddins)

{_list. Add (addin. Value. DocTypeDBO);

}. ItemsSource = doctype_list;. ItemsSource = App. DB. Module<DBModule_CardCase> (). getCardCasesSortedByTitle ();

}

// Смена типа документовvoid cmbDocTypes_SelectionChanged (object sender, SelectionChangedEventArgs e)

{_DocType selected = ( (ComboBox) sender). SelectedItem as DBO_DocType;page = null;(selected! = null)

{(recentDocTypes. ContainsKey (selected)) page = recentDocTypes [selected];

{(App. ConcreteDocAddins. ContainsKey (selected. Name))

{= App. ConcreteDocAddins [selected. Name]. getNewAddPage ();[selected] = page;

}

}

}(page! = null)

{. Navigate (page);= page;

}

}void insertToDB ()

{

{card_case = cmbxCardCase. SelectedItem as DBO_CardCase;(card_case == null)

{(cmbxCardCase. Text! = "") card_case = new DBO_CardCase () { Title = cmbxCardCase. Text };

}card_folder = cmbxCardFolder. SelectedItem as DBO_CardFolder;(card_folder == null)

{(cmbxCardFolder. Text! = "") card_folder = new DBO_CardFolder () { Title = cmbxCardFolder. Text };

}

// MessageBox. Show ("-3");

// Сам документfull_doc_info = new DBO_FullDocInfo ();_doc_info.commonInfo = CurrentDocument;_doc_info. CardCase = card_case;_doc_info. CardFolder = card_folder;result = currentDocPage. insertConcreteDocToDB (full_doc_info);(result)

{

// MessageBox. Show ("-2");

// Прикрепленные файлы= result && App. API<DocumentsAPI> (). addAttachedFolders (CurrentDocument, editedFolders);= result && App. API<DocumentsAPI> (). addAttachedFiles (CurrentDocument, editedFiles);(! result)

{. Show ("Документ #" + CurrentDocument. ID + " был добавлен, " +

"однако в процессе создания возникли ошибки и не все данные были сохранены." +

"Рекомендуется повторно отредактировать документ");

}= result;();

}

}(Exception e)

{. Show (e. ToString ());

}

}void OK_Click (object sender, RoutedEventArgs e)

{();

}void Cancel_Click (object sender, RoutedEventArgs e)

{= false;();

}void cmbxCardCase_SelectionChanged (object sender, SelectionChangedEventArgs e)

{card_case = cmbxCardCase. SelectedItem as DBO_CardCase;. Text = "";(card_case! = null)

{. ItemsSource = App. DB. Module<DBModule_CardCase> (). getCardFoldersSortedByTitle (card_case);

}

{. ItemsSource = null;

}

}void btnCardCase_Click (object sender, RoutedEventArgs e)

{editlist = new EditListForm. EditListForm ();settings = new EditListSettings<DBO_CardCase> ();. GetElemsFunc = App. DB. Module<DBModule_CardCase> (). getCardCasesSortedByTitle;. AddElemFunc = App. DB. Module<DBModule_CardCase> (). addCardCase;. DeleteElemFunc = App. DB. Module<DBModule_CardCase> (). deleteCardCase;. EditListSettings = settings;. SelectingObjTitle = "Картотека - ящик";res = editlist. ShowDialog ();(editlist. ListWasChanged)

{

// Обновление списка. ItemsSource = App. DB. Module<DBModule_CardCase> (). getCardCases ();

}(res == true)

{sel = (DBO_CardCase) editlist. SelectedItem;_CardCase lst_sel = null;(var item in cmbxCardCase. Items)

{as_dbo = item as DBO_CardCase;(as_dbo! = null && sel. ID == as_dbo. ID)

{_sel = as_dbo;;

}

}. SelectedItem = lst_sel;

}

}void btnCardFolder_Click (object sender, RoutedEventArgs e)

{card_case = cmbxCardCase. SelectedItem as DBO_CardCase;(card_case! = null)

{editlist = new EditListForm. EditListForm ();settings = new EditListSettings<DBO_CardFolder> ();. GetElemsFunc = ( () => App. DB. Module<DBModule_CardCase> (). getCardFoldersSortedByTitle (card_case));. AddElemFunc = ( (card_folder) => { card_folder. CardCaseID = card_case. ID; return App. DB. Module<DBModule_CardCase> (). addCardFolder (card_folder); });. DeleteElemFunc = App. DB. Module<DBModule_CardCase> (). deleteCardFolder;. EditListSettings = settings;. SelectingObjTitle = "Картотека - папка";res = editlist. ShowDialog ();(editlist. ListWasChanged)

{

// Обновление списка. ItemsSource = App. DB. Module<DBModule_CardCase> (). getCardFolders (card_case);

}(res == true)

{sel = (DBO_CardFolder) editlist. SelectedItem;_CardFolder lst_sel = null;(var item in cmbxCardFolder. Items)

{as_dbo = item as DBO_CardFolder;(as_dbo! = null && sel. ID == as_dbo. ID)

{_sel = as_dbo;;

}

}. SelectedItem = lst_sel;

}

}

}void Window_Closed (object sender, EventArgs e)

{

// Удаление временных файлов(var file in editedFiles)

{(file. IsTemporary)

{{ System. IO. File. Delete (file. LocalPath); }(Exception) { }

}

}

}void AddFile_Click (object sender, RoutedEventArgs e)

{

// var open_dialog2 = new Ookii. Dialogs. Wpf. VistaOpenFileDialog ();files = App. API<InterfaceAPI> (). openFileDialog (true);(files! = null)

{(var filepath in files)

{file = new DBO_DocFile ();. LocalPath = filepath. ToString ();. OrigName = System. IO. Path. GetFileName (filepath);. Title = System. IO. Path. GetFileName (filepath);(file);(file, SelectedDocFolderTreeItem);

}

}

}void ScanFile_Click (object sender, RoutedEventArgs e)

{title = String. Format ("Изображение{0}. jpg", editedFiles. Count + 1);file = App. API<ScannerAPI> (). OpenScanDocDialog (title);(file! = null)

{. OrigName = System. IO. Path. GetFileName (title);(file);(file, SelectedDocFolderTreeItem);

}

}void AddFolder_Click (object sender, RoutedEventArgs e)

{folder = new DBO_DocFileFolder ();. Title = String. Format ("Новая папка{0}", editedFolders. Count + 1);(folder);(folder, SelectedDocFolderTreeItem);

}TreeViewItem bubbleToTreeViewItem (object source)

{obj = (DependencyObject) source;(obj! = null && obj! = treeDocFiles && obj is Visual)

{(obj is TreeViewItem)

{(TreeViewItem) obj;

}= VisualTreeHelper. GetParent (obj);

}null;

}void DeleteAttachedFile_Executed (object sender, ExecutedRoutedEventArgs e)

{node = bubbleToTreeViewItem (e. Parameter);(node is DocFileTreeItem)

{( (DocFileTreeItem) node);

}if (node is DocFileFolderTreeItem)

{( (DocFileFolderTreeItem) node);

}

}

/*void lstAttachedFiles_MouseDoubleClick (object sender, MouseButtonEventArgs e)

{file = lstAttachedFiles. SelectedItem as DBO_DocFile;(file! = null && file. LocalPath! = null)

{. API<DocumentsAPI> (). openAttachedFile (file);

}

}

*/void Window_Closing (object sender, System.componentModel. CancelEventArgs e)

{

}DocFileFolderTreeItem SelectedDocFolderTreeItem

{

{selected = treeDocFiles. SelectedItem;(selected is DocFileTreeItem)

{ftree = (DocFileTreeItem) selected;ftree. Parent as DocFileFolderTreeItem;

}

{selected as DocFileFolderTreeItem;

}

}

}

// Удаляет узел из дереваvoid deleteNodeFromDocFileTree (TreeViewItem item)

{(item. Parent == treeDocFiles)

{. Items. Remove (item);

// Осталась только надпись "Файлы: "(treeDocFiles. Items. Count == 1) treeDocFiles. Items. RemoveAt (0);

}

{parent = item. Parent as TreeViewItem;(parent! = null) parent. Items. Remove (item);

}

}void deleteFromDocFiles (object item, bool quite = false)

{(item is DocFileFolderTreeItem) deleteFromDocFiles ( (DocFileFolderTreeItem) item, quite);if (item is DocFileTreeItem) deleteFromDocFiles ( (DocFileTreeItem) item, quite);

}void deleteFromDocFiles (DocFileFolderTreeItem folder_item, bool quite = false)

{folder = folder_item. Folder;(folder! = null)

{(! quite && folder. IsDeleted! = true && folder_item. Items. Count > 0)

{res = MessageBox. Show ("Удалить папку '" + folder. Title + "' и все ее содержимое?", "Подтверждение удаления", MessageBoxButton. OKCancel);(res == MessageBoxResult. Cancel) return; // Отмена

}(folder. IsDeleted! = true)

{

// Удаление потомков

// var children = new List<object> ();

// foreach (var ch in folder_item. Items) children. Add (ch);

// foreach (var ch in children) deleteFromDocFiles (ch, true);(int i = folder_item. Items. Count - 1; i >= 0; i--)

{(folder_item. Items [i], true);

}

// Удаление узла(folder. existInDB || folder_item. Items. Count > 0)

{(folder);. IsDeleted = true;

}

{(folder. IsChanged) editedFolders. Remove (folder);(folder_item);

}

}folder. IsDeleted = false;

}

}void deleteFromDocFiles (DocFileTreeItem file_item, bool quite = false)

{file = file_item. File;(file! = null)

{(file. IsDeleted! = true)

{(file. existInDB)

{(file);. IsDeleted = true;

}

{(file. IsTemporary)

{{ System. IO. File. Delete (file. LocalPath); }(Exception) { }

}(file. IsChanged) editedFiles. Remove (file);(file_item);

}

}

{

// Восстановлениеparent = file_item. Parent as DocFileFolderTreeItem;(parent! = null)

{. Folder. IsDeleted = false;

}

}

}

}void addToDocFiles (DBO_DocFileFolder folder, DocFileFolderTreeItem parent_folder)

{tree_item = new DocFileFolderTreeItem ();_item. Folder = folder;(parent_folder == null)

{. ParentDocFolder = null;(treeDocFiles. Items. Count == 0)

{dummy = new TreeViewItem ();. Header = "Файлы: ";. Items. Add (dummy);

}. Items. Add (tree_item);

}

{. ParentDocFolder = parent_folder. Folder;_folder. IsExpanded = true;_folder. Items. Add (tree_item);

}

}void setDocFileAsEdited (object file_or_folder)

{(file_or_folder is DBO_DocFile) setDocFileAsEdited ( (DBO_DocFile) file_or_folder);if (file_or_folder is DBO_DocFileFolder) setDocFileAsEdited ( (DBO_DocFileFolder) file_or_folder);

}void setDocFileAsEdited (DBO_DocFile file)

{(file. IsChanged! = true)

{. Add (file);. IsChanged = true;

}

}void setDocFileAsEdited (DBO_DocFileFolder folder)

{(folder. IsChanged! = true)

{. Add (folder);. IsChanged = true;

}

}void addToDocFiles (DBO_DocFile file, DocFileFolderTreeItem parent_folder)

{tree_item = new DocFileTreeItem ();_item. File = file;(parent_folder == null)

{. ParentDocFolder = null;(treeDocFiles. Items. Count == 0)

{dummy = new TreeViewItem ();. Header = "Файлы: ";. Items. Add (dummy);

}. Items. Add (tree_item);

}

{. ParentDocFolder = parent_folder. Folder;_folder. IsExpanded = true;_folder. Items. Add (tree_item);

}

}void treeDocFiles_Expanded (object sender, RoutedEventArgs e)

{folder_item = e. Source as DocFileFolderTreeItem;(folder_item! = null)

{(folder_item. Items. Count == 1 && folder_item. Items [0] == null)

{_item. Items. Clear ();(folder_item. Folder. existInDB)

{folders = App. DB. Module<DBModule_Files> (). getDocFolders (CurrentDocument, folder_item. Folder. ID);(var f in folders) addToDocFiles (f, folder_item);files = App. DB. Module<DBModule_Files> (). getDocFiles (CurrentDocument, folder_item. Folder. ID);(var f in files) addToDocFiles (f, folder_item);

}

}

}

}void treeDocFiles_MouseDoubleClick (object sender, MouseButtonEventArgs e)

{item = bubbleToTreeViewItem (e. OriginalSource) as DocFileTreeItem;(item! = null)

{file = item. File;(file! = null && file. LocalPath! = null)

{. API<DocumentsAPI> (). openAttachedFile (file);

}

}

}void treeDocFiles_KeyUp (object sender, KeyEventArgs e)

{

}void treeDocFiles_Renamed (object o, DKCustomControls. RenamingRoutedEventArgs e)

{. NewName = e. NewName. Trim ();. Cancel = true;

// Определение объектаitem = bubbleToTreeViewItem (e. OriginalSource);obj_title = "файла";(item is DocFileFolderTreeItem) obj_title = "папки";(String. IsNullOrEmpty (e. NewName)) MessageBox. Show ("Имя " + obj_title + " не задано");if (e. NewName =="." || e. NewName ==". ") MessageBox. Show ("Недопустимое имя " + obj_title);if (e. NewName. IndexOfAny (System. IO. Path. GetInvalidFileNameChars ())! = - 1) MessageBox. Show ("Недопустимые символы в имени " + obj_title);if (item is DocFileTreeItem)

{(System. IO. Path. GetExtension (e. NewName)! = System. IO. Path. GetExtension (e. OldName))

{res = MessageBox. Show ("Вы действительно хотите изменить расширение файла?", "Переименование файла", MessageBoxButton. YesNo);. Cancel = res == MessageBoxResult. No;

}e. Cancel = false;

}e. Cancel = false;(e. Cancel == false)

{(item is DocFileFolderTreeItem)

{folder = (DocFileFolderTreeItem) item;. Folder. Title = e. NewName;(folder. Folder);

}

{file = (DocFileTreeItem) item;. File. Title = e. NewName;(file. File);

}

}

}

[Serializable]class DragDataItem: ISerializable

{TreeViewItem Item { get; set; }DragDataItem ()

{

{

}void GetObjectData (SerializationInfo info, StreamingContext context)

{

}

}startPoint;void treeDocFiles_MouseLeftButtonDown (object sender, MouseButtonEventArgs e)

{= e. GetPosition (null);

}void treeDocFiles_MouseMove (object sender, MouseEventArgs e)

{(e. LeftButton == MouseButtonState. Pressed)

{mousePos = e. GetPosition (null);diff = startPoint - mousePos;(Math. Abs (diff. X) > SystemParameters. MinimumHorizontalDragDistance || Math. Abs (diff. Y) > SystemParameters. MinimumVerticalDragDistance)

{tree_item = bubbleToTreeViewItem (e. OriginalSource);(Mouse. Captured == null && tree_item! = null && (tree_item is DocFileFolderTreeItem || tree_item is DocFileTreeItem))

{dr = new DragDataItem ();. Item = tree_item;

{. DoDragDrop (treeDocFiles, dr, DragDropEffects. Move);

}(Exception) { }

}

}

}

}bool checkCanDrop (TreeViewItem tree_item, TreeViewItem dragged)

{(tree_item == null || tree_item is DocFileTreeItem) return false;(tree_item is DocFileFolderTreeItem)

{folder_item = (DocFileFolderTreeItem) tree_item;own_id = folder_item. Folder. ID;(folder_item! = null)

{(folder_item. Folder. IsDeleted == true) return false;(folder_item == dragged) return false;if (own_id! = null && folder_item. Folder. ParentDocFolderID == own_id) return false;_item = folder_item. Parent as DocFileFolderTreeItem;

}

}true;

}void treeDocFiles_DragOver (object sender, DragEventArgs e)

{tree_item = bubbleToTreeViewItem (e. OriginalSource);dragged_tm = null;

{_tm = e. Data. GetData (typeof (DragDataItem)) as DragDataItem;

}(Exception) { }(dragged_tm! = null)

{dragged = dragged_tm. Item;(! checkCanDrop (tree_item, dragged))

{. Effects = DragDropEffects. None;

}

}. Handled = true;

}void treeDocFiles_Drop (object sender, DragEventArgs e)

{. Effects = DragDropEffects. None;. Handled = true;tree_item = bubbleToTreeViewItem (e. OriginalSource);dragged_tm = null;

{_tm = e. Data. GetData (typeof (DragDataItem)) as DragDataItem;

}(Exception) { }(dragged_tm! = null)

{dragged = dragged_tm. Item;(dragged! = tree_item && checkCanDrop (tree_item, dragged))

{par = dragged. Parent as ItemsControl;. Items. Remove (dragged);_item. IsExpanded = true;_DocFileFolder folder = null;

// (tree_item is DocFileFolderTreeItem)

{_item. Items. Add (dragged);= ( (DocFileFolderTreeItem) tree_item). Folder;

}treeDocFiles. Items. Add (dragged);

// drag_file = dragged as DocFileTreeItem;drag_folder = dragged as DocFileFolderTreeItem;(drag_file! = null)

{_file. File. ParentDocFolder = folder;(drag_file. File);

}if (drag_folder! = null)

{_folder. Folder. ParentDocFolder = folder;(drag_folder. Folder);

}

}

}

}

}

}

Файл AddDocument. xaml

<Window x: Class="DKeeper. Forms. AddDocument. AddDocument"="http://schemas. microsoft.com/winfx/2006/xaml/presentation": x="http://schemas. microsoft.com/winfx/2006/xaml": local_db_obj="clr-namespace: DKCore. DataBase. Objects; assembly=DKCore": dkctrls="clr-namespace: DKCustomControls; assembly=DKCustomControls"="Добавить документ" Height="550" Width="400" Background="{StaticResource FormBackgroundBrush}"="Window_Loaded" Closing="Window_Closing" Closed="Window_Closed" xmlns: my="clr-namespace: DKeeper. Forms. AddDocument">

<Window. Resources>

<ResourceDictionary>

<ResourceDictionary. MergedDictionaries>

<ResourceDictionary Source=". /Resources/DocFilesDictonary. xaml"></ResourceDictionary>

</ResourceDictionary. MergedDictionaries>

</ResourceDictionary>

</Window. Resources>

<Grid>

<Grid. RowDefinitions>

<RowDefinition MinHeight="60" Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition></RowDefinition>

<RowDefinition MinHeight="70" Height="Auto"></RowDefinition>

</Grid. RowDefinitions>

<TextBlock FontSize="20" Margin="15, 10" VerticalAlignment="Center">Добавить документ</TextBlock>

<! - Тип документа - ->

<Grid Grid. Row="1" Margin="15 0 15 15" Width="{Binding ElementName=DocPropertiesGrid, Path=ActualWidth}" HorizontalAlignment="Left">

<Grid. ColumnDefinitions>

<ColumnDefinition Width="Auto" MinWidth="110" SharedSizeGroup="DialogLabelsGroup"></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid. ColumnDefinitions>

<Label Target="{Binding ElementName=cmbxDocTypes}">_Тип документа*: </Label>

<ComboBox Grid. Column="1" Name="cmbxDocTypes" TextSearch. TextPath="Title" DisplayMemberPath="Title" SelectedIndex="0" SelectionChanged="cmbDocTypes_SelectionChanged"></ComboBox>

</Grid>

<Grid Grid. Row="2" >

<ScrollViewer VerticalScrollBarVisibility="Auto" Name="ScrollSpace">

<Grid IsSharedSizeScope="True" Margin="15 0 15 15" Name="DocPropertiesGrid">

<Grid. RowDefinitions>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition></RowDefinition>

</Grid. RowDefinitions>

<! - Область для полей конкретных типов документов - ->

<StackPanel Grid. Row="1" Grid. ColumnSpan="2">

<TextBlock FontSize="18" Margin="0 0 0 10" Text="{Binding ElementName=cmbxDocTypes, Path=SelectedItem. Title}"></TextBlock>

<! - -<GroupBox Padding="5">-->

<Grid>

<Grid. RowDefinitions>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="100"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

</Grid. RowDefinitions>

<Grid. ColumnDefinitions>

<ColumnDefinition Width="Auto"></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid. ColumnDefinitions>

<Frame Grid. ColumnSpan="2" Name="frameConcreteDoc" JournalOwnership="OwnsJournal" NavigationUIVisibility="Hidden" Focusable="False"></Frame>

<DockPanel Grid. ColumnSpan="2" Grid. Row="1" Margin="0 0 0 5" LastChildFill="True">

<Label DockPanel. Dock="Top" Target="{Binding ElementName=txtComment}">Краткое _описание: </Label>

<TextBox Name="txtComment" AcceptsReturn="True" Text="{Binding Comment, Mode=TwoWay, Converter={StaticResource ResourceKey=NullableTextConverter}}"></TextBox>

</DockPanel>

<Label Grid. Row="2" Target="{Binding ElementName=cmbxCardCase}">Позиция в _картотеке: </Label>

<Grid Grid. Row="2" Grid. Column="1" VerticalAlignment="Top">

<Grid. ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition Width="Auto"></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid. ColumnDefinitions>

<DockPanel>

<Button Focusable="False" DockPanel. Dock="Right" MinWidth="22" Click="btnCardCase_Click" VerticalAlignment="Top" >. </Button>

<ComboBox Name="cmbxCardCase" IsEditable="True" VerticalAlignment="Top" TextSearch. TextPath="Title" DisplayMemberPath="Title" SelectionChanged="cmbxCardCase_SelectionChanged"></ComboBox>

</DockPanel>

<TextBlock Grid. Column="1" Margin="5 0">-</TextBlock>

<DockPanel Grid. Column="2">

<Button Focusable="False" DockPanel. Dock="Right" MinWidth="22" Click="btnCardFolder_Click" VerticalAlignment="Top" Content=". ">

<Button. Style>

<Style TargetType="{x: Type Button}">

<Style. Triggers>

<DataTrigger Binding="{Binding ElementName=cmbxCardCase,Path=SelectedItem}" Value="{x: Null}">

<Setter Property="IsEnabled" Value="False"></Setter>

</DataTrigger>

</Style. Triggers>

</Style>

</Button. Style>

</Button>

<ComboBox Name="cmbxCardFolder" Grid. Column="2" IsEditable="True" VerticalAlignment="Top" TextSearch. TextPath="Title" DisplayMemberPath="Title" SelectedValue="{Binding CardFolderID, Mode=TwoWay}" SelectedValuePath="ID"></ComboBox>

<DockPanel. Style>

<Style TargetType="{x: Type DockPanel}">

<Style. Triggers>

<DataTrigger Binding="{Binding ElementName=cmbxCardCase,Path=Text}" Value="">

<Setter Property="IsEnabled" Value="False"></Setter>

</DataTrigger>

</Style. Triggers>

</Style>

</DockPanel. Style>

</DockPanel>

</Grid>

</Grid>

<! - -</GroupBox>-->

</StackPanel>

<! - Общая информация документов - ->

<Expander Grid. Row="3" Grid. ColumnSpan="2" Header="Прикрепленные файлы" IsExpanded="True" Margin="0 15 0 0">

<StackPanel >

<StackPanel Orientation="Horizontal" Margin="5, 5, 0, 5" HorizontalAlignment="Right">

<Image VerticalAlignment="Center" Margin="0 0 5 0" Source="{StaticResource ResourceKey=Icon_PaperClipDark}" Width="8"></Image>

<TextBlock VerticalAlignment="Center">Прикрепить: </TextBlock>

<Button Margin="5 0 0 0" Click="AddFile_Click" Padding="5 0" ToolTip="Прикрепить файл">Файл</Button>

<Button Margin="5 0 0 0" Click="ScanFile_Click" Padding="5 0" ToolTip="Сканировать документ">Скан</Button>

<Button Margin="5 0 0 0" Click="AddFolder_Click" Padding="5 0" ToolTip="Создать папку">Папку</Button>

</StackPanel>

<TreeView Name="treeDocFiles" TreeViewItem. Expanded="treeDocFiles_Expanded" TreeViewItem. MouseDoubleClick="treeDocFiles_MouseDoubleClick" KeyUp="treeDocFiles_KeyUp" dkctrls: RenamingTextBox. Renamed="treeDocFiles_Renamed" Style="{StaticResource DocFileTreeStyle}" MouseMove="treeDocFiles_MouseMove" Drop="treeDocFiles_Drop" DragOver="treeDocFiles_DragOver" MouseLeftButtonDown="treeDocFiles_MouseLeftButtonDown">

<TreeView.commandBindings>

<CommandBinding Command="Delete" Executed="DeleteAttachedFile_Executed"></CommandBinding>

</TreeView.commandBindings>

</TreeView>

<! - -<Grid Margin="5, 5, 0, 5" HorizontalAlignment="Right">

<Grid. ColumnDefinitions>

<ColumnDefinition Width="Auto" MinWidth="120" ></ColumnDefinition>

</Grid. ColumnDefinitions>

<Grid. RowDefinitions>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

</Grid. RowDefinitions>

<Button Grid. Row="0" Margin="0 0 0 4" Padding="6 1" Click="AddFile_Click">

<StackPanel Orientation="Horizontal">

<Image Margin="0 0 5 0" Source="{StaticResource ResourceKey=Icon_PaperClipDark}" Width="8"></Image>

<TextBlock>Прикрепить файл</TextBlock>

</StackPanel>

</Button>

<Button Grid. Row="1" Padding="6 1" Click="ScanFile_Click">Сканировать документ</Button>

</Grid>-->

<! - -<Grid>

<ListBox Name="lstAttachedFiles" BorderThickness="0" Background="{StaticResource FormBackgroundBrush}" HorizontalAlignment="Left" HorizontalContentAlignment="Stretch" MouseDoubleClick="lstAttachedFiles_MouseDoubleClick" dkctrls: RenamingTextBox. Renamed="FileTitle_Renamed" >

<ListBox.commandBindings>

<CommandBinding Command="Delete" Executed="DeleteAttachedFile_Executed"></CommandBinding>

</ListBox.commandBindings>

<ListBox. Style>

<Style TargetType="{x: Type ListBox}">

<Style. Resources>

<Style x: Key="{x: Type ListBoxItem}" TargetType="{x: Type ListBoxItem}">

<Setter Property="Template">

<Setter. Value>

<ControlTemplate TargetType="{x: Type ListBoxItem}">

<Border Name="Bd" CornerRadius="8" BorderThickness="1" Margin="2 2 6 2 " Padding="6 1" >

<ContentPresenter />

</Border>

<ControlTemplate. Triggers>

<MultiTrigger>

<MultiTrigger. Conditions>

<Condition Property="IsFocused" Value="True"></Condition>

<Condition Property="IsSelected" Value="True"></Condition>

</MultiTrigger. Conditions>

<Setter TargetName="Bd" Property="BorderBrush" Value="#DDDDDD"></Setter>

</MultiTrigger>

<Trigger Property="IsMouseOver" Value="True">

<Setter TargetName="Bd" Property="Background" Value="#F0F0F0"></Setter>

</Trigger>

</ControlTemplate. Triggers>

</ControlTemplate>

</Setter. Value>

</Setter>

</Style>

</Style. Resources>

<Style. Triggers>

<DataTrigger Binding="{Binding RelativeSource={x: Static RelativeSource. Self}, Path=Items. Count}" Value="0">

<Setter Property="HorizontalAlignment" Value="Center"></Setter>

<Setter Property="Template">

<Setter. Value>

<ControlTemplate>

<TextBlock Name="msgEmpty" DataContext="{Binding ElementName=lstAttachedFiles, Path=Items. Count}" HorizontalAlignment="Center" Margin="0, 10" Text="Нет прикрепленнных файлов" />

</ControlTemplate>

</Setter. Value>

</Setter>

</DataTrigger>

</Style. Triggers>

</Style>

</ListBox. Style>

<ListBox. ItemTemplate>

<DataTemplate>

<Grid Name="Gr">

<Grid. ColumnDefinitions>

<ColumnDefinition Width="Auto"></ColumnDefinition>

<ColumnDefinition MinWidth="60"></ColumnDefinition>

<ColumnDefinition Width="Auto"></ColumnDefinition>

</Grid. ColumnDefinitions>

<Image Margin="0 0 5 0" Source="{StaticResource ResourceKey=Icon_PaperClipDark}" Width="8"></Image>

<dkctrls: RenamingTextBox Grid. Column="1" Name="Title" Text="{Binding Title, Mode=TwoWay}"></dkctrls: RenamingTextBox>

<Grid Grid. Column="2" Margin="5 0 0 0" Name="Buttons">

<Button Command="Delete" CommandParameter="{Binding}">

<Button. Template>

<ControlTemplate TargetType="{x: Type Button}">

<Border Name="Bd" CornerRadius="10">

<Image Margin="5 0" Source="{StaticResource ResourceKey=Icon_RedSmallDelete}" Width="5"></Image>

</Border>

<ControlTemplate. Triggers>

<Trigger Property="IsMouseOver" Value="True">

<Setter TargetName="Bd" Property="Background" Value="#FADADA"></Setter>

</Trigger>

<Trigger Property="IsPressed" Value="True">

<Setter TargetName="Bd" Property="Background" Value="#FFA0A0"></Setter>

</Trigger>

</ControlTemplate. Triggers>

</ControlTemplate>

</Button. Template>

</Button>

</Grid>

</Grid>

<DataTemplate. Triggers>

<DataTrigger Binding="{Binding ID}" Value="{x: Null}">

<Setter TargetName="Title" Property="FontStyle" Value="Italic"></Setter>

</DataTrigger>

</DataTemplate. Triggers>

</DataTemplate>

</ListBox. ItemTemplate>

</ListBox>

</Grid>-->

</StackPanel>

</Expander>

<! - -

<Expander Grid. Row="4" Grid. ColumnSpan="2" Header="Связанные документы">

<StackPanel>

<GroupBox Header="Выберите существующую группу: ">

<DockPanel>

<Button DockPanel. Dock="Right">Выбрать. </Button>

<TextBox></TextBox>

</DockPanel>

</GroupBox>

<GroupBox Header="Или создайте новую: ">

<Grid>

<Grid. ColumnDefinitions>

<ColumnDefinition Width="Auto"></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid. ColumnDefinitions>

<Grid. RowDefinitions>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="100"></RowDefinition>

<RowDefinition Height="Auto"></RowDefinition>

</Grid. RowDefinitions>

<TextBlock>Имя: </TextBlock>

<TextBox Grid. Column="1"></TextBox>

<TextBlock Grid. Row="1" Grid. ColumnSpan="2">Документы: </TextBlock>

<ListBox Grid. Row="2" Grid. ColumnSpan="2"></ListBox>

<TextBlock Grid. Row="3">Добавить: </TextBlock>

<StackPanel Grid. Row="3" Grid. Column="1" Orientation="Horizontal">

<Button>Новый. </Button>

<Button>Существующий. </Button>

</StackPanel>

</Grid>

</GroupBox>

</StackPanel>

</Expander>

</Grid>

</ScrollViewer>

<Rectangle Style="{StaticResource FormScrollTopFog}"/>

</Grid>

<! - Диалоговые кнопки - ->

<Border Grid. Row="3" Background="{StaticResource FormBottomBrush}">

<Grid>

<Grid. ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition Width="Auto"></ColumnDefinition>

</Grid. ColumnDefinitions>

<CheckBox Name="chkOpenAfterClose" VerticalAlignment="Center" Margin="10 0 0 0" IsChecked="{Binding Path=OpenAfterClose, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType=my: AddDocument, AncestorLevel=1}}">Открыть по завершении</CheckBox>

<WrapPanel Grid. Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0 0 10 0">

<Button Click="Cancel_Click" MinWidth="80" Margin="5" Padding="6 1">Отмена</Button>

<Button Click="OK_Click" MinWidth="80" Margin="5" Padding="6 1">Ок</Button>

</WrapPanel>

</Grid>

</Border>

</Grid>

</Window>

Приложение 3. Руководство оператора структурированной системы хранения документов предприятия

 

П.3.1 Назначение программы

Система предназначена для ведения архива документов, предосталяет возможности поиска и печати.

П.3.2 Условия выполнения программы

Для работы структурированной системы хранения документов предприятия требуется персональный компьютер со следующими характеристиками и устройствами:

процессор: 1 ГГц (или выше);

ОЗУ: 1024 Мб (или выше);

жесткий диск: 10 Гб (или выше);

видеоадаптер;

монитор;

клавиатура;

мышь.

Для доступа к функциям печати и сканирования требуются соответствующие устройства.

Кроме того, должно быть установлено следующее программное обеспечение:

Операционная система: Windows XP SP 3, Windows Vista, Windows 7 (или выше)

.net Framework 4.5 Client Profile;Installer 3.1 (или выше).

Для доступа к функциям печати и сканирования требуется установка драйверов соответствующих устройств.

П.3.3 Пуск программы

Для пуска программы необходимо открыть файл docstruct. exe

П.3.4 Команды оператора

Опреатор может выполнять следующие команды:

) Документы. - > Добавить - добавление нового документа;

) Документы. - > Изменить - изменение текущего документа;

) Документы. - > Удалить - удаление текущего документа;

) Документы. - > Поместить в архив - помещение текущего документа в архив;

) Документы. - > Извлечь из архива - извлечение текущего документа их архива;

) Картотека - показ позиции документов в картотеке;

) Отчеты - > Истекающие документы - показ списка документов с истекающим сроком;

) Найти… - открыть форму поиска;

) Настройки - настройки программы (пути до базы данных, автоматическое помещение документов в архив);

) Файл - > Создать резервную копию - создание резервной копии базы данных;

) Файл - > Восстановить базу данных - восстановление базы данных из ранее созданных резервных копий;

) Файл - > Закрыть - выход и из программы.

Похожие работы на - Структурированная система хранения документов предприятия

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!