Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 11:24

Помогите написать код. Хелп.

Автор gribok, 16 авг 2019, 07:15

0 Пользователей и 1 гость просматривают эту тему.

gribok

Друзья, уважаемые гуру 1С коддинга, прошу помощи т.к. сам попросту не знаю 1С.
Имеется стандартная печатаная форма 1С 8.2 ЗУП -График работы (Рис 1)
Данную форму я привел к форме как на рисунке 2
Т.е. добавил столбец
ЦитироватьОТКЛОНЕНИЕ от баланса (переработка/недоработка)

Требуется что б  в данном столбце производились расчеты
Хотя бы на 1м примере как рассчитать

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

Как записать это в коде я понятия не имею.

Кому не сложно напишите код.


Вот все процедуры и функции которые есть к данному макету


Перем ТекущийГод Экспорт;

Перем мДлинаСуток Экспорт;
Перем ТаблицаДляЗаписи Экспорт;
Перем СоответствиеИнтервалыРедактирования Экспорт;

Перем мСокращенноеРабочееВремя;
Перем мГрафикПолногоРабочегоВремени;

Перем БледноКрасныйЦвет Экспорт;
Перем КрасныйЦвет Экспорт;
Перем СерыйЦвет Экспорт;



////////////////////////////////////////////////////////////////////////////////
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
//

// Функция возвращает соответствие между датой и днем недели для этой даты,
// установленной в регистре сведений ПеренесенныеРабочиеДни
//
Функция ПолучитьСоответствиеПеренесенныхДней(ГодЗаполнения)

СоответствиеДней = Новый Соответствие;
НаборЗаписей = РегистрыСведений.ПеренесенныеРабочиеДни.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Год.Установить(ГодЗаполнения);
НаборЗаписей.Прочитать();

Для Каждого ЭлементНабораЗаписей Из НаборЗаписей Цикл
СоответствиеДней.Вставить(ЭлементНабораЗаписей.РабочийДень, ДеньНедели(ЭлементНабораЗаписей.ВыходнойДень));
СоответствиеДней.Вставить(ЭлементНабораЗаписей.ВыходнойДень, ДеньНедели(ЭлементНабораЗаписей.РабочийДень));
КонецЦикла;

Возврат СоответствиеДней;

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

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

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНачалаИнтервала", ДатаНачалаИнтервала);
Запрос.УстановитьПараметр("ДатаОкончанияИнтервала", ДатаОкончанияИнтервала);
Запрос.Текст =
"ВЫБРАТЬ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
| РегламентированныйПроизводственныйКалендарь.ВидДня
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачалаИнтервала И &ДатаОкончанияИнтервала";

Выборка = Запрос.Выполнить().Выбрать();
СоответствиеДней = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоответствиеДней.Вставить(Выборка.ДатаКалендаря,Выборка.ВидДня)
КонецЦикла;

Возврат СоответствиеДней;

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

// Составляет описание рабочего времени каждой смены графика
//
// Параметры
//  нет
//
// Возвращаемое значение:
//   Соответствие: смена - структура ее рабочего времени (ЧасовВсего,ЧасовНочных)
//    под "сменой" понимается эл-т справичника Смены для сменных графиков или значение
//      перечисления
//
Функция ПолучитьПродолжительностьРабочихСмен()

Если ВидГрафика = Перечисления.ВидыРабочихГрафиков.Сменный Тогда
ПериодыРаботыТекст =
"ВЫБРАТЬ
| ГрафикиРаботыПериодыСмены.Ссылка КАК Ссылка,
| ГрафикиРаботыПериодыСмены.ВремяНачала КАК ВремяНачала,
| ВЫБОР
| КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата  // для графиков с одинаковым временем начала и окончания
| ТОГДА &КонецДня
| ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания
| КОНЕЦ КАК ВремяОкончания
|ИЗ
| Справочник.ГрафикиРаботы.Смены КАК ГрафикиРаботыСмены
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Смены.ПериодыСмены КАК ГрафикиРаботыПериодыСмены
| ПО ГрафикиРаботыСмены.Смена = ГрафикиРаботыПериодыСмены.Ссылка
|ГДЕ
| ГрафикиРаботыСмены.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ГрафикиРаботыПериодыСмены.Ссылка,
| &ПустаяДата,
| ГрафикиРаботыПериодыСмены.ВремяОкончания
|ИЗ
| Справочник.ГрафикиРаботы.Смены КАК ГрафикиРаботыСмены
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Смены.ПериодыСмены КАК ГрафикиРаботыПериодыСмены
| ПО ГрафикиРаботыСмены.Смена = ГрафикиРаботыПериодыСмены.Ссылка
|ГДЕ
| ГрафикиРаботыСмены.Ссылка = &Ссылка
| И ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата";
Иначе
ПериодыРаботыТекст =
"ВЫБРАТЬ
| ГрафикиРаботыПериодыСмены.ДеньНедели КАК Ссылка,
| ГрафикиРаботыПериодыСмены.ВремяНачала КАК ВремяНачала,
| ВЫБОР
| КОГДА ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата // для графиков с одинаковым временем начала и окончания
| ТОГДА &КонецДня
| ИНАЧЕ ГрафикиРаботыПериодыСмены.ВремяОкончания
| КОНЕЦ КАК ВремяОкончания
|ИЗ
| Справочник.ГрафикиРаботы.ПериодыСмены КАК ГрафикиРаботыПериодыСмены
|ГДЕ
| ГрафикиРаботыПериодыСмены.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ГрафикиРаботыПериодыСмены.ДеньНедели,
| &ПустаяДата,
| ГрафикиРаботыПериодыСмены.ВремяОкончания
|ИЗ
| Справочник.ГрафикиРаботы.ПериодыСмены КАК ГрафикиРаботыПериодыСмены
|ГДЕ
| ГрафикиРаботыПериодыСмены.Ссылка = &Ссылка
| И ГрафикиРаботыПериодыСмены.ВремяНачала >= ГрафикиРаботыПериодыСмены.ВремяОкончания И ГрафикиРаботыПериодыСмены.ВремяОкончания <> &ПустаяДата";  // для графиков с одинаковым временем начала и окончания
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| СУММА(ЕСТЬ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 Цикл
Если НомерДня <= ДнейВМесяце Тогда
Если ДанныеПроизводственногоКалендаря.Количество() > 0 Тогда
ВидДня = ДанныеПроизводственногоКалендаря[НомерДня - 1].ВидДня;
Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье
Или ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота
Или ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник Тогда
ОбластьВыходных = ПечатныйДокумент.НайтиТекст(Строка(НомерДня),,,,Истина);
ОбластьДляЗакрашивания = ПечатныйДокумент.Область(ОбластьВыходных.Верх + НомерМесяца*2 + Квартал*2- 1, ОбластьВыходных.Лево, ОбластьВыходных.Верх + НомерМесяца*2  + Квартал*2, ОбластьВыходных.Лево);
ОбластьДляЗакрашивания.ЦветФона = КрасныйЦвет;
КонецЕсли;
КонецЕсли;
Иначе
ОбластьЛишнихДней = ПечатныйДокумент.НайтиТекст(Строка(НомерДня),,,,Истина);
ОбластьДляЗакрашивания = ПечатныйДокумент.Область(ОбластьЛишнихДней.Верх + НомерМесяца*2 + Квартал*2 - 1, ОбластьЛишнихДней.Лево, ОбластьЛишнихДней.Верх + НомерМесяца*2 + Квартал*2, ОбластьЛишнихДней.Лево);
ОбластьДляЗакрашивания.ЦветФона = СерыйЦвет;
КонецЕсли;
КонецЦикла;

Если НомерМесяца = 3 ИЛИ НомерМесяца = 6 ИЛИ НомерМесяца = 9 ИЛИ НомерМесяца = 12 Тогда
Квартал = НомерМесяца/3;
ОбластьИтогиЗаКвартал.Параметры.Установить(0, "" + Квартал + " квартал");
ОбластьИтогиЗаКвартал.Параметры.Установить(1, ДнейЗаКвартал);
ОбластьИтогиЗаКвартал.Параметры.Установить(2, ЧасовЗаКвартал);
Если ВыводитьИтогиПроизводственногоКалендаря Тогда
ОбластьИтогиЗаКвартал.Параметры.Установить(3, ТаблицаИтоговКалендаря[НомерМесяца-1].ДнейЗаКварталПоКалендарю);
ОбластьИтогиЗаКвартал.Параметры.Установить(4, ТаблицаИтоговКалендаря[НомерМесяца-1].ЧасовЗаКварталПоКалендарю);
ОбластьИтогиЗаКвартал.Параметры.Установить(5, ТаблицаИтоговКалендаря[НомерМесяца-1].ВыходныхЗаКварталПоКалендарю);
КонецЕсли;

ПечатныйДокумент.Вывести(ОбластьИтогиЗаКвартал);

Если  УчитыватьНочныеЧасы Тогда
ПечатныйДокумент.Присоединить(ОбластьИтогиЗаКварталНЧ);
Иначе
ПечатныйДокумент.Вывести(ОбластьРасширениеИтоги);
КонецЕсли;
КонецЕсли;

КонецЦикла;

ОбластьИтогиЗаГод.Параметры.Установить(0, ДнейЗаГод);
ОбластьИтогиЗаГод.Параметры.Установить(1, ЧасовЗаГод);
Если ВыводитьИтогиПроизводственногоКалендаря Тогда
ОбластьИтогиЗаГод.Параметры.Установить(2, ТаблицаИтоговКалендаря[11].ДнейЗаГодПоКалендарю);
ОбластьИтогиЗаГод.Параметры.Установить(3, ТаблицаИтоговКалендаря[11].ЧасовЗаГодПоКалендарю);
ОбластьИтогиЗаГод.Параметры.Установить(4, ТаблицаИтоговКалендаря[11].ВыходныхЗаГодПоКалендарю);
КонецЕсли;

ПечатныйДокумент.Вывести(ОбластьИтогиЗаГод);

Если УчитыватьНочныеЧасы Тогда
ОбластьИтогиЗаГодНЧ.Параметры.Установить(0, НочныхЧасовЗаГод);
ПечатныйДокумент.Вывести(ОбластьИтогиЗаГодНЧ);
Иначе
ПечатныйДокумент.Вывести(ОбластьРасширениеИтоги);
ОбластьИтоговЗаГод = ПечатныйДокумент.НайтиТекст("Итого за год:");
СераяОбласть = ПечатныйДокумент.Область(ОбластьИтоговЗаГод.Верх + 1, ОбластьИтоговЗаГод.Лево, ОбластьИтоговЗаГод.Верх + 1, ОбластьИтоговЗаГод.Лево + 37);
СераяОбласть.ЦветФона = ЦветаСтиля.ФонГруппировкиВерхнегоУровня;
КонецЕсли;

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

УниверсальныеМеханизмы.НапечататьДокумент(ПечатныйДокумент, , , "График работы " + Наименование);



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

#КонецЕсли

// заполняет календарь за определенный временной интервал
Процедура АвтозаполнениеКалендаря(ДатаНачалаИнтервала, ДатаОкончанияИнтервала, СообщатьОбОшибках = Истина) Экспорт

Если ДатаОкончанияИнтервала < ДатаОтсчета
И ВидГрафика = Перечисления.ВидыРабочихГрафиков.Сменный Тогда
Сообщить("Календарь не может быть заполнен на период, предшествующий указанной в нем дате отсчета!");
Возврат;
КонецЕсли;

Календарь = ПолучитьДниВПроизводственномКалендаре(ДатаНачалаИнтервала, ДатаОкончанияИнтервала); // это соответствие: дата - вид дня
ДнейВИнтервале = (КонецДня(ДатаОкончанияИнтервала) - НачалоДня(ДатаНачалаИнтервала) + 1) / мДлинаСуток;
Если СообщатьОбОшибках и ДнейВИнтервале <> Календарь.Количество() Тогда
Сообщить("Проверьте правильность заполнения регламентированного производственного календаря на " + Формат(Год(ДатаОкончанияИнтервала), "ЧГ=5") + " год", СтатусСообщения.Важное);
КонецЕсли;

Модифицированность = Истина;

    СоответствиеПеренесенныхДней = ПолучитьСоответствиеПеренесенныхДней(Год(ДатаНачалаИнтервала));

// сначала очистим записи за указанный период
индДата = ДатаНачалаИнтервала;
ПарамПоиска = Новый Структура("Дата");
Пока индДата <= ДатаОкончанияИнтервала Цикл
ПарамПоиска.Дата = индДата;
СтрокиДляУдаления = ТаблицаДляЗаписи.НайтиСтроки(ПарамПоиска);
Для каждого СтрокаУдаления из СтрокиДляУдаления Цикл
ТаблицаДляЗаписи.Удалить(СтрокаУдаления);
КонецЦикла;
индДата = индДата + мДлинаСуток;
КонецЦикла;

ЭтоПятиШестидневка = ВидГрафика = Перечисления.ВидыРабочихГрафиков.Пятидневка Или ВидГрафика = Перечисления.ВидыРабочихГрафиков.Шестидневка;
ЭтоСменныйГрафик = ВидГрафика = Перечисления.ВидыРабочихГрафиков.Сменный;

ПродолжительностьРабочихСменГрафика = ПолучитьПродолжительностьРабочихСмен(); // Соответствие: смена - структура ее рабочего времени

ДатаНачалаЗаполнения = ДатаНачалаИнтервала;

Если ЭтоСменныйГрафик Тогда

ТаблицаСменПоДням   = Новый ТаблицаЗначений;
ТаблицаСменПоДням.Колонки.Добавить("СписокСмен", Новый ОписаниеТипов("СписокЗначений"));

КоличествоДнейВЦикле  = 0;
Для каждого НомерДня из Смены Цикл
КоличествоДнейВЦикле = Макс(КоличествоДнейВЦикле, НомерДня.НомерДня);
Если ТаблицаСменПоДням.Количество() < НомерДня.НомерДня Тогда
Пока Истина Цикл
ТаблицаСменПоДням.Добавить();
Если ТаблицаСменПоДням.Количество() = НомерДня.НомерДня Тогда
Прервать;
КонецЕсли
КонецЦикла;
КонецЕсли;
ТаблицаСменПоДням[НомерДня.НомерДня-1].СписокСмен.Добавить(НомерДня.Смена);
КонецЦикла;

    Если КоличествоДнейВЦикле = 0 Тогда
Возврат
КонецЕсли;

Если УчитыватьПраздники Тогда
НомерПервогоВыходного = 6;
НомерВторогоВыходного = 7;
Иначе
НомерПервогоВыходного = 0;
НомерВторогоВыходного = 0;
КонецЕсли;

Если КоличествоДнейВЦикле = 7 Тогда // вычислим выходные дни
НомерДняДатыОтсчета = ДеньНедели(ДатаОтсчета);
Для НомерДняДляСмены = 0 По 6 Цикл
    ЭтоРабочийДень = Ложь;
Для каждого ЭлементСписка Из ТаблицаСменПоДням[НомерДняДляСмены].СписокСмен Цикл
ЭтоРабочийДень = ЗначениеЗаполнено(ЭлементСписка.Значение);
Если ЭтоРабочийДень Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЭтоРабочийДень Тогда
Если НомерПервогоВыходного = 0 Тогда
НомерПервогоВыходного = ?(НомерДняДляСмены + НомерДняДатыОтсчета = 7, 7,(НомерДняДляСмены + НомерДняДатыОтсчета) % 7)
ИначеЕсли НомерВторогоВыходного = 0 Тогда
НомерВторогоВыходного = ?(НомерДняДляСмены + НомерДняДатыОтсчета = 7, 7,(НомерДняДляСмены + НомерДняДатыОтсчета) % 7)
КонецЕсли;
КонецЕсли;

КонецЦикла;
КонецЕсли;
ДатаНачалаЗаполнения = Макс(ДатаНачалаИнтервала,ДатаОтсчета);

ИначеЕсли ЭтоПятиШестидневка Тогда

Если ВидГрафика = Перечисления.ВидыРабочихГрафиков.Шестидневка Тогда
НомерПервогоВыходного = 0;
Иначе
НомерПервогоВыходного = ?(ЗначениеЗаполнено(ПервыйВыходной), Перечисления.ДниНедели.Индекс(ПервыйВыходной) + 1, 0);
КонецЕсли;
НомерВторогоВыходного = ?(ЗначениеЗаполнено(ВторойВыходной), Перечисления.ДниНедели.Индекс(ВторойВыходной) + 1, 0);

КонецЕсли;

индДата   = '00000000';
ЧасовВДне = Окр(ДлительностьРабочейНедели/?(ВидГрафика = Перечисления.ВидыРабочихГрафиков.Шестидневка,6,5));

ДнейВИнтервале = (КонецДня(ДатаОкончанияИнтервала) - НачалоДня(ДатаНачалаЗаполнения) + 1) / мДлинаСуток;
Для инд = 0 по ДнейВИнтервале-1 Цикл
индДата = ДатаНачалаЗаполнения + инд * мДлинаСуток;
ВидДня = Календарь[индДата];
Если УчитыватьПраздники
И ((НЕ ЭтоСменныйГрафик)
ИЛИ (ЭтоСменныйГрафик И ВидДня  = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник))
И ВыходнойСУчетомПроизводственногоКалендаря(ВидДня, индДата, НомерПервогоВыходного, НомерВторогоВыходного) Тогда
ЗаписьПоСменам  = ТаблицаДляЗаписи.Добавить();
ЗаписьПоСменам.Дата = индДата;
ЗаписьПоСменам.Часы = 0;
ЗаписьПоСменам.НочныеЧасы = 0;
Продолжить;
КонецЕсли;
Если  ЭтоСменныйГрафик Тогда

НомерДняДляСмены = ((индДата - ДатаОтсчета)/мДлинаСуток) % КоличествоДнейВЦикле;
НомерДняДляСмены = ?(НомерДняДляСмены < 0, -НомерДняДляСмены, НомерДняДляСмены);
СменыЗаДень   = ТаблицаСменПоДням[НомерДняДляСмены].СписокСмен;

Для каждого ПериодДня из СменыЗаДень Цикл

КоличествоЧасовВсего  = 0;
КоличествоЧасовНочных  = 0;
ИмеющиесяДанныеОСмене = ПродолжительностьРабочихСменГрафика[ПериодДня.Значение];
Если ИмеющиесяДанныеОСмене <> Неопределено Тогда
КоличествоЧасовВсего    = ИмеющиесяДанныеОСмене.ЧасовВсего;
КоличествоЧасовНочных   = ИмеющиесяДанныеОСмене.ЧасовНочных;
КонецЕсли;

ЗаписьПоСменам = ТаблицаДляЗаписи.Добавить();
ЗаписьПоСменам.Дата     = индДата;
ЗаписьПоСменам.Часы     = КоличествоЧасовВсего;
Если УчитыватьНочныеЧасы Тогда
ЗаписьПоСменам.НочныеЧасы   = КоличествоЧасовНочных;
КонецЕсли;
КонецЦикла;

ИначеЕсли ЭтоПятиШестидневка Тогда

ЗаписьПоСменам  = ТаблицаДляЗаписи.Добавить();
ЗаписьПоСменам.Дата = индДата;

КоличествоЧасовВсего  = 0;
КоличествоЧасовНочных  = 0;

ДеньНеделиПеренесенногоДня = СоответствиеПеренесенныхДней.Получить(индДата);
Если ДеньНеделиПеренесенногоДня = Неопределено Тогда
ИмеющиесяДанныеОСмене = ПродолжительностьРабочихСменГрафика[Перечисления.ДниНедели[ДеньНедели(ИндДата) - 1]];
Иначе
    ИмеющиесяДанныеОСмене = ПродолжительностьРабочихСменГрафика[Перечисления.ДниНедели[ДеньНеделиПеренесенногоДня-1]];
КонецЕсли;

Если ИмеющиесяДанныеОСмене = Неопределено Тогда
// найдем ближайший рабочий день
БлижайщийРабочийДень  = ИндДата + мДлинаСуток;
ШагИзменения = 1;
БлижайщийРабочийДеньВПрошлом = Неопределено;
БлижайщийРабочийДеньВБудущем = Неопределено;
Пока ШагИзменения <> 0 Цикл
ВидДня = Календарь[БлижайщийРабочийДень];
ИмеющиесяДанныеОСмене = ПродолжительностьРабочихСменГрафика[Перечисления.ДниНедели[ДеньНедели(БлижайщийРабочийДень) - 1]];
Если ИмеющиесяДанныеОСмене <> Неопределено Тогда
Если ШагИзменения > 0 Тогда
Если ВыходнойСУчетомПроизводственногоКалендаря(ВидДня, БлижайщийРабочийДень, НомерПервогоВыходного, НомерВторогоВыходного) Тогда
// по дням недели должен быть рабочим, а по производственному календарю - выходной
БлижайщийРабочийДеньВБудущем = БлижайщийРабочийДень;
КонецЕсли;
ШагИзменения = -1;
БлижайщийРабочийДень = индДата - мДлинаСуток;
ИначеЕсли ШагИзменения < 0 Тогда
Если ВыходнойСУчетомПроизводственногоКалендаря(ВидДня, БлижайщийРабочийДень, НомерПервогоВыходного, НомерВторогоВыходного) Тогда
// по дням недели должен быть рабочим, а по производственному календарю - выходной
БлижайщийРабочийДеньВПрошлом = БлижайщийРабочийДень;
КонецЕсли;
ШагИзменения = 0;
Прервать;
КонецЕсли;
Иначе
БлижайщийРабочийДень = БлижайщийРабочийДень + ШагИзменения * мДлинаСуток;
КонецЕсли;
КонецЦикла;

// по разности между ближайщими рабочими днями определим, с какого дня был перенос праздника
Если БлижайщийРабочийДеньВБудущем = Неопределено Тогда
Если БлижайщийРабочийДеньВПрошлом = Неопределено Тогда
БлижайщийРабочийДень = индДата; // не нашли ни какой ближайщий рабочий день, с которого мог быть сделан перенос
Иначе
БлижайщийРабочийДень = БлижайщийРабочийДеньВПрошлом;
КонецЕсли;
ИначеЕсли БлижайщийРабочийДеньВПрошлом = Неопределено Тогда
БлижайщийРабочийДень = БлижайщийРабочийДеньВБудущем;
ИначеЕсли индДата - БлижайщийРабочийДеньВПрошлом > БлижайщийРабочийДеньВБудущем - индДата Тогда
// будущий день ближе к текущей дате, чем прошедший
БлижайщийРабочийДень = БлижайщийРабочийДеньВБудущем;
Иначе
БлижайщийРабочийДень = БлижайщийРабочийДеньВПрошлом;
КонецЕсли;

ИмеющиесяДанныеОСмене = ПродолжительностьРабочихСменГрафика[Перечисления.ДниНедели[ДеньНедели(БлижайщийРабочийДень) - 1]];
КонецЕсли;

Если ИмеющиесяДанныеОСмене <> Неопределено Тогда
КоличествоЧасовВсего    = ИмеющиесяДанныеОСмене.ЧасовВсего;
КоличествоЧасовНочных   = ИмеющиесяДанныеОСмене.ЧасовНочных;
КонецЕсли;

ЗаписьПоСменам.Часы = КоличествоЧасовВсего;
ЗаписьПоСменам.НочныеЧасы   = КоличествоЧасовНочных;
КонецЕсли;
КонецЦикла;

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

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

СтруктураПоиска = Новый Структура("Дата");
СтруктураПоискаВТаблицеЗаписи = Новый Структура("Дата");

ТаблицаПоместить.Индексы.Добавить("Дата");

//Для каждого СтрокаТаблицаПоместить из ТаблицаПоместить Цикл
ДнейВТекущемМесяце = Окр((ДатаОкончанияИнтервала - ДатаНачалаИнтервала) / мДлинаСуток); //День(КонецМесяца(ДатаНачалаИнтервала));
ДатаМесяца = ДатаНачалаИнтервала;
Для индДата = 0 по ДнейВТекущемМесяце-1 Цикл
ДатаМесяца = ДатаНачалаИнтервала + индДата * мДлинаСуток;
// попробуем найти строку с соответствующей датой в таблице ИЗ которой помещаем
СтруктураПоиска.Дата = ДатаМесяца;

НайдСтрокиПоместить = ТаблицаПоместить.НайтиСтроки(СтруктураПоиска);
//СтрокаТаблицаПоместить =
Если НайдСтрокиПоместить.Количество() > 0 Тогда

// удалим имевшиеся ранее строки
СтруктураПоискаВТаблицеЗаписи.Дата = ДатаМесяца;
НайдСтроки = ТаблицаДляЗаписи.НайтиСтроки(СтруктураПоискаВТаблицеЗаписи);
Если НайдСтроки.Количество()>0 Тогда
Для каждого СтрокаТЗ Из НайдСтроки Цикл
ТаблицаДляЗаписи.Удалить(СтрокаТЗ)
КонецЦикла;
КонецЕсли;

// нашли строки и теперь их поместим
Для каждого СтрокаТЗ Из НайдСтрокиПоместить Цикл
            ЗаполнитьЗначенияСвойств(ТаблицаДляЗаписи.Добавить(),СтрокаТЗ);
КонецЦикла;
Иначе
// если не нашли строку, Тогда удалим соответствующую строку из другой таблицы
НайдСтроки = ТаблицаДляЗаписи.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаТаблицыДляЗаписи Из НайдСтроки Цикл
ТаблицаДляЗаписи.Удалить(СтрокаТаблицыДляЗаписи);
КонецЦикла;

КонецЕсли;

КонецЦикла;

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

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

СтруктураПоиска = Новый Структура("Дата");
СтруктураПоискаВТаблицеЗаписи = Новый Структура("Дата");

ДатаЦикла = ДатаНачалаИнтервала;
Пока ДатаЦикла <= ДатаОкончанияИнтервала Цикл
ДеньЦикла = День(ДатаЦикла);
МесяцЦикла = Месяц(ДатаЦикла);

Часов = ТаблицаПоместить[МесяцЦикла-1]["День"+ДеньЦикла];
НочныхЧасов = ТаблицаПоместить[МесяцЦикла-1]["НЧ"+ДеньЦикла];

// удалим имевшиеся ранее строки
СтруктураПоискаВТаблицеЗаписи.Дата = ДатаЦикла;
НайдСтроки = ТаблицаДляЗаписи.НайтиСтроки(СтруктураПоискаВТаблицеЗаписи);
Если НайдСтроки.Количество()>0 Тогда
Для каждого СтрокаТЗ Из НайдСтроки Цикл
ТаблицаДляЗаписи.Удалить(СтрокаТЗ)
КонецЦикла;
КонецЕсли;

// нашли строки и теперь их поместим
СтрокаДляЗаписи = ТаблицаДляЗаписи.Добавить();
СтрокаДляЗаписи.Дата = ДатаЦикла;
СтрокаДляЗаписи.Часы = Часов;
СтрокаДляЗаписи.НочныеЧасы = НочныхЧасов;

ДатаЦикла = ДатаЦикла + мДлинаСуток;
КонецЦикла;
       
КонецПроцедуры

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

ЗапросПоСменам = Новый Запрос;
ЗапросПоСменам.УстановитьПараметр("ДатаНачалаИнтервалаКалендаря",  ДатаНачалаИнтервалаКалендаря);
ЗапросПоСменам.УстановитьПараметр("ДатаОкончанияИнтервалаКалендаря", ДатаОкончанияИнтервалаКалендаря);
ЗапросПоСменам.УстановитьПараметр("ГрафикРаботы", Ссылка);
ЗапросПоСменам.УстановитьПараметр("ПоЧасам", Перечисления.ВидыУчетаВремени.ПоЧасам);
ЗапросПоСменам.УстановитьПараметр("Ночные", Перечисления.ВидыУчетаВремени.ПоНочнымЧасам);
   
ЗапросПоСменам.Текст = "ВЫБРАТЬ
                       | ГрафикиРаботыПоВидамВремени.Дата,
                       | ГрафикиРаботыПоВидамВремени.ОсновноеЗначение,
                       | ГрафикиРаботыПоВидамВремени.ВидУчетаВремени
                       | ПОМЕСТИТЬ ВТГрафики
                       |ИЗ
                       | РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
                       |
                       |ГДЕ
                       | ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы И
                       | ГрафикиРаботыПоВидамВремени.Дата >= &ДатаНачалаИнтервалаКалендаря И
                       | ГрафикиРаботыПоВидамВремени.Дата <= &ДатаОкончанияИнтервалаКалендаря И
                       | ГрафикиРаботыПоВидамВремени.ВидУчетаВремени В(&ПоЧасам, &Ночные)
   |;
   |///////////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
                       | ГрафикиРаботыПоВидамВремениЧасы.Дата,
                       | ГрафикиРаботыПоВидамВремениЧасы.ОсновноеЗначение КАК Часы,
                       | ГрафикиРаботыПоВидамВремениЧасы.ВидУчетаВремени,
                       | ГрафикиРаботыПоВидамВремениНочные.ОсновноеЗначение КАК НочныеЧасы
                       |ИЗ
                       | ВТГрафики КАК ГрафикиРаботыПоВидамВремениЧасы
                       | ЛЕВОЕ СОЕДИНЕНИЕ ВТГрафики КАК ГрафикиРаботыПоВидамВремениНочные
                       | ПО ГрафикиРаботыПоВидамВремениЧасы.Дата = ГрафикиРаботыПоВидамВремениНочные.Дата И (ГрафикиРаботыПоВидамВремениНочные.ВидУчетаВремени = &Ночные)
                       |
                       |ГДЕ
                       | ГрафикиРаботыПоВидамВремениЧасы.Дата >= &ДатаНачалаИнтервалаКалендаря И
                       | ГрафикиРаботыПоВидамВремениЧасы.Дата <= &ДатаОкончанияИнтервалаКалендаря И
                       | ГрафикиРаботыПоВидамВремениЧасы.ВидУчетаВремени = &ПоЧасам";


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

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

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

Процедура ПередЗаписью(Отказ)

// так было ранее
мСокращенноеРабочееВремя = Ссылка.СокращенноеРабочееВремя;
мГрафикПолногоРабочегоВремени = Ссылка.ГрафикПолногоРабочегоВремени;
   
КонецПроцедуры

Процедура ПриЗаписи(Отказ)

Если НЕ ОбменДанными.Загрузка Тогда

Если Отказ Тогда
Возврат;
КонецЕсли;

МассивМесяцев = Новый Массив;
Для каждого Элемент Из СоответствиеИнтервалыРедактирования Цикл
МассивМесяцев.Добавить(Элемент.Ключ)
КонецЦикла;

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("МассивМесяцев", МассивМесяцев);
Запрос.УстановитьПараметр("парамТекущийГрафик", Ссылка);

// Получим таблицу сведений о производственном календаре за нужные месяцы
Запрос.Текст =
"ВЫБРАТЬ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
| РегламентированныйПроизводственныйКалендарь.Пятидневка,
| РегламентированныйПроизводственныйКалендарь.Шестидневка,
| РегламентированныйПроизводственныйКалендарь.КалендарныеДни,
| РегламентированныйПроизводственныйКалендарь.ВидДня
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) В (&МассивМесяцев)";

ПроизводственныйКалендарь = Запрос.Выполнить().Выгрузить();
ПроизводственныйКалендарь.Индексы.Добавить("ДатаКалендаря");

УсловнаяПродолжительностьДня = ДлительностьРабочейНедели / 5;
// запишем отредактированные месяцы
Для каждого Элемент из СоответствиеИнтервалыРедактирования Цикл

ДатаИзСписка = Элемент.Ключ;

ДатаНачалаИнтервалаИзСписка  = НачалоМесяца(ДатаИзСписка);
ДатаОкончанияИнтервалаИзСписка = КонецМесяца(ДатаИзСписка);

ДнейВИнтервале = Окр((ДатаОкончанияИнтервалаИзСписка - ДатаНачалаИнтервалаИзСписка) / мДлинаСуток);

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

Для инд = 0 по ДнейВИнтервале - 1 Цикл
ИтогоЧасовВсего    = 0;
ИтогоЧасовНочных   = 0;

индДата = ДатаНачалаИнтервалаИзСписка + инд * мДлинаСуток;

СтруктураПоиска.Дата = индДата;
НайденныеСтроки      = ТаблицаДляЗаписи.НайтиСтроки(СтруктураПоиска);
// выбрали строки по дате, теперь будем их записывать
Для каждого СтрокаТаблицаДляЗаписи   из НайденныеСтроки   Цикл

КоличествоЧасовВсего     = СтрокаТаблицаДляЗаписи.Часы;
КоличествоЧасовНочных    = СтрокаТаблицаДляЗаписи.НочныеЧасы;

ИтогоЧасовВсего     = ИтогоЧасовВсего    + КоличествоЧасовВсего;
ИтогоЧасовНочных    = ИтогоЧасовНочных   + КоличествоЧасовНочных;

КонецЦикла;

ЗаписьПоВУВ = НаборЗаписейЗаДеньПоВремени.Добавить();
ЗаписьПоВУВ.ГрафикРаботы      = Ссылка;
ЗаписьПоВУВ.Месяц   = ДатаНачалаИнтервалаИзСписка;
ЗаписьПоВУВ.ВидУчетаВремени   = Перечисления.ВидыУчетаВремени.ПоДням;
ЗаписьПоВУВ.Дата     = индДата;
ЗаписьПоВУВ.ОсновноеЗначение  = ?(ИтогоЧасовВсего > 0, 1, 0);
ЗаписьПоВУВ.ДополнительноеЗначение = ИтогоЧасовВсего;
ЗаписьПоВУВ.ПроизводственныйКалендарьПятидневка     = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "Пятидневка",   ПроизводственныйКалендарь);
ЗаписьПоВУВ.ПроизводственныйКалендарьШестиДневка    = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "Шестидневка",  ПроизводственныйКалендарь);
ЗаписьПоВУВ.ПроизводственныйКалендарьКалендарныеДни = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "КалендарныеДни", ПроизводственныйКалендарь);

ЗаписьПоВУВ = НаборЗаписейЗаДеньПоВремени.Добавить();
ЗаписьПоВУВ.ГрафикРаботы          = Ссылка;
ЗаписьПоВУВ.Месяц   = ДатаНачалаИнтервалаИзСписка;
ЗаписьПоВУВ.ВидУчетаВремени       = Перечисления.ВидыУчетаВремени.ПоЧасам;
ЗаписьПоВУВ.Дата      = индДата;
ЗаписьПоВУВ.ОсновноеЗначение      = ИтогоЧасовВсего;
ЗаписьПоВУВ.ДополнительноеЗначение = ?(ИтогоЧасовВсего > 0, 1, 0);
ЗаписьПоВУВ.ПроизводственныйКалендарьПятидневка     = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "Пятидневка",   ПроизводственныйКалендарь);
ЗаписьПоВУВ.ПроизводственныйКалендарьШестиДневка    = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "Шестидневка",  ПроизводственныйКалендарь);
ЗаписьПоВУВ.ПроизводственныйКалендарьКалендарныеДни = ОтмеченВРесурсеПроизводственногоКалендаря(индДата, "КалендарныеДни", ПроизводственныйКалендарь);

ЗаписьПоВУВ = НаборЗаписейЗаДеньПоВремени.Добавить();
ЗаписьПоВУВ.ГрафикРаботы      = Ссылка;
ЗаписьПоВУВ.Месяц   = ДатаНачалаИнтервалаИзСписка;
ЗаписьПоВУВ.ВидУчетаВремени   = Перечисления.ВидыУчетаВремени.ПоНочнымЧасам;
ЗаписьПоВУВ.Дата        = индДата;
ЗаписьПоВУВ.ОсновноеЗначение  = ИтогоЧасовНочных;
// ПроизводственныйКалендарьПятидневка
// ПроизводственныйКалендарьШестиДневка
// ПроизводственныйКалендарьКалендарныеДни
// ДополнительноеЗначение
// ОсновноеЗначениеНорма
// ДополнительноеЗначениеНорма
// не записываются для ПоНочнымЧасам

