Имя: Пароль:
1C
1С v8
Помогите написать код. Хелп.
Ø (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 Ц
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн