Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

«Проектирование реализации операций бизнес-процесса «Взаиморасчеты с клиентами»» .

Содержание:

Введение

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

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

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

Целью проекта является разработка автоматизированной системы взаиморасчеты с клиентами фитнес клуба «Фитнес клаб»

Для достижения цели были сформулированы и решены следующие задачи:

1. Выполнен анализ характеристик объекта автоматизации. Изучен организационная и функциональная структура предприятия.

2. Систематизирован документооборот.

3. Изучен процесс функционирования предприятия. Разработана функциональная модель существующей системы.

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

5. Разработано техническое задание на разработку экономической информационной системы.

6. Разработано алгоритмическое и программное обеспечение системы.

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

8. Разработана системы защиты информации.

9. Внедрена автоматизированная система.

10. Расчитаны показатели экономической эффективности внедрения данной системы.

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

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

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

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

1 Аналитическая часть

1. 1 Выбор комплекса задач автоматизации и характеристика существующих бизнес процессов

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

Система должна выдавать отчеты по запросу менеджера: учета посещений клиентов, расписание, учет свободного времени, отчеты по загрузкам тренера и помещений.

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

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

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

- Данные о тренере (номер тренера, Ф.И.О., адрес, телефон, возраст);

- Данные о помещении (номер помещения, название помещения, вид проводимых занятий, этаж);

- Данные о группе (номер группы, название группы, специализация);

- Данные о посетителях (номер посетителя, Ф.И.О., название группы);

- Расписание (номер времени, номер тренера, номер помещения, номер группы).

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

- Таблица расписания для помещений (день недели, время, тренер, вид спортивного занятия, группа);

- Таблица расписания для групп (день недели, время, название помещения, тренер);

- Таблица расписания тренеров (день недели, время, номер помещения, группа);

- Таблица учета свободного времени для помещений и тренеров (день недели, время);

- Отчет по помещениям (название помещения, количество пар за неделю, вид занятия);

- Отчет по группам (название группы, количество человек в группе);

- Отчет по тренерам (Ф.И.О., количество пар за неделю, время работы за неделю);

- Информационная таблица обо всех помещениях (название помещения, вид занятия, этаж);

- Информационная таблица обо всех группа (название группы, специализация);

- Информационная таблица обо всех тренерах (Ф.И.О., адрес, телефон, возраст);

- Информационная таблица обо всех посетителях (Ф.И.О., группа).

1.2 Характеристика существующих бизнес –процессов

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

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

Рисунок 1.4 - Структурная функциональная модель деятельности (IDEF0)

а

б

в

г

д

е

ж

з

Рисунок 1.5 - Функциональная модель деятельности в виде иерархии потоков данных (DFD)

1.3 Характеристика документооборота, возникающего при решении задачи

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

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

Рассмотрим порядок взаиморасчеты с клиентами в ООО «Фитнес клаб».

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

Самыми затратными по временным и трудовым ресурсам среди описанных выше составляющих процесса взаиморасчеты с клиентами в ООО «Фитнес клаб» являются определение общих фактических результатов продажи за всю компанию.

В связи с обнаруженными недостатками в работе предприятия, в частности при учете услуг, руководством принято решение об автоматизации процессов взаиморасчеты с клиентами в ООО «Фитнес клаб» [13].

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

Сравнение основных операций при приеме заказа без применения средств автоматизации и в предлагаемом варианте по трудовым и стоимостным затратам приведено в таблице 1.6 и таблице 1.7.(с учетом средней заработной платы менеджера 25000 в месяц).

Таблица 1.6

Временные и стоимостные затраты при существующем варианте

Наименование операции

Количество, в рабочий день

Затрачиваемое время на одну, мин

Итого в рабочий день, минут

Стоимостная оценка, рублей

Сбор данных

4

10

40

99,2

Проверка данных

4

30

120

297,6

Формирование отчетов

8

40

320

793,6

Учет отчета

4

15

60

148,8

Итого:

540

1339,2

Таблица 1.7

Временные и стоимостные затрат при планируемом варианте

Наименование операции

Количество, в рабочий день

Затрачиваемое время на одну, мин

Итого в рабочий день, минут

Стоимостная оценка, рублей

Сбор данных

4

1

4

9,92

Проверка данных

4

1

4

9,92

Формирование отчетов

4

10

40

99,2

Учет отчета

4

10

40

99,2

Итого:

88

218,24

Как видно из приведенных выше таблиц, временные затраты должны сократиться на 540-88=452 минуты=7, 5 часов и 1339-218=1121 рубль в сутки. Следовательно, внедрение такой системы является однозначно выгодным с точки зрения оптимизации расхода трудовых и стоимостных ресурсов.

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

Рисунок 1.6 – Схема документооборота

1.4 Обоснование проектных решений по информационному обеспечению

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

ОКУД - Общероссийский классификатор управленческой документации;

ОКОПФ - Общероссийский классификатор организационно-правовых форм [4].

При разработке системы должна использоваться реляционная модель базы данных. Реляционная модель данных некоторой предметной области представляет собой набор отношений изменяющихся во времени. При создании информационной системы совокупность отношений позволяет хранить данные об объектах предметной области, моделировать связи между ними. При этом сами данные хранятся в таблицах [6]. Для удобства идентификации каждая таблица созданной базы данных обладает уникальным кодом.

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

1.5 Обоснование проектных решений по программному обеспечению

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

- операционные системы семейства Windows от фирмы Microsoft (Windows XP/Vista/Seven),

- операционные системы Linux/BSD семейства (UNIX подобные) от различных фирм – разработчиков [13].

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

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

Сравнение операционных систем приведено в таблице 1.9.

Таблица 1.9

Сравнение характеристик наиболее распространенных пользовательских ОС

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

Windows 7

Linux

Mac OS X Snow Leopard 10.6

Минимальные системные требования

Процессор

1 ГГц или выше 32- (x86) или 64-разрядный (x64)

500 МГц — 1 ГГц

300 МГц

ОЗУ

1 ГБ (32-разрядная система) / 2 Гб (64-разрядная система)

256 МБ (alternate-установка) / 384 МБ (стандартная установка)

192 МБ (32-разрядная версия) / 256 МБ (64-разрядная версия)

Свободное место на диске

16 ГБ (32-разрядная система) / 20 ГБ (64-разрядная система)

3-5 ГБ (в зависимости от разновидности)

2-3 ГБ

Видеокарта

Графический процессор DirectX 9 с драйвером WDDM 1.0 или более старшей версии

Super VGA (800x600/1024x768) из числа поддерживаемых системой

VGA (640 x 480)

Другие характеристики

Встроенное офисное ПО

-

+

-

Высокий уровень безопасности и защиты от вирусов и т.п.

-

+

-

Наличие 64-битной версии

-

+

+

Удобная работа с устройствами хранения данных

+

-

+

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

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

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

В работе был выбран язык программирования 1С, который был специально создан для ведения бухгалтерского учета и используется в программном продукте «1С предприятие». Данный язык является предметно-ориентированным языком высокого уровня. Встроенный язык имеет много общего с другими языками, такими как Java Script, Basic, что упрощает его освоение начинающим разработчикам. Приведу наиболее значимые особенности встроенного языка: предварительная компиляция, кэширование скомпилированных модулей в памяти, мягкая типизация также. Также язык 1С обладает очень интересной и для некоторых удобной особенностью: доступен двуязычный синтаксис команд: русский и английский. Русский язык программирования сильно удивляет новичков в сфере 1С программирования. При этом стоит отметить, что система «1С предприятие» является открытой для доработки и самостоятельной разработки, что позволяет достичь большой гибкости в организации системы.

Для разработки системы автоматизации мы разрабатываем модуль (конфигурацию) в системе 1С:Предприятие 8.2.

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

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

В обновлённой версии 1С:Предприятие 8.2. принципиально переработан механизм установки, запуска и обновления платформы. Предприняты существенные усилия для повышения удобства развертывания системы в крупных организациях.

Области применения

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

Клиентское приложение

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

Толстый клиент позволяет использовать все возможности 1С:Предприятие 8.2 в плане исполнения прикладного кода, но он не поддерживает работу с информационными базами через интернет.

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

Веб клиент не требует предварительной установки ко ПК и используется в среде интернет-браузера, что позволяет работать на любой платформе.

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

Благодаря этим механизмам ориентированных на быструю разработку и удобство пользовательского интерфейса делают систему 1С:Предприятие 8.2. очень удобной для разработки прикладных решений, что мы и будем делать в нашей работе.

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

Групповая разработка (Team Development). Механизмы конфигуратора, обеспечивающие групповую разработку прикладного решения, позволяют группе разработчиков вносить изменения в конфигурацию одновременно, по мере выполнения каждым из них своего участка работы. Такой порядок внесения изменений обеспечивается возможностью определить права доступа каждого из разработчиков на модификацию объектов прикладного решения: (рис. 1.7). 

Рисунок 1.7 - Модель групповой разработки

Облачные технологии (Cloud Computing)

Значение «облако» используется в IT технологиях как метафора.

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

  • Подключение к базе по протоколу HTTP (HTTPS) что дает возможность клиенту работать через интернет в любой точке мира.
  • Благодаря веб-клиенту пользователь может работать с любого компьютера или мобильного так это не требует предворительной установки.
  • Благодаря современным серверам и их защите 1С Предприятие может поддерживать большое количество пользователей.
  • Технология разделения данных с помощью которой прикладные решения могут работать в архитектуре multitenancy, это когда одно приложение запущенное на сервере обслуживает множество пользователей.
  • 1С Предприятие позволяет развертывать приложения в модели SaaS Когда программист разрабатывает и самостоятельно управляет прикладным решением, предоставляя клиенту доступ через интернет, такая бизнес-модель избавляет потребителя от всех затрат, связанных с установкой, обновлением и поддержкой оборудования и программного обеспечения; потребитель оплачивает лишь пользование услугой.

Трёхуровневая архитектура

При данном варианте реализации программный комплекс состоит из трех уровней: Клиент, Сервер «1С предприятия», Сервер SQL.
Примечание: аббревиатура SQL расшифровывается как Structure Query Language, что переводится как Структурированный Язык Запросов, но часто используется для обозначения типа сервера.

Главное назначение этого варианта построения – это повышение надежности и производительности. Самыми известными сторонними программами являются: MS SQL Server, PostgreSQL, причём последняя бесплатная и поставляется на дисках ИТС.

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

  • Клиент – это то, что связано с выводом на экран монитора
  • Сервер 1С – запрос информации к серверу SQL на языке SQL, наложение ограничений прав пользователей на полученную информацию
  • Сервер SQL – хранение и изменение информации.

В результате анализа выбрано 1С Предприятие 8.2 для разработки интерфейса и БД информационной системы.

2 Проектная часть

2.1 Информационная модель и её описание

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

В качестве информационной модели будем использовать схему данных (ГОСТ 19.701-90). Схемы данных отображают путь данных при решении задач и определяют этапы обработки, а также различные применяемые носители данных. Схема данных состоит из следующих элементов:

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

Весь цикл обработки информации можно разбить на два этапа:

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

Графическое представление информационной модели отражено на рис. 2.4.

Рисунок 2.4 - Информационная модель системы взаиморасчеты с клиентами в ООО «Фитнес клаб»

2.2 Характеристика нормативно-справочной, входной и оперативной информации

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

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

Разработанная модель находится в 3-й нормальной форме, так как:

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

2.3 Характеристика результатной информации

В ходе деятельности разработанной системы взаиморасчеты с клиентами в ООО «Фитнес клаб» формируются следующие выходные документы:

  • Отчеты;

2.4 Общие положения (дерево функций и сценарий диалога)

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

Взаимодействие с пользователем осуществляется посредством экранных форм. Дерево диалога (граф перехода экранных форм) приведено на рисунке 2.5.

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

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

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

Состав и классификация функций разрабатываемого программного продукта представлены в виде дерева функций (рис. 2.5).

Рисунок 2.6 – Дерево функций ИС

Сценарий диалога представлен на рисунке 2.6.

Рисунок 2.6 – Диалог с ИС

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

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

2.5 Характеристика базы данных

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

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

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

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

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

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

Помещение (код помещения, название, вид занятий, этаж). Объект содержит информацию о помещениях, в которых проводятся занятия.

Тренер (код тренера, Ф.И.О., адрес, телефон, возраст). Объект содержит информацию о тренерах, работающих в спорткомплексе.

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

Посетитель (код посетителя, код группы, Ф.И.О.). Объект содержит информацию обо всех посетителях, которые подразделены на группы.

День недели (код дня, день недели). Объект хранит все дни недели, в которые работает спорткомплекс.

Время (код времени, время). Объект хранит информацию о времени начала и окончания занятий.

Для системы были выделены следующие сущности: «Помещение», «Тренер», «Группа», «Посетитель», «Расписание», «День и время», «День проведения занятий» и «Время проведения занятий». Рассмотрим наглядно взаимодействие этих сущностей. Для этого построим ERD-модель данных (Рисунок 2.7).

Рисунок 2.7 – Инфологическая схема (ER-модель)

Связи между сущностями:

Сущность «группа» связана (М:М) с «посетителями», один посетитель может находиться в нескольких группах.

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

Сущность «тренер» связана (1:М) с «расписанием» значит для определенного тренера может быть сформировано расписание с разными группами, помещениями, днями недели и временем.

Сущность «помещение» связана (1:М) с «расписанием» значит, в определенном помещении могут заниматься множество групп с различными тренерами, и в разные дни недели и время.

Сущности «день проведения занятий» и «время проведения занятий» связаны (1:M) c сущностью «день и время», каждый рабочий день недели содержит все промежутки времени начала и окончания занятий.

Сущность «день и время» связано (1:М) с «расписанием», расписание содержит разные дни недели и разное время занятий проводимых в спорткомплексе для всех подразделений.

Сущность «группа» связана (1:М) с сущностью «вид спортивного занятия», группа занимается определенным видом спорта.

Анализируя каждую сущность и связи между ними, создадим необходимые таблицы базы данных (Таблица 2.2).

Таблица 2.2

Таблицы базы данных

Таблица

Описание

Имя поля

Тип и длина

Описание

Auditorium

Помещения

Id_auditorium

Autoincrement

Ключевое поле

Name

Varchar (10)

Название

type_occupation

Varchar (15)

Вид занятий

Floor

Int (5)

Этаж

Capacity

Int(5)

Вместимость

Group_off_student

Группы

Id_group

Autoincrement

Ключевое поле

Name

Varchar (10)

Название

Id_sports

Int(11)

Код вида

Мax_kol

Int(5)

Количество

Teacher

Тренеры

Id_teacher

Autoincrement

Ключевое поле

Name

Varchar (15)

Имя

Surname

Varchar (15)

Фамилия

Patronymic_name

Varchar (15)

Отчество

Address

Varchar (30)

Адрес

Telephone

Int (15)

Телефон

Age

Varchar (10)

Возраст

Vid sporta

Varchar (15)

Вид занятий

Student

Посетители

Id_student

Autoincrement

Ключевое поле

Id_group

Int (11)

Id группы

Name

Varchar (15)

Имя

Surname

Varchar (15)

Фамилия

Patronymic_name

Varchar (15)

Отчество

Raspisanie

Расписание

Id_raspisanie

Autoincrement

Ключевое поле

Id_timeweekday

Int (11)

Id дата и время

Id_auditorium

Int (11)

Id помещения

Id_teacher

Int (11)

Id тренера

Id_group

Int (11)

Id группы

Weekday

Дни недели

Id_weekday

Autoincrement

Ключевое поле

Weekday

Varchar (11)

День недели

Time

Время

Id_time

Autoincrement

Ключевое поле

time

Varchar (20)

Время

Time_off_weekday

Время дня недели

Id_timeweekday

Autoincrement

Ключевое поле

Id_weekday

Int (11)

Id дня недели

Id_time

Int (11)

Id времени

Sports

Виды спора

Id_sports

Autoincrement

Ключевое поле

Sports

Varchar (20)

Вид занятия

2.6 Структурная схема пакета (дерево вызова программных модулей)

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

  • справочники
  • документы
  • отчеты
  • обработки
  • регистры.

Следовательно, структуру программы можно описать следующими основными блоками представленными на рисунке 2.8 .

Рисунок 2.8 - Блок-схема основных модулей программы

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

Описание программных модулей представлено в таблице 2.3.

Таблица 2.3

Описание программных модулей

№ п/п

Наименование модуля

Функции модуля

Документы

Совокупность алгоритмов, выполняющих учет посещений клиентов- основную функцию системы

Регистры

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

Отчеты и обработки

Позволяет получить отчеты

Справочники и перечисления

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

Главные модули

Обеспечивает работу системы

2.7 Описание программных модулей

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

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

Программа состоит из следующих основных модулей.

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

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

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

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

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

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

Параметры (входные документы ) – входные данные, полученные в виде конкретных значений, переданных в оперативной памяти смежным модулям (функциям ).

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

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

Рисунок 2.9 - Блок-схема работы приложения

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

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

- внесение необходимых изменений в базу данных.

2.8 Контрольный пример реализации проекта

Справочники

В справочнике Сотрудники указываются ФИО сотрудника, помещение, специализация

Рисунок 2.10 - Справочники

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

Рисунок 2.11 - Справочник Физические лица

Рисунок 2.12 – Физическое лицо

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

Рисунок 2.13 - Справочнике помещения

Рисунок 2.14 - Помещения

В справочнике Специализации указываются наименования занятий и их цветовое решение

Рисунок 2.15 - Справочник специализация

Рисунок 2.16 - Специализации

Документы

В журнале Документы Событие содержится список документов Событие с колонками: дата, номер, группа, начало события, окончание события, сотрудник, дата события

Рисунок 2.17 - Расписание

В документе заполняются поля:

Рисунок 2.18 - Событие

Отчет

В отчете Расписание выводятся помещения, сотрудники, занятия

Рисунок 2.19 - Отчет расписание выводятся помещения, сотрудники, занятия

Также в отчете с помощью контекстного меню можно создать событие, копировать и вставить событие

Рисунок 2.20 - Создать событие

Отчет по загруженности помещений

Рисунок 2.21 - Отчет по загруженности помещений

Отчет по посещаемости занятий

Рисунок 2.22 - Отчет по посещаемости занятий

Рисунок 2.23 - Отчет об исполнении

Заключение

В работе была спроектирована и разработана автоматизированная информационная система взаиморасчеты с клиентами в ООО «Фитнес клаб"

Динамический процесс проектирования системы взаиморасчеты с клиентами в ООО «Фитнес клаб» происходил в несколько стадий.

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

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

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

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

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

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

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

  1. Базы данных: модели, разработка, реализация / Карпова Т.- СПб.: Питер, 2001. –304с.
  2. Буч Г. Объектно-ориентированное проектирование с примерами применения. М., 1992. - 654с.
  3. Волков В. Ф. Экономика предприятия. – М.: Вита-Пресс, 1998. – 380с.
  4. Галатенко В. Информационная безопасность // Открытые системы- 1996. – N 1-4.
  5. Глушаков С.В., Ломотько Д.В. Базы данных .- Х.: Фолио, 2002. – 504 с.
  6. Голубков Е.П. Маркетинг: стратегии, планы, структуры. М., Де­ло, 1995. – 450с.
  7. Голубков Е.П. Маркетинговые исследования: теория, методология и практика. М., Финпресс, 1998. – 280с.
  8. Гофман В.Э. Хомоненко А.Д. Delphi 5. - СПб.: - Санки-Петербург, 2000. –800с.
  9. Гофман В.Э. Хомоненко А.Д. Delphi 6. - СПб.: - Санки-Петербург, 2001. –1145с.
  10. Дайан А. и др. Маркетинг. М., Экономика, 1993.
  11. Жутова З.У. Бюджетный учет и отчетность. М.: Финансы, 1970.-215с.
  12. Конноли Томас, Бегг Каролин. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. — М.: Вильямс, 2000. – 1111 с.
  13. Маклаков С.В. BPwin и ERwin. CASE-средства разработки информационных систем. — М.: Диалог-Мифи, 2001. — 304 с.
  14. Турчин С. Обзор АСУП для малого бизнеса. Функциональные особенности // Компьютерное обозрение № 17 (286), 2001. с.22-27. // www.ITC-UA.COM
  15. Фатрелл Р., Шафер Д. Шафер Л. Управление программными проектами: достижение оптимального качества при минимуме затрат. М.: «Вильямс», 2003. – 1128с.
  16. Организация производства, Андреев А.Ф., Крайнова Э.А., 2010
  17. Организация и управление нефтегазовым производством, Крайнова Э.А., Ларионова О.А., 2010
  18. Основы организации деятельности предприятия, Ларионова О.А., 2005
  19. Бойко В.В., Савинков В.М. Проектирование баз данных информационных систем. – М.: Финансы и статистика, 2000. – 351 с.
  20. Кузнецов С.Д. Основы современных баз данных // http://www.citforum.ru/database/osbd/contents.shtml
  21. Методология структурного анализа и проектирования // http://or-rsv.net/SADT/SADT.htm.
  22. Вендров А.М. CASE-технологии. Проектирование программного обеспечения экономических информационных систем. – М.: Финансы и статистика, 2005. – 544 с.

Приложение А -Листинг разработанного программного обеспечения

// Процедура вызывается по событию НачалоВыбораИзСписка

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

//

// Параметры

// ЭлементУправления - ПолеВвода, в котором редактируется значение даты

// ЭтаФорма - Форма

// Пользователь - СправочникСсылка.Пользователи

// СтандартнаяОбработка - булево

// ПолныйГод - Булево, предсавление года даты в списке выбора

//

Процедура ВыбратьВремяИзСписка(ЭлементУправления, ЭтаФорма, ВремяНачалаВыбора, ИнтервалВремени, СтандартнаяОбработка, ТолькоВремя) Экспорт

СтруктураГрафикаРаботы = Константы.ГрафикРаботыОрганизации.Получить().Получить();

СтандартнаяОбработка = Ложь;

Если ЗначениеЗаполнено(ВремяНачалаВыбора) Тогда

ДатаВремени = ВремяНачалаВыбора;

Иначе

ДатаВремени = СтруктураГрафикаРаботы.НачалоРабочегоДня;

КонецЕсли;

СтруктураРабочихВремен = Новый Структура("ДатаНачала, ДатаОкончания",ДатаВремени,СтруктураГрафикаРаботы.ОкончаниеРабочегоДня);

СписокВремен = Новый СписокЗначений;

НачалоРабочегоДня = НачалоДня(ДатаВремени)+Час(СтруктураРабочихВремен.ДатаНачала)*60*60+Минута(СтруктураРабочихВремен.ДатаНачала)*60;

ОкончаниеРабочегоДня = НачалоДня(ДатаВремени)+Час(СтруктураРабочихВремен.ДатаОкончания)*60*60+Минута(СтруктураРабочихВремен.ДатаОкончания)*60;

НачалоРабочегоДняДляСпискаВыбора = НачалоЧаса(НачалоРабочегоДня);

а = 0;

Пока Истина Цикл

ВремяСписка = НачалоРабочегоДняДляСпискаВыбора + а*ИнтервалВремени*60;

Если ВремяСписка >= ОкончаниеРабочегоДня-ИнтервалВремени*60 Тогда

// добавить последнюю запись

Если ТолькоВремя Тогда

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='ЧЧ:мм'"));

Иначе

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='дд.ММ.гггг ЧЧ:мм'"));

КонецЕсли;

Прервать;

КонецЕсли;

Если ТолькоВремя Тогда

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='ЧЧ:мм'"));

Иначе

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='дд.ММ.гггг ЧЧ:мм'"));

КонецЕсли;

а = а + 1;

КонецЦикла;

Секунды = Минута(ДатаВремени)*60 +Секунда(ДатаВремени);

НачальноеЗначение = СписокВремен.НайтиПоЗначению(ДатаВремени - ?(Секунды < ИнтервалВремени*60,Секунды,Секунды-ИнтервалВремени*60));

Если НачальноеЗначение = Неопределено Тогда

ВыбранноеВремя = ЭтаФорма.ВыбратьИзСписка(СписокВремен, ЭлементУправления);

Иначе

ВыбранноеВремя = ЭтаФорма.ВыбратьИзСписка(СписокВремен, ЭлементУправления, НачальноеЗначение);

КонецЕсли;

Если ВыбранноеВремя <> Неопределено Тогда

ЭлементУправления.Значение = ВыбранноеВремя.Значение;

КонецЕсли;

КонецПроцедуры

//

Функция ДеньНеделиПрописью(Дата, Кратко) Экспорт

День = ДеньНедели(Дата);

Если День =1 Тогда

КраткоеНаименование ="Пн";

ПолноеНаименование ="Понедельник";

ИначеЕсли День =2 Тогда

КраткоеНаименование ="Вт";

ПолноеНаименование ="Вторник";

ИначеЕсли День =3 Тогда

КраткоеНаименование ="Ср";

ПолноеНаименование ="Среда";

ИначеЕсли День =4 Тогда

КраткоеНаименование ="Чт";

ПолноеНаименование ="Четверг";

ИначеЕсли День =5 Тогда

КраткоеНаименование ="Пт";

ПолноеНаименование ="Пятница";

ИначеЕсли День =6 Тогда

КраткоеНаименование ="Сб";

ПолноеНаименование ="Суббота";

ИначеЕсли День =7 Тогда

КраткоеНаименование ="Вс";

ПолноеНаименование ="Воскресенье";

КонецЕсли;

Если Кратко Тогда

Возврат КраткоеНаименование;

Иначе

Возврат ПолноеНаименование;

КонецЕсли;

КонецФункции // ДеньНеделиПрописью()

Функция ДобавитьВремяВДату(Дата, Время) Экспорт

НоваяДатаВремя = НачалоДня(Дата)+Час(Время)*60*60+минута(Время)*60;

Возврат НоваяДатаВремя;

КонецФункции // ДеньНеделиПрописью()

//

Функция МетаданныеКонфигурации() Экспорт

Возврат Метаданные;

КонецФункции // МетаданныеКонфигурации()

Перем ДатаНачалаСтароеЗначение; // Хранит предыдущее значение параметра ДатаНачала

