Загрузка данных
&НаСервере
Процедура ДневнаяСменаД()
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Для Каждого ТекСтр Из Объект.График Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеДня = "Д" Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.Продл;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура КоличествоСменНаСервере1Смена()
Объект.КоличествоСмен.Очистить();
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Для Каждого ТекСтр Из Объект.График Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеДня = "1" Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.ПерваяСмена;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура КоличествоСменНаСервере2Смена()
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Для Каждого ТекСтр Из Объект.График Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеДня = "2" Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.ВтораяСмена;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура КоличествоРезервНаСервере1Смена()
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Для Каждого ТекСтр Из Объект.График Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеДня = "Р" Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.РезервПерваяСмена;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура КоличествоРезервНаСервере2Смена()
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Для Каждого ТекСтр Из Объект.График Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеДня = "С" Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.РезервВтораяСмена;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ВернутьКоличествоСмен_(ТекИндекс)
НормоЧасыДни = ВернутьЧасыНорм();
ТекСтрока1 = Объект.График.Получить(ТекИндекс);
КолСмен = 0;
ИдОтпуска = Ложь;
Для стр = 1 По 31 Цикл
ЗначениеДня = ТекСтрока1["ЧислоМесяца" + Строка(стр)];
Если ЗначениеДня = "1"
Или ЗначениеДня = "2"
Или ЗначениеДня = "Д" Тогда
КолСмен = КолСмен + 1;
ИначеЕсли ЗначениеДня = "О" Тогда
ИдОтпуска = Истина;
КонецЕсли;
КонецЦикла;
Если ИдОтпуска Тогда
НормоЧасы = НормоЧасыДни.НормоЧасы / НормоЧасыДни.НормоДни * КолСмен;
Иначе
НормоЧасы = НормоЧасыДни.НормоЧасы;
КонецЕсли;
ТекСтрока1.КоличествоСмен = КолСмен;
ТекСтрока1.ЧасыНорм = НормоЧасы;
КонецПроцедуры
&НаКлиенте
Процедура КоличествоСменК()
//ТекИндекс=Элементы.График.ТекущиеДанные.НомерСтроки-1;
//ВернутьКоличествоСмен_(ТекИндекс);
КоличествоСменНаСервере1Смена();
КоличествоСменНаСервере2Смена();
ДневнаяСменаД();
//ДневнаяСмена();
КоличествоРезервНаСервере1Смена();
КоличествоРезервНаСервере2Смена();
КонецПроцедуры
&НаКлиенте
Процедура ГрафикПриИзменени(Элемент)
ТекИндекс=Элементы.График.ТекущиеДанные.НомерСтроки-1;
ВернутьКоличествоСмен_(ТекИндекс);
КоличествоСменНаСервере1Смена();
КоличествоСменНаСервере2Смена();
ДневнаяСменаД();
//ДневнаяСмена();
КоличествоРезервНаСервере1Смена();
КоличествоРезервНаСервере2Смена();
КонецПроцедуры
Процедура ДневнаяСмена()
ТекСписокТН = Новый СписокЗначений;
ном = 0;
Для Каждого ТекстрРасш Из Объект.График Цикл
ном = ном + 1;
ТекСписокТН.Вставить(ном - 1, ТекстрРасш.Расшифровка);
КонецЦикла;
КолСмен = Новый Массив;
Для i = 1 По 31 Цикл
КолСмен.Добавить(0);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасшифровкаРаботыКондуктораРасшифровка.ВидДеятельности КАК ВидДеятельности,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца1 КАК ЧислоМесяца1,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца2 КАК ЧислоМесяца2,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца3 КАК ЧислоМесяца3,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца4 КАК ЧислоМесяца4,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца5 КАК ЧислоМесяца5,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца6 КАК ЧислоМесяца6,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца7 КАК ЧислоМесяца7,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца8 КАК ЧислоМесяца8,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца9 КАК ЧислоМесяца9,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца10 КАК ЧислоМесяца10,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца11 КАК ЧислоМесяца11,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца12 КАК ЧислоМесяца12,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца13 КАК ЧислоМесяца13,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца14 КАК ЧислоМесяца14,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца15 КАК ЧислоМесяца15,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца16 КАК ЧислоМесяца16,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца17 КАК ЧислоМесяца17,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца18 КАК ЧислоМесяца18,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца19 КАК ЧислоМесяца19,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца20 КАК ЧислоМесяца20,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца21 КАК ЧислоМесяца21,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца22 КАК ЧислоМесяца22,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца23 КАК ЧислоМесяца23,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца24 КАК ЧислоМесяца24,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца25 КАК ЧислоМесяца25,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца26 КАК ЧислоМесяца26,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца27 КАК ЧислоМесяца27,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца28 КАК ЧислоМесяца28,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца29 КАК ЧислоМесяца29,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца30 КАК ЧислоМесяца30,
| РасшифровкаРаботыКондуктораРасшифровка.ЧислоМесяца31 КАК ЧислоМесяца31
|ИЗ
| Документ.РасшифровкаРаботыКондуктора.Расшифровка КАК РасшифровкаРаботыКондуктораРасшифровка
|ГДЕ
| РасшифровкаРаботыКондуктораРасшифровка.Ссылка В(&СписокРасшифровок)
| И РасшифровкаРаботыКондуктораРасшифровка.ВидДеятельности = &ТекРасписание";
Запрос.УстановитьПараметр("СписокРасшифровок", ТекСписокТН);
Запрос.УстановитьПараметр("ТекРасписание", Перечисления.ВидДеятельности.Расписание);
РезультатЗапроса = Запрос.Выполнить();
ТекСтр = РезультатЗапроса.Выбрать();
Пока ТекСтр.Следующий() Цикл
Для i = 1 По 31 Цикл
ЗначениеДня = ТекСтр["ЧислоМесяца" + Строка(i)];
Если ЗначениеЗаполнено(ЗначениеДня) Тогда
КолСмен[i - 1] = КолСмен[i - 1] + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КСНоваяСтрока = Объект.КоличествоСмен.Добавить();
КСНоваяСтрока.ВидСменыДок = Перечисления.ВидСмены.Продл;
Для i = 1 По 31 Цикл
КСНоваяСтрока["КСЧислоМесяца" + Строка(i)] = КолСмен[i - 1];
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ИтогоКоличествоСмен()
ТекИндекс=Элементы.ГрафикКондуктора.ТекущиеДанные.НомерСтроки-1;
ВернутьКоличествоСмен_(ТекИндекс);
КоличествоСменНаСервере1Смена();
КоличествоСменНаСервере2Смена();
ДневнаяСмена();
//ДневнаяСменаД();
КоличествоРезервНаСервере1Смена();
КоличествоРезервНаСервере2Смена();
КонецПроцедуры
&НаКлиенте
Процедура КоличествоСмен(Команда)
КоличествоСменНаСервере1Смена();
КоличествоСменНаСервере2Смена();
КоличествоРезервНаСервере1Смена();
КоличествоРезервНаСервере2Смена();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ГрафикСотрудникПриИзмененииНаСервере(ТекущСтр)
ТекущТабНомер="";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Кондукторы.Код КАК Код
|ИЗ
| Справочник.Кондукторы КАК Кондукторы
|ГДЕ
| Кондукторы.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ТекущСтр);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ТекущТабНомер = Выборка.ТабельныйНомер;
КонецЦикла;
Возврат ТекущТабНомер;
КонецФункции
&НаКлиенте
Процедура ГрафикСотрудникПриИзменении(Элемент)
ТекущСтр=ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Сотрудник;
ТекТабНом=ГрафикСотрудникПриИзмененииНаСервере(ТекущСтр);
ЭтотОбъект.ТекущийЭлемент.ТекущиеДанные.Код=ТекТабНом;
ЭтотОбъект.Записать();
КонецПроцедуры
&НаСервере
Процедура ГрафикРасшифровкаСоздать() Экспорт
// Получаем текущую строку графика
ТекущаяСтрока = Объект.График.Получить(Элементы.График.ТекущаяСтрока);
ТекущийМесяц = Объект.Месяц;
ТекущийГод = Объект.Год;
ТекущийСотрудник = ТекущаяСтрока.Сотрудник;
ТекРасшифровка = ТекущаяСтрока.Расшифровка;
Если НЕ ЗначениеЗаполнено(ТекРасшифровка) Тогда
ТекущаяРасшифровка = Документы.РасшифровкаРаботыКондуктора.СоздатьДокумент();
ТекущаяРасшифровка.Дата = ТекущаяДата();
ТекущаяРасшифровка.Сотрудник = ТекущийСотрудник;
ТекущаяРасшифровка.Месяц = ТекущийМесяц;
ТекущаяРасшифровка.Год = ТекущийГод;
НоваяСтр = ТекущаяРасшифровка.Расшифровка.Добавить();
НоваяСтр.ВидДеятельности = Перечисления.ВидДеятельности.Режим;
// Копируем все дни месяца через цикл
Для i = 1 По 31 Цикл
ИмяПоля = "ЧислоМесяца" + Строка(i);
НоваяСтр[ИмяПоля] = ТекущаяСтрока[ИмяПоля];
КонецЦикла;
ТекущаяРасшифровка.Записать(РежимЗаписиДокумента.Проведение);
ТекущаяСтрока.Расшифровка = ТекущаяРасшифровка.Ссылка;
ЭтотОбъект.Записать();
Иначе
ТекущаяРасшифровка = ТекРасшифровка;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ГрафикРасшифровкаНачалоВыбораНаСервере()
ГрафикРасшифровкаСоздать();
КонецПроцедуры
&НаКлиенте
Процедура ГрафикРасшифровкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
//ГрафикРасшифровкаНачалоВыбораНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьГрафикЧетыреЧерезДва(НоваяСтрока,ОтсутствиеС,ОтсутствиеПо,РежимПослеВыходногоДня,РежимПервогоЧисла,ПорядковыйНомерДня,ГрафикРаботы,Признак,ТекМесяц,ТекГод)
ЧислоКонцаМесяца = СпектрДоработки.ВернутьКоличествоДнейМесяца(ТекМесяц, ТекГод);
ТекСтр = НоваяСтрока;
Если ГрафикРаботы <> Перечисления.ГрафикРаботы.ЧетыреЧерезДва Тогда
Возврат;
КонецЕсли;
// Смещение старта
Смещение = ПорядковыйНомерДня - 1;
Для стр = 1 По ЧислоКонцаМесяца Цикл
ДеньЦикла = (стр + Смещение - 1) % 6;
// 0-3 рабочие, 4-5 выходные
Если ДеньЦикла <= 3 Тогда
Если РежимПослеВыходногоДня = Перечисления.РежимРаботыПослеВыходногоДня.Один Тогда
ТекСтр["ЧислоМесяца" + стр] = "1";
Иначе
ТекСтр["ЧислоМесяца" + стр] = "2";
КонецЕсли;
Иначе
ТекСтр["ЧислоМесяца" + стр] = "В";
КонецЕсли;
КонецЦикла;
// Отсутствия
Если ЗначениеЗаполнено(ОтсутствиеС) Тогда
НачПериода = Число(Сред(ОтсутствиеС,1,2));
КонПериода = Число(Сред(ОтсутствиеПо,1,2));
Для стр = НачПериода По КонПериода Цикл
ТекСтр["ЧислоМесяца" + стр] = "О";
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьГрафикПятьЧерезДва(НоваяСтрока,ОтсутствиеС,ОтсутствиеПо,РежимПослеВыходногоДня,РежимПервогоЧисла,ПорядковыйНомерДня,ГрафикРаботы,Признак,ТекМесяц,ТекГод)
ЧислоКонцаМесяца = СпектрДоработки.ВернутьКоличествоДнейМесяца(ТекМесяц,ТекГод);
ТекСтр = НоваяСтрока;
Если ГрафикРаботы <> Перечисления.ГрафикРаботы.ПятьЧерезДва Тогда
Возврат;
КонецЕсли;
// Смещение старта
Смещение = ПорядковыйНомерДня - 1;
Для стр = 1 По ЧислоКонцаМесяца Цикл
ДеньЦикла = (стр + Смещение - 1) % 7;
// 0-4 рабочие, 5-6 выходные
Если ДеньЦикла <= 4 Тогда
Если РежимПервогоЧисла = Перечисления.РежимРаботыПервогоЧисла.Выходной Тогда
// После выходного
Если РежимПослеВыходногоДня = Перечисления.РежимРаботыПослеВыходногоДня.Один Тогда
ТекСтр["ЧислоМесяца"+стр] = "1";
Иначе
ТекСтр["ЧислоМесяца"+стр] = "2";
КонецЕсли;
ИначеЕсли РежимПервогоЧисла = Перечисления.РежимРаботыПервогоЧисла.Один Тогда
// Чередование 1/2
Если (Цел(ДеньЦикла / 5) % 2) = 0 Тогда
ТекСтр["ЧислоМесяца"+стр] = "1";
Иначе
ТекСтр["ЧислоМесяца"+стр] = "2";
КонецЕсли;
ИначеЕсли РежимПервогоЧисла = Перечисления.РежимРаботыПервогоЧисла.Два Тогда
Если (Цел(ДеньЦикла / 5) % 2) = 0 Тогда
ТекСтр["ЧислоМесяца"+стр] = "2";
Иначе
ТекСтр["ЧислоМесяца"+стр] = "1";
КонецЕсли;
КонецЕсли;
Иначе
ТекСтр["ЧислоМесяца"+стр] = "В";
КонецЕсли;
КонецЦикла;
// Отсутствия
Если ЗначениеЗаполнено(ОтсутствиеС) Тогда
НачПериода = Число(Сред(ОтсутствиеС,1,2));
КонПериода = Число(Сред(ОтсутствиеПо,1,2));
Для стр = НачПериода По КонПериода Цикл
ТекСтр["ЧислоМесяца"+стр] = Признак;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СоздатьРасшифровку(ТекСотрудник,ТекМесяц,ТекГод,ТекГрафикРабот,ОтсутствиеС,ОтсутствиеПо,ТекРежимПослеВыходногоДня,ТекРежимПервогоЧисла,ТекПорядковыйНомерДня)
ТекРасшифровкаВ = Документы.РасшифровкаРаботы.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасшифровкаРаботыКондуктора.Ссылка КАК Ссылка
|ИЗ
| Документ.РасшифровкаРаботыКондуктора КАК РасшифровкаРаботыКондуктора
|ГДЕ
| РасшифровкаРаботыКондуктора.Месяц = &Месяц
| И РасшифровкаРаботыКондуктора.Год = &Год
| И РасшифровкаРаботыКондуктора.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Год", ТекГод);
Запрос.УстановитьПараметр("Месяц", ТекМесяц);
Запрос.УстановитьПараметр("Сотрудник", ТекСотрудник);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ТекРасшифровкаВ = Выборка.Ссылка;
КонецЦикла;
ТекПризнак="";
Если ЗначениеЗаполнено(ТекРасшифровкаВ) Тогда
ТекРасшифровка = ТекРасшифровкаВ.ПолучитьОбъект();
Иначе
ТекРасшифровка = Документы.РасшифровкаРаботыКондуктора.СоздатьДокумент();
ТекРасшифровка.Год=ТекГод;
ТекРасшифровка.Месяц=ТекМесяц;
ТекРасшифровка.Сотрудник=ТекСотрудник;
ТекРасшифровка.Дата=ТекущаяДата();
НоваяСтрока = ТекРасшифровка.Расшифровка.Добавить();
НоваяСтрока.ВидДеятельности=Перечисления.ВидДеятельности.Режим;
//Если ТекРежимПервогоЧисла=Перечисления.РежимРаботыПервогоЧисла.ОдинДваВ Тогда
Если ТекГрафикРабот=Перечисления.ГрафикРаботы.ПятьЧерезДва Тогда
ЗаполнитьГрафикПятьЧерезДва(НоваяСтрока,ОтсутствиеС,ОтсутствиеПо,ТекРежимПослеВыходногоДня,ТекРежимПервогоЧисла,ТекПорядковыйНомерДня,ТекГрафикРабот,ТекПризнак,ТекМесяц,ТекГод); //Сучков
Иначе
ЗаполнитьГрафикЧетыреЧерезДва(НоваяСтрока,ОтсутствиеС,ОтсутствиеПо,ТекРежимПослеВыходногоДня,ТекРежимПервогоЧисла,ТекПорядковыйНомерДня,ТекГрафикРабот,ТекПризнак,ТекМесяц,ТекГод); //Сучков
КонецЕсли;
НоваяСтрокаРасписание= ТекРасшифровка.Расшифровка.Добавить();
НоваяСтрокаРасписание.ВидДеятельности=Перечисления.ВидДеятельности.Расписание;
НоваяСтрокаРасписание= ТекРасшифровка.Расшифровка.Добавить();
НоваяСтрокаРасписание.ВидДеятельности=Перечисления.ВидДеятельности.Время;
//КонецЕсли;
ТекРасшифровка.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Возврат ТекРасшифровка;
КонецФункции
&НаСервере
Функция ВернутьЧасыНорм()
ТекНормоЧасы=0;
ТекНормоДни = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НормоЧасы.НормЧас КАК НормЧас,
| НормоЧасы.КолСмен КАК КолСмен
|ИЗ
| РегистрСведений.НормоЧасы КАК НормоЧасы
|ГДЕ
| НормоЧасы.Год = &Год
| И НормоЧасы.Месяц = &Месяц";
Запрос.УстановитьПараметр("Год", Объект.Год);
Запрос.УстановитьПараметр("Месяц", Объект.Месяц);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ТекНормоДни = Выборка.КолСмен;
ТекНормоЧасы = Выборка.НормЧас;
КонецЦикла;
НормоДниЧасы = Новый Структура;
НормоДниЧасы.Вставить("НормоДни", ТекНормоДни);
НормоДниЧасы.Вставить("НормоЧасы", ТекНормоЧасы);
Возврат НормоДниЧасы;
КонецФункции
&НаСервере
Функция ВернутьКоличествоСмен(НоваяСтрока)
ИдОтпуска = Ложь;
КолСмен=0;
НормоЧасыДни = ВернутьЧасыНорм();
ТекСтр = НоваяСтрока;
Для стр=1 по 31 Цикл
Если (ТекСтр["ЧислоМесяца"+стр]="1") или (ТекСтр["ЧислоМесяца"+стр]="2") или (ТекСтр["ЧислоМесяца"+стр]="Д") Тогда
КолСмен=КолСмен+1;
КонецЕсли;
Если (ТекСтр["ЧислоМесяца"+стр]="О") Тогда
ИдОтпуска = Истина
КонецЕсли;
КонецЦикла;
Если ИдОтпуска = Истина Тогда
НормоЧасы = НормоЧасыДни.НормоЧасы / НормоЧасыДни.НормоДни * КолСмен
Иначе
НормоЧасы = НормоЧасыДни.НормоЧасы
КонецЕсли;
НормоДниЧасы = Новый Структура;
НормоДниЧасы.Вставить("НормоДни", КолСмен);
НормоДниЧасы.Вставить("НормоЧасы",НормоЧасы);
Возврат НормоДниЧасы;
КонецФункции
&НаСервере
Процедура ЗаполнитьНаСервере(ТекТабНомер)
Объект.КоличествоСмен.Очистить();
Объект.График.Очистить();
ТекСписокТН= Новый СписокЗначений;
ном=0;
Реквизиты = СтрЗаменить(ТекТабНомер,",",Символы.ПС);
Для ТекСтр=1 По СтрЧислоСтрок(Реквизиты) Цикл
ТекСтрока = СтрПолучитьСтроку(Реквизиты,ТекСтр);
ном=ном+1;
ТекСписокТН.Вставить(ном-1,ТекСтрока);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РежимРаботыКондуктораСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
| РежимРаботыКондуктораСрезПоследних.ТабНомер КАК ТабНомер,
| Сотрудники.Ссылка КАК Сотрудник,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимРаботы КАК РежимРаботы,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ОтсутствиеС КАК ОтсутствиеС,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимПослеВыходногоДня КАК РежимПослеВыходногоДня,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ПорядковыйНомерДня КАК ПорядковыйНомерДня,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимРаботыПервогоЧисла КАК РежимПервогоЧисла,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ОтсутствиеПо КАК ОтсутствиеПо,
| РежимРаботыКондуктораСрезПоследних.Регистратор.Признак КАК Признак
|ИЗ
| РегистрСведений.РежимРаботыКондуктора.СрезПоследних(&ТекДата, ) КАК РежимРаботыКондуктораСрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО РежимРаботыКондуктораСрезПоследних.ТабНомер = Сотрудники.Код
|ГДЕ
| РежимРаботыКондуктораСрезПоследних.ТабНомер В(&ТабНомер)
| И РежимРаботыКондуктораСрезПоследних.Год = &Год
| И РежимРаботыКондуктораСрезПоследних.Месяц = &Месяц";
Запрос.УстановитьПараметр("ТабНомер", ТекСписокТН);
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
Запрос.УстановитьПараметр("Месяц", Объект.Месяц);
Запрос.УстановитьПараметр("Год", Объект.Год);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.График.Добавить();
НоваяСтрока.Код= Выборка.Код;
НоваяСтрока.Сотрудник = Выборка.Сотрудник;
Если Выборка.ГрафикРаботы=Перечисления.ГрафикРаботы.ПятьЧерезДва Тогда
ЗаполнитьГрафикПятьЧерезДва(НоваяСтрока,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня,Выборка.ГрафикРаботы,Выборка.Признак,Объект.Месяц,Объект.Год); //Сучков
Иначе
ЗаполнитьГрафикЧетыреЧерезДва(НоваяСтрока,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня,Выборка.ГрафикРаботы,Выборка.Признак,Объект.Месяц,Объект.Год); //Сучков
КонецЕсли;
ТекРасшифровка = СоздатьРасшифровку(Выборка.Сотрудник,Объект.Месяц,Объект.Год,Выборка.ГрафикРаботы,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня);
НоваяСтрока.Расшифровка = ТекРасшифровка.ссылка;
КоличествоСтр= Объект.График.Количество();
НоваяСтрока.ЧасыНорм = ВернутьЧасыНорм();
НоваяСтрока.КоличествоСмен = ВернутьКоличествоСмен(НоваяСтрока);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Заполнить(Команда)
ТекТабНомер=0;
Если ВвестиСтроку(ТекТабНомер," Введите список таб. номеров через запятую ! ",0,Истина) Тогда
ТекущаяСтрока = Объект.График.Получить(Элементы.График.ТекущаяСтрока);
ТекущийСотрудник=ТекущаяСтрока.Сотрудник;
Сообщить(ТекТабНомер);
КонецЕсли;
ЗаполнитьНаСервере(ТекТабНомер);
КонецПроцедуры
&НаСервере
Процедура ГрафикПриОкончанииРедактированияНаСервере()
//КолСмен=0;
//Для стр=1 По 31 Цикл
// ТекСтр=Объект.График.Получить(Элементы.График.ТекущаяСтрока);
// Если ТекСтр["ЧислоМесяца"+Строка(стр)]<>"В" Тогда
// КолСмен = КолСмен+1;
// КонецЕсли;
//КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ГрафикПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ГрафикПриОкончанииРедактированияНаСервере();
КонецПроцедуры
///////////При нажатии на кнопки заполнить
&НаСервере
Процедура ЗаполнитьГрафикНаСервере()
Объект.КоличествоСмен.Очистить();
Объект.График.Очистить();
//ТекСписокТН= Новый СписокЗначений;
//ном=0;
//Реквизиты = СтрЗаменить(ТекТабНомер,",",Символы.ПС);
//
//Для ТекСтр=1 По СтрЧислоСтрок(Реквизиты) Цикл
// ТекСтрока = СтрПолучитьСтроку(Реквизиты,ТекСтр);
// ном=ном+1;
// ТекСписокТН.Вставить(ном-1,ТекСтрока);
//КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РежимРаботыКондуктораСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
| РежимРаботыКондуктораСрезПоследних.ТабНомер КАК ТабНомер,
| Сотрудники.Ссылка КАК Сотрудник,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимРаботы КАК РежимРаботы,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ОтсутствиеС КАК ОтсутствиеС,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимПослеВыходногоДня КАК РежимПослеВыходногоДня,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ПорядковыйНомерДня КАК ПорядковыйНомерДня,
| РежимРаботыКондуктораСрезПоследних.Регистратор.ОтсутствиеПо КАК ОтсутствиеПо,
| РежимРаботыКондуктораСрезПоследних.Регистратор.РежимРаботыПервогоЧисла КАК РежимПервогоЧисла,
| Сотрудники.Наименование КАК Наименование,
| РежимРаботыКондуктораСрезПоследних.Регистратор.Признак КАК Признак
|ИЗ
| РегистрСведений.РежимРаботыКондуктора.СрезПоследних(&ТекДата, ) КАК РежимРаботыКондуктораСрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО РежимРаботыКондуктораСрезПоследних.ТабНомер = Сотрудники.Код
|ГДЕ
| РежимРаботыКондуктораСрезПоследних.Месяц = &Месяц
| И РежимРаботыКондуктораСрезПоследних.Год = &Год
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
//Запрос.УстановитьПараметр("ТабНомер", ТекСписокТН);
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
Запрос.УстановитьПараметр("Месяц", Объект.Месяц);
Запрос.УстановитьПараметр("Год", Объект.Год);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.График.Добавить();
НоваяСтрока.Код= Выборка.Код;
НоваяСтрока.Сотрудник = Выборка.Сотрудник;
Если Выборка.ГрафикРаботы=Перечисления.ГрафикРаботы.ПятьЧерезДва Тогда
ЗаполнитьГрафикПятьЧерезДва(НоваяСтрока,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня,Выборка.ГрафикРаботы,Выборка.Признак,Объект.Месяц,Объект.Год); //Сучков);
Иначе
ЗаполнитьГрафикЧетыреЧерезДва(НоваяСтрока,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня,Выборка.ГрафикРаботы,Выборка.Признак,Объект.Месяц,Объект.Год); //Сучков);
КонецЕсли;
ТекРасшифровка = СоздатьРасшифровку(Выборка.Сотрудник,Объект.Месяц,Объект.Год,Выборка.ГрафикРаботы,Выборка.ОтсутствиеС,Выборка.ОтсутствиеПо,Выборка.РежимПослеВыходногоДня,Выборка.РежимПервогоЧисла,Выборка.ПорядковыйНомерДня);
НоваяСтрока.Расшифровка = ТекРасшифровка.ссылка;
КоличествоСтр= Объект.График.Количество();
//НоваяСтрока.КоличествоСмен=КолСмен;
НормаДниЧасы = ВернутьКоличествоСмен(НоваяСтрока);
НоваяСтрока.КоличествоСмен = НормаДниЧасы.НормоДни;
НоваяСтрока.ЧасыНорм = НормаДниЧасы.НормоЧасы;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьГрафик(Команда)
ЗаполнитьГрафикНаСервере();
КоличествоСменК();
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере()
ТекДатаЗапретаРедактирования = КонецДня(Константы.ДатаЗапретаРедактирования.Получить());
ДатаДокумента = Объект.Дата;
Если ДатаДокумента<=ТекДатаЗапретаРедактирования Тогда
ЭтотОбъект.ТолькоПросмотр=Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ГрафикПередУдалением(Элемент, Отказ)
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Удалить строку документа ?",Режим,0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ= Истина;
КонецЕсли;
КонецПроцедуры