КонецЦикла;

НаборЗаписейЗаДеньПоВремени.Записать(Истина);
НаборЗаписейЗаДеньПоВремени.Очистить();
КонецЦикла;

ОбновлятьВесьНаборЗаписейКалендаря = (мСокращенноеРабочееВремя И Не мГрафикПолногоРабочегоВремени.Пустая()) Или (СокращенноеРабочееВремя И Не ГрафикПолногоРабочегоВремени.Пустая());
// переписываем норму времени в остальных месяцах календаря
Если ОбновлятьВесьНаборЗаписейКалендаря Тогда

Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГрафикиРаботыПоВидамВремени.Месяц
|ИЗ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
|ГДЕ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &парамТекущийГрафик
| И (НЕ ГрафикиРаботыПоВидамВремени.Месяц В (&МассивМесяцев))";

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

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

НаборЗаписейЗаДеньПоВремени.Отбор.Месяц.Значение = Выборка.Месяц;
НаборЗаписейЗаДеньПоВремени.Прочитать();
НаборЗаписейЗаДеньПоВремени.Записать(Истина);

КонецЦикла;

КонецЕсли;

// Заполнение нормы времени для графиков сокращенного рабочего времени,
// опирающихся на текущий график как график полного рабочего времени
Если Не СокращенноеРабочееВремя Тогда

Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГрафикиРаботы.Ссылка КАК ГрафикРаботы
|ИЗ
| Справочник.ГрафикиРаботы КАК ГрафикиРаботы
|ГДЕ
| ГрафикиРаботы.ГрафикПолногоРабочегоВремени = &парамТекущийГрафик
| И ГрафикиРаботы.СокращенноеРабочееВремя";

ВыборкаГрафик = Запрос.Выполнить().Выбрать();

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

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

ТаблицаДляЗаписи.Очистить();
СоответствиеИнтервалыРедактирования.Очистить();

КонецЕсли;

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

мДлинаСуток = 86400; // в секундах

ТаблицаДляЗаписи    = Новый ТаблицаЗначений;
ТаблицаДляЗаписи.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДляЗаписи.Колонки.Добавить("Часы", Новый ОписаниеТипов("Число"));
ТаблицаДляЗаписи.Колонки.Добавить("НочныеЧасы",  Новый ОписаниеТипов("Число"));
ТаблицаДляЗаписи.Индексы.Добавить("Дата");

СоответствиеИнтервалыРедактирования = Новый Соответствие;

БледноКрасныйЦвет = Новый Цвет(255, 235, 235);
КрасныйЦвет = Новый Цвет(255, 220, 205);
СерыйЦвет = Новый Цвет(205, 205, 205);



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

Если Не ЗначениеЗаполнено(ГодПечати) Тогда
ГодПечати = ТекущийГод;
КонецЕсли;

ВыводитьИтогиПроизводственногоКалендаря = Истина;
ДатаНачалаИнтервала    = НачалоГода(ГодПечати);
ДатаОкончанияИнтервала  = КонецГода(ГодПечати);
ДнейВИнтервале = (КонецДня(ДатаОкончанияИнтервала) - НачалоДня(ДатаНачалаИнтервала) + 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 Цикл
Если НомерДня <= ДнейВМесяце Тогда
Если ДанныеПроизводственногоКалендаря.Количество() > 0 Тогда
ВидДня = ДанныеПроизводственногоКалендаря[НомерДня - 1].ВидДня;
Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье
Или ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота
Или ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник Тогда
ОбластьВыходных = ПечатныйДокумент.НайтиТекст(Строка(НомерДня),,,,Истина);
ОбластьДляЗакрашивания = ПечатныйДокумент.Область(ОбластьВыходных.Верх + НомерМесяца*2 + Квартал*2- 1, ОбластьВыходных.Лево, ОбластьВыходных.Верх + НомерМесяца*2  + Квартал*2, ОбластьВыходных.Лево);
ОбластьДляЗакрашивания.ЦветФона = КрасныйЦвет;
КонецЕсли;
КонецЕсли;
Иначе
ОбластьЛишнихДней = ПечатныйДокумент.НайтиТекст(Строка(НомерДня),,,,Истина);
ОбластьДляЗакрашивания = ПечатныйДокумент.Область(ОбластьЛишнихДней.Верх + НомерМесяца*2 + Квартал*2 - 1, ОбластьЛишнихДней.Лево, ОбластьЛишнихДней.Верх + НомерМесяца*2 + Квартал*2, ОбластьЛишнихДней.Лево);
ОбластьДляЗакрашивания.ЦветФона = СерыйЦвет;
КонецЕсли;
КонецЦикла;

Если НомерМесяца = 3 ИЛИ НомерМесяца = 6 ИЛИ НомерМесяца = 9 ИЛИ НомерМесяца = 12 Тогда
Квартал = НомерМесяца/3;
ОбластьИтогиЗаКвартал.Параметры.Установить(0, "" + Квартал + " квартал");
ОбластьИтогиЗаКвартал.Параметры.Установить(1, ДнейЗаКвартал);
ОбластьИтогиЗаКвартал.Параметры.Установить(2, ЧасовЗаКвартал);
Если ВыводитьИтогиПроизводственногоКалендаря Тогда
ОбластьИтогиЗаКвартал.Параметры.Установить(3, ТаблицаИтоговКалендаря[НомерМесяца-1].ДнейЗаКварталПоКалендарю);
ОбластьИтогиЗаКвартал.Параметры.Установить(4, ТаблицаИтоговКалендаря[НомерМесяца-1].ЧасовЗаКварталПоКалендарю);
ОбластьИтогиЗаКвартал.Параметры.Установить(5, ТаблицаИтоговКалендаря[НомерМесяца-1].ВыходныхЗаКварталПоКалендарю);
КонецЕсли;

ПечатныйДокумент.Вывести(ОбластьИтогиЗаКвартал);

Если  УчитыватьНочныеЧасы Тогда
ПечатныйДокумент.Присоединить(ОбластьИтогиЗаКварталНЧ);
Иначе
ПечатныйДокумент.Вывести(ОбластьРасширениеИтоги);
КонецЕсли;
КонецЕсли;

КонецЦикла;

ОбластьИтогиЗаГод.Параметры.Установить(0, ДнейЗаГод);
ОбластьИтогиЗаГод.Параметры.Установить(1, ЧасовЗаГод);
Если ВыводитьИтогиПроизводственногоКалендаря Тогда
ОбластьИтогиЗаГод.Параметры.Установить(2, ТаблицаИтоговКалендаря[11].ДнейЗаГодПоКалендарю);
ОбластьИтогиЗаГод.Параметры.Установить(3, ТаблицаИтоговКалендаря[11].ЧасовЗаГодПоКалендарю);
ОбластьИтогиЗаГод.Параметры.Установить(4, ТаблицаИтоговКалендаря[11].ВыходныхЗаГодПоКалендарю);
КонецЕсли;

ПечатныйДокумент.Вывести(ОбластьИтогиЗаГод);

Если УчитыватьНочныеЧасы Тогда
ОбластьИтогиЗаГодНЧ.Параметры.Установить(0, НочныхЧасовЗаГод);
ПечатныйДокумент.Вывести(ОбластьИтогиЗаГодНЧ);
Иначе
ПечатныйДокумент.Вывести(ОбластьРасширениеИтоги);
ОбластьИтоговЗаГод = ПечатныйДокумент.НайтиТекст("Итого за год:");
СераяОбласть = ПечатныйДокумент.Область(ОбластьИтоговЗаГод.Верх + 1, ОбластьИтоговЗаГод.Лево, ОбластьИтоговЗаГод.Верх + 1, ОбластьИтоговЗаГод.Лево + 37);
СераяОбласть.ЦветФона = ЦветаСтиля.ФонГруппировкиВерхнегоУровня;
КонецЕсли;

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

УниверсальныеМеханизмы.НапечататьДокумент(ПечатныйДокумент, , , "График работы " + Наименование);



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


Куда нужно дописать мой расчет и как его дописать понятия не имею


Спасибо.

gribok

Написал такой код
//Получаем мою область ++
ОбластьДеньКалендарь   = Макет.ПолучитьОбласть("День|Календарь");
ТестПеременная1= ОбластьДеньКалендарь.Параметры.ЧасовПоКалендарю;
ТестПеременная2= ОбластьИтогиЗаМесяц.Параметры.ЧасовЗаМесяц;


    //  Сообщить(ТестПеременная1);
Если  ТестПеременная1 = NULL или
ТестПеременная1 =  Неопределено тогда
ТестПеременная1=0;
КонецЕсли;

Если  ТестПеременная2 = NULL или
ТестПеременная2 =  Неопределено тогда
ТестПеременная2=0;

КонецЕсли;
ОбластьДеньКалендарь.Параметры.ОтклЧасов=ТестПеременная2-ТестПеременная1;


Ничего не выводит в мой параметр

Похожие темы (5)

Рейтинг@Mail.ru

Поиск