Перем ДатаКонцаСтароеЗначение; // Хранит предыдущее значение параметра ДатаКонца

Перем СтруктураРеквизитов;

//

Процедура СформироватьОтчет() Экспорт

ТабличныйДокументПомещение = Новый ТабличныйДокумент;

//

Начало = НачалоДня(Начало);

Окончание = КонецДня(Окончание);

СтруктураГрафикаОрганизации = Константы.ГрафикРаботыОрганизации.Получить().Получить();

ВидГрафика = СтруктураГрафикаОрганизации.ВидГрафика;

ВремяНачалаРаботы = СтруктураГрафикаОрганизации.НачалоРабочегоДня ;

ВремяОкончанияРаботы =СтруктураГрафикаОрганизации.ОкончаниеРабочегоДня ;

Макет = ПолучитьМакет("Расписание");

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти("Шапка сотрудника","Специализация");

Если СоответствиеЦвета =Неопределено Тогда

ЦветШапкиСотрудника = Новый Цвет(249,249,201);

Иначе

ЦветШапкиСотрудника = СоответствиеЦвета.Цвет;

КонецЕсли;

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти("Шапка помещения","Специализация");

Если СоответствиеЦвета =Неопределено Тогда // цвет взять из макета

ЦветШапкиПомещения = Новый Цвет(231,227,203);

Иначе

ЦветШапкиПомещения = СоответствиеЦвета.Цвет;

КонецЕсли;

ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;

ТабДок.Очистить();

Отбор = Новый Структура("Использовать", Истина);

СписокПомещений = Новый СписокЗначений;

Для Каждого Строкатч из Помещения цикл

Если Строкатч.Использовать тогда

СписокПомещений.Добавить(Строкатч.Помещение);

КонецЕсли;

КонецЦикла;

СписокСотрудников = Новый СписокЗначений;

Для Каждого Строкатч из Сотрудники цикл

Если Строкатч.Использовать тогда

СписокСотрудников.Добавить(Строкатч.Сотрудник);

КонецЕсли;

КонецЦикла;

ТекстУсловия = ?(СписокПомещений.Количество()>0," И ЗанятостьСотрудников.Помещение В(&СписокПомещений)","");

ТекстУсловия = ТекстУсловия+?(СписокСотрудников.Количество()>0," И ЗанятостьСотрудников.Сотрудник В(&СписокСотрудников)","");

ВременнаяТаблицаЗапроса = Новый МенеджерВременныхТаблиц ;

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Начало",Начало);

Запрос.УстановитьПараметр("Окончание",Окончание);

Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);

Запрос.УстановитьПараметр("СписокПомещений",СписокПомещений);

Запрос.МенеджерВременныхТаблиц = ВременнаяТаблицаЗапроса;

Запрос.Текст = "ВЫБРАТЬ

| ЗанятостьСотрудников.Дата КАК Дата,

| ЗанятостьСотрудников.Сотрудник КАК Сотрудник,

| ПРЕДСТАВЛЕНИЕ(ЗанятостьСотрудников.Сотрудник) КАК СотрудникПредставление,

| ЗанятостьСотрудников.Помещение,

| ПРЕДСТАВЛЕНИЕ(ЗанятостьСотрудников.Помещение),

| ЗанятостьСотрудников.Регистратор КАК Регистратор,

| ЗанятостьСотрудников.Регистратор.Содержание КАК Содержание,

| ЗанятостьСотрудников.Регистратор.Комментарий КАК ПримечаниеСобытия,

| РАЗНОСТЬДАТ(ЗанятостьСотрудников.НачалоПериода, ЗанятостьСотрудников.КонецПериода, МИНУТА) / 5 КАК КоличествоИнтервалов,

| ЗанятостьСотрудников.Регистратор.Контрагент.Примечание КАК ПримечаниеКонтрагента,

| ЗанятостьСотрудников.Регистратор.Контрагент.ДатаРождения,

| ЗанятостьСотрудников.Регистратор.Телефон КАК Телефон,

| ЗанятостьСотрудников.Регистратор.Оповещение КАК Оповещение,

| ЗанятостьСотрудников.Регистратор.Специализация КАК Специализация,

| ЗанятостьСотрудников.Регистратор.Контрагент КАК Контрагент,

| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ЗанятостьСотрудников.Дата, ЧАС, ЧАС(ЗанятостьСотрудников.НачалоПериода)), МИНУТА, МИНУТА(ЗанятостьСотрудников.НачалоПериода)) КАК НачалоСобытия,

| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ЗанятостьСотрудников.Дата, ЧАС, ЧАС(ЗанятостьСотрудников.КонецПериода)), МИНУТА, МИНУТА(ЗанятостьСотрудников.КонецПериода)) КАК ОкончаниеСобытия,

| ЗанятостьСотрудников.Регистратор.СкрытьПримечаниеВРасписании КАК СкрытьПримечание

|ПОМЕСТИТЬ ВременнаяТаблицаЗапроса

|ИЗ

| РегистрСведений.ЗанятостьСотрудников КАК ЗанятостьСотрудников

|ГДЕ

| ЗанятостьСотрудников.Дата МЕЖДУ &Начало И &Окончание"+ТекстУсловия;

Запрос.Выполнить();

Область = Макет.ПолучитьОбласть("Заголовок");

Область.Параметры.Начало = Формат(Начало,"ДФ=dd.ММ");

Область.Параметры.Окончание =Формат(Окончание,"ДФ=dd.ММ");

ТабДок.Вывести(Область);

Область = Макет.ПолучитьОбласть("ШапкаПомещение|ПустойСтолбец");

ТабДок.Вывести(Область);

Для каждого Строкатч из Помещения цикл

Если Не Строкатч.Использовать тогда

Продолжить;

КонецЕсли;

ТекущийСотрудник = Справочники.Сотрудники.НайтиПоРеквизиту("ОсновноеРабочееМесто",Строкатч.Помещение);

ВремяОкончанияПредыдущегоСобытия = '00010101';

СтруктураОбластейПредыдущегоСобытия = Новый Структура;

ТабличныйДокументПомещение.Очистить();

ТекущийДень = День(Начало);

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(Начало,ВремяНачалаРаботы);

ДатаВремяОкончанияСобытия=ТекущееВремя;

Пока ТекущееВремя<Окончание Цикл

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВременнаяТаблицаЗапроса

|ГДЕ

|ВременнаяТаблицаЗапроса.Помещение =&Помещение

|И ВременнаяТаблицаЗапроса.Дата =&Дата

|УПОРЯДОЧИТЬ ПО

|ВременнаяТаблицаЗапроса.НачалоСобытия";

Запрос.УстановитьПараметр("Помещение",Строкатч.Помещение);

Запрос.УстановитьПараметр("Дата",НачалоДня(ТекущееВремя));

ВыборкаПоПомещению = Запрос.Выполнить().Выбрать();

Область = Макет.ПолучитьОбласть("ШапкаПомещение|Время");

Область.Параметры.День = Формат(ТекущееВремя,"ДФ=дд")+" "+ОдинМодульНаВсех.ДеньНеделиПрописью(ТекущееВремя,Истина);

ОбластьЯчеек = ТабличныйДокументПомещение.Вывести(Область);

ОбластьЯчеек.ЦветФона = ЦветШапкиПомещения;

Область = Макет.ПолучитьОбласть("ШапкаПомещение|Данные");

Область.Параметры.Помещение = Строкатч.Помещение;

ОбластьЯчеек = ТабличныйДокументПомещение.Присоединить(Область);

ОбластьЯчеек.ЦветФона = ЦветШапкиПомещения;

ВывестиШапкуСотрудника(Макет,ТабличныйДокументПомещение,ТекущийСотрудник,ЦветШапкиСотрудника); // для каждого помещения вывести шапку основного сотрудника

ДеньНедели = ДеньНедели(ТекущееВремя);

Если ВидГрафика =Перечисления.ВидГрафика.Пятидневка И ДеньНедели>5

ИЛИ ВидГрафика =Перечисления.ВидГрафика.Шестидневка И ДеньНедели=7 Тогда

// для выходного вывел только шапку и переход на следующий день

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя+86400,ВремяНачалаРаботы);

ТекущийДень = День(ТекущееВремя);

Продолжить;

КонецЕсли;

ВремяОкончанияТекущегоДня =ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя,ВремяОкончанияРаботы);

Пока ТекущееВремя<ВремяОкончанияТекущегоДня цикл

Если ТекущийДень <> День(ТекущееВремя) Тогда // начался следующий день

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя,ВремяНачалаРаботы);

ТекущийДень = День(ТекущееВремя);

КонецЕсли;

Пока ВыборкаПоПомещению.Следующий() Цикл

ДатаВремяНачалаСобытия = ВыборкаПоПомещению.НачалоСобытия;

Пока ТекущееВремя<ДатаВремяНачалаСобытия Цикл // выводить пустые строки пока не наступит событие

ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ТекущееВремя, ТекущееВремя, 3600,Неопределено);

КонецЦикла;

// вывести строку с временем начала

ДобавляемоеВремя = ?(ДатаВремяНачалаСобытия=ТекущееВремя,3600,0);

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

СодержаниеСобытия= Строка(ВыборкаПоПомещению.Контрагент)+"; "+ВыборкаПоПомещению.Содержание+"; "+ВыборкаПоПомещению.ПримечаниеКонтрагента

+"; "+?(ВыборкаПоПомещению.СкрытьПримечание,"",ВыборкаПоПомещению.ПримечаниеСобытия+"; ")+ВыборкаПоПомещению.Телефон;

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти(ВыборкаПоПомещению.Специализация,"Специализация");

Если СоответствиеЦвета =Неопределено Тогда

ЦветФонаОбласти = ВыборкаПоПомещению.Специализация.ЦветВРасписании.Получить();

Иначе

ЦветФонаОбласти = СоответствиеЦвета.Цвет;

КонецЕсли;

Если ДатаВремяНачалаСобытия<=ВремяОкончанияПредыдущегоСобытия Тогда

ВременныйТабличныйДокумент = Новый ТабличныйДокумент;

Если ТекущийСотрудник<>ВыборкаПоПомещению.Сотрудник Тогда

// вставить шапку сотрудника

СтруктураОбластей = ВывестиШапкуСотрудника(Макет,ВременныйТабличныйДокумент,ВыборкаПоПомещению.Сотрудник,ЦветШапкиСотрудника);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьВремени,СтруктураОбластейПредыдущегоСобытия.ОбластьВремени,ТипСмещенияТабличногоДокумента.БезСмещения);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьСобытия,СтруктураОбластейПредыдущегоСобытия.ОбластьСобытия,ТипСмещенияТабличногоДокумента.БезСмещения);

ТекущийСотрудник=ВыборкаПоПомещению.Сотрудник;

// вывести событие

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ДатаВремяНачалаСобытия<ВремяОкончанияПредыдущегоСобытия Тогда

СтруктураОбластей.ОбластьВремени.Примечание.Текст = "Это событие пересекается по времени с предыдущим";

КонецЕсли;

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

Иначе

// вставить только событие

СтруктураОбластей =ВывестиОбластьМакета(ВременныйТабличныйДокумент, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ДатаВремяНачалаСобытия<ВремяОкончанияПредыдущегоСобытия Тогда

СтруктураОбластей.ОбластьВремени.Примечание.Текст = "Это событие пересекается по времени с предыдущим";

КонецЕсли;

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьВремени,СтруктураОбластейПредыдущегоСобытия.ОбластьВремени,ТипСмещенияТабличногоДокумента.БезСмещения);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьСобытия,СтруктураОбластейПредыдущегоСобытия.ОбластьСобытия,ТипСмещенияТабличногоДокумента.БезСмещения);

КонецЕсли;

Иначе

// если сотрудник изменился, то вывести шапку для нового сотрудника

Если ТекущийСотрудник<>ВыборкаПоПомещению.Сотрудник Тогда

ВывестиШапкуСотрудника(Макет,ТабличныйДокументПомещение,ВыборкаПоПомещению.Сотрудник,ЦветШапкиСотрудника);

ТекущийСотрудник=ВыборкаПоПомещению.Сотрудник

КонецЕсли;

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

КонецЕсли;

ДатаВремяОкончанияСобытия = ВыборкаПоПомещению.ОкончаниеСобытия;

// и время окончания события выводить только если рабочий день ещё не закончился

Если ДатаВремяОкончанияСобытия<ВремяОкончанияТекущегоДня Тогда

ДобавляемоеВремя = Цел((ДатаВремяОкончанияСобытия-ТекущееВремя)/3600+1)*3600;

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ВыборкаПоПомещению.ОкончаниеСобытия, ТекущееВремя, ДобавляемоеВремя,Неопределено);

СтруктураОбластейПредыдущегоСобытия = СтруктураОбластей;

КонецЕсли;

ВремяОкончанияПредыдущегоСобытия = ДатаВремяОкончанияСобытия;

КонецЦикла;

Если ВремяОкончанияТекущегоДня>ТекущееВремя Тогда

Если ВремяОкончанияПредыдущегоСобытия>=ТекущееВремя Тогда

ТекущееВремя = ТекущееВремя+3600;

Иначе

ОбластьЯчеек = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ТекущееВремя, ТекущееВремя, 3600,Неопределено);

//ТекущееВремя = ТекущееВремя+3600;

КонецЕсли;

КонецЕсли;

КонецЦикла;

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя+86400,ВремяНачалаРаботы); // переходим на следующие сутки

КонецЦикла;

ТабДок.Присоединить(ТабличныйДокументПомещение);

КонецЦикла;

КонецПроцедуры

//

Функция ВывестиОбластьМакета(ТабличныйДокумент, Макет, Содержание, ВремяСобытия, ТекущееВремя, ДобавляемоеВремя,Регистратор)

СтруктураОбластей = Новый Структура("ОбластьВремени, ОбластьСобытия");

Область = Макет.ПолучитьОбласть("Детали|Время");

Область.Параметры.Время = ВремяСобытия;

ОбластьВремени=ТабличныйДокумент.Вывести(Область);

// ищем ближайшую область к текущему времени

РазницаВремени = ВремяСобытия-ТекущаяДата();

Если РазницаВремени<3600 И РазницаВремени>0 Тогда

ОбластьВремени.ЦветФона = ЦветаСтиля.ЦветОтрицательногоЧисла;

КонецЕсли;

Область = Макет.ПолучитьОбласть("Детали|Данные");

Область.Параметры.Содержание = Содержание;

Область.Параметры.Регистратор = Регистратор;

ОбластьСобытия = ТабличныйДокумент.Присоединить(Область);

ТекущееВремя = ТекущееВремя+ ДобавляемоеВремя;

Если Регистратор<>Неопределено Тогда

Если Не Регистратор.Оповещение Тогда

ТекущийШрифт = ОбластьСобытия.Шрифт;

ОбластьСобытия.Шрифт = Новый Шрифт(ТекущийШрифт,,10,истина);

КонецЕсли;

КонецЕсли;

СтруктураОбластей.ОбластьВремени = ОбластьВремени;

СтруктураОбластей.ОбластьСобытия = ОбластьСобытия;

Возврат СтруктураОбластей;

КонецФункции

//

Функция ВывестиШапкуСотрудника(Макет,ТабличныйДокумент,Сотрудник,ЦветФона)

СтруктураОбластей = Новый Структура("ОбластьВремени, ОбластьСобытия");

Область = Макет.ПолучитьОбласть("ШапкаСотрудник|Время");

ОбластьВремени = ТабличныйДокумент.Вывести(Область);

Область = Макет.ПолучитьОбласть("ШапкаСотрудник|Данные");

Область.Параметры.Сотрудник = Сотрудник;

ОбластьСобытия = ТабличныйДокумент.Присоединить(Область);

СтруктураОбластей.ОбластьВремени = ОбластьВремени;

СтруктураОбластей.ОбластьСобытия = ОбластьСобытия;

СтруктураОбластей.ОбластьВремени.ЦветФона =ЦветФона ;

СтруктураОбластей.ОбластьСобытия.ЦветФона =ЦветФона ;

Возврат СтруктураОбластей;

КонецФункции

//

Процедура КнопкаСформироватьНажатие(Кнопка)

СформироватьОтчет();

КонецПроцедуры

Процедура ПриОткрытии()

ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ДействияФормы;

СформироватьОтчет();

КонецПроцедуры

Процедура ДействияФормыНастройки(Кнопка)

Форма = ПолучитьФорму("Настройки",Этаформа);

Форма.Открыть();

КонецПроцедуры

Процедура КоманднаяПанель1День(Кнопка)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Начало = НачалоДня(ДатаОтчета);

Окончание = КонецДня(ДатаОтчета);

Кнопка.Пометка = Истина;

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.Неделя.Пометка = Ложь;

СформироватьОтчет();

КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

ДатаОтчета = ТекущаяДата();

ОтчетОбъект.Начало = НачалоДня(ДатаОтчета);

ОтчетОбъект.Окончание = КонецДня(ДатаОтчета);

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.День.Пометка = Истина;

СтруктураНастроек = ВосстановитьЗначение("ОтчетРасписание_10");

Если СтруктураНастроек<>Неопределено Тогда

Помещения.Загрузить(СтруктураНастроек.Помещения);

Сотрудники.Загрузить(СтруктураНастроек.Сотрудники);

ТаблицаСоответствияЦветов = СтруктураНастроек.ТаблицаСоответствияЦветов;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Колонки.Количество() = 0 Тогда

УстановитьЦветаПоУмолчанию();

КонецЕсли;

КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

СтруктураНастроек = Новый Структура;

СтруктураНастроек.Вставить("Помещения",Помещения.Выгрузить());

СтруктураНастроек.Вставить("Сотрудники",Сотрудники.Выгрузить());

СтруктураНастроек.Вставить("ТаблицаСоответствияЦветов",ТаблицаСоответствияЦветов);

СохранитьЗначение("ОтчетРасписание_10",СтруктураНастроек);

КонецПроцедуры

Процедура ДатаОтчетаПриИзменении(Элемент)

//Если Вопрос("Сформировать отчет?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да Тогда

Интервал = Окончание-Начало;

Начало = ДатаОтчета;

Окончание = Начало+Интервал;

СформироватьОтчет();

//КонецЕсли;

КонецПроцедуры

Процедура КнНазадНажатие(Элемент)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Если НачалоДня(Начало) <> НачалоДня(Окончание) Тогда

ДатаОтчета = ДатаОтчета - (7*86400);

Начало = ДатаОтчета;

Окончание = Начало+(7*86400);

Иначе

ДатаОтчета = ДатаОтчета - 86400;

Начало = ДатаОтчета;

Окончание = ДатаОтчета;

КонецЕсли;

СформироватьОтчет();

КонецПроцедуры

Процедура КнВпередНажатие(Элемент)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Если НачалоДня(Начало) <> НачалоДня(Окончание) Тогда

ДатаОтчета = ДатаОтчета + (7*86400);

Начало = ДатаОтчета;

Окончание = Начало+(7*86400);

Иначе

ДатаОтчета = ДатаОтчета + 86400;

Начало = ДатаОтчета;

Окончание = Начало;

КонецЕсли;

СформироватьОтчет();

КонецПроцедуры

Процедура КоманднаяПанель1Неделя(Кнопка)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

ДатаОтчета = НачалоНедели(ДатаОтчета);

Начало = ДатаОтчета;

Окончание = НачалоНедели(ДатаОтчета) + (24*60*60*6);

Кнопка.Пометка = Истина;

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.День.Пометка = Ложь;

СформироватьОтчет();

КонецПроцедуры

Процедура УстановитьЦветаПоУмолчанию() Экспорт

ТаблицаСоответствияЦветов.Колонки.Очистить();

ТаблицаСоответствияЦветов.Колонки.Добавить("Специализация");

ТаблицаСоответствияЦветов.Колонки.Добавить("Цвет");

Выборка = Справочники.Специализации.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти(Выборка.Ссылка,"Специализация")=Неопределено Тогда

Строкатч = ТаблицаСоответствияЦветов.Добавить();

Строкатч.Специализация = Выборка.Ссылка;

Строкатч.Цвет = ЦветаСтиля.ЦветФонаПоля;

КонецЕсли;

КонецЦикла;

КонецПроцедуры // УстановитьЦветаИнтерваловПоУмолчанию()

Процедура ПолеТабличногоДокумента1ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка=Ложь;

Форма = Расшифровка.ПолучитьФорму("ФормаДокумента",ЭтаФорма,"КлючУникальности_123123");

Форма.Открыть();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляОтметитьОповещен(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Объект = Расшифровка.ПолучитьОбъект();

Объект.Оповещение = истина;

Попытка

Объект.Записать();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

СформироватьОтчет();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляСоздать(Кнопка)

ОбластьПриемник = ЭлементыФормы.ПолеТабличногоДокумента1.ВыделенныеОбласти[0];

Если ТипЗнч(ОбластьПриемник.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Предупреждение("На выбранное время уже оформлено событие",10);

Возврат;

КонецЕсли;

СоздатьНовоеСобытие(ОбластьПриемник,"Создание");

КонецПроцедуры

Процедура СоздатьНовоеСобытие(ОбластьПриемник,ТипДействия)

НомерРазделителя =Найти(ОбластьПриемник.Имя,":");

Если НомерРазделителя>0 Тогда // выделен диапазон строк или колонок

ЛеваяЧасть = Лев(ОбластьПриемник.Имя,НомерРазделителя-1);

ПраваяЧасть = Сред(ОбластьПриемник.Имя,НомерРазделителя+1);

НомерПервойСтроки = Число(Сред(ЛеваяЧасть,2,Найти(ЛеваяЧасть,"C")-2));

НомерПоследнейСтроки = Число(Сред(ПраваяЧасть,2,Найти(ПраваяЧасть,"C")-2));

// если выделено несколько колонок, то за текущую принимаем последнюю

НомерТекущейКолонки = Число(Сред(ПраваяЧасть,Найти(ПраваяЧасть,"C")+1));

Иначе

НомерПервойСтроки = Число(Сред(ОбластьПриемник.Имя,2,Найти(ОбластьПриемник.Имя,"C")-2));

НомерПоследнейСтроки = НомерПервойСтроки;

НомерТекущейКолонки = Число(Сред(ОбластьПриемник.Имя,Найти(ОбластьПриемник.Имя,"C")+1));

КонецЕсли;

// в ячейке слева текущей строки должны содержаться дата и время

ОбластьСДатой = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R"+НомерПервойСтроки+"C"+(Число(НомерТекущейКолонки)-1));

Если Не ОбластьСДатой.СодержитЗначение Тогда

Предупреждение("Неправильно выбрано время события",10);

Возврат;

КонецЕсли;

ДатаНачалаНовогоСобытия = ОбластьСДатой.Значение;

Если ТипДействия="Перемещение" Тогда // для перемещения новый документ не создается

НовыйДокумент = СтруктураРеквизитов.Ссылка.ПолучитьОбъект();

Иначе

НовыйДокумент = Документы.Событие.СоздатьДокумент();

КонецЕсли;

НовыйДокумент.Дата = ТекущаяДата();

НовыйДокумент.ДатаСобытия = ДатаНачалаНовогоСобытия;

НовыйДокумент.НачалоСобытия = ДатаНачалаНовогоСобытия;

НовыйДокумент.Оповещение = Ложь;

// во второй строке текущей колонки всегда содержится помещение,

ОбластьСПомещением = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R2"+"C"+НомерТекущейКолонки);

Если ТипЗнч(ОбластьСПомещением.Расшифровка)=Тип("СправочникСсылка.Помещения") Тогда

НовыйДокумент.Помещение = ОбластьСПомещением.Расшифровка;

КонецЕсли;

Если ТипДействия="Копирование"

ИЛИ ТипДействия="Перемещение" Тогда // при копировании дату окончания высчитывать, сотрудника и берём из события-источника

Если НовыйДокумент.Помещение.Пустая() Тогда

Предупреждение("Неправильно выделено рабочее место для события.",10);

Возврат;

КонецЕсли;

ДатаОкончанияНовогоСобытия = НовыйДокумент.НачалоСобытия + (СтруктураРеквизитов.ОкончаниеСобытия-СтруктураРеквизитов.НачалоСобытия);

НовыйДокумент.ОкончаниеСобытия = ДатаОкончанияНовогоСобытия;

СтруктураРеквизитов.Удалить("Ссылка"); // перед циклом удалить необрабатываемый элемент

Для Каждого элементСтруктуры из СтруктураРеквизитов цикл

Если Не ЗначениеЗаполнено(НовыйДокумент[элементСтруктуры.Ключ]) Тогда

НовыйДокумент[элементСтруктуры.Ключ] = элементСтруктуры.Значение;

КонецЕсли;

КонецЦикла;

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Иначе

ОбластьСДатой = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R"+(НомерПоследнейСтроки+1)+"C"+(Число(НомерТекущейКолонки)-1));

Если ОбластьСДатой.СодержитЗначение Тогда

ДатаОкончанияНовогоСобытия = ОбластьСДатой.Значение;

Иначе

ДатаОкончанияНовогоСобытия = НовыйДокумент.НачалоСобытия+3600;

КонецЕсли;

Если Не НовыйДокумент.Помещение.Пустая() Тогда

ОсновнойСотрудникПомещения = Справочники.Сотрудники.НайтиПоРеквизиту("ОсновноеРабочееМесто",НовыйДокумент.Помещение);

НовыйДокумент.Сотрудник = ОсновнойСотрудникПомещения;

НовыйДокумент.Специализация = НовыйДокумент.Сотрудник.ОсновнаяСпециализация;

КонецЕсли;

НовыйДокумент.ОкончаниеСобытия = ДатаОкончанияНовогоСобытия;

НовыйДокумент.Состояние = Перечисления.СостоянияСобытий.Запланировано;

Форма = НовыйДокумент.ПолучитьФорму(,ЭтаФорма);

Форма.Открыть();

КонецЕсли;

СтруктураРеквизитов.Очистить();

СформироватьОтчет();

КонецПроцедуры

Процедура ОбработкаЗаписиНовогоОбъекта(Объект, Источник)

СформироватьОтчет();

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляОтменитьСобытие(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Объект = Расшифровка.ПолучитьОбъект();

Попытка

Объект.Состояние = Перечисления.СостоянияСобытий.Отменено;

Объект.Записать();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

СформироватьОтчет();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляКопировать(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

СкопироватьВыбраныйДокумент(Расшифровка);

КонецПроцедуры

//

Процедура СкопироватьВыбраныйДокумент(Расшифровка)

СтруктураРеквизитов.Очистить();

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

МетаданныеКонфигурации = ОдинМодульНаВсех.МетаданныеКонфигурации();

Для Каждого реквизит из МетаданныеКонфигурации.Документы.Событие.Реквизиты Цикл

СтруктураРеквизитов.Вставить(реквизит.Имя,Расшифровка[реквизит.Имя]);

КонецЦикла;

СтруктураРеквизитов.Вставить("Ссылка",Расшифровка);

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляВставить(Кнопка)

ВставитьСкопированныйДокумент();

КонецПроцедуры

//

Процедура ВставитьСкопированныйДокумент()

Если СтруктураРеквизитов.Количество()=0 Тогда

Возврат;

КонецЕсли;

ОбластьПриемник = ЭлементыФормы.ПолеТабличногоДокумента1.ВыделенныеОбласти[0];

Если ТипЗнч(ОбластьПриемник.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Предупреждение("На выбранное время уже оформлено событие",10);

Возврат;

КонецЕсли;

СоздатьНовоеСобытие(ОбластьПриемник,"Копирование");

КонецПроцедуры

Процедура ПолеТабличногоДокумента1Выбор(Элемент, Область, СтандартнаяОбработка)

ДействияПользователяССобытием(СтандартнаяОбработка,Область.Расшифровка,"Открыть");

КонецПроцедуры

//

Процедура ДействияПользователяССобытием(СтандартнаяОбработка,Расшифровка,ТипДействия)

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка=Ложь;

Если ТипДействия = "Открыть" Тогда

Форма = Расшифровка.ПолучитьФорму("ФормаДокумента",ЭтаФорма,"КлючУникальности_123123");

Форма.Открыть();

иначеЕсли ТипДействия = "РедактироватьСодержание" Тогда

Объект = Расшифровка.ПолучитьОбъект();

Объект.Заблокировать();

Содержание = Объект.Содержание;

Если ВвестиСтроку(Содержание, Строка(Расшифровка.Контрагент), 0, Истина) Тогда

Объект.Содержание = Содержание;

Объект.Записать();

СформироватьОтчет();

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляРедактировать(Кнопка)

ТекущаяОбласть = ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть;

ДействияПользователяССобытием(Ложь,ТекущаяОбласть.Расшифровка,"Открыть");

КонецПроцедуры

Процедура ПолеТабличногоДокумента1НачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

Если ТипЗнч(ПараметрыПеретаскивания.Значение.ТекущаяОбласть.Расшифровка)<>Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка = Ложь;

КонецЕсли;

КонецПроцедуры

Процедура ПолеТабличногоДокумента1ПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

КонецПроцедуры

Процедура ПолеТабличногоДокумента1Перетаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

СтандартнаяОбработка = Ложь;

// если принимающая область содержит событие, то отмена

Если ТипЗнч(Область.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;

Предупреждение("На выбранное время уже оформлено событие",10);

КонецЕсли;

СкопироватьВыбраныйДокумент(ПараметрыПеретаскивания.Значение.ТекущаяОбласть.Расшифровка);

СоздатьНовоеСобытие(Область,"Перемещение");

//СформироватьОтчет();

КонецПроцедуры

Процедура ПолеТабличногоДокумента1ОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

КонецПроцедуры

СтруктураРеквизитов = Новый Структура();

Процедура ОсновныеДействияФормыОсновныеДействияФормыСформировать(Кнопка)

Закрыть();

ВладелецФормы.СформироватьОтчет();

КонецПроцедуры

Процедура КоманднаяПанель1Заполнить(Кнопка)

Выборка = Справочники.Помещения.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если Помещения.Найти(Выборка.Ссылка,"Помещение")=Неопределено Тогда

Строкатч = Помещения.Добавить();

Строкатч.Помещение = Выборка.Ссылка;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3Заполнить(Кнопка)

Выборка = Справочники.Сотрудники.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если Сотрудники.Найти(Выборка.Ссылка,"Сотрудник")=Неопределено Тогда

Строкатч = Сотрудники.Добавить();

Строкатч.Сотрудник = Выборка.Ссылка;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3УстановитьФлажки(Кнопка)

Для Каждого Строкатч из Сотрудники цикл

Строкатч.Использовать = Истина ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3СнятьФлажки(Кнопка)

Для Каждого Строкатч из Сотрудники цикл

Строкатч.Использовать = Ложь ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель1УстановитьФлажки(Кнопка)

Для Каждого Строкатч из Помещения цикл

Строкатч.Использовать = Истина ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель1СнятьФлажки(Кнопка)

Для Каждого Строкатч из Помещения цикл

Строкатч.Использовать = Ложь ;

КонецЦикла;

КонецПроцедуры

Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

Если ДанныеСтроки.Цвет = Неопределено Тогда

Возврат;

КонецЕсли;

ОформлениеСтроки.Ячейки.ПримерЦвета.ЦветФона = ДанныеСтроки.Цвет;

КонецПроцедуры

Процедура КоманднаяПанель2Заполнить(Кнопка)

Выборка = Справочники.Специализации.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти(Выборка.Ссылка,"Специализация")=Неопределено Тогда

Строкатч = ТаблицаСоответствияЦветов.Добавить();

Строкатч.Специализация = Выборка.Ссылка;

Строкатч.Цвет = ЦветаСтиля.ЦветФонаПоля;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура ПриОткрытии()

Если ТаблицаСоответствияЦветов.Найти("Шапка помещения","Специализация")=неопределено Тогда

Строкатз = ТаблицаСоответствияЦветов.Добавить();

Строкатз.Специализация = "Шапка помещения";

Строкатз.цвет =Новый Цвет(231,227,203);

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти("Шапка сотрудника","Специализация")=неопределено Тогда

Строкатз = ТаблицаСоответствияЦветов.Добавить();

Строкатз.Специализация = "Шапка сотрудника";

Строкатз.цвет = Новый Цвет(249,249,201);

КонецЕсли;

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

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

// регистр ОтметкаИсполнения

Движения.ОтметкаИсполнения.Записывать = Истина;

Движения.ОтметкаИсполнения.Очистить();

Для Каждого ТекСтрокаДоки Из Доки Цикл

Движение = Движения.ОтметкаИсполнения.Добавить();

Движение.Дата = Дата;

Движение.Документ = ТекСтрокаДоки.Документ;

Движение.Исполнен = ТекСтрокаДоки.Отметка;

КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

Если ЭтотОбъект.Исправляемый <> Неопределено Тогда

ИсправляемыйДок=ЭтотОбъект.Исправляемый.ПолучитьОбъект();

ИсправляемыйДок.Исправление=ЭтотОбъект.Ссылка;

ИсправляемыйДок.Записать();

ИсправляемыйДок.УстановитьПометкуУдаления(Истина);

Набор = РегистрыСведений.ЗанятостьСотрудников.СоздатьНаборЗаписей();

Набор.Отбор.Регистратор.Установить(ЭтотОбъект.Исправляемый);

Набор.Прочитать();

Набор.Очистить();

Набор.Записать(Истина);

Движение = Движения.ЗанятостьСотрудников.Добавить();

Движение.Дата = ДатаСобытия;

Движение.Помещение = Помещение;

Движение.НачалоПериода = НачалоСобытия;

Движение.Специализация = Специализация;

Движение.КонецПериода = ОкончаниеСобытия;

Движение.Сотрудник = Сотрудник;

иначе

Движение = Движения.ЗанятостьСотрудников.Добавить();

Движение.Дата = ДатаСобытия;

Движение.Помещение = Помещение;

Движение.НачалоПериода = НачалоСобытия;

Движение.Специализация = Специализация;

Движение.КонецПериода = ОкончаниеСобытия;

Движение.Сотрудник = Сотрудник;

КонецЕсли;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Состояние = Перечисления.СостоянияСобытий.Отменено Тогда

РежимЗаписи = РежимЗаписиДОкумента.ОтменаПроведения;

КонецЕсли;

//проверка на события в это же время

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЗанятостьСотрудников.Помещение,

| ЗанятостьСотрудников.Регистратор,

| ЗанятостьСотрудников.НачалоПериода,

| ЗанятостьСотрудников.КонецПериода

|ИЗ

| РегистрСведений.ЗанятостьСотрудников КАК ЗанятостьСотрудников

|ГДЕ

| ЗанятостьСотрудников.Помещение = &Помещение

| И ЗанятостьСотрудников.Активность = &Истина

| И ЗанятостьСотрудников.Дата = &Дата";

Запрос.УстановитьПараметр("Истина", Истина);

Запрос.УстановитьПараметр("Дата", ЭтотОбъект.ДатаСобытия);

Запрос.УстановитьПараметр("Помещение", ЭтотОбъект.Помещение);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Если ЭтотОбъект.НачалоСобытия >=ВыборкаДетальныеЗаписи.НачалоПериода

И ЭтотОбъект.НачалоСобытия<= ВыборкаДетальныеЗаписи.КонецПериода

И ЭтотОбъект.Помещение = ВыборкаДетальныеЗаписи.Помещение

И ЭтотОбъект.Ссылка<> ВыборкаДетальныеЗаписи.Регистратор Тогда

Сообщить("На это время уже есть событие "+ ВыборкаДетальныеЗаписи.Регистратор + " документ не может быть проведен!!!");

РежимЗаписи = РежимЗаписиДОкумента.ОтменаПроведения;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

// Процедура вызывается по событию НачалоВыбораИзСписка

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

//

// Параметры

// ЭлементУправления - ПолеВвода, в котором редактируется значение даты

// ЭтаФорма - Форма

// Пользователь - СправочникСсылка.Пользователи

// СтандартнаяОбработка - булево

// ПолныйГод - Булево, предсавление года даты в списке выбора

//

Процедура ВыбратьВремяИзСписка(ЭлементУправления, ЭтаФорма, ВремяНачалаВыбора, ИнтервалВремени, СтандартнаяОбработка, ТолькоВремя) Экспорт

СтруктураГрафикаРаботы = Константы.ГрафикРаботыОрганизации.Получить().Получить();

СтандартнаяОбработка = Ложь;

Если ЗначениеЗаполнено(ВремяНачалаВыбора) Тогда

ДатаВремени = ВремяНачалаВыбора;

Иначе

ДатаВремени = СтруктураГрафикаРаботы.НачалоРабочегоДня;

КонецЕсли;

СтруктураРабочихВремен = Новый Структура("ДатаНачала, ДатаОкончания",ДатаВремени,СтруктураГрафикаРаботы.ОкончаниеРабочегоДня);

СписокВремен = Новый СписокЗначений;

НачалоРабочегоДня = НачалоДня(ДатаВремени)+Час(СтруктураРабочихВремен.ДатаНачала)*60*60+Минута(СтруктураРабочихВремен.ДатаНачала)*60;

ОкончаниеРабочегоДня = НачалоДня(ДатаВремени)+Час(СтруктураРабочихВремен.ДатаОкончания)*60*60+Минута(СтруктураРабочихВремен.ДатаОкончания)*60;

НачалоРабочегоДняДляСпискаВыбора = НачалоЧаса(НачалоРабочегоДня);

а = 0;

Пока Истина Цикл

ВремяСписка = НачалоРабочегоДняДляСпискаВыбора + а*ИнтервалВремени*60;

Если ВремяСписка >= ОкончаниеРабочегоДня-ИнтервалВремени*60 Тогда

// добавить последнюю запись

Если ТолькоВремя Тогда

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='ЧЧ:мм'"));

Иначе

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='дд.ММ.гггг ЧЧ:мм'"));

КонецЕсли;

Прервать;

КонецЕсли;

Если ТолькоВремя Тогда

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='ЧЧ:мм'"));

Иначе

СписокВремен.Добавить(ВремяСписка, Формат(ВремяСписка,"ДФ='дд.ММ.гггг ЧЧ:мм'"));

КонецЕсли;

а = а + 1;

КонецЦикла;

Секунды = Минута(ДатаВремени)*60 +Секунда(ДатаВремени);

НачальноеЗначение = СписокВремен.НайтиПоЗначению(ДатаВремени - ?(Секунды < ИнтервалВремени*60,Секунды,Секунды-ИнтервалВремени*60));

Если НачальноеЗначение = Неопределено Тогда

ВыбранноеВремя = ЭтаФорма.ВыбратьИзСписка(СписокВремен, ЭлементУправления);

Иначе

ВыбранноеВремя = ЭтаФорма.ВыбратьИзСписка(СписокВремен, ЭлементУправления, НачальноеЗначение);

КонецЕсли;

Если ВыбранноеВремя <> Неопределено Тогда

ЭлементУправления.Значение = ВыбранноеВремя.Значение;

КонецЕсли;

КонецПроцедуры

//

Функция ДеньНеделиПрописью(Дата, Кратко) Экспорт

День = ДеньНедели(Дата);

Если День =1 Тогда

КраткоеНаименование ="Пн";

ПолноеНаименование ="Понедельник";

ИначеЕсли День =2 Тогда

КраткоеНаименование ="Вт";

ПолноеНаименование ="Вторник";

ИначеЕсли День =3 Тогда

КраткоеНаименование ="Ср";

ПолноеНаименование ="Среда";

ИначеЕсли День =4 Тогда

КраткоеНаименование ="Чт";

ПолноеНаименование ="Четверг";

ИначеЕсли День =5 Тогда

КраткоеНаименование ="Пт";

ПолноеНаименование ="Пятница";

ИначеЕсли День =6 Тогда

КраткоеНаименование ="Сб";

ПолноеНаименование ="Суббота";

ИначеЕсли День =7 Тогда

КраткоеНаименование ="Вс";

ПолноеНаименование ="Воскресенье";

КонецЕсли;

Если Кратко Тогда

Возврат КраткоеНаименование;

Иначе

Возврат ПолноеНаименование;

КонецЕсли;

КонецФункции // ДеньНеделиПрописью()

Функция ДобавитьВремяВДату(Дата, Время) Экспорт

НоваяДатаВремя = НачалоДня(Дата)+Час(Время)*60*60+минута(Время)*60;

Возврат НоваяДатаВремя;

КонецФункции // ДеньНеделиПрописью()

//

Функция МетаданныеКонфигурации() Экспорт

Возврат Метаданные;

КонецФункции // МетаданныеКонфигурации()

Перем ДатаНачалаСтароеЗначение; // Хранит предыдущее значение параметра ДатаНачала

Перем ДатаКонцаСтароеЗначение; // Хранит предыдущее значение параметра ДатаКонца

Перем СтруктураРеквизитов;

//

Процедура СформироватьОтчет() Экспорт

ТабличныйДокументПомещение = Новый ТабличныйДокумент;

//

Начало = НачалоДня(Начало);

Окончание = КонецДня(Окончание);

СтруктураГрафикаОрганизации = Константы.ГрафикРаботыОрганизации.Получить().Получить();

ВидГрафика = СтруктураГрафикаОрганизации.ВидГрафика;

ВремяНачалаРаботы = СтруктураГрафикаОрганизации.НачалоРабочегоДня ;

ВремяОкончанияРаботы =СтруктураГрафикаОрганизации.ОкончаниеРабочегоДня ;

Макет = ПолучитьМакет("Расписание");

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти("Шапка сотрудника","Специализация");

Если СоответствиеЦвета =Неопределено Тогда

ЦветШапкиСотрудника = Новый Цвет(249,249,201);

Иначе

ЦветШапкиСотрудника = СоответствиеЦвета.Цвет;

КонецЕсли;

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти("Шапка помещения","Специализация");

Если СоответствиеЦвета =Неопределено Тогда // цвет взять из макета

ЦветШапкиПомещения = Новый Цвет(231,227,203);

Иначе

ЦветШапкиПомещения = СоответствиеЦвета.Цвет;

КонецЕсли;

ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;

ТабДок.Очистить();

Отбор = Новый Структура("Использовать", Истина);

СписокПомещений = Новый СписокЗначений;

Для Каждого Строкатч из Помещения цикл

Если Строкатч.Использовать тогда

СписокПомещений.Добавить(Строкатч.Помещение);

КонецЕсли;

КонецЦикла;

СписокСотрудников = Новый СписокЗначений;

Для Каждого Строкатч из Сотрудники цикл

Если Строкатч.Использовать тогда

СписокСотрудников.Добавить(Строкатч.Сотрудник);

КонецЕсли;

КонецЦикла;

ТекстУсловия = ?(СписокПомещений.Количество()>0," И ЗанятостьСотрудников.Помещение В(&СписокПомещений)","");

ТекстУсловия = ТекстУсловия+?(СписокСотрудников.Количество()>0," И ЗанятостьСотрудников.Сотрудник В(&СписокСотрудников)","");

ВременнаяТаблицаЗапроса = Новый МенеджерВременныхТаблиц ;

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Начало",Начало);

Запрос.УстановитьПараметр("Окончание",Окончание);

Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);

Запрос.УстановитьПараметр("СписокПомещений",СписокПомещений);

Запрос.МенеджерВременныхТаблиц = ВременнаяТаблицаЗапроса;

Запрос.Текст = "ВЫБРАТЬ

| ЗанятостьСотрудников.Дата КАК Дата,

| ЗанятостьСотрудников.Сотрудник КАК Сотрудник,

| ПРЕДСТАВЛЕНИЕ(ЗанятостьСотрудников.Сотрудник) КАК СотрудникПредставление,

| ЗанятостьСотрудников.Помещение,

| ПРЕДСТАВЛЕНИЕ(ЗанятостьСотрудников.Помещение),

| ЗанятостьСотрудников.Регистратор КАК Регистратор,

| ЗанятостьСотрудников.Регистратор.Содержание КАК Содержание,

| ЗанятостьСотрудников.Регистратор.Комментарий КАК ПримечаниеСобытия,

| РАЗНОСТЬДАТ(ЗанятостьСотрудников.НачалоПериода, ЗанятостьСотрудников.КонецПериода, МИНУТА) / 5 КАК КоличествоИнтервалов,

| ЗанятостьСотрудников.Регистратор.Контрагент.Примечание КАК ПримечаниеКонтрагента,

| ЗанятостьСотрудников.Регистратор.Контрагент.ДатаРождения,

| ЗанятостьСотрудников.Регистратор.Телефон КАК Телефон,

| ЗанятостьСотрудников.Регистратор.Оповещение КАК Оповещение,

| ЗанятостьСотрудников.Регистратор.Специализация КАК Специализация,

| ЗанятостьСотрудников.Регистратор.Контрагент КАК Контрагент,

| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ЗанятостьСотрудников.Дата, ЧАС, ЧАС(ЗанятостьСотрудников.НачалоПериода)), МИНУТА, МИНУТА(ЗанятостьСотрудников.НачалоПериода)) КАК НачалоСобытия,

| ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ЗанятостьСотрудников.Дата, ЧАС, ЧАС(ЗанятостьСотрудников.КонецПериода)), МИНУТА, МИНУТА(ЗанятостьСотрудников.КонецПериода)) КАК ОкончаниеСобытия,

| ЗанятостьСотрудников.Регистратор.СкрытьПримечаниеВРасписании КАК СкрытьПримечание

|ПОМЕСТИТЬ ВременнаяТаблицаЗапроса

|ИЗ

| РегистрСведений.ЗанятостьСотрудников КАК ЗанятостьСотрудников

|ГДЕ

| ЗанятостьСотрудников.Дата МЕЖДУ &Начало И &Окончание"+ТекстУсловия;

Запрос.Выполнить();

Область = Макет.ПолучитьОбласть("Заголовок");

Область.Параметры.Начало = Формат(Начало,"ДФ=dd.ММ");

Область.Параметры.Окончание =Формат(Окончание,"ДФ=dd.ММ");

ТабДок.Вывести(Область);

Область = Макет.ПолучитьОбласть("ШапкаПомещение|ПустойСтолбец");

ТабДок.Вывести(Область);

Для каждого Строкатч из Помещения цикл

Если Не Строкатч.Использовать тогда

Продолжить;

КонецЕсли;

ТекущийСотрудник = Справочники.Сотрудники.НайтиПоРеквизиту("ОсновноеРабочееМесто",Строкатч.Помещение);

ВремяОкончанияПредыдущегоСобытия = '00010101';

СтруктураОбластейПредыдущегоСобытия = Новый Структура;

ТабличныйДокументПомещение.Очистить();

ТекущийДень = День(Начало);

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(Начало,ВремяНачалаРаботы);

ДатаВремяОкончанияСобытия=ТекущееВремя;

Пока ТекущееВремя<Окончание Цикл

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВременнаяТаблицаЗапроса

|ГДЕ

|ВременнаяТаблицаЗапроса.Помещение =&Помещение

|И ВременнаяТаблицаЗапроса.Дата =&Дата

|УПОРЯДОЧИТЬ ПО

|ВременнаяТаблицаЗапроса.НачалоСобытия";

Запрос.УстановитьПараметр("Помещение",Строкатч.Помещение);

Запрос.УстановитьПараметр("Дата",НачалоДня(ТекущееВремя));

ВыборкаПоПомещению = Запрос.Выполнить().Выбрать();

Область = Макет.ПолучитьОбласть("ШапкаПомещение|Время");

Область.Параметры.День = Формат(ТекущееВремя,"ДФ=дд")+" "+ОдинМодульНаВсех.ДеньНеделиПрописью(ТекущееВремя,Истина);

ОбластьЯчеек = ТабличныйДокументПомещение.Вывести(Область);

ОбластьЯчеек.ЦветФона = ЦветШапкиПомещения;

Область = Макет.ПолучитьОбласть("ШапкаПомещение|Данные");

Область.Параметры.Помещение = Строкатч.Помещение;

ОбластьЯчеек = ТабличныйДокументПомещение.Присоединить(Область);

ОбластьЯчеек.ЦветФона = ЦветШапкиПомещения;

ВывестиШапкуСотрудника(Макет,ТабличныйДокументПомещение,ТекущийСотрудник,ЦветШапкиСотрудника); // для каждого помещения вывести шапку основного сотрудника

ДеньНедели = ДеньНедели(ТекущееВремя);

Если ВидГрафика =Перечисления.ВидГрафика.Пятидневка И ДеньНедели>5

ИЛИ ВидГрафика =Перечисления.ВидГрафика.Шестидневка И ДеньНедели=7 Тогда

// для выходного вывел только шапку и переход на следующий день

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя+86400,ВремяНачалаРаботы);

ТекущийДень = День(ТекущееВремя);

Продолжить;

КонецЕсли;

ВремяОкончанияТекущегоДня =ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя,ВремяОкончанияРаботы);

Пока ТекущееВремя<ВремяОкончанияТекущегоДня цикл

Если ТекущийДень <> День(ТекущееВремя) Тогда // начался следующий день

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя,ВремяНачалаРаботы);

ТекущийДень = День(ТекущееВремя);

КонецЕсли;

Пока ВыборкаПоПомещению.Следующий() Цикл

ДатаВремяНачалаСобытия = ВыборкаПоПомещению.НачалоСобытия;

Пока ТекущееВремя<ДатаВремяНачалаСобытия Цикл // выводить пустые строки пока не наступит событие

ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ТекущееВремя, ТекущееВремя, 3600,Неопределено);

КонецЦикла;

// вывести строку с временем начала

ДобавляемоеВремя = ?(ДатаВремяНачалаСобытия=ТекущееВремя,3600,0);

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

СодержаниеСобытия= Строка(ВыборкаПоПомещению.Контрагент)+"; "+ВыборкаПоПомещению.Содержание+"; "+ВыборкаПоПомещению.ПримечаниеКонтрагента

+"; "+?(ВыборкаПоПомещению.СкрытьПримечание,"",ВыборкаПоПомещению.ПримечаниеСобытия+"; ")+ВыборкаПоПомещению.Телефон;

СоответствиеЦвета = ТаблицаСоответствияЦветов.Найти(ВыборкаПоПомещению.Специализация,"Специализация");

Если СоответствиеЦвета =Неопределено Тогда

ЦветФонаОбласти = ВыборкаПоПомещению.Специализация.ЦветВРасписании.Получить();

Иначе

ЦветФонаОбласти = СоответствиеЦвета.Цвет;

КонецЕсли;

Если ДатаВремяНачалаСобытия<=ВремяОкончанияПредыдущегоСобытия Тогда

ВременныйТабличныйДокумент = Новый ТабличныйДокумент;

Если ТекущийСотрудник<>ВыборкаПоПомещению.Сотрудник Тогда

// вставить шапку сотрудника

СтруктураОбластей = ВывестиШапкуСотрудника(Макет,ВременныйТабличныйДокумент,ВыборкаПоПомещению.Сотрудник,ЦветШапкиСотрудника);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьВремени,СтруктураОбластейПредыдущегоСобытия.ОбластьВремени,ТипСмещенияТабличногоДокумента.БезСмещения);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьСобытия,СтруктураОбластейПредыдущегоСобытия.ОбластьСобытия,ТипСмещенияТабличногоДокумента.БезСмещения);

ТекущийСотрудник=ВыборкаПоПомещению.Сотрудник;

// вывести событие

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ДатаВремяНачалаСобытия<ВремяОкончанияПредыдущегоСобытия Тогда

СтруктураОбластей.ОбластьВремени.Примечание.Текст = "Это событие пересекается по времени с предыдущим";

КонецЕсли;

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

Иначе

// вставить только событие

СтруктураОбластей =ВывестиОбластьМакета(ВременныйТабличныйДокумент, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ДатаВремяНачалаСобытия<ВремяОкончанияПредыдущегоСобытия Тогда

СтруктураОбластей.ОбластьВремени.Примечание.Текст = "Это событие пересекается по времени с предыдущим";

КонецЕсли;

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьВремени,СтруктураОбластейПредыдущегоСобытия.ОбластьВремени,ТипСмещенияТабличногоДокумента.БезСмещения);

