Разработка АИС учета электронного документооборота деканата на основе бизнес-процессов

Разработка проекта автоматизации документооборота при помощи механизма бизнес-процессов и с использованием современных программных наработок в 1С:Предпирятие. Создание информационной базы "Деканат" для обработки данных процесса обучения студентов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 26.07.2013
Размер файла 954,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Также запущенный бизнес-процесс можно принудительно прервать формированием документа «АкадемическаяОтпуск». В этом случае бизнес-процесс завершается вне зависимости от каких-либо внутренних факторов, а студент считается находящимся в академическом отпуске. По возвращении из отпуска будем сформирован документ «Восстановление» с особыми параметрами (с указанием о том, что студент не был отчислен, а прибывал в академическом отпуске) и стартован новый бизнес-процесс.

ГЛАВА 3 ОЦЕНКА МАСШТАБИРУЕМОСТИ

3.1 Оценка масштабируемости платформы

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

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

Метод группового учета аргументов (МГУА) -- семейство индуктивных алгоритмов для математического моделирования мультипараметрических данных. Метод основан на рекурсивном селективном отборе моделей, на основе которых строятся более сложные модели. Точность моделирования на каждом следующем шаге рекурсии увеличивается за счет усложнения модели. За параметрический данные возьмем тип операционной системы сервера VPN (OS), количество узлов сети VPN (С), длину используемого ключа шифрования (KEY, b), максимальный размер блока передаваемых данных (MTU, b). Результатом же определим собранные статистические данные по пропускной способности сети (S, mbps) и нагрузке на процессор сервера VPN (L, %). Сокращенный вариант выборки, представляющий собой совокупность кортежей (S, L, OS, KEY, C, MTU) приведен в таблице 1.

Таблица 3.1

S

L

OS

KEY

C

MTU

44,38

18

1

128

10

1500

51,89

23

1

128

20

1500

57,69

38

1

128

30

1500

43,53

19

1

512

10

1500

21,13

25

1

512

20

1500

52,61

39

1

512

30

1500

12,81

14

2

128

10

1500

23,08

19

2

128

20

1500

68,06

40

2

128

30

1500

12,61

14

2

512

10

1500

23,11

22

2

512

20

1500

63,78

43

2

512

30

1500

В таблице 1: S - в kbps (кбит/с) - общая нагрузка на канал сети (сумма общего входящего и исходящего трафика сервера VPN), рассчитанная как среднее из N=30 испытаний, проведенных при фиксации набора P=12 прочих независимых параметров сети:

L - в % - общая нагрузка на центральный процессор сервера VPN,

OS - условное обозначение типа операционной системы сервера VPN (1- MS Windows Server, 2 - Linux)

KEY - в bit (бит) - длина ключа, установленного для используемого протокола шифрования. В работе использована группа протоколов AES-xxx-CBC (где ххх - длина ключа) с длиной ключа 128, 256 и 512 бит. Обозначения: 1 - AES-128-CBC, 2 - AES-512-CBC;

C - количество узлов, одновременно осуществляющих обмен данными с сервером VPN;

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

Сбор статистических данных проводился приложениями Perfomance Monitor v5.0 и кроссплатформенным пакетом iPerf v2.0 (среда Sun JVM 6u10). Данные собраны на основе запросов к сформированной базе данных под управлением СУБД MS SQL 2005 SP2, объем выборки составил 90-100 Мб. Анализ полученных данных проведен пакетами NeuroShell 2 и Statistica 6.0. Для построения графиков использован OOp Calc 3.0.

Всего было проведено А=N*P=360 опытов и на их основе построен сводный график (Рис. 3.1), наглядно представляющий общую зависимость пропускной способности и загрузки CPU сервера от параметров сети.

Рис. 3.1 «Производительность системы в различных ОС»

Из собранных данных и представленного графика можно сделать несколько предварительных общих выводов:

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

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

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

3.1.1 МГУА

Для формирования математической и функции отклика используем МГУА.

С целью автоматизации выбора оптимальных параметров в защищённом канале корпоративной сети, необходимо построить функцию отклика, которая будет идентифицировать пропускную способность канала в зависимости от воздействующих факторов: операционной системы, длины ключа, количества узлов корпоративной сети. Математическим аппаратом, который позволяет решить данную задачу, является Метод Группового Учёта Аргументов (Group Method of Data Handling). Он применяется в самых различных областях для анализа данных и отыскания знаний, прогнозирования и моделирования систем, оптимизации и распознавания образов. Индуктивные алгоритмы МГУА дают уникальную возможность автоматически находить взаимозависимости в данных, выбрать оптимальную структуру модели или сети и увеличить точность существующих алгоритмов.

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

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

Другим достоинством МГУА является то, что он гарантирует помехоустойчивость получаемых моделей. Чем больше степень неточности данных, характеризуемая отношением мощности помехи к мощности точных данных, тем проще модель оптимальной сложности, поэтому МГУА при увеличении помех выбирает все более узкие границы области моделирования и все более простые структуры моделей. Таким образом, при самоорганизации модели на ЭВМ выбирается структура, ближайшая к оптимальной для каждого уровня отношения помеха-сигнал.

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

Для подготовки элементов выборки к использованию в МГУА необходимо произвести ее цензурирование, т.е. приведение к отрезку [0,1].

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

После цензурирования выборки все ее значения приводятся к отрезку [0,1] по формуле

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

Для восстановления зависимости используется полиномиальный итерационный алгоритм МГУА, в результате работы которого должна быть получена зависимость

где l - число элементов в исходном базисе факторов;

m - число слагаемых модели с ненулевыми значениями коэффициентов, называемое сложностью модели.

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

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

Рассмотрим подробнее процедуру МГУА.

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

,

где - число элементов в экзаменационной части выборки.

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

.

Число F передаваемых от шага к шагу наилучших моделей называется свободой выбора метода.

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

Процесс останавливается при выполнении следующего неравенства:

и за результат принимается лучшая модель (r-1) шага.

Теперь рассмотрим подробнее процедуру подбора коэффициентов модели по заданной структуре модели итерационным МНК.

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

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

где Np - число наблюдений в рабочей части выборки.

Первоначально весовые коэффициенты наблюдений предполагаются одинаковыми и равными 1, с этими весами строится система коэффициентов k, k=1,2,...,m модели в виде решения системы линейных уравнений:

Затем выбираются веса таким образом, чтобы вес i-го наблюдения зависел от отношения i-го остатка в предыдущей итерации к общей мере остатков в этой итерации:

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

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

Итак, проведем математический анализ данных, используя МГУА и NeuroShell. Исходную выборку разбиваем на две подвыборки As и Bs. Подвыборка As используется для определения коэффициентов модели, а подвыборка Bs -- для определения качества (среднеквадратического отклонения). При этом соотношение количества данных в обеих выборках составляет 80%/20%.

Далее выбираем общий вид перебираемых моделей, так называемые опорные функции. Например, полином Колмогорова-Габора:

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

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

Y=-0.42-0.14*X1-8.8E-002*X2+0.4*X3+0.36*X32+6.7E-002*X1*X2+0.26*X1*X3-2.6E-002*X2*X3, (*)

где Х1 = OS, Х2 = KEY, Х3 = C, Y = S.

Степень соответствия полученной модели можно наблюдать на графике (Рис. 3.2)

Рис. 3.2 «График модели и реальных статистических данных»

Среди всех моделей выбираем наилучшую, используя приложение NeuroShell. Качество моделей определяется среднеквадратическим отклонением ошибки и корреляцией Y и исходных данных (Рис. 3.3).

Рис. 3.3 «Отклонение модели от реальных данных»

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

3.1.2 Многомерный регрессионный анализ

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

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

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

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

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

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

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

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

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

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

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

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

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

В общем виде многомерная линейная регрессионная модель зависимости y от объясняющих переменных , ,…, имеет вид:

.

Для оценки неизвестных параметров взята случайная выборка объема n из (k+1)-мерной случайной величины (y, ,,…,).

В матричной форме модель имеет вид:

,

Где

, , , е=

Ш вектор-столбец фактических значений зависимой переменной размерности n;

Ш матрица значений объясняющих переменных размерности n*(k+1);

Ш вектор-столбец неизвестных параметров, подлежащих оценке, размерности (k+1);

Ш вектор-столбец случайных ошибок размерности n с математическим ожиданием ME=0 и ковариационной матрицей

соответственно, при этом

-единичная матрица размерности (nxn).

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

Далее подставив выражение

в ,

получаем скалярную сумму квадратов

Условием обращения полученной суммы в минимум является система нормальных уравнений:

, (j=0,1,2,…,k) .

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

.

При замене вектора неизвестных параметров в на оценки, полученные методом наименьших квадратов, получаем следующее выражение: .

Далее умножив обе части уравнения слева на матрицу , получим

Так как , тогда .

Полученные оценки вектора b являются не смещенными и эффективными.

Ковариационная матрица вектора b имеет вид:

, где - остаточная дисперсия.

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

, где , .

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

Несмещенная оценка остаточной дисперсии определяется по формуле

,

где n - объем выборочной совокупности; k - число объясняющих переменных.

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

,

где - сумма квадратов отклонений (от нуля), обусловленная регрессией;

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

Для проверки гипотезы используется величина

,

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

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

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

3.2 Оценка масштабируемости ИБ

Тестирование проводилось на ОС Windows Server 2003 и СУБД Ms SQLserver 2005, т.к. 1С: Предприятие 8 оптимизировано для работы с данными продуктами. Использовалось специализированное программное обеспечение для тестирования: 1С:Корпоративный инструментальный пакет и TPC-1C-GILV.

3.2.1 Тест-пакет «1С: Корпоративный Инструментальный Пакет»

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

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

ь получения объективной информации о производительности системы;

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

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

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

Основные задачи, решаемые при помощи Корпоративного инструментального пакета:

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

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

ь оценка масштабируемости системы;

ь выбор оборудования;

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

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

ь поиск и анализ «узких мест» и оптимизация кода системы:

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

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

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

Рис. 3.4 «Схема работы 1С: КИП»

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

Нагрузка в исследуемой базе может создаваться Тест-центром (при помощи сценариев тестирования) либо реальными пользователями системы.

Эксперт, при помощи Тест-центра и «Центра управления производительностью» осуществляет сбор показателей производительности системы. На основании полученных значений он оценивает текущую работоспособность системы и наличие в ней проблем производительности.

Если обнаружены проблемы производительности, то эксперт при помощи ЦУП собирает дополнительную (аналитическую) информацию об «узких местах» системы. На основании этой информации и рекомендаций, данных в руководстве по использованию "Корпоративного инструментального паркета", эксперт может произвести оптимизацию системы, изменив код конфигурации и/или структуру метаданных.

3.2.3 Тест-центр

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

3.2.4 Центр управления производительностью

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

С помощью тест-центра проводилась нагрузка на сервер 1с:предприятия с 10 виртуальными пользователями, статистика собиралась с помощью Центр управления производительностью.

Результаты:

Windows Server 2003 + Ms SQLserver 2005, по оси абсцисс отмеряется относительная нагрузка на систему сервера 1С, а по оси ординат - количество одновременно установленных соединений (клиентов).

Рис. 3.5 «Производительность ИБ при различной нагрузке»

Исходя из полученных статистических данных (Приложение 1) и основанного на них графика (Рис. 3.5) видно, что время отклика ИБ напрямую зависит от количества одновременно взаимодействующих с ней клиентов. Тестовая выборка демонстрирует возможность благоприятной работы для 7-12 одновременно подключенных клиентов. При превышении условного лимита в 20 соединений шанс возникновения длительных простоев и отказов в работе ИБ превышает допустимые нормы.

ЗАКЛЮЧЕНИЕ

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

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

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

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Бутов А.С., Гаскаров Д.В., Егоров А.Н., Крупенина Н.В. Транспортные системы: моделирование и управление. / Под общ. ред. проф. Бутова А.С. - СПб.: Судостроение, 2001. - 552 с.

2. Юдицкий С.А., Магергут В.З. Логическое управление дискретными процессами: модели, анализ, синтез. - М.: Машиностроение, 1987. - 176 с.

3. Хрусталева Е.Ю. Разработка сложных отчетов в 1С:Предприятии 8. Система компоновки данных;

4. Габец А.П., Гончаров Д.И. 1С:Предприятие 8.1. Простые примеры разработки;

5. Бояркин В.А., Филатов А.И. 1С:Предприятие 8. Конвертация данных: обмен данными между прикладными решениями;

6. Максим Радченко. 1С:Предприятие 8.1. Практическое пособие разработчика. Примеры и типовые приемы;

7. Андрей Габец, Дмитрий Гончаров, Дмитрий Козырев, Дмитрий Кухлевский, Максим Радченко. Профессиональная разработка в системе 1С:Предприятие 8;

8. Грянина Е.А., Харитонов С.А. Секреты профессиональной работы с "1С:Зарплата и Управление Персоналом 8". Введение в конфигурацию.

Приложение 1

Листинг модуля ИБ

////////////////////////////////////////////////////////////////////////////////

// ОБРАБОТЧИКИ СОБЫТИЙ

// Обработчик события ПриОткрытии формы.

//

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

Макет = Справочники.КлассификаторСпециальностейПоОбразованию.ПолучитьМакет("КлассификаторСпециальностейПоОбразованию");

Макет.Параметры.Расшифровка = Истина; // чтобы работала расшифровка

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

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

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

ТабличныйДокумент.ФиксацияСверху = 3;

ТабличныйДокумент.ОтображатьЗаголовки = Ложь;

ТабличныйДокумент.ОтображатьСетку = Ложь;

ТабличныйДокумент.ТолькоПросмотр = Истина;

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

// Обработчик события ОбработкаРасшифровки элемента ПолеТабличногоДокумента.

//

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

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

// Получение значений полей выбранной строки.

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

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

ОбластьКод = ТабличныйДокумент.Области.Код;

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

Если ТекущаяОбласть.Низ = ТекущаяОбласть.Верх Тогда

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

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

// Проверка наличия выбранного элемента.

Ссылка = Справочники.КлассификаторСпециальностейПоОбразованию.НайтиПоНаименованию(Наименование);

Если НЕ Ссылка.Пустая() Тогда

