Разработка информационной системы автосервиса

Дипломная работа

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

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

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

1. Постановка задачи

1 Описание предметной области

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

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

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

Ремонт — комплекс операций по восстановлению исправного состояния колесного транспортного средства (его составных частей, систем).

Автосервис «Сан-Саныч» был основан в 2005 году как многопрофильное автосервисное предприятие.

Ремонт автомобилей производится специалистами с опытом не менее 3 лет. Мастера постоянно совершенствуют свои знания и умения на курсах повышения квалификации.

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

16 стр., 7736 слов

Разработка автоматизированной системы учёта работы автосервиса

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

Принципы работы автосервиса:

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

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

Таким образом, в функционирование автосервиса входит:

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

Название организации: «Сан-Саныч».

Юридический статус: Общество с ограниченной ответственностью (ООО).

Профиль деятельность: диагностика и ремонт автомобилей.

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

Код ОКВЭД: Код 50.2 <#»868285.files/image001.jpg»>

Рисунок 1.1 — Организационная модель в нотации Organization Chart

В таблице 1.1 представлены объекты, которые используются в организационной модели.

Таблица 1.1 — Используемые объекты

Тип объекта рус. (англ.)

Символ с именем по умолчанию (рус. или англ.)

Целевое использование

Правила именования

Организационная схема (Organizational Chart)

Сотрудник (Person)

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

Должность (Position)

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

Организационная единица (Organizational unit)

 постановка задачи 3 Обозначение отдельного штатного подразделения.Полное название подразделения

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

Таблица 1.2 — Типы связей

Тип объекта-источника связи

[Электронный ресурс]//URL: https://obzone.ru/diplomnaya/po-dlya-avtoservisa/

Тип связи рус. (англ.)

Целевое использование

Тип объекта-приемника связи

Должность (Position)

является непосредственным руководителем (is disciplinary superior)

предназначена для указания руководителя организационной единицы

Организационная единица (Organizational unit)

Организационная единица (Organizational unit)

Состоит из (is composed of)

предназначена для описания состава организационной единицы

Должность (Position)

Организационная единица (Organizational unit)

Является техническим руководителем (is technical superior)

предназначена для описания подчинения организационных единиц

Организационная единица (Organizational unit)

Сотрудник (internal person)

Занимает должность (occupies)

Предназначена для описания отдельного сотрудника, занимающего данную должность

Должность (Position)

В автосервисе «Сан-Саныч» работают: 1 администратор, 1 кладовщик, 1 мастер-приемщик, 4 автослесаря (2 профессиональных, 2 помощника), 1 диагност-электрик и генеральный директор, являющийся единственным владельцем «Сан-Саныча». Так же автосервис раз в месяц нанимает приходящего бухгалтера, так как это наименее затратно для малого бизнеса.

Мастер-приемщик решает следующие задачи:

— общение с клиентами;

— прием заказа ТО от клиентов;

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

принятие решения по гарантийным случаям;

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

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

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

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

ведение склада зачастей;

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

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

составление отчетности.

Кладовщик решает следующие задачи:

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

— проверяет соответствия принимаемых ценностей сопроводительным документам;

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

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

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

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

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

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

ведет учет складских операций;

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

выполняет отдельные служебные поручения своего непосредственного руководителя.

Автослесарь решает следующие задачи:

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

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

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

Автомаляр выполняет следующую работу:

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

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

— покраска автомобиля.

Администратор решает следующие задачи:

— осуществляет работу по эффективному и культурному обслуживанию посетителей, созданию для них комфортных условий;

— консультирует посетителей по вопросам, касающимся оказываемых услуг;

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

— выдает клиентам бланк заявки, оформляет разовый пропуск на въезд/выезд автомобиля на территорию автосервиса;

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

— принимает меры по предотвращению и ликвидации конфликтных ситуаций;

— списание материальных ценностей, применяемых при ремонте и тех.обслуживании автомобилей;

— изучать поступающий товар (цены, наименование).

— выполнять отдельные служебные поручения своего непосредственного руководителя;

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

На время отсутствия администратора его обязанности исполняет мастер — приемщик.

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

На рисунке 1.2 показан бизнес процесс «оформление заказа» в нотации Extended event driven process chain.

 постановка задачи 4

Рисунок 1.2 — Описание бизнес процесса «оформление заказа»

1.2 Обзор аналогов ИС

.2.1 Система LogicStar-AvtoAvto — это многофункциональная система автоматизации предприятий сферы автобизнеса, специализирующихся в области продажи и обслуживании автотранспорта. Avto автоматизирует бизнес-процессы автоцентра в едином интегрированном решении и поддерживает:

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

— интеграцию с внешними системами подбора работ и деталей, Ewa Net, TIS (Opel), Suzuki EPC, Mitsubishi EPC, Iveco Power, Chevrolet Parts Imager, AUDATEX;

интеграцию с системами автоматического отпуска ГСМ в цехе, к примеру MDS2000 Fluid Management, позволяющая производить списание ГСМ на Заказ-наряды в реальном времени;

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

В таблице 1.3 представлена сравнительная таблица LogicStar Avto.

Таблица 1.3 — Сравнительная таблица

<#»868285.files/image006.jpg»>

  • Рисунок 2.1 — Модель данных

 постановка задачи 5

Рисунок 2.2 — Концептуальная модель БД

На рисунке 2.2 представлена концептуальная модель БД, на которой изображены все таблицы из реляционной модели и связи между ними. Например: Таблицы КЛИЕНТ и СОТРУДНИК имеют связь многие ко многим. Таблицы КЛИЕНТ и АВТОМОБИЛЬ имеют связь один ко многим, так как один клиент может иметь несколько автомобилей.

На основе концептуальной и реляционной моделей были спроектированны таблицы БД в MS SQL.

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

 постановка задачи 6

Рисунок 2.3 — Таблица «клиенты»

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

 постановка задачи 7

Рисунок 2.4 — Таблица «сотрудники»

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

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

 постановка задачи 8

Рисунок 2.5 — Таблица «автомобили»

 постановка задачи 9

Рисунок 2.6 — Таблица «должности»

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

 постановка задачи 10

Рисунок 2.7 — Таблица «работы»

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

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

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

 постановка задачи 11

Рисунок 2.8 — Таблица «полномочия»

 постановка задачи 12

Рисунок 2.9 — Таблица «запасы»

 постановка задачи 13

Рисунок 2.10 — Таблица «места хранения»

На рисунке 2.11 показана таблица единиц измерения.

На рисунке 2.12 представлена таблица поставщиков, в ней хранятся данные о поставщиках. Данные этой таблицы нужны для оформления поставки мастером-приемщиком.

 постановка задачи 14

Рисунок 2.11 — Таблица «единицы измерения»

 постановка задачи 15

Рисунок 2.12 — Таблица «Поставщики»

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

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

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

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

3 Проектирование приложения

3.1 Обоснование выбора языка программирования

Для написания программы была выбрана среда программирования Visual Studio 2012 C#, основанная на языке программирования C#. Данная среда выгодно отличается эффективностью и надежностью.

Для стабильного функционирования программы необходим компьютер фирмы IBM или совместимый с ним, с объёмом оперативной памяти не менее 128 Мб., процессор с частотой не менее 600мГц.

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

Среда разработки Visual Studio, поставляемая вместе с .NET, предоставляет необходимый инструментарий для эффективного и быстрого создания приложений с графическим интерфейсом.

Появление технологии .NET повлекло за собой массовую реконструкцию некоторых языков программирования, стремящихся использовать те или иные возможности платформы, такие как C++ и Visual Basic. Microsoft решили предложить разработчикам альтернативу — язык, ориентированный специально .NET и создали C#. Сами разработчики языка описывают его, как простой, современный, объектно-ориентированный и безопасный язык программирования. Синтаксически C# напоминает C++ и Java, что позволяет за достаточно короткое время изучить тонкости нового языка.

Несмотря на то, что C# и .NET предназначены в первую очередь для веб-разработки, их также активно применяют для создания приложений, которые должны устанавливаться на машине конечного пользователя, где и будет выполняться вся обработка данных. Разработку таких приложений обеспечивает библиотека Windows Forms, позволяющая проектировать графический интерфейс. Система, описанная в данной работе, разработана именно с помощью библиотеки Windows Forms.

Язык программирования C# претендует на подлинную объектную ориентированность.

Язык программирования C# призван реализовать компонентно-ориентированный подход к программированию, который способствует меньшей машинно-архитектурной зависимости результирующего программного кода, большей гибкости, переносимости и легкости повторного использования программ.

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