ТабличныйДокументПомещение.ВставитьОбласть(СтруктураОбластей.ОбластьСобытия,СтруктураОбластейПредыдущегоСобытия.ОбластьСобытия,ТипСмещенияТабличногоДокумента.БезСмещения);

КонецЕсли;

Иначе

// если сотрудник изменился, то вывести шапку для нового сотрудника

Если ТекущийСотрудник<>ВыборкаПоПомещению.Сотрудник Тогда

ВывестиШапкуСотрудника(Макет,ТабличныйДокументПомещение,ВыборкаПоПомещению.Сотрудник,ЦветШапкиСотрудника);

ТекущийСотрудник=ВыборкаПоПомещению.Сотрудник

КонецЕсли;

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, СодержаниеСобытия, ВыборкаПоПомещению.НачалоСобытия, ТекущееВремя, ДобавляемоеВремя,ВыборкаПоПомещению.Регистратор);

Если ВыборкаПоПомещению.СкрытьПримечание Тогда

СтруктураОбластей.ОбластьСобытия.Примечание.Текст = ВыборкаПоПомещению.ПримечаниеСобытия;

КонецЕсли;

СтруктураОбластей.ОбластьСобытия.ЦветФона = ?(ЦветФонаОбласти=Неопределено,ЦветаСтиля.ЦветФонаПоля,ЦветФонаОбласти);

КонецЕсли;

ДатаВремяОкончанияСобытия = ВыборкаПоПомещению.ОкончаниеСобытия;

// и время окончания события выводить только если рабочий день ещё не закончился

Если ДатаВремяОкончанияСобытия<ВремяОкончанияТекущегоДня Тогда

ДобавляемоеВремя = Цел((ДатаВремяОкончанияСобытия-ТекущееВремя)/3600+1)*3600;

СтруктураОбластей = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ВыборкаПоПомещению.ОкончаниеСобытия, ТекущееВремя, ДобавляемоеВремя,Неопределено);

СтруктураОбластейПредыдущегоСобытия = СтруктураОбластей;

КонецЕсли;

ВремяОкончанияПредыдущегоСобытия = ДатаВремяОкончанияСобытия;

КонецЦикла;

Если ВремяОкончанияТекущегоДня>ТекущееВремя Тогда

Если ВремяОкончанияПредыдущегоСобытия>=ТекущееВремя Тогда

ТекущееВремя = ТекущееВремя+3600;

Иначе

ОбластьЯчеек = ВывестиОбластьМакета(ТабличныйДокументПомещение, Макет, "", ТекущееВремя, ТекущееВремя, 3600,Неопределено);

//ТекущееВремя = ТекущееВремя+3600;

КонецЕсли;

КонецЕсли;

КонецЦикла;

ТекущееВремя = ОдинМодульНаВсех.ДобавитьВремяВДату(ТекущееВремя+86400,ВремяНачалаРаботы); // переходим на следующие сутки

КонецЦикла;

ТабДок.Присоединить(ТабличныйДокументПомещение);

КонецЦикла;

КонецПроцедуры

//

Функция ВывестиОбластьМакета(ТабличныйДокумент, Макет, Содержание, ВремяСобытия, ТекущееВремя, ДобавляемоеВремя,Регистратор)

СтруктураОбластей = Новый Структура("ОбластьВремени, ОбластьСобытия");

Область = Макет.ПолучитьОбласть("Детали|Время");

Область.Параметры.Время = ВремяСобытия;

ОбластьВремени=ТабличныйДокумент.Вывести(Область);

// ищем ближайшую область к текущему времени

РазницаВремени = ВремяСобытия-ТекущаяДата();

Если РазницаВремени<3600 И РазницаВремени>0 Тогда

ОбластьВремени.ЦветФона = ЦветаСтиля.ЦветОтрицательногоЧисла;

КонецЕсли;

Область = Макет.ПолучитьОбласть("Детали|Данные");

Область.Параметры.Содержание = Содержание;

Область.Параметры.Регистратор = Регистратор;

ОбластьСобытия = ТабличныйДокумент.Присоединить(Область);

ТекущееВремя = ТекущееВремя+ ДобавляемоеВремя;

Если Регистратор<>Неопределено Тогда

Если Не Регистратор.Оповещение Тогда

ТекущийШрифт = ОбластьСобытия.Шрифт;

ОбластьСобытия.Шрифт = Новый Шрифт(ТекущийШрифт,,10,истина);

КонецЕсли;

КонецЕсли;

СтруктураОбластей.ОбластьВремени = ОбластьВремени;

СтруктураОбластей.ОбластьСобытия = ОбластьСобытия;

Возврат СтруктураОбластей;

КонецФункции

//

Функция ВывестиШапкуСотрудника(Макет,ТабличныйДокумент,Сотрудник,ЦветФона)

СтруктураОбластей = Новый Структура("ОбластьВремени, ОбластьСобытия");

Область = Макет.ПолучитьОбласть("ШапкаСотрудник|Время");

ОбластьВремени = ТабличныйДокумент.Вывести(Область);

Область = Макет.ПолучитьОбласть("ШапкаСотрудник|Данные");

Область.Параметры.Сотрудник = Сотрудник;

ОбластьСобытия = ТабличныйДокумент.Присоединить(Область);

СтруктураОбластей.ОбластьВремени = ОбластьВремени;

СтруктураОбластей.ОбластьСобытия = ОбластьСобытия;

СтруктураОбластей.ОбластьВремени.ЦветФона =ЦветФона ;

СтруктураОбластей.ОбластьСобытия.ЦветФона =ЦветФона ;

Возврат СтруктураОбластей;

КонецФункции

//

Процедура КнопкаСформироватьНажатие(Кнопка)

СформироватьОтчет();

КонецПроцедуры

Процедура ПриОткрытии()

ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ДействияФормы;

СформироватьОтчет();

КонецПроцедуры

Процедура ДействияФормыНастройки(Кнопка)

Форма = ПолучитьФорму("Настройки",Этаформа);

Форма.Открыть();

КонецПроцедуры

Процедура КоманднаяПанель1День(Кнопка)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Начало = НачалоДня(ДатаОтчета);

Окончание = КонецДня(ДатаОтчета);

Кнопка.Пометка = Истина;

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.Неделя.Пометка = Ложь;

СформироватьОтчет();

КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

ДатаОтчета = ТекущаяДата();

ОтчетОбъект.Начало = НачалоДня(ДатаОтчета);

ОтчетОбъект.Окончание = КонецДня(ДатаОтчета);

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.День.Пометка = Истина;

СтруктураНастроек = ВосстановитьЗначение("ОтчетРасписание_10");

Если СтруктураНастроек<>Неопределено Тогда

Помещения.Загрузить(СтруктураНастроек.Помещения);

Сотрудники.Загрузить(СтруктураНастроек.Сотрудники);

ТаблицаСоответствияЦветов = СтруктураНастроек.ТаблицаСоответствияЦветов;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Колонки.Количество() = 0 Тогда

УстановитьЦветаПоУмолчанию();

КонецЕсли;

КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

СтруктураНастроек = Новый Структура;

СтруктураНастроек.Вставить("Помещения",Помещения.Выгрузить());

СтруктураНастроек.Вставить("Сотрудники",Сотрудники.Выгрузить());

СтруктураНастроек.Вставить("ТаблицаСоответствияЦветов",ТаблицаСоответствияЦветов);

СохранитьЗначение("ОтчетРасписание_10",СтруктураНастроек);

КонецПроцедуры

Процедура ДатаОтчетаПриИзменении(Элемент)

//Если Вопрос("Сформировать отчет?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да Тогда

Интервал = Окончание-Начало;

Начало = ДатаОтчета;

Окончание = Начало+Интервал;

СформироватьОтчет();

//КонецЕсли;

КонецПроцедуры

Процедура КнНазадНажатие(Элемент)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Если НачалоДня(Начало) <> НачалоДня(Окончание) Тогда

ДатаОтчета = ДатаОтчета - (7*86400);

Начало = ДатаОтчета;

Окончание = Начало+(7*86400);

Иначе

ДатаОтчета = ДатаОтчета - 86400;

Начало = ДатаОтчета;

Окончание = ДатаОтчета;

КонецЕсли;

СформироватьОтчет();

КонецПроцедуры

Процедура КнВпередНажатие(Элемент)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

Если НачалоДня(Начало) <> НачалоДня(Окончание) Тогда

ДатаОтчета = ДатаОтчета + (7*86400);

Начало = ДатаОтчета;

Окончание = Начало+(7*86400);

Иначе

ДатаОтчета = ДатаОтчета + 86400;

Начало = ДатаОтчета;

Окончание = Начало;

КонецЕсли;

СформироватьОтчет();

КонецПроцедуры

Процедура КоманднаяПанель1Неделя(Кнопка)

ДатаНачалаСтароеЗначение = Начало;

ДатаКонцаСтароеЗначение = Окончание;

ДатаОтчета = НачалоНедели(ДатаОтчета);

Начало = ДатаОтчета;

Окончание = НачалоНедели(ДатаОтчета) + (24*60*60*6);

Кнопка.Пометка = Истина;

ЭлементыФормы.КоманднаяПанельФормыДополнительная.Кнопки.День.Пометка = Ложь;

СформироватьОтчет();

КонецПроцедуры

Процедура УстановитьЦветаПоУмолчанию() Экспорт

ТаблицаСоответствияЦветов.Колонки.Очистить();

ТаблицаСоответствияЦветов.Колонки.Добавить("Специализация");

ТаблицаСоответствияЦветов.Колонки.Добавить("Цвет");

Выборка = Справочники.Специализации.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти(Выборка.Ссылка,"Специализация")=Неопределено Тогда

Строкатч = ТаблицаСоответствияЦветов.Добавить();

Строкатч.Специализация = Выборка.Ссылка;

Строкатч.Цвет = ЦветаСтиля.ЦветФонаПоля;

КонецЕсли;

КонецЦикла;

КонецПроцедуры // УстановитьЦветаИнтерваловПоУмолчанию()

Процедура ПолеТабличногоДокумента1ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка=Ложь;

Форма = Расшифровка.ПолучитьФорму("ФормаДокумента",ЭтаФорма,"КлючУникальности_123123");

Форма.Открыть();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляОтметитьОповещен(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Объект = Расшифровка.ПолучитьОбъект();

Объект.Оповещение = истина;

Попытка

Объект.Записать();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

СформироватьОтчет();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляСоздать(Кнопка)

ОбластьПриемник = ЭлементыФормы.ПолеТабличногоДокумента1.ВыделенныеОбласти[0];

Если ТипЗнч(ОбластьПриемник.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Предупреждение("На выбранное время уже оформлено событие",10);

Возврат;

КонецЕсли;

СоздатьНовоеСобытие(ОбластьПриемник,"Создание");

КонецПроцедуры

Процедура СоздатьНовоеСобытие(ОбластьПриемник,ТипДействия)

НомерРазделителя =Найти(ОбластьПриемник.Имя,":");

Если НомерРазделителя>0 Тогда // выделен диапазон строк или колонок

ЛеваяЧасть = Лев(ОбластьПриемник.Имя,НомерРазделителя-1);

ПраваяЧасть = Сред(ОбластьПриемник.Имя,НомерРазделителя+1);

НомерПервойСтроки = Число(Сред(ЛеваяЧасть,2,Найти(ЛеваяЧасть,"C")-2));

НомерПоследнейСтроки = Число(Сред(ПраваяЧасть,2,Найти(ПраваяЧасть,"C")-2));

// если выделено несколько колонок, то за текущую принимаем последнюю

НомерТекущейКолонки = Число(Сред(ПраваяЧасть,Найти(ПраваяЧасть,"C")+1));

Иначе

НомерПервойСтроки = Число(Сред(ОбластьПриемник.Имя,2,Найти(ОбластьПриемник.Имя,"C")-2));

НомерПоследнейСтроки = НомерПервойСтроки;

НомерТекущейКолонки = Число(Сред(ОбластьПриемник.Имя,Найти(ОбластьПриемник.Имя,"C")+1));

КонецЕсли;

// в ячейке слева текущей строки должны содержаться дата и время

ОбластьСДатой = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R"+НомерПервойСтроки+"C"+(Число(НомерТекущейКолонки)-1));

Если Не ОбластьСДатой.СодержитЗначение Тогда

Предупреждение("Неправильно выбрано время события",10);

Возврат;

КонецЕсли;

ДатаНачалаНовогоСобытия = ОбластьСДатой.Значение;

Если ТипДействия="Перемещение" Тогда // для перемещения новый документ не создается

НовыйДокумент = СтруктураРеквизитов.Ссылка.ПолучитьОбъект();

Иначе

НовыйДокумент = Документы.Событие.СоздатьДокумент();

КонецЕсли;

НовыйДокумент.Дата = ТекущаяДата();

НовыйДокумент.ДатаСобытия = ДатаНачалаНовогоСобытия;

НовыйДокумент.НачалоСобытия = ДатаНачалаНовогоСобытия;

НовыйДокумент.Оповещение = Ложь;

// во второй строке текущей колонки всегда содержится помещение,

ОбластьСПомещением = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R2"+"C"+НомерТекущейКолонки);

Если ТипЗнч(ОбластьСПомещением.Расшифровка)=Тип("СправочникСсылка.Помещения") Тогда

НовыйДокумент.Помещение = ОбластьСПомещением.Расшифровка;

КонецЕсли;

Если ТипДействия="Копирование"

ИЛИ ТипДействия="Перемещение" Тогда // при копировании дату окончания высчитывать, сотрудника и берём из события-источника

Если НовыйДокумент.Помещение.Пустая() Тогда

Предупреждение("Неправильно выделено рабочее место для события.",10);

Возврат;

КонецЕсли;

ДатаОкончанияНовогоСобытия = НовыйДокумент.НачалоСобытия + (СтруктураРеквизитов.ОкончаниеСобытия-СтруктураРеквизитов.НачалоСобытия);

НовыйДокумент.ОкончаниеСобытия = ДатаОкончанияНовогоСобытия;

СтруктураРеквизитов.Удалить("Ссылка"); // перед циклом удалить необрабатываемый элемент

Для Каждого элементСтруктуры из СтруктураРеквизитов цикл

Если Не ЗначениеЗаполнено(НовыйДокумент[элементСтруктуры.Ключ]) Тогда

НовыйДокумент[элементСтруктуры.Ключ] = элементСтруктуры.Значение;

КонецЕсли;

КонецЦикла;

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Иначе

ОбластьСДатой = ЭлементыФормы.ПолеТабличногоДокумента1.Область("R"+(НомерПоследнейСтроки+1)+"C"+(Число(НомерТекущейКолонки)-1));

Если ОбластьСДатой.СодержитЗначение Тогда

ДатаОкончанияНовогоСобытия = ОбластьСДатой.Значение;

Иначе

ДатаОкончанияНовогоСобытия = НовыйДокумент.НачалоСобытия+3600;

КонецЕсли;

Если Не НовыйДокумент.Помещение.Пустая() Тогда

ОсновнойСотрудникПомещения = Справочники.Сотрудники.НайтиПоРеквизиту("ОсновноеРабочееМесто",НовыйДокумент.Помещение);

НовыйДокумент.Сотрудник = ОсновнойСотрудникПомещения;

НовыйДокумент.Специализация = НовыйДокумент.Сотрудник.ОсновнаяСпециализация;

КонецЕсли;

НовыйДокумент.ОкончаниеСобытия = ДатаОкончанияНовогоСобытия;

НовыйДокумент.Состояние = Перечисления.СостоянияСобытий.Запланировано;

Форма = НовыйДокумент.ПолучитьФорму(,ЭтаФорма);

Форма.Открыть();

КонецЕсли;

СтруктураРеквизитов.Очистить();

СформироватьОтчет();

КонецПроцедуры

Процедура ОбработкаЗаписиНовогоОбъекта(Объект, Источник)

СформироватьОтчет();

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляОтменитьСобытие(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Объект = Расшифровка.ПолучитьОбъект();

Попытка

Объект.Состояние = Перечисления.СостоянияСобытий.Отменено;

Объект.Записать();

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

СформироватьОтчет();

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляКопировать(Кнопка)

Расшифровка=ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть.Расшифровка;

СкопироватьВыбраныйДокумент(Расшифровка);

КонецПроцедуры

//

Процедура СкопироватьВыбраныйДокумент(Расшифровка)

СтруктураРеквизитов.Очистить();

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

МетаданныеКонфигурации = ОдинМодульНаВсех.МетаданныеКонфигурации();

Для Каждого реквизит из МетаданныеКонфигурации.Документы.Событие.Реквизиты Цикл

СтруктураРеквизитов.Вставить(реквизит.Имя,Расшифровка[реквизит.Имя]);

КонецЦикла;

СтруктураРеквизитов.Вставить("Ссылка",Расшифровка);

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляВставить(Кнопка)

ВставитьСкопированныйДокумент();

КонецПроцедуры

//

Процедура ВставитьСкопированныйДокумент()

Если СтруктураРеквизитов.Количество()=0 Тогда

Возврат;

КонецЕсли;

ОбластьПриемник = ЭлементыФормы.ПолеТабличногоДокумента1.ВыделенныеОбласти[0];

Если ТипЗнч(ОбластьПриемник.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

Предупреждение("На выбранное время уже оформлено событие",10);

Возврат;

КонецЕсли;

СоздатьНовоеСобытие(ОбластьПриемник,"Копирование");

КонецПроцедуры

Процедура ПолеТабличногоДокумента1Выбор(Элемент, Область, СтандартнаяОбработка)

ДействияПользователяССобытием(СтандартнаяОбработка,Область.Расшифровка,"Открыть");

КонецПроцедуры

//

Процедура ДействияПользователяССобытием(СтандартнаяОбработка,Расшифровка,ТипДействия)

Если ТипЗнч(Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка=Ложь;

Если ТипДействия = "Открыть" Тогда

Форма = Расшифровка.ПолучитьФорму("ФормаДокумента",ЭтаФорма,"КлючУникальности_123123");

Форма.Открыть();

иначеЕсли ТипДействия = "РедактироватьСодержание" Тогда

Объект = Расшифровка.ПолучитьОбъект();

Объект.Заблокировать();

Содержание = Объект.Содержание;

Если ВвестиСтроку(Содержание, Строка(Расшифровка.Контрагент), 0, Истина) Тогда

Объект.Содержание = Содержание;

Объект.Записать();

СформироватьОтчет();

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Процедура КонтекстноеМенюТабличногоПоляРедактировать(Кнопка)

ТекущаяОбласть = ЭлементыФормы.ПолеТабличногоДокумента1.ТекущаяОбласть;

ДействияПользователяССобытием(Ложь,ТекущаяОбласть.Расшифровка,"Открыть");

КонецПроцедуры

Процедура ПолеТабличногоДокумента1НачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

Если ТипЗнч(ПараметрыПеретаскивания.Значение.ТекущаяОбласть.Расшифровка)<>Тип("ДокументСсылка.Событие") Тогда

СтандартнаяОбработка = Ложь;

КонецЕсли;

КонецПроцедуры

Процедура ПолеТабличногоДокумента1ПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

КонецПроцедуры

Процедура ПолеТабличногоДокумента1Перетаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

СтандартнаяОбработка = Ложь;

// если принимающая область содержит событие, то отмена

Если ТипЗнч(Область.Расшифровка)=Тип("ДокументСсылка.Событие") Тогда

ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;

Предупреждение("На выбранное время уже оформлено событие",10);

КонецЕсли;

СкопироватьВыбраныйДокумент(ПараметрыПеретаскивания.Значение.ТекущаяОбласть.Расшифровка);

СоздатьНовоеСобытие(Область,"Перемещение");

//СформироватьОтчет();

КонецПроцедуры

Процедура ПолеТабличногоДокумента1ОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

КонецПроцедуры

СтруктураРеквизитов = Новый Структура();

Процедура ОсновныеДействияФормыОсновныеДействияФормыСформировать(Кнопка)

Закрыть();

ВладелецФормы.СформироватьОтчет();

КонецПроцедуры

Процедура КоманднаяПанель1Заполнить(Кнопка)

Выборка = Справочники.Помещения.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если Помещения.Найти(Выборка.Ссылка,"Помещение")=Неопределено Тогда

Строкатч = Помещения.Добавить();

Строкатч.Помещение = Выборка.Ссылка;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3Заполнить(Кнопка)

Выборка = Справочники.Сотрудники.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если Сотрудники.Найти(Выборка.Ссылка,"Сотрудник")=Неопределено Тогда

Строкатч = Сотрудники.Добавить();

Строкатч.Сотрудник = Выборка.Ссылка;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3УстановитьФлажки(Кнопка)

Для Каждого Строкатч из Сотрудники цикл

Строкатч.Использовать = Истина ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель3СнятьФлажки(Кнопка)

Для Каждого Строкатч из Сотрудники цикл

Строкатч.Использовать = Ложь ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель1УстановитьФлажки(Кнопка)

Для Каждого Строкатч из Помещения цикл

Строкатч.Использовать = Истина ;

КонецЦикла;

КонецПроцедуры

Процедура КоманднаяПанель1СнятьФлажки(Кнопка)

Для Каждого Строкатч из Помещения цикл

Строкатч.Использовать = Ложь ;

КонецЦикла;

КонецПроцедуры

Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

Если ДанныеСтроки.Цвет = Неопределено Тогда

Возврат;

КонецЕсли;

ОформлениеСтроки.Ячейки.ПримерЦвета.ЦветФона = ДанныеСтроки.Цвет;

КонецПроцедуры

Процедура КоманднаяПанель2Заполнить(Кнопка)

Выборка = Справочники.Специализации.Выбрать();

Пока выборка.Следующий() цикл

Если Выборка.ЭтоГруппа

ИЛИ выборка.ПометкаУдаления Тогда

Продолжить;

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти(Выборка.Ссылка,"Специализация")=Неопределено Тогда

Строкатч = ТаблицаСоответствияЦветов.Добавить();

Строкатч.Специализация = Выборка.Ссылка;

Строкатч.Цвет = ЦветаСтиля.ЦветФонаПоля;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура ПриОткрытии()

Если ТаблицаСоответствияЦветов.Найти("Шапка помещения","Специализация")=неопределено Тогда

Строкатз = ТаблицаСоответствияЦветов.Добавить();

Строкатз.Специализация = "Шапка помещения";

Строкатз.цвет =Новый Цвет(231,227,203);

КонецЕсли;

Если ТаблицаСоответствияЦветов.Найти("Шапка сотрудника","Специализация")=неопределено Тогда

Строкатз = ТаблицаСоответствияЦветов.Добавить();

Строкатз.Специализация = "Шапка сотрудника";

Строкатз.цвет = Новый Цвет(249,249,201);

КонецЕсли;

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

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

// регистр ОтметкаИсполнения

Движения.ОтметкаИсполнения.Записывать = Истина;

Движения.ОтметкаИсполнения.Очистить();

Для Каждого ТекСтрокаДоки Из Доки Цикл

Движение = Движения.ОтметкаИсполнения.Добавить();

Движение.Дата = Дата;

Движение.Документ = ТекСтрокаДоки.Документ;

Движение.Исполнен = ТекСтрокаДоки.Отметка;

КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

Если ЭтотОбъект.Исправляемый <> Неопределено Тогда

ИсправляемыйДок=ЭтотОбъект.Исправляемый.ПолучитьОбъект();

ИсправляемыйДок.Исправление=ЭтотОбъект.Ссылка;

ИсправляемыйДок.Записать();

ИсправляемыйДок.УстановитьПометкуУдаления(Истина);

Набор = РегистрыСведений.ЗанятостьСотрудников.СоздатьНаборЗаписей();

Набор.Отбор.Регистратор.Установить(ЭтотОбъект.Исправляемый);

Набор.Прочитать();

Набор.Очистить();

Набор.Записать(Истина);

Движение = Движения.ЗанятостьСотрудников.Добавить();

Движение.Дата = ДатаСобытия;

Движение.Помещение = Помещение;

Движение.НачалоПериода = НачалоСобытия;

Движение.Специализация = Специализация;

Движение.КонецПериода = ОкончаниеСобытия;

Движение.Сотрудник = Сотрудник;

иначе

Движение = Движения.ЗанятостьСотрудников.Добавить();

Движение.Дата = ДатаСобытия;

Движение.Помещение = Помещение;

Движение.НачалоПериода = НачалоСобытия;

Движение.Специализация = Специализация;

Движение.КонецПериода = ОкончаниеСобытия;

Движение.Сотрудник = Сотрудник;

КонецЕсли;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Состояние = Перечисления.СостоянияСобытий.Отменено Тогда

РежимЗаписи = РежимЗаписиДОкумента.ОтменаПроведения;

КонецЕсли;

//проверка на события в это же время

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЗанятостьСотрудников.Помещение,

| ЗанятостьСотрудников.Регистратор,

| ЗанятостьСотрудников.НачалоПериода,

| ЗанятостьСотрудников.КонецПериода

|ИЗ

| РегистрСведений.ЗанятостьСотрудников КАК ЗанятостьСотрудников

|ГДЕ

| ЗанятостьСотрудников.Помещение = &Помещение

| И ЗанятостьСотрудников.Активность = &Истина

| И ЗанятостьСотрудников.Дата = &Дата";

Запрос.УстановитьПараметр("Истина", Истина);

Запрос.УстановитьПараметр("Дата", ЭтотОбъект.ДатаСобытия);

Запрос.УстановитьПараметр("Помещение", ЭтотОбъект.Помещение);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Если ЭтотОбъект.НачалоСобытия >=ВыборкаДетальныеЗаписи.НачалоПериода

И ЭтотОбъект.НачалоСобытия<= ВыборкаДетальныеЗаписи.КонецПериода

И ЭтотОбъект.Помещение = ВыборкаДетальныеЗаписи.Помещение

И ЭтотОбъект.Ссылка<> ВыборкаДетальныеЗаписи.Регистратор Тогда

Сообщить("На это время уже есть событие "+ ВыборкаДетальныеЗаписи.Регистратор + " документ не может быть проведен!!!");

РежимЗаписи = РежимЗаписиДОкумента.ОтменаПроведения;

КонецЕсли;

КонецЦикла;

КонецПроцедуры