Вопрос = "В справочнике ""Классификатор специальностей по образованию"" уже существует элемент с наименованием """ + Наименование + """! Открыть существующий?";

Ответ = Вопрос(Вопрос, РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Отмена, );

Если Ответ = КодВозвратаДиалога.Да Тогда

Ссылка.ПолучитьФорму( , ВладелецФормы, ).Открыть();

Возврат;

ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда

Возврат;

КонецЕсли;

КонецЕсли;

// Создание нового элемента справочника.

ФормаНовогоЭлемента = Справочники.КлассификаторСпециальностейПоОбразованию.ПолучитьФормуНовогоЭлемента(, ВладелецФормы, );

ФормаНовогоЭлемента.Код = Код;

ФормаНовогоЭлемента.Наименование = Наименование;

ФормаНовогоЭлемента.Открыть();

Иначе

Форма = ПолучитьОбщуюФорму("ФормаПодбораИзКлассификатора", ЭтаФорма);

Если Форма.Открыта() Тогда

Форма.СписокВыбора.Очистить();

Иначе

СтруктураКолонок = Новый Структура();

СтруктураКолонок.Вставить("Код", Новый Структура("Заголовок, Ширина", "Код", 5));

СтруктураКолонок.Вставить("Наименование", Новый Структура("Заголовок, Ширина", "Наименование"));

СтруктураКолонок.Вставить("Видимость", Новый Структура("Заголовок, Ширина", ""));

Форма.ТипСправочника = "КлассификаторСпециальностейПоОбразованию";

Форма.НастроитьФорму(СтруктураКолонок);

КонецЕсли;

СписокВыбора = Форма.СписокВыбора;

Для ТекущаяСтрока = ТекущаяОбласть.Верх по ТекущаяОбласть.Низ Цикл

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

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

ЕстьРасшифрока = (ТабличныйДокумент.Область(ТекущаяСтрока, ОбластьНаименование.Лево, ТекущаяСтрока, ОбластьНаименование.Право).Расшифровка <> Неопределено);

ЭтоЧисло = Истина;

Попытка

КодКакЧисло = Число(КодЧисловой);

Исключение

ЭтоЧисло = Ложь;

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

ЕСли ЭтоЧисло И ЕстьРасшифрока Тогда

СтрокаПодбора = СписокВыбора.Добавить();

СтрокаПодбора.Код = КодЧисловой;

СтрокаПодбора.Наименование = СтрПолучитьСтроку(Наименование, 1);

СтрокаПодбора.Видимость = Справочники.КлассификаторСпециальностейПоОбразованию.НайтиПоКоду(КодЧисловой).Пустая();

СтрокаПодбора.Переносить = СтрокаПодбора.Видимость;

КонецЕсли;

КонецЦикла;

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

КонецЕсли;

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

Модуль печатной формы

// Функция возвращает ближайшую дату начала периода планирования

//

// Параметры

// Периодичность (Перечисления.Периодичность) - периодичность планирования по сценарию.

// ДатаВПериоде (Дата) - произвольная дата

//

// Возвращаемое значение:

// ДатаНачалаПериода - ближайшая дата начала периода планирования

//

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

Если НЕ ТипЗнч(ДатаВПериоде)=Тип("Дата") Тогда

Возврат '00010101';

КонецЕсли;

Если Периодичность=Перечисления.Периодичность.День Тогда

Возврат НачалоДня(ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Неделя Тогда

Возврат НачалоНедели (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Месяц Тогда

Возврат НачалоМесяца (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Квартал Тогда

Возврат НачалоКвартала (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Год Тогда

Возврат НачалоГода (ДатаВПериоде);

Иначе

Возврат НачалоДня(ДатаВПериоде);

КонецЕсли;

КонецФункции // ДатаНачалаПериода()

// Функция возвращает ближайшую дату окончания периода планирования

//

// Параметры

// Периодичность (Перечисления.Периодичность) - периодичность планирования по сценарию.

// ДатаВПериоде (Дата) - произвольная дата

//

// Возвращаемое значение:

// ДатаКонцаПериода - ближайшая дата окончания периода планирования

//

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

Если Периодичность=Перечисления.Периодичность.День Тогда

Возврат КонецДня(ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Неделя Тогда

Возврат КонецНедели (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Месяц Тогда

Возврат КонецМесяца (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Квартал Тогда

Возврат КонецКвартала (ДатаВПериоде);

ИначеЕсли Периодичность=Перечисления.Периодичность.Год Тогда

Возврат КонецГода (ДатаВПериоде);

Иначе

Возврат КонецДня(ДатаВПериоде);

КонецЕсли;

КонецФункции // ДатаКонцаПериода()

// Функция добавляет интервал к дате

//

// Параметры:

// Периодичность (Перечисления.Периодичность) - пнриодичность планирования по сценарию.

// ДатаВПериоде (Дата) - произвольная дата

// Смещение (число) - определяет направление и количество периодов, в котором сдвигается дата

//

// Возвращаемое значение:

// Дата, отстоящая от исходной на заданное количество периодов

//

Функция ДобавитьИнтервал(ДатаПериода,Периодичность,Смещение) Экспорт

Если Периодичность = Перечисления.Периодичность.День Тогда

НоваяДатаПериода = ДатаПериода + Смещение*24*3600;

ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда

НоваяДатаПериода = ДатаПериода + Смещение*7*24*3600;

ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда

НоваяДатаПериода = ДобавитьМесяц(ДатаПериода, Смещение);

ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда

НоваяДатаПериода = ДобавитьМесяц(ДатаПериода, Смещение*3);

ИначеЕсли Периодичность = Перечисления.Периодичность.Год Тогда

НоваяДатаПериода = ДобавитьМесяц(ДатаПериода, Смещение*12);

Иначе

НоваяДатаПериода=НачалоДня(ДатаПериода) + Смещение*24*3600;

КонецЕсли;

Возврат НоваяДатаПериода;

КонецФункции // ДобавитьИнтервал()

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

//

// Параметры

// Периодичность - Перечисление.Периодичность элемент перечисления,

// для которого вычисляется количество дней

//

// Возвращаемое значение:

// ЧислоДнейВПериоде (число) - число дней в переданном периоде

//

Функция ЧислоДнейВПериоде(Периодичность) Экспорт

Если Периодичность=Перечисления.Периодичность.День Тогда

ЧислоДнейВПериоде=1;

ИначеЕсли Периодичность=Перечисления.Периодичность.Неделя Тогда

ЧислоДнейВПериоде=7;

ИначеЕсли Периодичность=Перечисления.Периодичность.Месяц Тогда

ЧислоДнейВПериоде=30;

ИначеЕсли Периодичность=Перечисления.Периодичность.Квартал Тогда

ЧислоДнейВПериоде=90;

ИначеЕсли Периодичность=Перечисления.Периодичность.Год Тогда

ЧислоДнейВПериоде=365;

Иначе

ЧислоДнейВПериоде=0;

КонецЕсли;

Возврат ЧислоДнейВПериоде;

КонецФункции // ЧислоДнейВПериоде()

// Возвращает текст фрагмента запроса с выборками по стандартным периодам

//

// Параметры

// Периодичность(строка) - периодичность выборки данных запроса

// Период(строка) - имя измерения, в котором хранится период данных

//

// Возвращаемое значение:

// ТекстЗапросаПоПериодам - текст фрагмента запроса

//

Функция СформироватьТекстЗапросаПоПериодам(Периодичность,Период) Экспорт

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

СписокПериодов.Добавить("День");

СписокПериодов.Добавить("Неделя");

СписокПериодов.Добавить("Месяц");

СписокПериодов.Добавить("Квартал");

СписокПериодов.Добавить("Год");

ТекстЗапросаПоПериодам="";

НачальныйИндекс=СписокПериодов.Индекс(СписокПериодов.НайтиПоЗначению(Периодичность));

Для Сч=НачальныйИндекс По СписокПериодов.Количество()-1 Цикл

ТекущаяПериодичность=СписокПериодов.Получить(Сч).Значение;

ТекстЗапросаПоПериодам=ТекстЗапросаПоПериодам+"

|НачалоПериода("+Период+", "+ТекущаяПериодичность+") КАК Период"+ТекущаяПериодичность+",";

КонецЦикла;

Возврат ТекстЗапросаПоПериодам;

КонецФункции // СформироватьТекстЗапросаПоПериодам()

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

// датой и периодичностью.

//

// Параметры

// ДатаВПериоде:Дата - дата из периода

// Периодичность: Строка - строка, определяющая периодичность

//

// Возвращаемое значение:

// СтрокаПериод: строка - представление периода для вывода в отчетах

//

Функция ПолучитьПериодСтрокой(ДатаВПериоде, Периодичность) Экспорт

Если Периодичность = "Год" Тогда

ФорматДаты = "ДФ='гггг ""г.""'";

ИначеЕсли Периодичность = "Квартал" Тогда

ФорматДаты = "ДФ='к"" квартал"" гггг ""г.""'";

ИначеЕсли Периодичность = "Месяц" Тогда

ФорматДаты = "ДФ='ММММ гггг ""г.""'";

ИначеЕсли Периодичность = "Неделя" Тогда

ФорматДаты = "ДФ='""Неделя (""дд.ММ.гггг'";

ИначеЕсли Периодичность = "День" Тогда

ФорматДаты = "ДФ='дд.ММ.гггг ""г.""'";

Иначе

ФорматДаты = "";

КонецЕсли;

СтрокаПериод = "" + Формат(ДатаВПериоде, ФорматДаты);

Если Периодичность = "Неделя" И ТипЗнч(ДатаВПериоде) = Тип("Дата") Тогда

СтрокаПериод = "" + НеделяГода(ДатаВПериоде) + "-ая " + СтрокаПериод + Формат(КонецНедели(ДатаВПериоде), "ДФ='"" - ""дд.ММ.гггг)'");

КонецЕсли;

Возврат СтрокаПериод;

КонецФункции // ПолучитьПериодСтрокой()

// Предназначена для реализации "произвольного" ввода даты-месяца

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

// в переданный параметр ДатаПоТексту возвращает подобранную по тексту дату

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

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

ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату();

ТекущийГод = Год(ТекущаяДата);

ТекущийКвартал = Цел(Месяц(ТекущаяДата) / 4) + 1;

ТекущийМесяц = Месяц(ТекущаяДата);

ТекущаяНеделя = НеделяГода(ТекущаяДата);

ТекущийДень = День(ТекущаяДата);

НачалоГода = НачалоГода(ТекущаяДата);

НачалоМесяца = НачалоМесяца(ТекущаяДата);

КонецГода = КонецГода(ТекущаяДата);

Если ПустаяСтрока(Текст) Тогда

Возврат СписокВозврата;

КонецЕсли;

Если Найти(Текст, ".") <> 0 Тогда

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

ИспользуемыйРазделитель = ".";

ИначеЕсли Найти(Текст, ",") <> 0 Тогда

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

ИспользуемыйРазделитель = ",";

ИначеЕсли Найти(Текст, "-") <> 0 Тогда

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

ИспользуемыйРазделитель = "-";

ИначеЕсли Найти(Текст, "/") <> 0 Тогда

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

ИспользуемыйРазделитель = "/";

ИначеЕсли Найти(Текст, "\") <> 0 Тогда

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

ИспользуемыйРазделитель = "\";

Иначе

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

ИспользуемыйРазделитель = " ";

КонецЕсли;

Если Периодичность = Перечисления.Периодичность.День Тогда

КонецПериода = День(КонецМесяца(ТекущаяДата));

ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда

КонецПериода = НеделяГода(КонецГода);

ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда

КонецПериода = 12;

ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда

КонецПериода = 4;

КонецЕсли;

Если Подстроки.Количество() = 1 И Периодичность <> Перечисления.Периодичность.Год Тогда

// единственное слово - пытаемся получить период

Если ОбщегоНазначения.ТолькоЦифрыВСтроке(Текст) Тогда

ПериодЧислом = Число(Текст);

Если ПериодЧислом >= 1 И ПериодЧислом <= КонецПериода Тогда

Если Периодичность = Перечисления.Периодичность.День Тогда

ДатаПоТексту = ДобавитьИнтервал(НачалоМесяца, Периодичность, ПериодЧислом - 1);

Иначе

ДатаПоТексту = ДобавитьИнтервал(НачалоГода, Периодичность, ПериодЧислом - 1);

КонецЕсли;

Если Периодичность = Перечисления.Периодичность.День Тогда

Если СтрДлина(Текст) = 1 Тогда

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ=d/MM/yyyy");

Иначе

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ=dd/MM/yyyy");

КонецЕсли;

ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда

ФорматированнаяДата = Текст + Формат(ДатаПоТексту, "ДФ=/yyyy");

ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда

ФорматированнаяДата = Текст + Формат(ДатаПоТексту, "ДФ=/yyyy");

ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда

Если СтрДлина(Текст) = 1 Тогда

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ=M/yyyy");

Иначе

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ=MM/yyyy");

КонецЕсли;

Иначе // Год

ФорматированнаяДата = Текст;

КонецЕсли;

СписокВозврата.Добавить(ФорматированнаяДата);

КонецЕсли;

Иначе

Если Периодичность = Перечисления.Периодичность.Месяц Тогда

СписокМесяцев = СписокМесяцевПоСтроке(Текст);

Для Каждого Месяц Из СписокМесяцев Цикл

ДатаПоТексту = Дата(ТекущийГод, Месяц, 1);

СписокВозврата.Добавить(Формат(ДатаПоТексту, "ДФ='ММММ гггг ""г""'"));

КонецЦикла;

КонецЕсли;

КонецЕсли;

Иначе

Если Периодичность = Перечисления.Периодичность.День Тогда

Если Подстроки.Количество() >= 2 И Не ПустаяСтрока(Подстроки[1]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда

Месяц = Число(Подстроки[1]);

Если Месяц >= 1 И Месяц <= КонецПериода Тогда

ФорматДляМесяца = Прав("MM", СтрДлина(Подстроки[1]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Если ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда

Месяц = ТекущийМесяц;

ФорматДляМесяца = "MM";

Иначе

СписокМесяцев = СписокМесяцевПоСтроке(Подстроки[1]);

Если СписокМесяцев.Количество() = 1 Тогда

Месяц = СписокМесяцев[0];

ФорматДляМесяца = "MMMM";

КонецЕсли;

КонецЕсли;

КонецЕсли;

Если Подстроки.Количество() >= 3 И Не ПустаяСтрока(Подстроки[2]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[2]) Тогда

Год = Число(Лев(Формат(ТекущийГод, "ЧГ="), 4-СтрДлина(Подстроки[2])) + Подстроки[2]);

Если Год >= 1900 И Год < 3000 Тогда

ФорматДляГода = Прав("yyyy", СтрДлина(Подстроки[2]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Год = ТекущийГод;

ФорматДляГода = "yyyy";

КонецЕсли;

Если Подстроки.Количество() >= 1 И Не ПустаяСтрока(Подстроки[0]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда

День = Число(Подстроки[0]);

Если День >= 1 И Месяц <> Неопределено И День <= День(КонецМесяца(Дата(Год, Месяц, 1))) Тогда

ФорматДляДня = Прав("dd", СтрДлина(Подстроки[0]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Возврат СписокВозврата;

КонецЕсли;

ДатаПоТексту = Дата(Год, Месяц, День);

Если Подстроки.Количество() < 3 ИЛИ ПустаяСтрока(Подстроки[2]) Тогда

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ='" + ФорматДляДня + ИспользуемыйРазделитель + ФорматДляМесяца + ИспользуемыйРазделитель + ФорматДляГода + "'");

Иначе

ФорматированнаяДата = "";

КонецЕсли;

ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда

Если Подстроки.Количество() >= 2 И Не ПустаяСтрока(Подстроки[1]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда

Год = Число(Лев(Формат(ТекущийГод, "ЧГ="), 4-СтрДлина(Подстроки[1])) + Подстроки[1]);

Если Год >= 1900 И Год < 3000 Тогда

ФорматДляГода = Прав("yyyy", СтрДлина(Подстроки[1]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Год = ТекущийГод;

ФорматДляГода = "yyyy";

КонецЕсли;

Если Подстроки.Количество() >= 1 И Не ПустаяСтрока(Подстроки[0]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда

Неделя = Число(Подстроки[0]) - 1;

Если Неделя < 1 ИЛИ Неделя > НеделяГода(Дата(Год, 12, 31)) Тогда

Возврат СписокВозврата;

КонецЕсли;

Иначе

Возврат СписокВозврата;

КонецЕсли;

ДатаПоТексту = ДобавитьИнтервал(Дата(Год, 1, 1), Периодичность, Неделя);

Если Подстроки.Количество() < 2 ИЛИ ПустаяСтрока(Подстроки[1]) Тогда

ФорматированнаяДата = Подстроки[0] + ИспользуемыйРазделитель + Формат(ДатаПоТексту, "ДФ='" + ФорматДляГода + "'");

Иначе

ФорматированнаяДата = "";

КонецЕсли;

ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда

Если Подстроки.Количество() >= 1 И Не ПустаяСтрока(Подстроки[0]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда

Месяц = Число(Подстроки[0]);

Если Месяц >= 1 И Месяц <= КонецПериода Тогда

ФорматДляМесяца = Прав("MM", СтрДлина(Подстроки[0]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Возврат СписокВозврата;

КонецЕсли;

Если Подстроки.Количество() >= 2 И Не ПустаяСтрока(Подстроки[1]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда

Год = Число(Лев(Формат(ТекущийГод, "ЧГ="), 4-СтрДлина(Подстроки[1])) + Подстроки[1]);

Если Год >= 1900 И Год < 3000 Тогда

ФорматДляГода = Прав("yyyy", СтрДлина(Подстроки[1]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Год = ТекущийГод;

ФорматДляГода = "yyyy";

КонецЕсли;

ДатаПоТексту = Дата(Год, Месяц, 1);

Если Подстроки.Количество() < 2 ИЛИ ПустаяСтрока(Подстроки[1]) Тогда

ФорматированнаяДата = Формат(ДатаПоТексту, "ДФ='" + ФорматДляМесяца + ИспользуемыйРазделитель + ФорматДляГода + "'");

Иначе

ФорматированнаяДата = "";

КонецЕсли;

ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда

Если Подстроки.Количество() >= 1 И Не ПустаяСтрока(Подстроки[0]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда

Квартал = (Число(Подстроки[0]));

Если Квартал < 1 ИЛИ Квартал > КонецПериода Тогда

Возврат СписокВозврата;

КонецЕсли;

Иначе

Возврат СписокВозврата;

КонецЕсли;

Если Подстроки.Количество() >= 2 И Не ПустаяСтрока(Подстроки[1]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[1]) Тогда

Год = Число(Лев(Формат(ТекущийГод, "ЧГ="), 4-СтрДлина(Подстроки[1])) + Подстроки[1]);

Если Год >= 1900 И Год < 3000 Тогда

ФорматДляГода = Прав("yyyy", СтрДлина(Подстроки[1]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Год = ТекущийГод;

ФорматДляГода = "yyyy";

КонецЕсли;

ДатаПоТексту = Дата(Год, (Квартал - 1) * 3 + 1, 1);

Если Подстроки.Количество() < 2 ИЛИ ПустаяСтрока(Подстроки[1]) Тогда

ФорматированнаяДата = Подстроки[0] + ИспользуемыйРазделитель + Формат(ДатаПоТексту, "ДФ='" + ФорматДляГода + "'");

Иначе

ФорматированнаяДата = "";

КонецЕсли;

ИначеЕсли Периодичность = Перечисления.Периодичность.Год Тогда

Если Подстроки.Количество() >= 1 И Не ПустаяСтрока(Подстроки[0]) И ОбщегоНазначения.ТолькоЦифрыВСтроке(Подстроки[0]) Тогда

Год = Число(Лев(Формат(ТекущийГод, "ЧГ="), 4-СтрДлина(Подстроки[0])) + Подстроки[0]);

Если Год >= 1900 И Год < 3000 Тогда

ФорматДляГода = Прав("yyyy", СтрДлина(Подстроки[0]));

Иначе

Возврат СписокВозврата;

КонецЕсли;

Иначе

Возврат СписокВозврата;

КонецЕсли;

ДатаПоТексту = Дата(Год, 1, 1);

Если Подстроки.Количество() < 2 ИЛИ ПустаяСтрока(Подстроки[1]) Тогда

ФорматированнаяДата = Подстроки[0] + " год";

Иначе

ФорматированнаяДата = "";

КонецЕсли;

КонецЕсли;

СписокВозврата.Добавить(ФорматированнаяДата);

КонецЕсли;

Возврат СписокВозврата;

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

// подбирает массив номеров месяцев, соответствующих переданной строке

// например, для строки "ма" это будут 3 и 5, для "а" - 4 и 8

// используется в ПодобратьДатуПоТексту

//

Функция СписокМесяцевПоСтроке(Текст)

СписокМесяцев = Новый СписокЗначений;

Месяцы = Новый Соответствие;

МесяцыВозврата = Новый Массив;

Для Счетчик = 1 По 12 Цикл

Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='ММММ'");

СписокМесяцев.Добавить(Счетчик, Представление);

ПроцедурыУправленияПерсоналом.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"), Представление, 2, Представление);

СписокМесяцев.Добавить(Счетчик, Представление);

Представление = Формат(Дата(2000, Счетчик, 1), "ДФ='МММ'");

СписокМесяцев.Добавить(Счетчик, Представление);

КонецЦикла;

Для Каждого ЭлементСписка Из СписокМесяцев Цикл

Если ВРег(Текст) = ВРег(Лев(ЭлементСписка.Представление, СтрДлина(Текст))) Тогда

Месяцы[ЭлементСписка.Значение] = 0;

КонецЕсли;

КонецЦикла;

Для Каждого Элемент Из Месяцы Цикл

МесяцыВозврата.Добавить(Элемент.Ключ);

КонецЦикла;

Возврат МесяцыВозврата;

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

Процедура ПериодАвтоПодборТекста(Текст, ТекстАвтоПодбора, Периодичность, СтандартнаяОбработка) Экспорт

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

Список = ПериодПодобратьПоТексту(Текст, Периодичность);

Если Список.Количество() = 1 Тогда

ТекстАвтоПодбора = Список[0].Значение;

КонецЕсли;

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

Процедура ПериодОкончаниеВводаТекста(Текст, Значение, Периодичность, СтандартнаяОбработка, ДатаПоТексту = Неопределено) Экспорт

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

Список = ПериодПодобратьПоТексту(Текст, Периодичность, ДатаПоТексту);

Если Список.Количество() = 1 Тогда

Значение = Список[0].Значение;

Иначе

Значение = Список;

КонецЕсли;

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

#Если Клиент Тогда

// Процедура обрабатывает событие начала выбора из списка в поле периода

// Процедура исполняется только на клиенте

//

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

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

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

НачальноеЗначение = ДатаВПериоде;

КонецЕсли;

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

НачалоТекущегоГода = НачалоГода(НачальноеЗначение);

НачалоПрошлогоГода = НачалоГода(НачалоТекущегоГода - 1);

СписокВыбора.Добавить(НачалоПрошлогоГода, (Формат(НачалоПрошлогоГода, "ДФ='yyyy'") + "..."));

НачалоМесяцаЗаполнения = НачалоТекущегоГода;

ЭлементПоУмолчанию = Неопределено;

Пока Год(НачальноеЗначение) = Год(НачалоМесяцаЗаполнения) Цикл

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

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

ЭлементПоУмолчанию = ДобавленныйЭлемент;

КонецЕсли;

НачалоМесяцаЗаполнения = ДобавитьИнтервал(НачалоМесяцаЗаполнения, Периодичность, 1);

КонецЦикла;

НачалоСледующегоГода = КонецГода(НачалоТекущегоГода) + 1;

СписокВыбора.Добавить(НачалоСледующегоГода, (Формат(НачалоСледующегоГода, "ДФ='yyyy'") + "..."));

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

Если ВыбранныйЭлемент = Неопределено Тогда

Возврат;

ИначеЕсли Год(ВыбранныйЭлемент.Значение) <> Год(НачальноеЗначение) Тогда

ПериодНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка, Форма, ДатаВПериоде, Периодичность, ВыбранныйЭлемент.Значение);

Возврат;

КонецЕсли;

ДатаВПериоде = ВыбранныйЭлемент.Значение;

Элемент.Значение = ПолучитьПериодСтрокой(ДатаВПериоде, ОбщегоНазначения.ПолучитьИмяЭлементаПеречисленияПоЗначению(Периодичность));

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

#КонецЕсли

Глобальный модуль ИБ

Перем АдресРесурсовОбозревателя Экспорт; // В переменной содержится значение

// адреса ресурса данной конфигурации

Перем глОбщиеЗначения Экспорт;

//Функция глПредставлениеФИО(Значение) Экспорт;

Функция глПредставлениеФИО(Значение) Экспорт

проб = " ";

Сзнач = СокрЛП(Значение);

Дл = СтрДлина(Сзнач);

поз1 = Найти(Сзнач,проб);

Фам = Лев(Сзнач,поз1-1);

Сзнач = СокрЛП(Прав(Сзнач,Дл-поз1));

Имя = Лев(Сзнач,1)+". ";

Дл2 = СтрДлина(Сзнач);

поз2 = Найти(Сзнач,проб);

Сзнач = СокрЛП(Прав(Сзнач,Дл2-поз2));

Отч = Лев(Сзнач,1)+". ";

ФИО = Имя+Отч+Фам;

Возврат ФИО;

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

Процедура ПередНачаломРаботыСистемы(Отказ)

УправлениеПользователями.ПроверитьВозможностьРаботыПользователя(Отказ);

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

Процедура ПриНачалеРаботыСистемы()

ВыполнитьОбновлениеИнформационнойБазы();

ЗавершениеРаботыПользователей.УстановитьКонтрольРежимаЗавершенияРаботыПользователей();

Если ПравоДоступа("Использование", Метаданные.Обработки.МенеджерКонтактов)

И УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "АвтооткрытиеЭлектроннойПочтыПриЗапускеПрограммы") = Истина Тогда

Обработки.МенеджерКонтактов.ПолучитьФорму().Открыть();

КонецЕсли;

Если ПравоДоступа("Использование", Метаданные.Обработки.НаборПерсонала)

И УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "АвтооткрытиеНабораПриЗапускеПрограммы") = Истина Тогда

Обработки.НаборПерсонала.ПолучитьФорму().Открыть();

КонецЕсли;

ПроверятьПриЗапуске = ВосстановитьЗначение("ПроверкаНаличияОбновленияПроверятьПриЗапуске");

ПроверятьПриЗапуске = ?(ТипЗнч(ПроверятьПриЗапуске) = Тип("Неопределено"), Ложь, ПроверятьПриЗапуске);

Если ПроверятьПриЗапуске Тогда

Обозреватель = Обработки.Обозреватель.Создать();

Форма = Обозреватель.ПолучитьФорму("ПроверкаНаличияОбновления");

Если Обозреватель.Проверить(Форма.ЭлементыФормы) Тогда

ПоказПриПоявленииНовойВерсии = ВосстановитьЗначение("ПроверкаНаличияОбновленияПоказПриПоявленииНовойВерсии");


Подобные документы

  • Принципы автоматизации и типы архитектур систем учета электронного документооборота. Бизнес-процессы в среде "1С: Предприятие 8". Структура информационной базы электронного документооборота деканата. Объекты и методы механизма бизнес-процессов.

    дипломная работа [773,9 K], добавлен 27.06.2013

  • Понятие бизнес-процесса. Формы автоматизации регистрации документов. Функции систем электронного управления делопроизводства и документооборота, обоснование их выбора и практическое применение. Структура рынка программных продуктов в области ЭУД.

    курсовая работа [232,8 K], добавлен 17.07.2013

  • Процессы внутреннего документооборота производственного предприятия. Управление организационно-распорядительной документацией. Построение модели TO BE на основе предложений по усовершенствованию процессов в рамках системы электронного документооборота.

    дипломная работа [970,9 K], добавлен 22.01.2016

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

    дипломная работа [2,7 M], добавлен 10.02.2012

  • Создание нескольких таблиц для нашей базы данных "Деканат студентов". Проектирование межтабличных связей. Создание формы в режиме "Мастера создания форм". Запросы при помощи мастера. Запрос "Выбор студентов по успеваемости". Установка порядка сортировки.

    лабораторная работа [124,5 K], добавлен 01.05.2014

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

    реферат [23,3 K], добавлен 12.10.2010

  • Методология структурного проектирования, создание функциональной модели процесса учета договоров на предприятии ООО "УралСтройПроект"; разработка информационной модели логической структуры базы данных для организации электронного документооборота.

    курсовая работа [1,6 M], добавлен 10.04.2011

  • Характеристика деятельности ООО "ЖилРемСтрой", его организационная структура. Разработка проекта автоматизации бизнес-процессов предприятия с помощью программы "1С". Контрольный пример реализации проекта. Расчет экономической эффективности автоматизации.

    дипломная работа [3,7 M], добавлен 29.01.2013

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

    дипломная работа [5,4 M], добавлен 29.06.2012

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

    дипломная работа [2,4 M], добавлен 17.08.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.