Расширенная поддержка событийно-ориентированного программирования.

Язык программирования C# является «родным» для создания приложений в среде Microsoft .NET, поскольку наиболее тесно и эффективно интегрирован с ней. Visual Studio- это версия Visual Studio и .NET Framework, которая поддерживает новые и улучшенные объекты, включает среду разработки с обновленным интерфейсом и отличается интегрированной поддержкой Microsoft SQL Server, позволяя создавать и развертывать проекты с применением сервера баз данных. Из инструмента программиста, пишущего и отлаживающего код, Microsoft Visual Studio, превратилась в полноценное инструментальное средство, позволяющее автоматизировать деятельность всех членов команды, работающих над проектом.

Интерфейс Visual Studio традиционно выполнен в одном стиле с MS Office. Имеется список задач, в который помещают информацию об ошибках и о необходимых доработках. Каждому пункту можно назначить приоритет, а после выполнения установить флажок, сообщающий о завершении указанной задачи. Task List поддерживает сортировку записей по тексту, по приоритету и статусу. Свойства проекта в Visual Studio можно редактировать с помощью встроенного инструмента, который позволяет изменять настройки и подписи сборки, ссылки на внешние модули, набор прав, необходимых для её функционирования. Кроме того, разработчик легко может сохранить настройки своего пользовательского IDE в файле настроек и применять его в случае перехода на другой компьютер. Разработчик баз данных может использовать объектно-ориентированные языки программирования, такие как C# и Visual Basic, опираясь на широчайший спектр встроенных возможностей классов и методов .NET Framework. Кроме того, программист может воспользоваться компонентами, написанными сторонними компаниями. С появлением SQL Server был усовершенствован механизм доступа к данным.

Классы и структуры являются двумя основными конструкциями системы общих типов CTS в платформе .NET Framework. Каждая по сути является структурой данных, инкапсулирующей набор данных и поведение, связанные как логическая единица. Данные и поведение являются членами класса или структуры, и в них включены методы, свойства, события и так далее.

Объявление класса или структуры подобно чертежу, который используется для создания экземпляров или объектов во время выполнения. При определении класса или структуры с именем Person, Person является именем типа. При объявлении или инициализации переменной p типа Person, p считается объектом или экземпляром Person. Возможно создание нескольких экземпляров одного типа Person, и каждый экземпляр может иметь разные значения в своих свойствах и полях.

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

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

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

  • public class Permissions : List<Permission>

{Permission this[string name]

{

{this.FirstOrDefault(tTemp => tTemp.name == name);

}

}

}class Permission

{string name;bool canRead;bool canEdit;bool canDelete;Permission(DataRow row)

{= row[«ОбъектДоступа»].ToString();= (row[«Чтение»].ToString() == «1»);= (row[«Изменение»].ToString() == «1»);= (row[«Удаление»].ToString() == «1»);

}

}

}

В процессе работы над дипломной работой была создана информационная система, которая обеспечивает:

— повышение эффективности управления;

— оптимизация процессов сбора, обработки, учета и контроля информации;

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

Система работает по принципу 1 автомобиль — 1 заказ-наряд на рисунке 3.1 схематично показано как формируется данный документ на автосервисе. Сначала собираются данные о заказчике и об автомобиле. Далее выбирается классификация ремонта. Потом каждому классу ремонта подбираются соответственно работы и детали. После всего этого список всех работ передается механику или автослесарю, а список необходимых деталей кладовщику.

 постановка задачи 16

Рисунок 3.1 — схема формирования заказ-наряда

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

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

 постановка задачи 17

Рисунок 3.2 — Форма авторизации

Необходимо выбрать сотрудника и ввести пароль. После нажатия клавиши «Ок» от пароля вычисляется хеш-функция и полученный результат сравнивается с данными в базе. Если авторизация проходит успешно, загружается рабочая форма сотрудника согласно его статусу. Посмотреть код программы можно в Приложении А.

Интерфейс генерального директора.

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

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

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

 постановка задачи 18

Рисунок 3.3 — Интерфейс генерального директора

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

 постановка задачи 19

Рисунок 3.4 — Форма оформления заказа

Для того, чтобы сформировать заказ-наряд, нужно просто нажать кнопку «заказ-наряд» и после оформления заказа появится документ на печать в формате html. На рисунке 3.5 показан пример заказ-накладной.

 постановка задачи 20

Рисунок 3.5 — Пример заказ-наряда

Из главного меню можно зайти в управление справочниками системы. Нажав пункт меню «Справочники» открывается форма изображенная на рисунке 3.6. В справочниках находятся данные о сотрудниках, клиентах, запасах, поставщиках, работах.

 постановка задачи 21

Рисунок 3.6 — Справочники

На рисунке 3.7 представлена форма для оформления поставки, в неё вносит данные мастер-приемщик. После сохранения данных, в вкладку «остатки запасов» автоматически вносятся принятые мастером-приемщиком материалы.

 постановка задачи 22

Рисунок 3.7 — Форма оформления поставки

Система предоставляет отчет по задаваемому периоду. (рисунок 3.8, рисунок 3.9)

 постановка задачи 23

Рисунок 3.8 — Форма «отчет»

 постановка задачи 24

Рисунок 3.9 — Отчет

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

4. Расчет экономических показателей

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

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

СОСОМО (от Constructive COst MOdel — конструктивная стоимостная модель) является статистической моделью, так как основана на опыте реализации многих программных проектов. Она создана посредством сбора данных о большом количестве проектов и анализа этой информации, в результате чего получены формулы, наилучшим образом аппроксимирующие имеющиеся данные. Модель СОСОМО:

— имеет хорошую техническую документацию, общедоступна, существуют коммерческие программные средства ее поддержки;

— популярна и ценится среди широкого круга пользователей;

— прошла достаточно долгий путь развития, начиная с 1981 года.

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

Модель СОСОМО 2 охватывает три описанных ниже уровня:

— уровень предварительного прототипирования. Для определения необходимых затрат осуществляется оценка размера системы на основе объектных точек прототипа с помощью простой формулы «размер-производительность»;

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

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

Расчет экономических показателей по методу СОСОМО

В моем проекте пятнадцать форм, пять из них средней сложности (запросы к БД), один отчет и шесть программных модулей на языке С#. Процент повторного использования кода программы — 5%.

Формула для предварительного определения объема работ будет выглядеть так:

PM=(NOP * (1- PROCM/100)) / PROD

где PM — это затраты, выраженные в человеко-месяцах;

  • NOP — количество объектных точек;
  • PROCM — процент многократного использования кода;
  • PROD — производительность, как показано на таблице 4.1.

Таблица 4.1 — Уровни производительности

Опыт и возможности программиста

Очень низкие

Низкие

Средние

Высокие

Очень высокие

Уровень и возможности CASE-средств

Очень низкие

Низкие

Средние

Высокие

Очень высокие

Производительность (количество объектных точек в месяц)

4

7

13

25

50

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

Таблица 4.2 — Характеристика проекта

№ п/п

Наименование объекта

Уровень сложности

Количество

Число точек

1

Форма

Средний

5

10

2

Форма

Простой

10

10

3

Отчет

Средний

1

5

4

Модуль

6

60

Всего

31

85

Определим затраты на уровне прототипирования, приняв среднюю производительность программиста 13 точек в месяц ( смотрите таблицу 4.1):

PM=(NOP(1-PROCENT/100))/PROD=85(1 — 5/100)) / 13 = 6,2 (чел/мес.).

Определим длительность выполнения проекта на уровне прототипирования:

TDEV = 3 (PM) (0,33+0,2(В-1,01)) = 3*6,2(0,33+0,2 (1-1,01) = 3*1,8 = 5,4 (мес.),

где В = 1.

2 Уровень предварительного проектирования

Определим показатель степени В на основе следующих данных (таблица 4.3).

Таблица 4.3 — данные для расчета показателя степени В

Пояснение

Балл

Новизна проекта

Опыт работы в данной предметной области небольшой

4

Гибкость процесса разработки

Взаимодействие с заказчиком слабое

1

Анализ архитектуры системы и риска

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

3

Сплоченность команды

Сплоченность высока я, так как работает один программист

1

Уровень зрелосьти процесса разработки

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

5

Всего баллов

14

В= 1,01 +14/100 = 1,15.

Определим множитель на основе следующих данных (таблица 4.4).

Таблица 4.4 — Таблица показателей

Фактор

Оценка

Балл

RCPX — надежность и уровень сложности системы

Средняя

1

RUSE — повторная используемость компонентов

Низкая

1

PDIF — сложность платфомы разработки

Ниже среднего

1

PERS — возможности персонала

Средняя

1

PREX — опыт персонала

Высокий

1.2

SCED — график работ

Полный

1

FCIL — средства поддержки

Средняя

1.1

М=RCPX*RUSE*PDIF*PERS*PREX*SCED*FCIL=1*1*1*1*1,2*1*1,1=1,32

Затраты на автоматическую генерацию кода PMm = 0.

Определим размер программы, приняв число строк кода на одну объектную точку раным 50:

RAZMER = 50*85 = 4,25 тыс. строк.

Определим затраты

PM = 2,5 * RAZMERB * M+ PMm = 2,5*4,251,15 * 1,32 = 17,49 (чел/мес.).

Определим длительность выполнения проекта на уровне прототипирования

TDEV = 3*(PM) (0,33+0,2(В-1,01)) = 3* 17,49(0,33+0,2(1,15-1,01)) = 8,34(мес.).

Находим значение М, учитывая следующие факторы — сомножители на таблице 4.5.

Таблица 4.5 — Факторы-сомножители

Фактор

Оценка

Множитель затрат М

Факторы продукта

RELY, требуемая надежность ПО.

Ниже среднего

0,9

DATA, размер базы данных

Средняя

1

CPLX, сложность продукта

Ниже среднего

0,73

RUSE, требуемая повторная используемость

Низкая

0,95

DOCU, документирование требований жизненного цикла

Низкий

0,81

Факторы платформы

TIME, ограничения времени выполнения

Средняя

1

STOR, ограничения оперативной памяти

Номинальный. Используется не более 50% доступной информации

1

PVOL, изменчивость платформы

Низкая

0,87

Факторы персонала

ACAP, возможности аналитика

Номинальный. 60%

0,85

PCAP, возможности программиста

Номинальный. 60%

0,85

AEXP, опыт работы с приложением

Номинальный

0,9

PEXP, опыт работы с платформой

Номинальный

0,95

LTEX, опыт работы с языком и утилитами

Номинальный

0,9

PCON, непрерывность персонала

Номинальный

1

Факторы проекта

TOOL, использование программных утилит

Номинальный

1

SITE, мультисетевая разработка

Номинальный

1

SCED, требуемый график разработки

Выше среднего

1,2

М = 0,9 х 1 х 0,73 х 0,95 х 0,81 х 1 х 1 х 0,87 х 0,85 х 0,85 х х 0,9 х 0,95 х 0,9 х 1 х 1 х 1 х 1,2 = 0,293.

Значения показателя степени и размера программы берем из предыдущего пункта расчета:

В = 1,15; РМm = 0; RAZMER = 4,25,

РМ = 2,5 *RAZMERB *М + РМm = 2,5 * 4,251,15 * 0,293 = 3,87 (чел/мес.).

Определим длительность выполнения проекта на постархитектурном уровне:

TDEV = 3 * (PM) (0,33+0,2(В-1,01))= 3*3,87(0,33+0,2(1,15-1,01))= 4,87 (мес.).

Найдем оценку стоимости проекта, считая стоимость затрат на один человеко-месяц равной 30000 руб.:

SC = TDEV х ZATRAT = 4,87 х 30 000 = 146 100 руб.

Заключение

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

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

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

автосервис заказ архитектура реляционный

Список литературы

[Электронный ресурс]//URL: https://obzone.ru/diplomnaya/po-dlya-avtoservisa/

1. Администрирование Microsoft SQL Server 2000. Учебный курс MCSA/MCSE, MCDBA.- Москва: Русская Редакция 2003.

. Гайдамакин Н. А., Автоматизированные информационные системы, базы и банки данных. Вводный курс: Учебное пособие. — М.: Гелиос АРВ, 2002. — 368 с., ил.

. Петров В. Н., Информационные системы, Учебник 2 изд., (Серия «Учебное пособие») изд. ПИТЕР, 2006г., 656 стр.

. Характеристики программного обеспечения «LogicStar Avto» Электронный ресурс — www.logicstars.ru

. Характеристики программного обеспечения «Альфа-Авто», разработанный на платформе «1С:Предприятие 8.0» Электронный ресурс — www.rarus.ru/products/soft/146

. Характеристики программного обеспечения «TurboService» Электронный ресурс — www.turboservice.ru

. Администрирование Microsoft SQL Server 2000. Учебный курс MCSA/MCSE, MCDBA.- Москва: Русская Редакция 2003.

. Сайт по SQL и клиент/серверной технологии [Электронный ресурс]. — Режим доступа: http://www.sql.ru/, свободный.

. Проектирование и реализация БД MS SQL Server 2000. Учебный курс MCSA/MCSE, MCDBA.- Москва: Русская Редакция 2003 издание 2-е, исправленное.

. Официальный сайт LogicStars. http://www.logicstars.ru/

. Официальный сайт 1С-Рарус. https://rarus.ru/1c-auto/1c8-alfa-avto-4/

Приложение А

Программный код

///Represents the strongly named DataTable class.

///</summary>

[global::System.Serializable()]

[global::System.Xml.Serialization.XmlSchemaProviderAttribute(«GetTypedTableSchema»)]partial class КлиентыDataTable : global::System.Data.TypedTableBase<КлиентыRow> {global::System.Data.DataColumn columnКодКлиента;global::System.Data.DataColumn columnНаименование;global::System.Data.DataColumn columnКонтакты;global::System.Data.DataColumn columnПримечание;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыDataTable() {.TableName = «Клиенты»;.BeginInit();.InitClass();.EndInit();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыDataTable(global::System.Data.DataTable table) {.TableName = table.TableName;((table.CaseSensitive != table.DataSet.CaseSensitive)) {

this.CaseSensitive = table.CaseSensitive;

}((table.Locale.ToString() != table.DataSet.Locale.ToString())) {

this.Locale = table.Locale;

}((table.Namespace != table.DataSet.Namespace)) {

this.Namespace = table.Namespace;

}.Prefix = table.Prefix;.MinimumCapacity = table.MinimumCapacity;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :

base(info, context) {.InitVars();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn КодКлиентаColumn {{

return this.columnКодКлиента;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn НаименованиеColumn {{

return this.columnНаименование;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn КонтактыColumn {{

return this.columnКонтакты;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn ПримечаниеColumn {{

return this.columnПримечание;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]

[global::System.ComponentModel.Browsable(false)]int Count {{

return this.Rows.Count;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыRow this[int index] {{

return ((КлиентыRow)(this.Rows[index]));

}

}

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event КлиентыRowChangeEventHandler КлиентыRowChanging;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute «System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event КлиентыRowChangeEventHandler КлиентыRowChanged;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event КлиентыRowChangeEventHandler КлиентыRowDeleting;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event КлиентыRowChangeEventHandler КлиентыRowDeleted;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void AddКлиентыRow(КлиентыRow row) {.Rows.Add(row);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыRow AddКлиентыRow(string Наименование, string Контакты, string Примечание) {

КлиентыRow rowКлиентыRow = ((КлиентыRow)(this.NewRow()));[] columnValuesArray = new object[] {

null,

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

Контакты,

Примечание};КлиентыRow.ItemArray = columnValuesArray;.Rows.Add(rowКлиентыRow);rowКлиентыRow;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыRow FindByКодКлиента(int КодКлиента) {((КлиентыRow)(this.Rows.Find(new object[] {

КодКлиента})));

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataTable Clone() {

КлиентыDataTable cln = ((КлиентыDataTable)(base.Clone()));.InitVars();cln;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataTable CreateInstance() {new КлиентыDataTable();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void InitVars() {.columnКодКлиента = base.Columns[«КодКлиента»];.columnНаименование = base.Columns[«Наименование»];.columnКонтакты = base.Columns[«Контакты»];.columnПримечание = base.Columns[«Примечание»];

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void InitClass() {.columnКодКлиента = new global::System.Data.DataColumn «КодКлиента», typeof(int), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnКодКлиента);.columnНаименование = new global::System.Data.DataColumn «Наименование», typeof(string), null, global:: ystem.Data.MappingType.Element);.Columns.Add(this.columnНаименование);.columnКонтакты = new global::System.Data.DataColumn «Контакты», typeof(string), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnКонтакты);.columnПримечание = new global::System.Data.DataColumn «Примечание», typeof(string), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnПримечание);.Constraints.Add(new global::System.Data.UniqueConstraint «Constraint1», new global::System.Data.DataColumn[] {

this.columnКодКлиента}, true));.columnКодКлиента.AutoIncrement = true;.columnКодКлиента.AutoIncrementSeed = -1;.columnКодКлиента.AutoIncrementStep = -1;.columnКодКлиента.AllowDBNull = false;.columnКодКлиента.ReadOnly = true;.columnКодКлиента.Unique = true;.columnНаименование.AllowDBNull = false;.columnНаименование.MaxLength = 100;.columnКонтакты.MaxLength = 200;.columnПримечание.MaxLength = 200;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]КлиентыRow NewКлиентыRow() {((КлиентыRow)(this.NewRow()));

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {new КлиентыRow(builder);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Type GetRowType() {typeof(КлиентыRow);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {.OnRowChanged(e);((this.КлиентыRowChanged != null)) {

this.КлиентыRowChanged(this, new КлиентыRowChangeEvent(((КлиентыRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {.OnRowChanging(e);((this.КлиентыRowChanging != null)) {

this.КлиентыRowChanging(this, new КлиентыRowChangeEvent(((КлиентыRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {.OnRowDeleted(e);((this.КлиентыRowDeleted != null)) {

this.КлиентыRowDeleted(this, new КлиентыRowChangeEvent(((КлиентыRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {.OnRowDeleting(e);((this.КлиентыRowDeleting != null)) {

this.КлиентыRowDeleting(this, new КлиентыRowChangeEvent(((КлиентыRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();ds = new MyDataSet();::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();.Namespace = «http://www.w3.org/2001/XMLSchema»;.MinOccurs = new decimal(0);.MaxOccurs = decimal.MaxValue;.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;.Items.Add(any1);::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();.Namespace = «urn:schemas-microsoft-com:xml-diffgram-v1»;.MinOccurs = new decimal(1);.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;.Items.Add(any2);::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();.Name = «namespace»;.FixedValue = ds.Namespace;.Attributes.Add(attribute1);::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();.Name = «tableTypeName»;.FixedValue = «КлиентыDataTable»;.Attributes.Add(attribute2);.Particle = sequence;::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();(xs.Contains(dsSchema.TargetNamespace)) {

global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();

global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();

try {

global::System.Xml.Schema.XmlSchema schema = null;

dsSchema.Write(s1);

for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {

schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));

s2.SetLength(0);

schema.Write(s2);

if ((s1.Length == s2.Length)) {

s1.Position = 0;

s2.Position = 0;

for (; ((s1.Position != s1.Length)

&& (s1.ReadByte() == s2.ReadByte())); ) {

;

}

if ((s1.Position == s1.Length)) {

return type;

}

///Represents the strongly named DataTable class.

///</summary>

[global::System.Serializable()]

[global::System.Xml.Serialization.XmlSchemaProviderAttribute(«GetTypedTableSchema»)]partial class МестаХраненияDataTable : global::System.Data.TypedTableBase<МестаХраненияRow> {global::System.Data.DataColumn columnКодМестаХранения;global::System.Data.DataColumn columnНаименование;global::System.Data.DataColumn columnПримечание;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияDataTable() {.TableName = «МестаХранения»;.BeginInit();.InitClass();.EndInit();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияDataTable(global::System.Data.DataTable table) {.TableName = table.TableName;((table.CaseSensitive != table.DataSet.CaseSensitive)) {

this.CaseSensitive = table.CaseSensitive;

}((table.Locale.ToString() != table.DataSet.Locale.ToString())) {

this.Locale = table.Locale;

}((table.Namespace != table.DataSet.Namespace)) {

this.Namespace = table.Namespace;

}.Prefix = table.Prefix;.MinimumCapacity = table.MinimumCapacity;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :

base(info, context) {.InitVars();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn КодМестаХраненияColumn {{

return this.columnКодМестаХранения;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn НаименованиеColumn {{

return this.columnНаименование;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]global::System.Data.DataColumn ПримечаниеColumn {{

return this.columnПримечание;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]

[global::System.ComponentModel.Browsable(false)]int Count {{

return this.Rows.Count;

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияRow this[int index] {{

return ((МестаХраненияRow)(this.Rows[index]));

}

}

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event МестаХраненияRowChangeEventHandler МестаХраненияRowChanging;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event МестаХраненияRowChangeEventHandler МестаХраненияRowChanged;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event МестаХраненияRowChangeEventHandler МестаХраненияRowDeleting;

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]event МестаХраненияRowChangeEventHandler МестаХраненияRowDeleted;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void AddМестаХраненияRow(МестаХраненияRow row) {.Rows.Add(row);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияRow AddМестаХраненияRow(string Наименование, string Примечание) {

МестаХраненияRow rowМестаХраненияRow = ((МестаХраненияRow)(this.NewRow()));[] columnValuesArray = new object[] {

null,

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

Примечание};МестаХраненияRow.ItemArray = columnValuesArray;.Rows.Add(rowМестаХраненияRow);rowМестаХраненияRow;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияRow FindByКодМестаХранения(int КодМестаХранения) {((МестаХраненияRow)(this.Rows.Find(new object[] {

КодМестаХранения})));

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataTable Clone() {

МестаХраненияDataTable cln = ((МестаХраненияDataTable)(base.Clone()));.InitVars();cln;

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataTable CreateInstance() {new МестаХраненияDataTable();

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void InitVars() {.columnКодМестаХранения = base.Columns[«КодМестаХранения»];.columnНаименование = base.Columns[«Наименование»];.columnПримечание = base.Columns[«Примечание»];

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void InitClass() {.columnКодМестаХранения = new global::System.Data.DataColumn «КодМестаХранения», typeof(int), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnКодМестаХранения);.columnНаименование = new global::System.Data.DataColumn («Наименование», typeof(string), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnНаименование);.columnПримечание = new global::System.Data.DataColumn(«Примечание», typeof(string), null, global::System.Data.MappingType.Element);.Columns.Add(this.columnПримечание);.Constraints.Add(new global::System.Data.UniqueConstraint(«Constraint1», new global::System.Data.DataColumn[] {

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]МестаХраненияRow NewМестаХраненияRow() {((МестаХраненияRow)(this.NewRow()));

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {new МестаХраненияRow(builder);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override global::System.Type GetRowType() {typeof(МестаХраненияRow);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {((this.МестаХраненияRowChanged != null)) {

this.МестаХраненияRowChanged(this, new МестаХраненияRowChangeEvent(((МестаХраненияRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {.OnRowChanging(e);((this.МестаХраненияRowChanging != null)) {

this.МестаХраненияRowChanging(this, new МестаХраненияRowChangeEvent(((МестаХраненияRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {.OnRowDeleted(e);((this.МестаХраненияRowDeleted != null)) {

this.МестаХраненияRowDeleted(this, new МестаХраненияRowChangeEvent(((МестаХраненияRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {.OnRowDeleting(e);((this.МестаХраненияRowDeleting != null)) {

this.МестаХраненияRowDeleting(this, new МестаХраненияRowChangeEvent(((МестаХраненияRow)(e.Row)), e.Action));

}

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]void RemoveМестаХраненияRow(МестаХраненияRow row) {.Rows.Remove(row);

}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.CodeDom.Compiler.GeneratedCodeAttribute(«System.Data.Design.TypedDataSetGenerator», «4.0.0.0»)]static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();ds = new MyDataSet();::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();.Namespace = «http://www.w3.org/2001/XMLSchema»;.MinOccurs = new decimal(0);.MaxOccurs = decimal.MaxValue;.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;.Items.Add(any1);::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();.Namespace = «urn:schemas-microsoft-com:xml-diffgram-v1»;.MinOccurs = new decimal(1);.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;.Items.Add(any2);::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();.Name = «namespace»;.FixedValue = ds.Namespace;.Attributes.Add(attribute1);::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();.Name = «tableTypeName»;.FixedValue = «МестаХраненияDataTable»;.Attributes.Add(attribute2);.Particle = sequence;::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();(xs.Contains(dsSchema.TargetNamespace)) {

global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();

global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();

try {

global::System.Xml.Schema.XmlSchema schema = null;

dsSchema.Write(s1);

for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {

schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));

s2.SetLength(0);

schema.Write(s2);

if ((s1.Length == s2.Length)) {

s1.Position = 0;

s2.Position = 0;

for (; ((s1.Position != s1.Length)

&& (s1.ReadByte() == s2.ReadByte())); ) {

;

}

if ((s1.Position == s1.Length)) {

return type;

}

}

}

finally {

if ((s1 != null)) {

s1.Close();

}

if ((s2 != null)) {

s2.Close();

}