|
Помогите написать код. Хелп. Ø (Xapac 16.08.2019 07:49) | ☑ | ||
---|---|---|---|---|
0
Gribok
16.08.19
✎
07:48
|
Друзья, уважаемые гуру 1С коддинга, прошу помощи т.к. сам попросту не знаю 1С.
Имеется стандартная печатаная форма 1С 8.2 ЗУП -График работы (Рис 1) Данную форму я привел к форме как на рисунке 2 Т.е. добавил столбец Цитировать ОТКЛОНЕНИЕ от баланса (переработка/недоработка) Требуется что б в данном столбце производились расчеты Хотя бы на 1м примере как рассчитать Сделал Параметр ОтклЧасов, который должен рассчитываться следующим образом ОтклЧасов=Часов по графику - Часов по произв календарю Как записать это в коде я понятия не имею. Кому не сложно напишите код. Вот все процедуры и функции которые есть к данному макету [code]Перем ТекущийГод Экспорт; Перем мДлинаСуток Экспорт; Перем ТаблицаДляЗаписи Экспорт; Перем СоответствиеИнтервалыРедактирования Экспорт; Перем мСокращенноеРабочееВремя; Перем мГрафикПолногоРабочегоВремени; Перем БледноКрасныйЦвет Экспорт; Перем КрасныйЦвет Экспорт; Перем СерыйЦвет Экспорт; //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // // Функция возвращает соответствие между датой и днем недели для этой даты, // установленной в регистре сведений ПеренесенныеРабочиеДни // Функция ПолучитьСоответствиеПеренесенныхДней(ГодЗаполнения) СоответствиеДней = Новый Соответствие; НаборЗаписей = РегистрыСведений.ПеренесенныеРабочиеДни.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Год.Установить(ГодЗаполнения); НаборЗаписей.Прочитать(); Для Каждого ЭлементНабораЗаписей Из НаборЗаписей Цикл СоответствиеДней.Вставить(ЭлементНабораЗаписей.РабочийДень, ДеньНедели(ЭлементНабораЗаписей.ВыходнойДень)); СоответствиеДней.Вставить(ЭлементНабораЗаписей.ВыходнойДень, ДеньНедели(ЭлементНабораЗаписей.РабочийДень)); КонецЦикла; Возврат СоответствиеДней; КонецФункции Функция ПолучитьДниВПроизводственномКалендаре(ДатаНачалаИнтервала, ДатаОкончанияИнтервала) Экспорт Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаИнтервала", ДатаНачалаИнтервала); Запрос.УстановитьПараметр("ДатаОкончанияИнтервала", ДатаОкончанияИнтервала); Запрос.Текст = "ВЫБРАТЬ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, | РегламентированныйПроизводственныйКалендарь.ВидДня |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачалаИнтервала И &ДатаОкончанияИнтервала"; Выборка = Запрос.Выполнить().Выбрать(); СоответствиеДней = Новый Соответствие; Пока Выборка.Следующий() Цикл СоответствиеДней.Вставить(Выборка.ДатаКалендаря,Выборка.ВидДня) КонецЦикла; Возврат СоответствиеДней; КонецФункции // Составляет описание рабочего времени каждой смены графика // // Параметры // нет // // Возвращаемое значение: // Соответствие: смена - структура ее рабочего времени (ЧасовВсего,ЧасовНочных) // под "сменой" понимается эл-т справичника Смены для сменных графиков или значение // перечисления // Функция ПолучитьПродолжительностьРабочихСмен() Если ВидГрафика = Перечисления.ВидыРабочихГрафиков.Сменный Тогда ПериодыРаботыТекст = "ВЫБРАТЬ | ГрафикиРаботыПериодыСмены.Ссылка КАК Ссылка, | ГрафикиРаботыПериодыСмены.ВремяНачала КАК ВремяНачала, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата // для графиков с одинаковым временем начала и окончания | ТОГДА &КонецДня | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания | КОНЕЦ КАК ВремяОкончания |ИЗ | Справочник.ГрафикиРаботы.Смены КАК ГрафикиРаботыСмены | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Смены.ПериодыСмены КАК ГрафикиРаботыПериодыСмены | ПО ГрафикиРаботыСмены.Смена = ГрафикиРаботыПериодыСмены.Ссылка |ГДЕ | ГрафикиРаботыСмены.Ссылка = &Ссылка | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ГрафикиРаботыПериодыСмены.Ссылка, | &ПустаяДата, | ГрафикиРаботыПериодыСмены.ВремяОкончания |ИЗ | Справочник.ГрафикиРаботы.Смены КАК ГрафикиРаботыСмены | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Смены.ПериодыСмены КАК ГрафикиРаботыПериодыСмены | ПО ГрафикиРаботыСмены.Смена = ГрафикиРаботыПериодыСмены.Ссылка |ГДЕ | ГрафикиРаботыСмены.Ссылка = &Ссылка | И ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата"; Иначе ПериодыРаботыТекст = "ВЫБРАТЬ | ГрафикиРаботыПериодыСмены.ДеньНедели КАК Ссылка, | ГрафикиРаботыПериодыСмены.ВремяНачала КАК ВремяНачала, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата // для графиков с одинаковым временем начала и окончания | ТОГДА &КонецДня | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания | КОНЕЦ КАК ВремяОкончания |ИЗ | Справочник.ГрафикиРаботы.ПериодыСмены КАК ГрафикиРаботыПериодыСмены |ГДЕ | ГрафикиРаботыПериодыСмены.Ссылка = &Ссылка | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ГрафикиРаботыПериодыСмены.ДеньНедели, | &ПустаяДата, | ГрафикиРаботыПериодыСмены.ВремяОкончания |ИЗ | Справочник.ГрафикиРаботы.ПериодыСмены КАК ГрафикиРаботыПериодыСмены |ГДЕ | ГрафикиРаботыПериодыСмены.Ссылка = &Ссылка | И ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата"; // для графиков с одинаковым временем начала и окончания КонецЕсли; Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | СУММА(ЕСТЬNULL(РАЗНОСТЬДАТ(ПериодыРабочихСмен.ВремяНачала, ПериодыРабочихСмен.ВремяОкончания, СЕКУНДА) + ВЫБОР | КОГДА ПериодыРабочихСмен.ВремяНачала <= ПериодыРабочихСмен.ВремяОкончания | ТОГДА 0 | ИНАЧЕ &ДлинаСуток | КОНЕЦ, 0)) КАК ЧасовВсего, | СУММА(ЕСТЬNULL(ВЫБОР | КОГДА ПериодыРабочихСмен.НачалоНочных1 < ПериодыРабочихСмен.ОкончаниеНочных1 | ТОГДА РАЗНОСТЬДАТ(ПериодыРабочихСмен.НачалоНочных1, ПериодыРабочихСмен.ОкончаниеНочных1, СЕКУНДА) | ИНАЧЕ 0 | КОНЕЦ + ВЫБОР | КОГДА ПериодыРабочихСмен.НачалоНочных2 < ПериодыРабочихСмен.ОкончаниеНочных2 | ТОГДА РАЗНОСТЬДАТ(ПериодыРабочихСмен.НачалоНочных2, ПериодыРабочихСмен.ОкончаниеНочных2, СЕКУНДА) | ИНАЧЕ 0 | КОНЕЦ, 0)) КАК ЧасовНочных, | ПериодыРабочихСмен.Ссылка |ИЗ | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ГрафикиРаботыПериодыСмены.ВремяНачала КАК ВремяНачала, | ГрафикиРаботыПериодыСмены.ВремяОкончания КАК ВремяОкончания, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала > &ОкончаниеНочных1 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания < &НачалоНочных1 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала < &НачалоНочных1 | ТОГДА &НачалоНочных1 | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяНачала | КОНЕЦ КАК НачалоНочных1, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала > &ОкончаниеНочных1 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания < &НачалоНочных1 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания > &ОкончаниеНочных1 | ТОГДА &ОкончаниеНочных1 | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания | КОНЕЦ КАК ОкончаниеНочных1, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала > &ОкончаниеНочных2 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания < &НачалоНочных2 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала < &НачалоНочных2 | ТОГДА &НачалоНочных2 | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяНачала | КОНЕЦ КАК НачалоНочных2, | ВЫБОР | КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала > &ОкончаниеНочных2 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания < &НачалоНочных2 | ТОГДА &ПустаяДата | КОГДА ГрафикиРаботыПериодыСмены.ВремяОкончания > &ОкончаниеНочных2 | ТОГДА &ОкончаниеНочных2 | ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания | КОНЕЦ КАК ОкончаниеНочных2, | ГрафикиРаботыПериодыСмены.Ссылка КАК Ссылка | ИЗ | (" + ПериодыРаботыТекст + ") КАК ГрафикиРаботыПериодыСмены) КАК ПериодыРабочихСмен | |СГРУППИРОВАТЬ ПО | ПериодыРабочихСмен.Ссылка"; ПустаяДата = '00010101'; КонецДня = ПустаяДата + (мДлинаСуток - 1); Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("ДлинаСуток", мДлинаСуток); Запрос.УстановитьПараметр("ПустаяДата", ПустаяДата); Запрос.УстановитьПараметр("КонецДня", КонецДня); // 23:59:59 Запрос.УстановитьПараметр("НачалоНочных1", НачалоНочныхЧасов); // например, 22:00:00 Запрос.УстановитьПараметр("ОкончаниеНочных1", КонецДня); // 23:59:59 Запрос.УстановитьПараметр("НачалоНочных2", ПустаяДата); // начало дня Запрос.УстановитьПараметр("ОкончаниеНочных2", НачалоДневныхЧасов - 1);// например, 05:59:59 Выборка = Запрос.Выполнить().Выбрать(); ПродолжительностьРабочихСменГрафика = Новый Соответствие; Пока Выборка.Следующий() Цикл ПродолжительностьРабочихСменГрафика.Вставить(Выборка.Ссылка,Новый Структура("ЧасовВсего,,ЧасовНочных",Выборка.ЧасовВсего / 3600,Выборка.ЧасовНочных / 3600)); КонецЦикла; Возврат ПродолжительностьРабочихСменГрафика; КонецФункции // ПолучитьПродолжительностьРабочихСмен() Функция ВыходнойСУчетомПроизводственногоКалендаря(ВидДня, индДата, НомерПервогоВыходного, НомерВторогоВыходного) Если ВидДня = Неопределено Тогда // производственный календарь не заполнен НомерДня = ДеньНедели(индДата); Возврат НомерПервогоВыходного = НомерДня Или НомерВторогоВыходного = НомерДня; КонецЕсли; Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник ИЛИ ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.ДополнительныйВыходной Тогда Возврат Истина; ИначеЕсли ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда НомерДня = ДеньНедели(индДата); Если НомерДня < 6 Тогда // обычный рабочий день Если НомерПервогоВыходного = НомерДня Или НомерВторогоВыходного = НомерДня Тогда Возврат Истина; КонецЕсли; Иначе // перенесенный рабочий день Возврат Ложь; КонецЕсли; ИначеЕсли ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота Тогда Если (НомерПервогоВыходного = 6 Или НомерВторогоВыходного = 6) Тогда // т.е. ПервыйВыходной = Перечисления.ДниНедели.Суббота или ВторойВыходной = Перечисления.ДниНедели.Суббота Возврат Истина; КонецЕсли; ИначеЕсли ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье Тогда Если (НомерПервогоВыходного = 7 Или НомерВторогоВыходного = 7) Тогда // т.е. ПервыйВыходной = Перечисления.ДниНедели.Воскресенье или ВторойВыходной = Перечисления.ДниНедели.Воскресенье Возврат Истина; КонецЕсли; КонецЕсли; Возврат Ложь; КонецФункции //ВыходнойПоПроизводственномуКалендарю Функция ОтмеченВРесурсеПроизводственногоКалендаря(ПроверяемаяДата, Ресурс, ТаблицаДанныхКалендаря) НайденнаяСтрока = ТаблицаДанныхКалендаря.Найти(ПроверяемаяДата, "ДатаКалендаря"); Если НайденнаяСтрока = Неопределено Тогда Возврат 0; КонецЕсли; Возврат НайденнаяСтрока[Ресурс]; КонецФункции //Функция вычисляет количество дней в месяце Функция КоличествоДнейВМесяце(Месяц, Год) Экспорт ДатаМесяца = Дата(Год, Месяц, 1); ДнейВМесяце = День(КонецМесяца(ДатаМесяца)); Возврат ДнейВМесяце; КонецФункции //Функция выбирает данные производственного календаря за месяц Функция ДанныеПроизводственногоКалендаря(НомерМесяца) Экспорт ТекущийМесяц = НачалоМесяца(Дата(Год(ТекущийГод), НомерМесяца, 1)); Запрос = Новый Запрос; Запрос.УстановитьПараметр("НачалоМесяца",НачалоМесяца(ТекущийМесяц)); Запрос.УстановитьПараметр("КонецМесяца",КонецМесяца(ТекущийМесяц)); Запрос.Текст = "ВЫБРАТЬ | РегламентированныйПроизводственныйКалендарь.ВидДня, | ДЕНЬНЕДЕЛИ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДеньНедели |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоМесяца И &КонецМесяца | |УПОРЯДОЧИТЬ ПО | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря"; Данные = Запрос.Выполнить().Выгрузить(); Возврат Данные; КонецФункции //Функция вычисляет итоги рабочего времени за месяцы, кварталы и за год //по данным производственного календаря Функция ДанныеПроизводственногоКалендаряЗаГод(Год) ТекстЗапроса = "ВЫБРАТЬ | ГОД(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ГодКалендаря, | КВАРТАЛ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КварталКалендаря, | МЕСЯЦ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК МесяцКалендаря, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КалендарныеДни, | РегламентированныйПроизводственныйКалендарь.ВидДня КАК ВидДня |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ | РегламентированныйПроизводственныйКалендарь.Год = &Год | |СГРУППИРОВАТЬ ПО | ГОД(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря), | КВАРТАЛ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря), | МЕСЯЦ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря), | РегламентированныйПроизводственныйКалендарь.ВидДня | |УПОРЯДОЧИТЬ ПО | КварталКалендаря, | МесяцКалендаря | |ИТОГИ ПО | ГодКалендаря, | КварталКалендаря, | МесяцКалендаря"; РабочееВремяГод = 0; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Год", Год); Результат = Запрос.Выполнить(); ВыборкаПоГоду = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ТаблицаИтогов = Новый ТаблицаЗначений; ТаблицаИтогов.Колонки.Добавить("НомерМесяца"); ТаблицаИтогов.Колонки.Добавить("ДнейПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ЧасовПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ВыходныхПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ДнейЗаКварталПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ЧасовЗаКварталПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ВыходныхЗаКварталПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ДнейЗаГодПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ЧасовЗагодПоКалендарю"); ТаблицаИтогов.Колонки.Добавить("ВыходныхЗагодПоКалендарю"); Пока ВыборкаПоГоду.Следующий() Цикл ВыборкаПоКварталу = ВыборкаПоГоду.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоКварталу.Следующий() Цикл КалендарныеДниКв = 0; РабочееВремяКв = 0; РабочиеДниКв = 0; ВыходныеДниКв = 0; Если ВыборкаПоКварталу.КварталКалендаря = 1 тогда КалендарныеДниГод = 0; РабочееВремяГод = 0; РабочиеДниГод = 0; ВыходныеДниГод = 0; КонецЕсли; ВыборкаПоМесяцу = ВыборкаПоКварталу.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоМесяцу.Следующий() Цикл ВыходныеДни = 0; РабочееВремя = 0; КалендарныеДни = 0; РабочиеДни = 0; ВыборкаПоВидуДня = ВыборкаПоМесяцу.Выбрать(ОбходРезультатаЗапроса.Прямой); Пока ВыборкаПоВидуДня.Следующий() Цикл Если ВыборкаПоВидуДня.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота Или ВыборкаПоВидуДня.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье Или ВыборкаПоВидуДня.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник Тогда ВыходныеДни = ВыходныеДни + ВыборкаПоВидуДня.КалендарныеДни ИначеЕсли ВыборкаПоВидуДня.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий Тогда РабочееВремя = РабочееВремя + ВыборкаПоВидуДня.КалендарныеДни * ДлительностьРабочейНедели / 5; РабочиеДни = РабочиеДни + ВыборкаПоВидуДня.КалендарныеДни; КонецЕсли; КалендарныеДни = КалендарныеДни + ВыборкаПоВидуДня.КалендарныеДни; КонецЦикла; // вид дня КалендарныеДниКв = КалендарныеДниКв + КалендарныеДни; РабочееВремяКв = РабочееВремяКв + РабочееВремя; РабочиеДниКв = РабочиеДниКв + РабочиеДни; ВыходныеДниКв = ВыходныеДниКв + ВыходныеДни; КалендарныеДниГод = КалендарныеДниГод + КалендарныеДни; РабочееВремяГод = РабочееВремяГод + РабочееВремя; РабочиеДниГод = РабочиеДниГод + РабочиеДни; ВыходныеДниГод = ВыходныеДниГод + ВыходныеДни; НоваяСтрока = ТаблицаИтогов.Добавить(); НоваяСтрока.НомерМесяца = ВыборкаПоМесяцу.МесяцКалендаря; НоваяСтрока.ДнейПоКалендарю = РабочиеДни; НоваяСтрока.ЧасовПоКалендарю = РабочееВремя; НоваяСтрока.ВыходныхПоКалендарю = ВыходныеДни; КонецЦикла; // месяц НоваяСтрока.ДнейЗаКварталПоКалендарю = РабочиеДниКв; НоваяСтрока.ЧасовЗаКварталПоКалендарю = РабочееВремяКв; НоваяСтрока.ВыходныхЗаКварталПоКалендарю = ВыходныеДниКв; КонецЦикла; // квартал НоваяСтрока.ДнейЗаГодПоКалендарю = РабочиеДниГод; НоваяСтрока.ЧасовЗаГодПоКалендарю = РабочееВремяГод; НоваяСтрока.ВыходныхЗаГодПоКалендарю = ВыходныеДниГод; КонецЦикла; // год Возврат ТаблицаИтогов; КонецФункции //////////////////////////////////////////////////////////////////////////////// // ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ Процедура ЗаполнитьГрафикПоПятидневка40() Экспорт ВидГрафика = Перечисления.ВидыРабочихГрафиков.Пятидневка; ДлительностьРабочейНедели = 40; ПервыйВыходной = Перечисления.ДниНедели.Суббота; ВторойВыходной = Перечисления.ДниНедели.Воскресенье; НачалоДневныхЧасов = Дата(1,1,1,6,0,0); НачалоНочныхЧасов = Дата(1,1,1,22,0,0); ШаблонЗаполнения = Перечисления.ШаблонЗаполненияГрафикаРаботы.Пятидневка40; УчитыватьПраздники = Истина; ПериодыСмены.Очистить(); Для ИндексДня = 0 По 4 Цикл Смена = ПериодыСмены.Добавить(); Смена.ВремяНачала = Дата(1,1,1,8,0,0); Смена.ВремяОкончания = Дата(1,1,1,16,0,0); Смена.ДеньНедели = Перечисления.ДниНедели[ИндексДня]; КонецЦикла; КонецПроцедуры // ЗаполнитьГрафикПоПятидневка40() Процедура ЗаполнитьГрафикПоШестидневка40() Экспорт ВидГрафика = Перечисления.ВидыРабочихГрафиков.Шестидневка; ДлительностьРабочейНедели = 40; ПервыйВыходной = Перечисления.ДниНедели.ПустаяСсылка(); ВторойВыходной = Перечисления.ДниНедели.Воскресенье; НачалоДневныхЧасов = Дата(1,1,1,6,0,0); НачалоНочныхЧасов = Дата(1,1,1,22,0,0); ШаблонЗаполнения = Перечисления.ШаблонЗаполненияГрафикаРаботы.Шестидневка40; УчитыватьПраздники = Истина; ПериодыСмены.Очистить(); Для ИндексДня = 0 По 5 Цикл Смена = ПериодыСмены.Добавить(); Смена.ВремяНачала = Дата(1,1,1,8,0,0); Если ИндексДня = 5 Тогда Смена.ВремяОкончания = Дата(1,1,1,13,0,0); Иначе Смена.ВремяОкончания = Дата(1,1,1,15,0,0); КонецЕсли; Смена.ДеньНедели = Перечисления.ДниНедели[ИндексДня]; КонецЦикла; КонецПроцедуры // ЗаполнитьГрафикПоШестидневка40() #Если ТолстыйКлиентОбычноеПриложение Тогда Функция Печать(КалендарьНаборЗаписей, ГодПечати = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ГодПечати) Тогда ГодПечати = ТекущийГод; КонецЕсли; ВыводитьИтогиПроизводственногоКалендаря = Истина; ДатаНачалаИнтервала = НачалоГода(ГодПечати); ДатаОкончанияИнтервала = КонецГода(ГодПечати); ДнейВИнтервале = (КонецДня(ДатаОкончанияИнтервала) - НачалоДня(ДатаНачалаИнтервала) + 1) / мДлинаСуток; Календарь = ПолучитьДниВПроизводственномКалендаре(ДатаНачалаИнтервала, ДатаОкончанияИнтервала); // это соответствие: дата - вид дня Если ДнейВИнтервале <> Календарь.Количество() Тогда Сообщить("Проверьте правильность заполнения регламентированного производственного календаря на " + Формат(Год(ГодПечати), "ЧГ=5") + " год", СтатусСообщения.Важное); ВыводитьИтогиПроизводственногоКалендаря = Ложь; КонецЕсли; ПечатныйДокумент = Новый ТабличныйДокумент; ПечатныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ГрафикиРаботы"; ПечатныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; ПечатныйДокумент.Автомасштаб = Истина; Макет = ПолучитьМакет("Макет"); ОбластьДанныхШапка = Макет.ПолучитьОбласть("Шапка"); //ОТОБРАЖАЕМ ВСЕ ОБЛАСТЬ ШАПКИ ++ //++ ОбластьДанныхШапка = Макет.ПолучитьОбласть("Шапка|Месяцы"); ОбластьДанныхКолонтитул = Макет.ПолучитьОбласть("Колонтитул"); ОбластьДанныхРасширение = Макет.ПолучитьОбласть("Расширение"); ОбластьДанныхДень = Макет.ПолучитьОбласть("День|Месяцы"); ОбластьДанныхДеньПоДням = Макет.ПолучитьОбласть("День|Дни"); ОбластьДанныхНочные = Макет.ПолучитьОбласть("НЧ"); ОбластьИтогиЗаМесяц = Макет.ПолучитьОбласть("День|Итоги"); ОбластьИтогиЗаКвартал = Макет.ПолучитьОбласть("Квартал"); ОбластьИтогиЗаКварталНЧ = Макет.ПолучитьОбласть("КварталНЧ"); ОбластьИтогиЗаГод = Макет.ПолучитьОбласть("Год"); ОбластьИтогиЗаГодНЧ = Макет.ПолучитьОбласть("ГодНЧ"); ОбластьКалендаря = Макет.ПолучитьОбласть("Календарь"); ОбластьПодписи = Макет.ПолучитьОбласть("Подпись"); ОбластьРасширениеИтоги = Макет.ПолучитьОбласть("РасширениеИтоги"); //Получаем мою область ++ //ОбластьДеньКалендарь = Макет.ПолучитьОбласть("День|Календарь"); //ОбластьКалендаря.Параметры.ОтклЧасов=111; //ПечатныйДокумент.Вывести(ОбластьКалендаря); ОбластьДанныхШапка.Параметры.Наименование = "График работы '" + СокрЛП(ЭтотОбъект.Наименование) + "' на " + Формат(Год(ГодПечати), "ЧГ=5") + " год"; ПечатныйДокумент.Вывести(ОбластьДанныхШапка); ОбластьДнейЗаголовок = "Часов за день"; Если УчитыватьНочныеЧасы Тогда ОбластьДнейЗаголовок = ОбластьДнейЗаголовок + ", в том числе ночных"; КонецЕсли; ОбластьДанныхКолонтитул.Параметры.Установить(0, ОбластьДнейЗаголовок); ПечатныйДокумент.Вывести(ОбластьДанныхКолонтитул); ДнейЗаКвартал = 0; ЧасовЗаКвартал = 0; НочныхЧасовЗаКвартал = 0; ДнейЗаГод = 0; ЧасовЗагод = 0; НочныхЧасовЗаГод = 0; ДнейПоКалендарю = 0; ЧасовПоКалендарю = 0; ВыходныхПоКалендарю = 0; ДнейЗаКварталПоКалендарю = 0; ЧасовЗаКварталПоКалендарю = 0; ВыходныхЗаКварталПоКалендарю = 0; ДнейЗаГодПоКалендарю = 0; ЧасовЗаГодПоКалендарю = 0; ВыходныхЗаГодПоКалендарю = 0; Квартал = 0; ИндексСтраницы = 0; ОтклЧасов = 0; ОтклКвартал = 0; ОтклГод = 0; Для Индекс = 0 По 11 Цикл НомерМесяца = Индекс + 1; НазваниеМесяца = КалендарьНаборЗаписей[Индекс].Месяц; Дней = КалендарьНаборЗаписей[Индекс].ДнейЗаМесяц; Часов = КалендарьНаборЗаписей[Индекс].ЧасовЗаМесяц; НочныхЧасов = КалендарьНаборЗаписей[Индекс].НочныхЧасовЗаМесяц; Если НомерМесяца = 4 ИЛИ НомерМесяца = 7 ИЛИ НомерМесяца = 10 Тогда ДнейЗаКвартал = 0; ЧасовЗаквартал = 0; НочныхЧасовЗаКвартал = 0; КонецЕсли; ДнейЗаКвартал = ДнейЗаКвартал + Дней; ЧасовЗаКвартал = ЧасовЗаКвартал + Часов; ДнейЗаГод = ДнейЗаГод + Дней; ЧасовЗаГод = ЧасовЗаГод + Часов; НочныхЧасовЗаГод = НочныхЧасовЗаГод + НочныхЧасов; ДанныеМесяца = КалендарьНаборЗаписей[Индекс]; ОбластьДанныхДень.Параметры.Заполнить(ДанныеМесяца); СтрокаСПодвалом = Новый Массив; // создадим массив для проверки вывода СтрокаСПодвалом.Добавить(ОбластьДанныхДень); СтрокаСПодвалом.Добавить(ОбластьИтогиЗаКвартал); СтрокаСПодвалом.Добавить(ОбластьИтогиЗаКварталНЧ); Если Не УниверсальныеМеханизмы.ПроверитьВыводДляТабличногоДокумента(ПечатныйДокумент, СтрокаСПодвалом) Тогда ПечатныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); ПечатныйДокумент.Вывести(ОбластьДанныхКолонтитул); ИндексСтраницы = ИндексСтраницы+1; КонецЕсли; ПечатныйДокумент.Вывести(ОбластьДанныхДень); ОбластьДанныхДеньПоДням.Параметры.Заполнить(ДанныеМесяца); ОбластьИтогиЗаМесяц.Параметры.Заполнить(ДанныеМесяца); Если УчитыватьНочныеЧасы Тогда ОбластьДанныхНочные.Параметры.Заполнить(ДанныеМесяца); НочныхЧасовЗаКвартал = НочныхЧасовЗаКвартал + НочныхЧасов; ОбластьИтогиЗаКварталНЧ.Параметры.Установить(0, НочныхЧасовЗаКвартал); КонецЕсли; ДнейВМесяце = КоличествоДнейВМесяце(НомерМесяца, Год(ГодПечати)); Если ДнейВМесяце < 31 Тогда ЛишнийДень = ДнейВМесяце + 1; Пока ЛишнийДень <= 31 Цикл ОбластьДанныхДеньПоДням.Параметры.Установить(ЛишнийДень-1, "X"); ОбластьДанныхНочные.Параметры.Установить(ЛишнийДень-1, "X"); ЛишнийДень = ЛишнийДень + 1; КонецЦикла; КонецЕсли; //Установим параметры производственного календаря ДанныеПроизводственногоКалендаря = ДанныеПроизводственногоКалендаря(НомерМесяца); ТаблицаИтоговКалендаря = ДанныеПроизводственногоКалендаряЗаГод(Год(ГодПечати)); Если ВыводитьИтогиПроизводственногоКалендаря Тогда ТаблицаИтогов = ТаблицаИтоговКалендаря[Индекс]; ОбластьИтогиЗаМесяц.Параметры.Установить(2, ТаблицаИтоговКалендаря[Индекс].ДнейПоКалендарю); ОбластьИтогиЗаМесяц.Параметры.Установить(3, ТаблицаИтоговКалендаря[Индекс].ЧасовПоКалендарю); ОбластьИтогиЗаМесяц.Параметры.Установить(4, ТаблицаИтоговКалендаря[Индекс].ВыходныхПоКалендарю); КонецЕсли; ПечатныйДокумент.Присоединить(ОбластьДанныхДеньПоДням); ПечатныйДокумент.Присоединить(ОбластьИтогиЗаМесяц); Если УчитыватьНочныеЧасы Тогда ПечатныйДокумент.Вывести(ОбластьДанныхНочные); Иначе ПечатныйДокумент.Вывести(ОбластьДанныхРасширение); КонецЕсли; //Выделим цветом нерабочие дни в календаре ТекущийМесяц = НачалоМесяца(Дата(Год(ГодПечати), НомерМесяца, 1)); ДеньНеделиМесяца = ДеньНедели(НачалоМесяца(ТекущийМесяц)); Для НомерДня = 1 По 31 Ц |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |