Билет №1 Используя типовую конфигурацию «Зарплата и Управление персоналом», необходимо реализовать дополнительную функциональность согласно заданию с максимальным использованием «штатных» механизмов. Автоматизируемая задача: Оплата труда работников организации производится по часовой тарифной ставке. Размер ставки зависит от разряда работника: Тарифный разряд Размер часовой ставки 1 разряд 200 руб. 2 разряд 250 руб. 3 разряд 300 руб. Периодически работники выполняют работы в особых условиях. За каждый день работы в особых условиях начисляется доплата, размер которой зависит от фактических условий работы в этот день (т.е. каждый день работники получают разную доплату): Фактические условия Размер доплаты в % от дневной тарифной ставки 0 (средние показатели) 30% 1 (повышенная температура) 40% 2 (повышенная температура и влажность) 50% 25 числа каждого месяца в организации составляется график работ в особых условиях на следующий месяц, в котором для каждого работника указываются периоды работы в особых условиях (дата начала, дата окончания). Измерение фактических условий ведется специализированным прибором и в конце каждого месяца выгружается из памяти прибора в виде текстового файла. Текстовый файл имеет следующую структуру: сведения о фактических условиях труда на каждую дату записываются в отдельной строке, разделяются точкой с запятой, например: 01.02.2014;0 02.02.2014;1 Необходимо: 1) Реализовать учет плановых периодов привлечения работников к работам на открытом воздухе, для чего создать документ «График работ в особых условиях». 2) Реализовать учет фактических условий труда по календарным дням, данные должны автоматически загружаться в программу из текстового файла описанного формата. Работник <Месяц> Запланировано дней работ в особых условиях Фактически отработано дней в особых условиях Начислено доплаты Средний размер доплаты за один день работы Должность 1 - всего … … … … <Работник> … … … … … … … … … Должность 2 - всего … … … … <Работник> … … … … … … … … … 3) Реализовать автоматизированный учет фактически отработанных в особых условиях труда дней и начисление работникам доплаты, обеспечить учет начисления для целей налогообложения и обложения страховыми взносами в соответствии с законодательством. 4) Создать настраиваемый отчет «Работы в особых условиях», позволяющий за произвольное количество расчетных периодов получать следующую информацию (начальная настройка отчета должна соответствовать образцу): Отчет должен быть реализован аналогично другим отчетам типовой конфигурации, с применением при необходимости генерируемых представлений («Представления_»). 5) Создать отдельную подсистему «Экзамен» для работы с добавленными объектами. 6) Представленная к защите база должна содержать данные о начислениях за несколько расчетных периодов не менее, чем для 2-х работников. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Начальная настройка программы: Используются тарифные группы, На предприятии используется почасовая оплата труда, Настройки – Кадровый Учет – Штатное расписание отключено 1. Завел в системе виды времени: Работа во вредных условиях 0(РВ0, Вахта), Работа во вредных условиях 1(РВ1, Вахта), Работа во вредных условиях 2(РВ2, Вахта), вывел их в константы: ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели, ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература, ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность (СпрСс.ВидыИспользованияРабочеговремени) для получения в документах. Так же создал эквивалентные начисления: Работа во вредных условиях (0), Работа во вредных условиях (1), Работа во вредных условиях (2) и так же вывел их в константы: Начисление_РаботаВоВредныхУсловиях_СреднииПоказатели, Начисление_РаботаВоВредныхУсловиях_ПовышеннаяТемпература, Начисление_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность (ПланВидовРасчетаСсылка.Начисления) для получения в отчете. 2. Завел три показателя: Работа во вредных условиях 0, Работа во вредных условиях 1, Работа во вредных условиях 2 (Для организации, Во всех месяцах после ввода значения) 3. Завел шаблон для ввода исходных данных "Процент за вредность". Постоянно действующие, выбираем все три показателя. Зарплата – Данные для расчета зарплаты – вводим в показатели процентные ставки. 4. Начисления за работу во вредных условиях. Только если введен вид учета времени. имеют след. формулу " ВремяВДнях * СтоимостьДня * РаботаВоВредныхУсловиях0(1,2)/100". Начисление вводиться если введен вид времени. В документе "Начисление зарплаты" начисления делятся при изменении кадровых данных и тарифной ставки, поэтому стоимость дня будет верной даже если изменилась тарифная ставка. 5. Создал перечисление РаботыВоВредныхУсловиях. Значения: СреднииПоказатели_0 (0 (Среднии показатели)), ПовышеннаяТемпература_1(1 (Повышенная температура), ПовышеннаяТемператураИВлажность_2(2 (Повышенная температура и влажность). 6. Разработал РС " ГрафикиРаботВоВредныхУсловиях"(Непериодический, Подчинение регистратору), для регистрации графиков. Регистр след. структуры: измерения: Сотрудник(Спр.Сс.Сотрудники, Дата(Дата, Дата) ресурс: ВидВремени(СпрСс.ВидыИспользованияРабочеговремени), данная структура удобна при разработке отчета, не соединять периоды от и до, а соединять период и день. 7. Создал документ "Графики работы во вредных условиях" который формирует движения в РС " ГрафикиРаботВоВредныхУсловиях". Реквизитов нет. ТЧ-Данные – Сотрудник(СпрСс.Сотрудники), НачалоПериода (Дата, Дата), КонецПериода (Дата, Дата), Вредность (ПеречислениеСсылка.РаботыВоВредныхУсловиях). Движения – РС ГрафикиРаботВоВредныхУсловиях. При проведении документа проверяются, нет ли дублирования данных в табличной части документа, конец периода должен быть больше или равен началу периода, период должен лежать в одном месяце, и действительно ли график строиться 25-го число предшествующего месяца 8. Создал документ "РаботаВоВредныхУсловиях" Реквизиты: Организация (СпрСс.Организации), Сотрудник(СпрСс.Сотрудники), ДатаНачалаПериода (Дата, Дата), ДатаОкончанияПериода (Дата, Дата), ПериодРегистрации (Дата, Дата), Подразделение(СпрСс.ПодразделенияОрганизаций), ИсправленныйДокумент(Булево); ТЧ – Данные: День(Дата, Дата), Вредность (ПеречислениеСсылка.РаботыВоВредныхУсловиях). Движения: РН ДанныеОперативногоУчетаРабочегоВремениСотрудников . ФормаДокумента: Убираем лишние реквизиты(оставляем Организацию и Сотрудника), Команда Заполнить(НаКлиенте). ФормаВыбораФайла – Реквизит АдресФайла(Строка) КнопкаВыбора – Да, Команда АдресФайлаНачалоВыбора, команды ОК и Отмена (НаКлиенте). Который регистрирует работу во вредных условиях в регистре накопления "ДанныеОперативногоУчетаРабочегоВремениСотрудников" из этого регистра в дальнейшем данные попадают в табель при заполнении или если табель не вводиться то в индивидуальный график который создается для сотрудника. В документе проверяется работает ли сотрудник в день вредности. 9. Разработал отчет "РаботыВОсобыхУсловиях", который собирается из виртуальной таблицы "Данные графика" из регистр расчета "Начисления" и таблицы "графики работы во вредных условиях". Ресурсы - Сумма(ЗапланированоДнейРаботВОсобыхУсловиях, НачисленоДоплаты, СреднийРазмерДоплатыЗаОдинДень, ФактическиОтработаноДнейВОсобыхУсловиях); Настройки – Правой кнопкой по отчету – Конструктор настроек – Таблица – Поля(Все которые в Сумме) – Строки (Должность, Сотрудник) – Колонки (Месяц). Создаем ФормуОтчета – два реквизита: Организация(СпрСс.Организации) и Период(СтандартныйПериод), убираем стандартные кнопки, создаем – КоманднаяПанель – Группа1(Сформировать, Период, Организация)- Результат. Команда Сформировать (клиент-сервер) – Заполняем. 10. В регистре сведений "ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников" в измерении "ДокументОснование" добавил тип "ДокументСсылка.РаботаВоВредныхУсловиях " 11. Принимаем на работу двух сотрудников. Подразделение Основное, Тарифная группа Основная, Три разряда. В документе Прием на работу – вкладка ОплатаСотруднику – ОплатаПоЧасовомуТарифу. 12. Заполняем все константы, Заполняем документы Графики работы во вредных условиях, на три месяца, каждому работнику с 11 по 15 – 0, с 18 по 22 – 1, с 25 по 29 – 2. //////////////////////////////////////////////////////////////////////////////////////// ГрафикиРаботВоВредныхУсловиях Модуль объекта Процедура ОбработкаПроведения(Отказ, Режим) ТекстОшибки = ""; ПроверитьНастройкуПодсистемы(ТекстОшибки, Отказ); Если Отказ Тогда СообщениеПользователю = Новый СообщениеПользователю; СообщениеПользователю.Текст = ТекстОшибки; СообщениеПользователю.Сообщить(); Возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Дата", Дата); Запрос.Текст = "ВЫБРАТЬ | Док.НомерСтроки, | Док.Сотрудник, | Док.НачалоПериода, | Док.КонецПериода, | Док.Вредность |ПОМЕСТИТЬ ДанныеДокумента |ИЗ | Документ.ГрафикиРаботВоВредныхУсловиях.Данные КАК Док |ГДЕ | Док.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеДокумента.НомерСтроки |ИЗ | ДанныеДокумента КАК ДанныеДокумента | ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДокумента КАК ДанныеДокумента1 | ПО ДанныеДокумента.Сотрудник = ДанныеДокумента1.Сотрудник | И ДанныеДокумента.НомерСтроки <> ДанныеДокумента1.НомерСтроки | И (ДанныеДокумента.НачалоПериода <= ДанныеДокумента1.НачалоПериода | И ДанныеДокумента.КонецПериода >= ДанныеДокумента1.НачалоПериода | ИЛИ ДанныеДокумента.НачалоПериода <= ДанныеДокумента1.КонецПериода | И ДанныеДокумента.КонецПериода >= ДанныеДокумента1.КонецПериода | ИЛИ ДанныеДокумента.НачалоПериода >= ДанныеДокумента1.НачалоПериода | И ДанныеДокумента.КонецПериода <= ДанныеДокумента1.КонецПериода) |ГДЕ | (НЕ ДанныеДокумента1.НомерСтроки ЕСТЬ NULL | ИЛИ ДанныеДокумента.НачалоПериода > ДанныеДокумента.КонецПериода | ИЛИ ГОД(ДанныеДокумента.НачалоПериода) <> ГОД(ДанныеДокумента.КонецПериода) | ИЛИ МЕСЯЦ(ДанныеДокумента.НачалоПериода) <> МЕСЯЦ(ДанныеДокумента.КонецПериода) | ИЛИ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ДанныеДокумента.НачалоПериода, МЕСЯЦ), МЕСЯЦ, -1) <> НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ)) | |СГРУППИРОВАТЬ ПО | ДанныеДокумента.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеДокумента.Сотрудник, | ДанныеДокумента.НачалоПериода, | ДанныеДокумента.КонецПериода, | ДанныеДокумента.Вредность |ИЗ | ДанныеДокумента КАК ДанныеДокумента"; Результат = Запрос.ВыполнитьПакет(); ВыборкаПроверка = Результат[1].Выбрать(); Выборка = Результат[2].Выбрать(); Пока ВыборкаПроверка.Следующий() Цикл ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не верно задан период в строке № " + Строка(ВыборкаПроверка.НомерСтроки); Отказ = Истина; КонецЦикла; Если Отказ Тогда СообщениеПользователю = Новый СообщениеПользователю; СообщениеПользователю.Текст = ТекстОшибки; СообщениеПользователю.Сообщить(); Возврат; КонецЕсли; Пока Выборка.Следующий() Цикл НачалоПериода = Выборка.НачалоПериода; Пока День(НачалоПериода) < День(Выборка.КонецПериода) Цикл Движение = Движения.ГрафикиРаботВоВредныхУсловиях.Добавить(); Движение.Сотрудник = Выборка.Сотрудник; Движение.Дата = НачалоПериода; Движение.ВидВремени = ПолучитьВидВремени(Выборка.Вредность); НачалоПериода = НачалоДня(НачалоПериода + 60*60*24); КонецЦикла; Движение = Движения.ГрафикиРаботВоВредныхУсловиях.Добавить(); Движение.Сотрудник = Выборка.Сотрудник; Движение.Дата = НачалоПериода; Движение.ВидВремени = ПолучитьВидВремени(Выборка.Вредность); КонецЦикла; Движения.ГрафикиРаботВоВредныхУсловиях.Записывать = Истина; КонецПроцедуры Функция ПолучитьВидВремени(Вредность) Если Вредность = Перечисления.РаботыВоВредныхУсловиях.СреднииПоказатели_0 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели.Получить(); ИначеЕсли Вредность = Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемпература_1 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература.Получить(); ИначеЕсли Вредность = Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемператураИВлажность_2 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность.Получить(); КонецЕсли; КонецФункции Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Дата = Дата(Год(Дата), Месяц(Дата), 25); КонецПроцедуры Процедура ПроверитьНастройкуПодсистемы(ТекстОшибки, Отказ) Если Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература"""; Отказ = Истина; КонецЕсли; Если Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность"""; Отказ = Истина; КонецЕсли; Если Константы.ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели"""; Отказ = Истина; КонецЕсли; КонецПроцедуры Документ РаботаВоВредныхУсловиях МодульОбъекта Процедура ОбработкаПроведения(Отказ, Режим) ТекстОшибки = ""; ПроверитьНастройкуПодсистемы(ТекстОшибки, Отказ); Если Отказ Тогда СообщениеПользователю = Новый СообщениеПользователю; СообщениеПользователю.Текст = ТекстОшибки; СообщениеПользователю.Сообщить(); Возврат; КонецЕсли; МассивСотрудников = Новый Массив; МассивСотрудников.Добавить(Сотрудник); ДанныеТабеля = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект, МассивСотрудников).Владелец().Выгрузить(); Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Записать(); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДанныеТабеля", ДанныеТабеля); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.Текст = "ВЫБРАТЬ | ДанныеТабеля.Дата, | ДанныеТабеля.Дни |ПОМЕСТИТЬ ДанныеТабеля |ИЗ | &ДанныеТабеля КАК ДанныеТабеля |ГДЕ | ДанныеТабеля.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Явка) | И ДанныеТабеля.Сотрудник = &Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеТабеля.Дата, | МАКСИМУМ(ДанныеТабеля.Дни) КАК Дни |ПОМЕСТИТЬ Табель |ИЗ | ДанныеТабеля КАК ДанныеТабеля | |СГРУППИРОВАТЬ ПО | ДанныеТабеля.Дата |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | док.НомерСтроки, | док.День, | док.Вредность |ПОМЕСТИТЬ ДанныеДокумента |ИЗ | Документ.РаботаВоВредныхУсловиях.Данные КАК док |ГДЕ | док.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеДокумента.НомерСтроки |ИЗ | ДанныеДокумента КАК ДанныеДокумента | ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДокумента КАК ДанныеДокумента1 | ПО ДанныеДокумента.НомерСтроки <> ДанныеДокумента1.НомерСтроки | И ДанныеДокумента.День = ДанныеДокумента1.День | И (НЕ ДанныеДокумента.Вредность = ДанныеДокумента1.Вредность) |ГДЕ | НЕ ДанныеДокумента1.НомерСтроки ЕСТЬ NULL | |СГРУППИРОВАТЬ ПО | ДанныеДокумента.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеДокумента.День, | МАКСИМУМ(ДанныеДокумента.Вредность) КАК Вредность, | МАКСИМУМ(ЕСТЬNULL(Табель.Дни, 0)) КАК Дни |ИЗ | ДанныеДокумента КАК ДанныеДокумента | ЛЕВОЕ СОЕДИНЕНИЕ Табель КАК Табель | ПО ДанныеДокумента.День = Табель.Дата | |СГРУППИРОВАТЬ ПО | ДанныеДокумента.День"; Результат = Запрос.ВыполнитьПакет(); ВыборкаПроверка = Результат[3].Выбрать(); Выборка = Результат[4].Выбрать(); Пока ВыборкаПроверка.Следующий() Цикл ДобавитьСтрокуВТекст(ТекстОшибки, "В строке номер " + Строка(ВыборкаПроверка.НомерСтроки) + " ошибка, за один день введено несколько вредностей"); Отказ = Истина; КонецЦикла; Если Отказ Тогда СообщениеПользователю = Новый СообщениеПользователю; СообщениеПользователю.Текст = ТекстОшибки; СообщениеПользователю.Сообщить(); Возврат; КонецЕсли; Пока Выборка.Следующий() Цикл Если Выборка.Дни = 0 Тогда ДобавитьСтрокуВТекст(ТекстОшибки, "Сотрудник не работает " + Формат(Выборка.День, "ДЛФ=DD")); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Добавить(); Движение.Сотрудник = Сотрудник; Движение.ПериодРегистрации = НачалоМесяца(Выборка.День); Движение.Период = Выборка.День; Движение.ВидУчетаВремени = ПолучитьВидВремени(Выборка.Вредность); Движение.ВидДанных = Перечисления.ВидыДанныхУчетаВремениСотрудников.ДополнительноеВнутрисменноеВремя; Движение.Часы = 1; Движение.Дни = 1; КонецЦикла; Если Отказ Тогда СообщениеПользователю = Новый СообщениеПользователю; СообщениеПользователю.Текст = ТекстОшибки; СообщениеПользователю.Сообщить(); Иначе Движения.ДанныеОперативногоУчетаРабочегоВремениСотрудников.Записывать = Истина; КонецЕсли; КонецПроцедуры Функция ПолучитьВидВремени(Вредность) Если Вредность = Перечисления.РаботыВоВредныхУсловиях.СреднииПоказатели_0 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели.Получить(); ИначеЕсли Вредность = Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемпература_1 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература.Получить(); ИначеЕсли Вредность = Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемператураИВлажность_2 Тогда Возврат Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность.Получить(); КонецЕсли; КонецФункции Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ДатаНачалаПериода = НачалоМесяца(Дата); ДатаОкончанияПериода = КонецМесяца(Дата); ПериодРегистрации = НачалоМесяца(Дата); КонецПроцедуры Процедура ДобавитьСтрокуВТекст(Текст, Строка) Текст = Текст + ?(Текст = "", "", " |") + Строка; КонецПроцедуры Процедура ПроверитьНастройкуПодсистемы(ТекстОшибки, Отказ) Если Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемпература"""; Отказ = Истина; КонецЕсли; Если Константы.ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность"""; Отказ = Истина; КонецЕсли; Если Константы.ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели.Получить().Пустая() Тогда ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не заполнена константа ""ВидВремени_РаботаВоВредныхУсловиях_СреднииПоказатели"""; Отказ = Истина; КонецЕсли; КонецПроцедуры) МодульФормыДокумента &НаКлиенте Процедура Заполнить(Команда) ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма); ОткрытьФорму("Документ.РаботаВоВредныхУсловиях.Форма.ФормаВыбораФайла",, ЭтаФорма,, ВариантОткрытияОкна.ОтдельноеОкно,, ОписаниеОповещения); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораФайла(АдресФайла, ДопПараметр) Экспорт Если АдресФайла = Неопределено Тогда Возврат; КонецЕсли; Попытка ЧтениеТекста = Новый ЧтениеТекста(АдресФайла); ТекстФайла = ЧтениеТекста.Прочитать(); Исключение ПоказатьПредупреждение(, "Не удалось открыть файл"); КонецПопытки; МассивДанных = СтруктурироватьФайл(ТекстФайла); ТекстОшибки = ""; МассивДанных = КонвертироватьДанные(МассивДанных, ТекстОшибки); Если Не ПустаяСтрока(ТекстОшибки) Тогда ПоказатьПредупреждение(, ТекстОшибки); Возврат; КонецЕсли; Объект.Данные.Очистить(); Для Каждого ЭлементМассива Из МассивДанных Цикл СтрокаТаблицыДанных = Объект.Данные.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТаблицыДанных, ЭлементМассива); КонецЦикла; КонецПроцедуры &НаКлиенте Функция КонвертироватьДанные(МассивДанных, ТекстОшибки) МассивВозврат = Новый Массив; Для Каждого ЭлементМассива из МассивДанных Цикл Дата = Неопределено; Вредность = Неопределено; Отказ = Ложь; Попытка День = Число(Лев(ЭлементМассива.День, 2)); Месяц = Число(Прав(Лев(ЭлементМассива.День, 5), 2)); Год = Число(Прав(ЭлементМассива.День, 4)); Дата = Дата(Год, Месяц, День); Исключение ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не удалось определить дату: " + ЭлементМассива.День; Отказ = Истина; КонецПопытки; Попытка Вредность = Число(ЭлементМассива.Вредность); Если Вредность > 2 Или Вредность < 0 Тогда ВызватьИсключение ""; КонецЕсли; Вредность = ПолучитьВредностьПоИндексу(Вредность); Исключение ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", " |") + "Не удалось определить вредность: " + ЭлементМассива.Вредность; Отказ = Истина; КонецПопытки; Если Не Отказ Тогда МассивВозврат.Добавить(Новый Структура("День, Вредность", Дата, Вредность)); КонецЕсли; КонецЦикла; Возврат МассивВозврат; КонецФункции Функция ПолучитьВредностьПоИндексу(Индекс) Если Индекс = 0 Тогда Возврат Перечисления.РаботыВоВредныхУсловиях.СреднииПоказатели_0; ИначеЕсли Индекс = 1 Тогда Возврат Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемпература_1; ИначеЕсли Индекс = 2 Тогда Возврат Перечисления.РаботыВоВредныхУсловиях.ПовышеннаяТемператураИВлажность_2; КонецЕсли; КонецФункции &НаКлиенте Функция СтруктурироватьФайл(ТекстФайла) МассивДанных = Новый Массив; Для ИИ = 1 По СтрЧислоСтрок(ТекстФайла) Цикл Строка = СтрПолучитьСтроку(ТекстФайла, ИИ); Разделитель = СтрНайти(Строка, ";"); Если Разделитель > 0 Тогда МассивДанных.Добавить(Новый Структура("День, Вредность", СокрЛП(Лев(Строка, Разделитель - 1)), СокрЛП(Прав(Строка, СтрДлина(Строка) - Разделитель)))); Иначе МассивДанных.Добавить(Новый Структура("День, Вредность", Строка, "")); КонецЕсли; КонецЦикла; Возврат МассивДанных; КонецФункции МодульФормыВыбора &НаКлиенте Процедура АдресФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДиалогВыборафайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыборафайла.Фильтр = "Текстовый документ (*.txt)|*.txt"; Если ДиалогВыборафайла.Выбрать() Тогда АдресФайла = ДиалогВыборафайла.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОК(Команда) Закрыть(АдресФайла); КонецПроцедуры &НаКлиенте Процедура Отмена(Команда) Закрыть(); КонецПроцедуры Отчет РаботыВОсобыхУсловиях СКД ВЫБРАТЬ ВЗ.Месяц, ВЗ.Сотрудник, СУММА(ВЗ.ФактическиОтработаноДнейВОсобыхУсловиях) КАК ФактическиОтработаноДнейВОсобыхУсловиях, СУММА(ВЗ.НачисленоДоплаты) КАК НачисленоДоплаты, ВЗ.ПериодСрезаКадровыхДанных, МАКСИМУМ(ВЗ.ЗапланированоДнейРаботВОсобыхУсловиях) КАК ЗапланированоДнейРаботВОсобыхУсловиях, ВЗ.ПериодДействияНачало, ВЗ.ПериодДействияКонец ПОМЕСТИТЬ Данные ИЗ (ВЫБРАТЬ НАЧАЛОПЕРИОДА(НачисленияДанныеГрафика.ПериодДействияНачало, МЕСЯЦ) КАК Месяц, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, ЕСТЬNULL(НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия, 0) КАК ФактическиОтработаноДнейВОсобыхУсловиях, НачисленияДанныеГрафика.Результат КАК НачисленоДоплаты, КОНЕЦПЕРИОДА(НачисленияДанныеГрафика.ПериодДействияНачало, ДЕНЬ) КАК ПериодСрезаКадровыхДанных, КОЛИЧЕСТВО(ГрафикиРаботВоВредныхУсловиях.ВидВремени) КАК ЗапланированоДнейРаботВОсобыхУсловиях, НачисленияДанныеГрафика.Регистратор КАК Регистратор, НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки, НачисленияДанныеГрафика.ПериодДействияНачало КАК ПериодДействияНачало, НачисленияДанныеГрафика.ПериодДействияКонец КАК ПериодДействияКонец ИЗ РегистрРасчета.Начисления.ДанныеГрафика(ВидРасчета В (&ВидыРасчета)) КАК НачисленияДанныеГрафика ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботВоВредныхУсловиях КАК ГрафикиРаботВоВредныхУсловиях ПО НачисленияДанныеГрафика.Сотрудник = ГрафикиРаботВоВредныхУсловиях.Сотрудник И НачисленияДанныеГрафика.ПериодДействияНачало <= ГрафикиРаботВоВредныхУсловиях.Дата И НачисленияДанныеГрафика.ПериодДействияКонец >= ГрафикиРаботВоВредныхУсловиях.Дата И (ГрафикиРаботВоВредныхУсловиях.Активность) И НачисленияДанныеГрафика.ВидУчетаВремени <= ГрафикиРаботВоВредныхУсловиях.ВидВремени ГДЕ НЕ НачисленияДанныеГрафика.Сторно И НачисленияДанныеГрафика.Активность И НачисленияДанныеГрафика.ПериодДействияНачало МЕЖДУ &ПериодНачало И &ПериодКонец И НачисленияДанныеГрафика.ГоловнаяОрганизация = &Организация СГРУППИРОВАТЬ ПО НачисленияДанныеГрафика.Регистратор, НачисленияДанныеГрафика.НомерСтроки, НачисленияДанныеГрафика.Сотрудник, НАЧАЛОПЕРИОДА(НачисленияДанныеГрафика.ПериодДействияНачало, МЕСЯЦ), НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия, НачисленияДанныеГрафика.Результат, КОНЕЦПЕРИОДА(НачисленияДанныеГрафика.ПериодДействияНачало, ДЕНЬ), НачисленияДанныеГрафика.ПериодДействияНачало, НачисленияДанныеГрафика.ПериодДействияКонец) КАК ВЗ СГРУППИРОВАТЬ ПО ВЗ.Месяц, ВЗ.Сотрудник, ВЗ.ПериодДействияНачало, ВЗ.ПериодДействияКонец, ВЗ.ПериодСрезаКадровыхДанных ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Сотрудник, Данные.ПериодСрезаКадровыхДанных ПОМЕСТИТЬ ТаблицаСреза ИЗ Данные КАК Данные СГРУППИРОВАТЬ ПО Данные.Сотрудник, Данные.ПериодСрезаКадровыхДанных ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник, ДАТАВРЕМЯ(1, 1, 1) КАК ПериодСрезаКадровыхДанных, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность ПОМЕСТИТЬ Представления_Должности ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Месяц, Данные.Сотрудник, Представления_Должности.Должность, СУММА(Данные.ЗапланированоДнейРаботВОсобыхУсловиях) КАК ЗапланированоДнейРаботВОсобыхУсловиях, СУММА(Данные.ФактическиОтработаноДнейВОсобыхУсловиях) КАК ФактическиОтработаноДнейВОсобыхУсловиях, СУММА(Данные.НачисленоДоплаты) КАК НачисленоДоплаты ПОМЕСТИТЬ ИтоговыеДанные ИЗ Данные КАК Данные ЛЕВОЕ СОЕДИНЕНИЕ Представления_Должности КАК Представления_Должности ПО Данные.Сотрудник = Представления_Должности.Сотрудник И Данные.ПериодСрезаКадровыхДанных = Представления_Должности.ПериодСрезаКадровыхДанных СГРУППИРОВАТЬ ПО Данные.Месяц, Данные.Сотрудник, Представления_Должности.Должность ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ИтоговыеДанные.Месяц, ИтоговыеДанные.Сотрудник, ИтоговыеДанные.Должность, ИтоговыеДанные.ЗапланированоДнейРаботВОсобыхУсловиях, ИтоговыеДанные.ФактическиОтработаноДнейВОсобыхУсловиях, ИтоговыеДанные.НачисленоДоплаты, ВЫБОР КОГДА ИтоговыеДанные.ФактическиОтработаноДнейВОсобыхУсловиях = 0 ТОГДА 0 ИНАЧЕ ВЫРАЗИТЬ(ИтоговыеДанные.НачисленоДоплаты / ИтоговыеДанные.ФактическиОтработаноДнейВОсобыхУсловиях КАК ЧИСЛО(10, 2)) КОНЕЦ КАК СреднийРазмерДоплатыЗаОдинДень ИЗ ИтоговыеДанные КАК ИтоговыеДанные МодульФормы Процедура СформироватьНаСервере() Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки(); Для Каждого ПараметрДанных Из Настройки.ПараметрыДанных.Элементы Цикл Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("Организация") Тогда ПараметрДанных.Использование = Истина; ПараметрДанных.Значение = Организация; КонецЕсли; Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("ПериодНачало") Тогда ПараметрДанных.Использование = Истина; ПараметрДанных.Значение = НачалоМесяца(Период.ДатаНачала); КонецЕсли; Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("ПериодКонец") Тогда ПараметрДанных.Использование = Истина; ПараметрДанных.Значение = КонецМесяца(Период.ДатаОкончания); КонецЕсли; Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("ВидыРасчета") Тогда МассивВидыРасчета = Новый Массив; МассивВидыРасчета.Добавить(Константы.Начисление_РаботаВоВредныхУсловиях_ПовышеннаяТемпература.Получить()); МассивВидыРасчета.Добавить(Константы.Начисление_РаботаВоВредныхУсловиях_ПовышеннаяТемператураИВлажность.Получить()); МассивВидыРасчета.Добавить(Константы.Начисление_РаботаВоВредныхУсловиях_СреднииПоказатели.Получить()); ПараметрДанных.Использование = Истина; ПараметрДанных.Значение = МассивВидыРасчета; КонецЕсли; КонецЦикла; Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); СкомпоноватьРезультат(); КонецПроцедуры &НаКлиенте Процедура Сформировать(Команда) СформироватьНаСервере(); КонецПроцедуры //////////////////////////////////////////////////// 11.01.2016;0 12.01.2016;0 13.01.2016;0 14.01.2016;0 15.01.2016;0 18.01.2016;1 19.01.2016;1 20.01.2016;1 21.01.2016;1 22.01.2016;1 25.01.2016;2 26.01.2016;2 27.01.2016;2 28.01.2016;2 29.01.2016;2 01.02.2016;0 02.02.2016;0 03.02.2016;0 04.02.2016;0 05.02.2016;0 08.02.2016;1 09.02.2016;1 10.02.2016;1 11.02.2016;1 12.02.2016;1 15.02.2016;2 16.02.2016;2 17.02.2016;2 18.02.2016;2 19.02.2016;2 24.02.2016;0 25.02.2016;0 26.02.2016;0 29.02.2016;0 01.03.2016;0 02.03.2016;0 03.03.2016;0 04.03.2016;0 09.03.2016;1 10.03.2016;1 11.03.2016;1 14.03.2016;2 15.03.2016;2 16.03.2016;2 17.03.2016;2 18.03.2016;2 21.03.2016;0 22.03.2016;0 23.03.2016;0 24.03.2016;0 25.03.2016;0 28.03.2016;1 29.03.2016;1 30.03.2016;1 31.03.2016;1