Базовый курс. Занятие №13

Первое занятие по 4-му блоку.

Необходимо изучить следующие главы.
Глава 1. Основные понятия расчета.
Глава 2. Постановка задачи.
Глава 3. План видов расчета.
Глава 4. Проектирование планов видов расчета.
Глава 5. Кадровый учет.
Глава 6. Графики работы.
Глава 7. Документы.
Глава 8. Регистры расчета.

Также нужно выполнить домашнее задание, текст которого доступен на странице.

Задание необходимо выполнять в ИБ после предыдущего ДЗ.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментария 44 на “Базовый курс. Занятие №13”

  1. Создал РС и справочник ГрафикРабот
    Заполнение графика:

    &НаКлиенте
    Процедура Заполнить(Команда)
        Выходные = новый Структура;
        Для я=1 По 7 Цикл
            Выходные.Вставить("д"+я,Число(ЭтаФорма["Д"+я]));
        КонецЦикла;
       
        ЗаполнитьГрафикСервер(Объект.ДатаНачала,Объект.ДатаОкончания, Объект.ТипГрафика, Выходные);
    КонецПроцедуры

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

        Запрос.УстановитьПараметр("Дата1", Дата1);
        Запрос.УстановитьПараметр("Дата2", Дата2);

     Тз = Запрос.Выполнить().Выгрузить();
     МассивСтрок = Тз.ВыгрузитьКолонку("Дата");
     Для каждого Строка Из МассивСтрок Цикл
        Су = ТаблицаЗаписей.Найти(Строка, "Дата");
        ТаблицаЗаписей.Удалить(Су);
     КонецЦикла;
      Набор.Загрузить(ТаблицаЗаписей);
     ТекДата = Дата1;
    Пока ТекДата <= Дата2  Цикл
       
        Запись = Набор.Добавить();
        Запись.ТипГрафика = График;
        Запись.Дата = ТекДата;

    Далее всё как в уроках.

  2. Выполнено. Создал простой справочник “Типы графиков”, регистр сведений “Графики работы” (Измерения: “Тип графика”, “Дата”; Ресурс “Значение” – число длинной 1).
    Создал обработку по заполнению. Выходные дни помечаются в списке значений “ВыходныеДни”. Ниже код процедуры заполнения:
    <code>
    &НаСервереБезКонтекста
    Процедура ЗаполнитьГрафикНаСервере(Год,ТипГрафика,ВыходныеДни)
    НачалоПериода = Дата(Год,1,1);
    ОкончаниеПериода = Дата(Год,12,31,23,59,59);
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ГрафикиРаботы.ТипГрафика,
    | ГрафикиРаботы.Дата,
    | ГрафикиРаботы.Значение
    |ИЗ
    | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    |ГДЕ
    | ГрафикиРаботы.ТипГрафика = &ТипГрафика
    | И (НЕ(ГрафикиРаботы.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода))”;
    Запрос.УстановитьПараметр(“НачалоПериода”, НачалоПериода);
    Запрос.УстановитьПараметр(“ОкончаниеПериода”, ОкончаниеПериода);
    Запрос.УстановитьПараметр(“ТипГрафика”, ТипГрафика);
    Результат = Запрос.Выполнить();
    ТЗ = Результат.Выгрузить();
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    Пока НачалоПериода <= ОкончаниеПериода Цикл
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.ТипГрафика = ТипГрафика;
    НоваяСтрока.Дата = НачалоПериода;
    Если НЕ ВыходныеДни[ДеньНедели(НачалоПериода) – 1].Пометка Тогда
    НоваяСтрока.Значение = 1;
    конецЕсли;
    НачалоПериода = НачалоПериода + 24*3600;
    КонецЦикла;

    Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    Набор.Отбор.ТипГрафика.Установить(ТипГрафика);
    Набор.Записать();
    Набор.Загрузить(ТЗ);
    Набор.Записать();
    КонецПроцедуры // ЗаполнитьГрафикНаСервере()
    &НаСервереБезКонтекстаПроцедура ЗаполнитьГрафикНаСервере(Год,ТипГрафика,ВыходныеДни) НачалоПериода = Дата(Год,1,1); ОкончаниеПериода = Дата(Год,12,31,23,59,59);
    Запрос = Новый Запрос; Запрос.Текст =  “ВЫБРАТЬ | ГрафикиРаботы.ТипГрафика, | ГрафикиРаботы.Дата, | ГрафикиРаботы.Значение |ИЗ | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы |ГДЕ | ГрафикиРаботы.ТипГрафика = &ТипГрафика | И (НЕ(ГрафикиРаботы.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода))”;
    Запрос.УстановитьПараметр(“НачалоПериода”, НачалоПериода); Запрос.УстановитьПараметр(“ОкончаниеПериода”, ОкончаниеПериода); Запрос.УстановитьПараметр(“ТипГрафика”, ТипГрафика);
    Результат = Запрос.Выполнить();    ТЗ = Результат.Выгрузить();
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА Пока НачалоПериода <= ОкончаниеПериода Цикл НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.ТипГрафика = ТипГрафика; НоваяСтрока.Дата = НачалоПериода; Если НЕ ВыходныеДни[ДеньНедели(НачалоПериода) – 1].Пометка Тогда НоваяСтрока.Значение = 1; конецЕсли; НачалоПериода = НачалоПериода + 24*3600; КонецЦикла; Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ТипГрафика.Установить(ТипГрафика); Набор.Записать(); Набор.Загрузить(ТЗ); Набор.Записать();КонецПроцедуры // ЗаполнитьГрафикНаСервере()
    </code>
    Планы видов расчета “Основные начисления” и “Дополнительные начисления” тоже создал. Чуть повозился с настройками предопределенных значений (Базовые, вытесняющие).
    Регистры расчета “Основные начисления” и “Базовые начисления”, также как и документ “Начисление заработной платы” особых проблем не создали.

  3. Елена 01.07.2011 в 23:06

    Добрый день!
    Очень сильно отстала от группы – имеет ли мне смысл выкладывать решения на сайте после 01.07.2011?

    • Добрый день, Елена!

      В Вашей ситуации отчитываться имеет смысл только в том случае, если Вы хотите зафиналить тренинг. Но делать это придется со следующим потоком. Также для этого необходимо, чтобы Вы были участником мастер-группы на дату финала следующего потока (вторая половина сентября).

  4. Задание выполнено
    http://www.imagepost.ru/?v=dz13_screen.png

  5. Добрый день
    В обработке заполнение графика использовал список значений с пометками, для установления параметров графика (дни недели) пометка выполняет функцию признака выходной/рабочий. Внесение данных в регистр сведений графики производится с использованием менеджераЗаписи, неоптимальность алгоритма компенсируется простотой его исполненния. Обработкой заполнены графики за 2009 и 2010 года. Также в конфигурацию добавленны объекты для начисления зарплаты, регистры начислений, документ НачиленияЗП, планы видов расчёта.
    Выгрузка ИБ

  6. Продолжаю нагонять. Несколько удивился такому простому заданию по сравнению с объемом теоретического материала. Подготовка объектов не вызвала никаких затруднений, обработка заполнения графиков – вначале делаю запрос к регистру с таким условием, что в результат попадают все записи по данному типу графика, кроме записей с заполняемым годом; затем в цикле эту таблицу значений дополняю недостающими данными по заполняемому году и потом заполняю набор записей из созданной таблицы значений.

  7. 1) Добавил справочник «ТипыГрафиковРаботы». Документ «ГрафикРаботыНаГод»(реквизиты — ТипГрафика, Год) является регистратором для РС «ГрафикиРаботы». В документе обеспечивается в МО в процедуре «ПередЗаписью» уникальность записей по ключу (ТипГрафика, Год). Для редактирования в РС «ГрафикиРаботы» ресурса «РаботатьИлиНет» на форму документа «ГрафикРаботыНаГод» добавил реквизит «ГрафикРаботы» типа «РегистрСведенийНаборЗаписей.ГрафикиРаботы». И работаю с ним программно в кнопках «Заполнить» и «Редактировать».
    <code>

    &НаКлиенте

    Процедура Заполнить(Команда)

    ФлагРаботы = Истина;

    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда

    Если ПроверкаНаЗаполнениеГрафика(Объект.Ссылка) Тогда

    Если НЕ КодВозвратаДиалога.Да = Вопрос(“Данные по текущему графику за этот год уже есть – При новом заполнении эти данные очистятся, заполняем?”, РежимДиалогаВопрос.ДаНет, , , “Решайтесь”) Тогда

    ФлагРаботы = Ложь;

    КонецЕсли;

    КонецЕсли;

    Иначе

    ФлагРаботы = Ложь;

    Сообщить(“Для заполнения необходимо сохранить документ!”);

    КонецЕсли;

    Если ФлагРаботы Тогда

    ЗаполнитьГрафикНаГод(Объект.Ссылка, Объект.Год);

    Сообщить(“График по дням на этот год заполнен.”);

    КонецЕсли;

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

    &НаСервереБезКонтекста

    Функция ЗаполнитьГрафикНаГод(Ссылка, Год)

    Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();

    Набор.Отбор.Регистратор.Установить(Ссылка);

    Набор.Записать();

    ДатаТек = Дата(Год, 1, 1);

    ДатаКон = Дата(Год, 12, 31);

    Пока ДатаТек<=ДатаКон Цикл

    Запись = Набор.Добавить();

    Запись.ТипГрафика = Ссылка.ТипГрафика;

    Запись.Дата = ДатаТек;

    Если ДеньНедели(Запись.Дата)<6 Тогда

    Запись.РаботатьИлиНет = 1;

    Иначе

    Запись.РаботатьИлиНет = 0;

    КонецЕсли;

    ДатаТек = ДатаТек + 24*3600;

    КонецЦикла;

    Набор.Записать();

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

    &НаСервереБезКонтекста

    Функция ПроверкаНаЗаполнениеГрафика(Ссылка)

    Запрос = Новый Запрос;

    Запрос.Текст =

    “ВЫБРАТЬ ПЕРВЫЕ 1

    | ГрафикиРаботы.Регистратор

    |ИЗ

    | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы

    |ГДЕ

    | ГрафикиРаботы.Регистратор = &Регистратор”;

    Запрос.УстановитьПараметр(“Регистратор”, Ссылка);

    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда

    Возврат Ложь;

    Иначе

    Возврат Истина;

    КонецЕсли;

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

    &НаКлиенте

    Процедура Редактировать(Команда)

    ЗаполнитьДляРедактированияГрафик();

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

    &НаСервере

    Процедура ЗаполнитьДляРедактированияГрафик()

    Запрос = Новый Запрос;

    Запрос.Текст =

    “ВЫБРАТЬ

    | ГрафикиРаботы.НомерСтроки,

    | ГрафикиРаботы.Регистратор,

    | ГрафикиРаботы.ТипГрафика,

    | ГрафикиРаботы.Дата,

    | ГрафикиРаботы.РаботатьИлиНет

    |ИЗ

    | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы

    |ГДЕ

    | ГрафикиРаботы.Регистратор = &Регистратор”;

    Запрос.УстановитьПараметр(“Регистратор”, Объект.Ссылка);

    Результат = Запрос.Выполнить();

    Графикработы.Загрузить(Результат.Выгрузить());

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

    &НаКлиенте

    Процедура ТипГрафикаПриИзменении(Элемент)

    Если ЗначениеЗаполнено(Объект.Ссылка) И ПроверкаНаЗаполнениеГрафика(Объект.Ссылка) Тогда

    Если ПолучитьСтароеЗначение(“ТипГрафика”) Тогда

    Сообщить(“График по дням уже заполнен, редактирование запрещено.”);

    КонецЕсли;

    КонецЕсли;

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

    &НаКлиенте

    Процедура ГодПриИзменении(Элемент)

    Если ЗначениеЗаполнено(Объект.Ссылка) И ПроверкаНаЗаполнениеГрафика(Объект.Ссылка) Тогда

    Если ПолучитьСтароеЗначение(“Год”) Тогда

    Сообщить(“График по дням уже заполнен, редактирование запрещено.”);

    КонецЕсли;

    КонецЕсли;

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

    &НаСервере

    Функция ПолучитьСтароеЗначение(Условие)

    //!!!Если передавать ПолучитьСтароеЗначение(Объект, “ТипГрафика”) работать возврат к старому НЕ БУДЕТ

    Если Условие = “ТипГрафика” Тогда

    СтароеЗначение = Объект.Ссылка.ПолучитьОбъект().ТипГрафика;

    Если Объект.ТипГрафика <> СтароеЗначение Тогда

    Объект.ТипГрафика = СтароеЗначение;

    Возврат Истина;

    КонецЕсли;

    ИначеЕсли Условие = “Год” Тогда

    СтароеЗначение = Объект.Ссылка.ПолучитьОбъект().Год;

    Если Объект.Год <> СтароеЗначение Тогда

    Объект.Год = СтароеЗначение;

    Возврат Истина;

    КонецЕсли;

    КонецЕсли;

    Возврат Ложь;

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

    &НаКлиенте

    Процедура ГрафикработыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

    Отказ = Истина;

    Сообщить(“Строки НЕ добавляются!”);

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

    &НаСервере

    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

    Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();

    Набор.Отбор.Регистратор.Установить(ТекущийОбъект.Ссылка);

    Набор.Записать();
    Результат = Графикработы.Выгрузить();
    Набор.Загрузить(Результат);

    Набор.Записать();

    КонецПроцедуры
    </code>
     

  8. Обработка по “Графику работы”<code>
    &НаСервере
    Процедура СозданииНаСервере(Список)
    Список = Новый СписокЗначений;
    ВидНедели = Перечисления.ДниНедели;

    Колич = 0;
    Пока Колич < ВидНедели.Количество() Цикл
    Список.Добавить(ВидНедели[Колич],Строка(Колич+1),Истина);
    Колич = Колич+1;
    КонецЦикла;
    КонецПроцедуры
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    СозданииНаСервере(Объект.Список);
    КонецПроцедуры
    &НаКлиенте
    Процедура Заполнить(Команда)
    ЗаполнитьГрафик(Объект.ТипГрафика,Объект.ГодЗаполнения,Объект.Список);
    КонецПроцедуры
    Процедура ЗаполнитьГрафик(ТипГрафика,ГодЗаполнения,Список)
    Набор = РегистрыСведений.ГрафикиРабот.СоздатьНаборЗаписей();
    Набор.Отбор.ТипГрафика.Установить(ТипГрафика);

    Год = Дата(Формат(ГодЗаполнения,”ЧЦ=4; ЧГ=0″),1,1);
    ТекДата = НачалоГода(Год);
    КонецГода = КонецГода(Год);

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

    Результат = Запрос.Выполнить();
    Таблица = Результат.Выгрузить();

    Пока ТекДата <= КонецГода Цикл
    Запись = Таблица.Добавить();
    Запись.Дата = ТекДата;
    Запись.ТипГрафика = ТипГрафика;
    ДеньНедели = ДеньНедели(ТекДата);

    Если  Список[ДеньНедели-1].Пометка Тогда
    Запись.Значение = 1;
    КонецЕсли;

    ТекДата = ТекДата + 24*3600;
    КонецЦикла;
    Набор.Загрузить(Таблица);
    Набор.Записать();
    КонецПроцедуры // ЗаполнитьГрафик()

    &НаСервереПроцедура СозданииНаСервере(Список) Список = Новый СписокЗначений; ВидНедели = Перечисления.ДниНедели; Колич = 0; Пока Колич < ВидНедели.Количество() Цикл Список.Добавить(ВидНедели[Колич],Строка(Колич+1),Истина); Колич = Колич+1; КонецЦикла;КонецПроцедуры
    &НаКлиентеПроцедура ПриОткрытии(Отказ) СозданииНаСервере(Объект.Список);КонецПроцедуры
    &НаКлиентеПроцедура Заполнить(Команда) ЗаполнитьГрафик(Объект.ТипГрафика,Объект.ГодЗаполнения,Объект.Список);КонецПроцедуры
    Процедура ЗаполнитьГрафик(ТипГрафика,ГодЗаполнения,Список)
    Набор = РегистрыСведений.ГрафикиРабот.СоздатьНаборЗаписей(); Набор.Отбор.ТипГрафика.Установить(ТипГрафика); Год = Дата(Формат(ГодЗаполнения,”ЧЦ=4; ЧГ=0″),1,1); ТекДата = НачалоГода(Год); КонецГода = КонецГода(Год); Запрос = Новый Запрос; Запрос.Текст =  “ВЫБРАТЬ | ГрафикиРабот.Дата, | ГрафикиРабот.ТипГрафика, | ГрафикиРабот.Значение |ИЗ | РегистрСведений.ГрафикиРабот КАК ГрафикиРабот |ГДЕ | ГрафикиРабот.ТипГрафика = &ТипГрафика | И (НЕ(ГрафикиРабот.Дата МЕЖДУ &ДатаНачало И &ДатаКонец))”;
    Запрос.УстановитьПараметр(“ДатаНачало”,ТекДата); Запрос.УстановитьПараметр(“ДатаКонец”,КонецГода); Запрос.УстановитьПараметр(“ТипГрафика”,ТипГрафика); Результат = Запрос.Выполнить();  Таблица = Результат.Выгрузить(); Пока ТекДата <= КонецГода Цикл Запись = Таблица.Добавить(); Запись.Дата = ТекДата; Запись.ТипГрафика = ТипГрафика; ДеньНедели = ДеньНедели(ТекДата); Если  Список[ДеньНедели-1].Пометка Тогда Запись.Значение = 1; КонецЕсли; ТекДата = ТекДата + 24*3600; КонецЦикла; Набор.Загрузить(Таблица); Набор.Записать();
    КонецПроцедуры // ЗаполнитьГрафик()</code>
    Регистр сведений “График работ”  непериодический.
    Также создал планы видов расчета  – Основные начисления (оклад, отпуск, прогул) и дополнительные начисления (премия).
    Оклад – вытес. вид. р. отпуск и прогул, ведущие – те же. Отпуск – вытес. вид.р. нет, базовые и  ведущие  -оклад. Прогул – базовые, вытесняющие, ведущие пустые. Премия – база и ведущие – оклад, отпуск.
    Создал документ “Начисление ЗП“, который делает движения по регистрам расчета.

    • Поправлюсь:  “Оклад” – ведущих видов расчета нет, т.е. это первичный вид расчета.

  9. Надежда 18.06.2011 в 16:47

    Задание выполнено, все объекты, описанные в задании, добавлены, правильность буду проверять по решению.
    Привожу текст обработки по заполнению графиков:
    <code>
    &НаКлиенте
    Процедура Заполнить(Команда)
     
    ВыхДни = Новый Массив;
    Для Сч = 0 По ДниНедели.Количество()-1 Цикл
    Если ДниНедели.Получить(сч).Пометка Тогда
    ВыхДни.Добавить(сч+1);
    КонецЕсли;
    КонецЦикла;
     
    МассивДат = Новый Массив;
    Дата=Период.ДатаНачала;
    Пока Дата>=Период.ДатаНачала и Дата<=Период.ДатаОкончания  Цикл
    МассивДат.Добавить(Дата);
    Дата=Дата+3600*24;
    КонецЦикла;
     
    ЗаполнитьГрафикРаботыНаСервере(ВидГрафика,МассивДат, ВыхДни);
     
    КонецПроцедуры
     
     
    &НаСервереБезКонтекста
    Процедура   ЗаполнитьГрафикРаботыНаСервере(ВидГрафика,МассивДат,ВыходныеДни)
     
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |             ГрафикиРаботы.ВидГрафика,
    |             ГрафикиРаботы.Дата КАК Дата,
    |             ГрафикиРаботы.РабНеРаб
    |ИЗ
    |             РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    |ГДЕ
    |             ГрафикиРаботы.ВидГрафика = &ВидГрафика
    |
    |УПОРЯДОЧИТЬ ПО
    |             Дата”;
     
    Запрос.УстановитьПараметр(“ВидГрафика”, ВидГрафика);
    Запрос.УстановитьПараметр(“МассивДат”, МассивДат);
     
    ТабЗнНаборЗаписей = Запрос.Выполнить().Выгрузить();
     
    Для Сч=0 По МассивДат.Количество()-1 Цикл
    ДеньПериода = МассивДат[Сч];
    РабочийДень=1;
     
    Если ВыходныеДни.Найти(ДеньНедели(ДеньПериода))<>неопределено Тогда
    РабочийДень=0;
    КонецЕсли;
     
    Строка=ТабЗнНаборЗаписей.Найти (ДеньПериода,”Дата”);
    Если Строка = неопределено Тогда
    НоваяЗапись =  ТабЗнНаборЗаписей.Вставить(Сч);
    НоваяЗапись.Дата = ДеньПериода;
    НоваяЗапись.ВидГрафика = ВидГрафика;
    НоваяЗапись.РабНеРаб = РабочийДень;
    Иначе
    Если   Строка.РабНеРаб <> РабочийДень Тогда
    Строка.РабНеРаб = РабочийДень;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
     
    НовыйНабор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей() ;
    НовыйНабор.Отбор.ВидГрафика.Установить(ВидГрафика);
    НовыйНабор.Записать();
     
    НовыйНабор.Загрузить(ТабЗнНаборЗаписей);
    НовыйНабор.Записать();
     
    КонецПроцедуры
     
     
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ДнНеделиОбъект = Перечисления.ДниНедели;
     
    Для Сч=0 по ДнНеделиОбъект.Количество()-1 Цикл
     
    День = ДнНеделиОбъект.Получить(Сч);
    ДниНедели.Добавить(День);
    КонецЦикла;
     
    КонецПроцедуры
    </code>
     
    Вопрос: у меня на форме обработки расположено поле, в котором пользователь из списка значений должен отметить галочками выходные дни, для заполнения этого списка я использую процедуру  ПриСозданииНаСервере. Правилен ли такой подход? в теории, мне кажется, это не разбиралось, если ошибаюсь – сориентируйте, пожалуйста, где искать.

    • Да, все правильно. Инициализировать данные формы (в Вашем случае заполнение списка значений) нужно в ПриСозданииНаСервере().

  10. Задание выполнено с опозданием. Отсутствовала в Москве.
    Создан регистр “ГрафикиРабот” и справочник “ТипыГрафиков”. Обработка заполнения  регистра сделана при помощи запроса с условием “не в текущем периоде”.
    Созданы 2 плана видов расчета с предопределенными значениями. Созданы соответствующие им регистры расчета.
    Создан док-т “НачислениеЗаработнойПлаты”.

  11. Задание выполнил.

    Создал справочник «ТипыГрафиковРаботы».
    Создал непериодический регистр сведений «ГрафикиРаботы».
    Измерения:
    – «ТипГрафика»
    – «Дата»
    Ресурсы:
    – «РабочийДень».
    Создал обработку «ЗаполнениеГрафика». Долго бился над отбором по дате (почему-то не поддерживался ВидСравнения.Интервал). Потом вовсе отказался от отбора, исходя из резона, что, при создании новой записи с теми же значениями измерений старая запись просто затирается. В результате – все заработало: http://paste.org.ru/?6bp8kb
    Создал планы видов расчета:
    – «ОсновныеНачисления»;
    – «ДополнительныеНачисления».
    В план видов расчета «ОсновныеНачисления» добавлены предопределенные виды расчетов:
    – «ОкладПоДням»;
    – «Отпуск»;
    – «Прогул».
    В план видов расчета «ДополнительныеНачисления» добавлен предопределенный вид расчетов:
    – «ПремияКвартальная».
    Создал регистры расчета:
    – «ОсновныеНачисления»;
    – «ДополнительныеНачисления».
    Создал документ «НачислениеЗаработнойПлаты».

  12. Виталий Межаков 14.06.2011 в 23:38

    Задание выполнил.
    1. Создал РС “Графики работы” и обработку, заполняющую его, удовлетворяющую требованиям задания.
    2. Создал планы видов расчета “Основные начисления” и “Дополнительные начисления”. Занес в них виды расчета, описанные в задании. Добавил регистры расчета и документ “Начисление ЗП”
    3. Все объекты включил в новую подсистему “ЗП”

  13. Задание сделал. Долго мучился с обработкой – хотел сделать красиво, не получилось. Пойду решение ДЗ смотреть :)
    Создал все необходимые объекты.
    В форме документа сделал 2 команды – МинусМесяц и ПлюсМесяц для изменения периода расчета, и вставил их на форму. Получилось красиво.

  14. Задание выполнил.
    Опоздание связано с попыткой сделать как в жизни и красиво. Итак:
    Сделан справочник ТипыРабочегоГрафика с табличной частью ТиповаяНеделя из двух колонок: ДеньНедели(от 0 до 6) и  РабочийДень(булево). В нем заводим графики и для них расписываем типовую неделю.
    Создаем регистр сведений ГрафикиРаботы с измерениями “ТипГрафика”,  “наДату” и Ресурсом Значение.
    Создаем обработку ЗаполнениеГрафика.
    Создаеем реквизиты формы:
    “Год” тип Дата с форматом редактирования ДФ=yyyy, для выбора года для заполнения;
    “Выходне” тип ТаблицаЗначений с одной колонкой  типа Дата с форматом редактирования ДФ=’d MMMM’, для указания праздничных дней года;
    “Набор” типа НаборЗаписей Регистра сведений ГрафикиРаботы, для отображения результата заполнения;
    “РабочийГрафик” тип Справ.Ссылка.ТипыРабочего Графика, для выбора графика для заполнения.
    Рисуем Форму:
    В условной шапке размещаем “РабочийГрафик”, “год”, конпку “Заполнить”.
    В условной табличной части размещаем ТЗ Выходные и Набор.
    В обработке команды заполнить: вызываем серверный модуль без контекста с передачей параметров Год(строкой только год), График, Выходные.
    На сервере формируем даты начала и конца:
    тДата=Дата(Год+”0101″);
    КонДата=Дата(Год+”1231″);
    получаем табличную часть выбранного графика:
    НедельноеРасписание=РабочийГрафик.ПолучитьОбъект().ТиповаяНеделя;

    в ТЗ выгружаем колонку заданных на форме выходных:
    Праздники=Выходные.Выгрузить(,”ВыходнойДень”);

    и переписываем выходные в заданный год:
    Для каждого праздник Из Праздники  Цикл
    й=праздник.ВыходнойДень;
    праздник.ВыходнойДень=Дата(Год,Месяц(й),День(й));
    КонецЦикла;
    Уговорить платформу установить Отбор для набора записей регистра сведений по измерению “наДату” в Интервал’е или ИнтервалВключаяГраницы не удалось. В документации вообще ничего на эту тему не нашел. В синтаксис помощнике только через пару дней увидел. Пришлось заглядывать в Ваше решение. В результате не понял как но сделал и работает через запрос. Запросом получаю таблицу значений по заданному графику и в диапазоне дат.
    Читаю набор записей с установленным отбором по графику.
    В цикле по датам:
    Пока тДата<=КонДата Цикл
    Получаю либо существующую запись набора, либо создаю новую:
    ф=тЗаписейНабора.Найти(тДата,”наДату”);
    Если ф=Неопределено Тогда
    Запись=Набор.Добавить();
    Иначе
    Запись=Набор[тЗаписейНабора.Индекс(ф)];
    КонецЕсли;

    И почему этот фрагмент работает НЕ понимаю, может быть Вы объясните?
    И еще одна НЕ поборотая проблема: после отработки серверного вызова на операторе вызова в клиенте я получаю такое сообщение:
    {Обработка.ЗаполнениеГрафика.Форма.Форма.Форма(5)}: Ошибка при установке значения атрибута контекста (Выходные)
    наСервереЗаполнить(й, РабочийГрафик,Выходные);
    по причине:
    Нельзя изменять поле, содержащее объект данных формы
    Ну а дальше очевидно, проверяем на типовые выходные на неделе, и на праздничные дни года. Соответственно и выставляем значение ресурса.
    И в завершении: Набор.Записать();
    Создание и настройка  остальных объектов вобщем-то как и у Вас.
     

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

  15. Задание выполнил.
    В регистре сведений ГрафикиРаботы отбор можно установить только по измерению ВидГрафика, что заставляет перезаписывать данные за весь период, имеющийся в  регистре. 
    При заполнении регистра обработкой пришлось учесть работу со всем периодом, перед модификацией прочитать и изменения вносить только в период заполнения графика.
    При создании других объектов проблем не возникло.

  16. Дмитрий 13.06.2011 в 19:15

    Задание выполнил.

    Создал справочник “ТипыГрафиков”. Также был создан непериодический независимый регистр сведений “ГрафикиРаботы”. Измерения: ТипГрафика, Дата. Ресурсы: Значение
    Создал обработку “Заполнение графика”. Реквизиты: ДатаНачала, ДатаОкончания, ТипГрафика. Добавил табличную часть “ВыходныеДни” с единственным реквизитом “ДеньНеделиДата” (Тип – Число,Дата).
    Добавил кнопку “Заполнить” на форму.
    //Модуль формы
    <code>

    &НаКлиенте
    Процедура Заполнить(Команда)

    Если НЕ ЗначениеЗаполнено(Объект.ДатаНачала)
    ИЛИ НЕ ЗначениеЗаполнено(Объект.ДатаОкончания)
    ИЛИ НЕ ЗначениеЗаполнено(Объект.ТипГрафика) Тогда
    Сообщить(“Ошибка! Необходимо заполнить период и тип графика.”);
    Возврат;
    КонецЕсли;

    ЗаполнитьГрафик();

    КонецПроцедуры
    &НаСервере
    Процедура ЗаполнитьГрафик()

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

    ТекДата = НачалоДня(Объект.ДатаНачала);
    Пока ТекДата <= КонецДня(Объект.ДатаОкончания) Цикл
    НайденнаяЗапись = ТаблицаЗаписей.Найти(ТекДата, “Дата”);
    ТекЗапись = ?(НайденнаяЗапись = Неопределено, ТаблицаЗаписей.Добавить(), НайденнаяЗапись);

    ТекЗапись.Дата = ТекДата;
    ТекЗапись.ТипГрафика = Объект.ТипГрафика;

    Если Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНеделиДата”, ДеньНедели(ТекДата))).Количество()=0
    И Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНеделиДата”, ТекДата)).Количество() = 0 Тогда
    ТекЗапись.Значение = 1;
    Иначе
    ТекЗапись.Значение = 0;
    КонецЕсли;

    ТекДата = ТекДата + 24*3600;
    КонецЦикла;

    НаборЗаписей.Загрузить(ТаблицаЗаписей);
    НаборЗаписей.Записать();
    КонецПроцедуры
    &НаКлиентеПроцедура Заполнить(Команда) Если НЕ ЗначениеЗаполнено(Объект.ДатаНачала) ИЛИ НЕ ЗначениеЗаполнено(Объект.ДатаОкончания) ИЛИ НЕ ЗначениеЗаполнено(Объект.ТипГрафика) Тогда Сообщить(“Ошибка! Необходимо заполнить период и тип графика.”); Возврат; КонецЕсли; ЗаполнитьГрафик(); КонецПроцедуры
    &НаСервереПроцедура ЗаполнитьГрафик() НаборЗаписей = РегистрыСведений.ГрафикиРасчета.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ТипГрафика.Установить(Объект.ТипГрафика); НаборЗаписей.Прочитать(); ТаблицаЗаписей = НаборЗаписей.Выгрузить(); ТекДата = НачалоДня(Объект.ДатаНачала); Пока ТекДата <= КонецДня(Объект.ДатаОкончания) Цикл НайденнаяЗапись = ТаблицаЗаписей.Найти(ТекДата, “Дата”); ТекЗапись = ?(НайденнаяЗапись = Неопределено, ТаблицаЗаписей.Добавить(), НайденнаяЗапись); ТекЗапись.Дата = ТекДата; ТекЗапись.ТипГрафика = Объект.ТипГрафика; Если Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНеделиДата”, ДеньНедели(ТекДата))).Количество()=0 И Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНеделиДата”, ТекДата)).Количество() = 0 Тогда ТекЗапись.Значение = 1; Иначе ТекЗапись.Значение = 0; КонецЕсли; ТекДата = ТекДата + 24*3600; КонецЦикла;                                                                  НаборЗаписей.Загрузить(ТаблицаЗаписей); НаборЗаписей.Записать();
    КонецПроцедуры
    </code>
    3.  Создал план видов расчета “ОсновныеНачисления” с реквизитом “Категория расчета” (на будущее). Использует период действия = Истина. Зависит от базы по периоду действия. Базовые планы видов расчета – “ОсновныеНачисления”.
    Создал план видов расчета “ДополнительныеНачисления” с реквизитом “КатегорияРасчета”. Использует период действия = Ложь. Зависит от базы по периоду действия. Базовые планы видов расчета – “Основные начисления”, “ДополнительныеНачисления”.
    4.В ПВР “ОсновныеНачисления” создал предопределенные элементы:

    “ОкладПоДням” – Базовых нет. Вытесняющие – “Отпуск”, “Прогул”. Ведущие – “Отпуск”,”Прогул”.
    “Отпуск”
    “Прогул”

    В ПВР “ДополнительныеНачисления” добавил предопределенный элемент “ПремияКвартальная”. Базовые – “ОкладПоДням”, “Отпуск”. Выдущие – “ОкладПоДням”, “Отпуск”, “Прогул”.
    5.Создал регистр расчета “ОсновныеНачисления”.  Периодичность = Месяц. Период действия = Истина. Привязал к регистру “ГрафикиРаботы”. Измерения – “Сотрудник”, “Подразделение”. Ресурсы – “Значение”. Реквизиты – “ПлановыйРазмер”, “ТипГрафика”.
    Создал регистр расчета “ДополнительныеНачисления”. Периодичность = Месяц. период действия = Ложь. Структура аналогична регистру “ОсновныеНачисления”. За исключением реквизитов (отсутствует “ТипГрафика”).
    6.Создал документ “НачислениеЗаработнойПлаты” со структурой, описанной в задании. Сделал регистратором для регистров расчета.

  17. Задание выполнил.  Создал и настроил начисления, указанные в задании. Определил свойства и структуру регистров расчета “Основные начисления”, “Дополнительные начисления”: измерения – Сотрудник, Подразделение; ресурсы – Результат; реквизиты – График работы (для основных начислений) и Размер. Регистр расчета “Основные начисления” и его реквизит “График работы” связал с регистром сведений “Графики работы”. Создал документ “Начисление ЗП”.
     

  18. Светлана 13.06.2011 в 16:18

    Задание выполнила.
    Создан РС “Графики работы” непериод, независим (измерения- ТипГрафика, Дата; ресурсы – значение).
    Заполнение осуществляется из обработки “Заполнение графика”
    =================================
    &НаКлиенте
    Процедура Заполнить(Команда)
     
     Перезаполнить = Ложь;
     // проверить наличие записей в регистре сведений за это период
     ГрафикСтар = УжеЗаполненГрафик(ТипГрафика,Период);
     
     Если ГрафикСтар.Количество() > 0 тогда
      
      Ответ  = Вопрос(“График на период ” + ПредставлениеПериода(Период.ДатаНачала,Период.ДатаОкончания,) + ” уже заполнен. Вы хотите перезаполнить график?”,РежимДиалогаВопрос.ДаНет);
      Если Ответ = КодВозвратаДиалога.Да Тогда
       Перезаполнить = Истина;
      иначе
       возврат;
      КонецЕсли;
      
     КонецЕсли;
        ДанныеЗаполнения = Новый Структура;
     ДанныеЗаполнения.Вставить(“ТипГрафика”,ТипГрафика);
     ДанныеЗаполнения.Вставить(“Период”,Период);
     ДанныеЗаполнения.Вставить(“Выходные”,Выходные);
     ДанныеЗаполнения.Вставить(“Перезаполнить”,Перезаполнить);
     ДанныеЗаполнения.Вставить(“ГрафикСтар”,ГрафикСтар);
     
     ЗаполнитьГрафик(ДанныеЗаполнения);         
     
    КонецПроцедуры
    ============================
    &НаСервереБезКонтекста
    Функция УжеЗаполненГрафик(ТипГрафика,Период)
     
     // Данный фрагмент построен конструктором.
     // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
     Запрос = Новый Запрос;
     Запрос.Текст =
      “ВЫБРАТЬ
      | ГрафикиРаботы.ТипГрафика,
      | ГрафикиРаботы.Дата КАК Дата,
      | СУММА(ГрафикиРаботы.Значение) КАК Значение
      |ИЗ
      | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
      |ГДЕ
      | ГрафикиРаботы.ТипГрафика = &ТипГрафика
      | И ГрафикиРаботы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
      |
      |СГРУППИРОВАТЬ ПО
      | ГрафикиРаботы.ТипГрафика,
      | ГрафикиРаботы.Дата
      |
      |УПОРЯДОЧИТЬ ПО
      | Дата”;
     //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
     Запрос.УстановитьПараметр(“ДатаНачала”, Период.ДатаНачала);
     Запрос.УстановитьПараметр(“ДатаОкончания”, Период.ДатаОкончания);
     Запрос.УстановитьПараметр(“ТипГрафика”, ТипГрафика);
     Таблица = Запрос.Выполнить().Выгрузить();
     Возврат Таблица;
    КонецФункции 
    ============================
    &НаСервереБезКонтекста
    Процедура ЗаполнитьГрафик(ДанныеЗаполнения)
     
     ТипГрафика = ДанныеЗаполнения.ТипГрафика;
     Период = ДанныеЗаполнения.Период;
     Выходные = ДанныеЗаполнения.Выходные;
     Перезаполнить = ДанныеЗаполнения.Перезаполнить;
       ГрафикСтар = ДанныеЗаполнения.ГрафикСтар;
     Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
     Набор.Отбор.ТипГрафика.Значение = ТипГрафика;
     //сохраним текущий набор
     Набор.Прочитать();
     ТекущНабор = Набор.Выгрузить();
     
     
     Если Перезаполнить = 1 тогда
      //удалим период в старом графике
      Для каждого строка из ГрафикСтар цикл
       СтрокаТН = ТекущНабор.Найти(строка.Дата,”Дата”); 
       Если СтрокаТН <>Неопределено тогда
        Если СтрокаТн.ТипГрафика = ТипГрафика тогда
         ТекущНабор.Удалить(СтрокаТН);
        КонецЕсли;
       КонецЕсли;
      КонецЦикла;
     КонецЕсли; 
     
     //добавим период в новый график
     ТекДата = Период.ДатаНачала;
     КонецПериода = Период.ДатаОкончания;
     Пока ТекДата<=КонецПериода Цикл
      Строка = ТекущНабор.Добавить();
      Строка.Дата = ТекДата;
      Строка.ТипГрафика = ТипГрафика;
      Если ТипГрафика.ВидГрафика = Перечисления.ВидыГрафиков.Пятидневка тогда
       РабочихДней = 5;
      иначеЕсли ТипГрафика.ВидГрафика = Перечисления.ВидыГрафиков.Шестидневка тогда
       РабочихДней = 6;
      иначе
       РабочихДней = 7;
      КонецЕсли;
      стр = Выходные.НайтиСтроки(новый Структура(“Дата”,ТекДата));
      Если стр.количество()>0 тогда
       Строка.Значение = 0;
      иначеЕсли ДеньНедели(ТекДата)<=РабочихДней Тогда
       Строка.Значение = 1;
      КонецЕсли;
      
      ТекДата = ТекДата+24*3600;
     КонецЦикла;
     
     Набор.Загрузить(ТекущНабор);
     
     Набор.Записать();
     
    КонецПроцедуры // ЗаполнитьГрафик()
    ========================================================================
    В ПВР “Основные начисления” (использует период действия, зависит по периоду действия) вошли предопределенные элементы: Оклад по дням (вытесн – отпуск, прогул; ведущ – отпуск, прогул), Отпуск (ведущ – прогул), Прогул.
    В ПВР “Дополнительные начисления” (зависит по периоду действия) вошел предопределенный элемент Премия квартальная (базовые – оклад по дням, отпуск; ведущ – оклад по дням, отпуск, прогул).
    —————————–
    Новый РР “Основные начисления” – ПВР Основные начисления, выставлен флаг “Период действия”, график – Графики работы, значение графика – значение, дата графика – дата, периодичность – месяц, (измерения – сотрудник, подразделение; ресурс – результат; реквизиты – тип графика, размер), регистратор – НачислениеЗаработнойПлаты.
    Новый РР “Дополнительные начисления” – ПВР Дополнительные начисления, периодичность – месяц,  (измерения – сотрудник, подразделение; ресурс – результат; реквизиты – размер), регистратор – НачислениеЗаработнойПлаты.
    —————————–
    Новый документ “Начисление заработной платы” сконструирован согласно заданию.

  19. Задание выполнил.
    Трудностей не возникло. Привожу мой способ заполнения графиков:
    <code>
    &НаКлиенте
    Процедура Заполнить(Команда)
    Ошибка=Ложь;
    Если НЕ ЗначениеЗаполнено(ЭтаФорма.Объект.ТипГрафика) или НЕ ЗначениеЗаполнено(ЭтаФорма.Объект.ДатаНачала)
    или НЕ ЗначениеЗаполнено(ЭтаФорма.Объект.ДатаОкончания) Тогда
    Ошибка=Истина;
    ИначеЕсли ЭтаФорма.Объект.ДатаНачала>ЭтаФорма.Объект.ДатаОкончания Тогда
    Ошибка=Истина;
    КонецЕсли;
    Если Ошибка Тогда
    Сообщить(“Проверьте правильность заполнения исходных данных.”);
    Возврат;
    КонецЕсли;
    ЭФО=ЭтаФорма.Объект;
    ВыбТипГрафика=ЭФО.ТипГрафика;
    ВыбДатаНачала=ЭФО.ДатаНачала;
    ВыбДатаОкончания=ЭФО.ДатаОкончания;
    ВыбВыходные=ЭФО.Выходные;
    ВыбПраздники=ЭФО.Праздники;
    ЗаполнитьНаСервере(ВыбТипГрафика,ВыбДатаНачала,ВыбДатаОкончания,ВыбВыходные,ВыбПраздники);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ЗаполнитьНаСервере(ВыбТипГрафика,ВыбДатаНачала,ВыбДатаОкончания,ВыбВыходные,ВыбПраздники)
    МассивВыходные=ВыбВыходные.Выгрузить().ВыгрузитьКолонку(“Выходной”);
    МассивПраздники=ВыбПраздники.Выгрузить().ВыгрузитьКолонку(“Праздник”);

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

    Запрос.УстановитьПараметр(“ДатаНачала”, ВыбДатаНачала);
    Запрос.УстановитьПараметр(“ДатаОкончания”, ВыбДатаОкончания);
    Запрос.УстановитьПараметр(“ТипГрафика”, ВыбТипГрафика);
    ТаблРезультат = Запрос.Выполнить().Выгрузить();

    Набор=РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    Набор.Отбор.ТипГрафика.Установить(ВыбТипГрафика);
    //Загрузим записи, не относящиеся к выбранному периоду, обратно,
    //одновременно почистив записи за наш период.
    Набор.Загрузить(ТаблРезультат);

    СекундВДне=24*3600;
    ТекДень=ВыбДатаНачала;
    ТекДеньНедели=ДеньНедели(ТекДень);
    Пока ТекДень<=ВыбДатаОкончания Цикл
    Запись=Набор.Добавить();
    Запись.Активность=Истина;
    Запись.ТипГрафика=ВыбТипГрафика;
    Запись.Дата=ТекДень;
    Если МассивВыходные.Найти(ТекДеньНедели)=Неопределено И МассивПраздники.Найти(ТекДень)=Неопределено Тогда
    Запись.Значение=1;
    Иначе
    Запись.Значение=0;
    КонецЕсли;
    ТекДень=ТекДень+СекундВДне;
    ТекДеньНедели=?(ТекДеньНедели<7,ТекДеньНедели+1,1);
    КонецЦикла;
    Набор.Записать();
    КонецПроцедуры // ЗаполнитьНаСервере()

    </code>

  20. kuznetsovimail 13.06.2011 в 15:29

    Задание выполнил. Небольшая задержка из-за тогочто ездил на дачу где нет инета.
    Модуль обработки заполнениеграфика
    <code>
    &НаКлиенте
    Процедура Заполнить(Команда)
    Массив=Новый массив(7);
    Если Объект.Пн Тогда Массив[0]=Истина Иначе Массив[0]=Ложь; КонецЕсли;
    Если Объект.Вт Тогда Массив[1]=Истина Иначе Массив[1]=Ложь; КонецЕсли;
    Если объект.Ср Тогда Массив[2]=Истина Иначе Массив[2]=Ложь; КонецЕсли;
    Если Объект.Чт Тогда Массив[3]=Истина Иначе Массив[3]=Ложь; КонецЕсли;
    Если объект.Пт Тогда Массив[4]=Истина Иначе Массив[4]=Ложь; КонецЕсли;
    Если Объект.Сб Тогда Массив[5]=Истина Иначе Массив[5]=Ложь; КонецЕсли;
    Если Объект.Вс Тогда Массив[6]=Истина Иначе Массив[6]=Ложь; КонецЕсли;

    ЗаполнитьГрафик(Объект.Период,Объект.ВидГрафикаРаботы,Массив);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ЗаполнитьГрафик(Период,ВидГрафикаРаботы,Массив)
    Набор=РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    Набор.Отбор.ВидГрафикаРаботы.Установить(ВидГрафикаРаботы);

    ТекДата=Период.ДатаНачала;
    Пока ТекДата<Период.ДатаОкончания Цикл

    Если Массив[ДеньНедели(ТекДата)-1] тогда
    Запись=Набор.Добавить();
    Запись.Дата=ТекДата;
    Запись.ВидГрафикаРаботы=ВидГрафикаРаботы;
    Запись.Значение=Истина;
    Иначе
    Запись=Набор.Добавить();
    Запись.Дата=ТекДата;
    Запись.ВидГрафикаРаботы=ВидГрафикаРаботы;
    Запись.Значение=Ложь;
    КонецЕсли;
    ТекДата=ТекДата+24*3600;
    КонецЦикла;
    Набор.Записать(Ложь);
    КонецПроцедуры // ЗаполнитьГрафик()
    </code>
    С настройкой объектов проблем не возникло.

  21. Задание выполнила. Основное затруднение вызвала обработка по заполнению графиков. Вот что в итоге получилось:
    <code>
    &НаКлиенте
    Процедура Заполнить(Команда)
    Перем ТипГрафика;
    Если ВвестиЗначение(ТипГрафика,”Выберите тип графика”, Тип(“СправочникСсылка.ТипыГрафиков”)) Тогда
    ЗаполнитьГрафик(ТипГрафика,Объект.ДатаЗаполнения);
    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьГрафик(ТипГрафика,Дата)

    ТекДата = НачалоГода(Дата);
    КонецГода = КонецГода(Дата);

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

    ТекДата = НачалоГода(Дата);
    Пока ТекДата <= КонецГода Цикл

    СтрокаТЗ = ТаблицаЗн.Найти(ТекДата,”Дата”);
    Если СтрокаТЗ = Неопределено Тогда
    СтрокаТЗ = ТаблицаЗн.Добавить();                        
    СтрокаТЗ.Дата = ТекДата;
    СтрокаТЗ.ТипГрафика = ТипГрафика;
    КонецЕсли;

    ДеньНедели = ДеньНедели(ТекДата);
    СтрокаТЗ.Значение = Объект.СписокВыходных.НайтиПоЗначению(ДеньНедели).Пометка;

    ТекДата = ТекДата + 86400;
    КонецЦикла;

    НаборЗаписей.Загрузить(ТаблицаЗн);
    НаборЗаписей.Записать();
    КонецПроцедуры // ЗаполнитьГрафик()

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Объект.СписокВыходных.Добавить(1,”Пн”);
    Объект.СписокВыходных.Добавить(2,”Вт”);
    Объект.СписокВыходных.Добавить(3,”Ср”);
    Объект.СписокВыходных.Добавить(4,”Чт”);
    Объект.СписокВыходных.Добавить(5,”Пт”);
    Объект.СписокВыходных.Добавить(6,”Сб”);
    Объект.СписокВыходных.Добавить(7,”Вс”);
    КонецПроцедуры
    </code>
    Создала два плана видов расчета и два регистра расчета, с измерениями Сотрудник, Подразделение и реквизитами ПлановыйОклад и ПроцентПремии.
    Оклад по дням, отпуск и прогул относятся к основным начислениям, премия квартальная – к дополнительным.
    Для оклада – базы нет, вытесняющие и ведущие виды расчета – отпуск и прогул.
    Для отпуска – база оклад и премия, они же ведущие.
    Для прогула – нет базы, вытесняющих и ведущих видов расчета.
    Для премии – база Оклад и Отпуск, они же ведущие.

  22. Андрей Кусанов 12.06.2011 в 23:30

    Задание выполнено.
    Справочник “ТипыГрафиков”, непериодич. р.с. “ГрафикиРаботы”,
    измерения “ТипГрафика”, “Дата”, ресурсы “Значение”.
    Обработка “ЗаполнениеГрафика”: на форме помимо типа графика, стандартного периода и семи
    реквизитов “Д1”-“Д7” выведен динамический список с осн. таблицей “РегистрСведений.ГрафикиРаботы”.
    Реализован автоотбор по типу графика.
    При вып. ком. формы вызывается эксп. проц. модуля обраб-ки:
    <code>
    Перем МассивЗначений;

    Процедура ЗаполнитьГрафик() Экспорт

    МассивЗначений = Новый Массив;
    Для i=1 По 7 Цикл
    МассивЗначений.Добавить(ЭтотОбъект[“Д”+i]);
    КонецЦикла;

    ДатаТек = НачалоДня(ПериодЗаполнения.ДатаНачала);
    ДатаОкончания = НачалоДня(ПериодЗаполнения.ДатаОкончания);
    Если НЕ (ЗначениеЗаполнено(ДатаТек) И ЗначениеЗаполнено(ДатаОкончания)) Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не выбран период!”;
    Сообщение.Сообщить();
    Возврат;
    КонецЕсли;
    Если НЕ (ЗначениеЗаполнено(ТипГрафика)) Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не выбран тип графика!”;
    Сообщение.Сообщить();
    Возврат;
    КонецЕсли;

    НачатьТранзакцию();
    НаборЗаписей = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    ЭлементОтбора = НаборЗаписей.Отбор[“ТипГрафика”];
    ЭлементОтбора.Значение = ТипГрафика;
    ЭлементОтбора.Использование = Истина;

    НаборЗаписей.Прочитать();
    ТаблицаЗаписей = НаборЗаписей.Выгрузить();

    Пока ДатаТек <= ДатаОкончания Цикл
    Запись = ТаблицаЗаписей.Найти(ДатаТек, “Дата”);
    Если Запись = Неопределено Тогда
    Запись = ТаблицаЗаписей.Добавить();
    КонецЕсли;
    Запись.Дата = ДатаТек;
    Запись.ТипГрафика = ТипГрафика;
    Запись.Значение = ПолучитьЗначениеПоДате(ДатаТек);
    ДатаТек = ДатаТек+86400;
    КонецЦикла;

    НаборЗаписей.Загрузить(ТаблицаЗаписей);
    НаборЗаписей.Записать();
    ЗафиксироватьТранзакцию();

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

    Функция ПолучитьЗначениеПоДате(ДатаТек)
    Возврат МассивЗначений[ДеньНедели(ДатаТек)-1];
    КонецФункции
    </code>

    Созданы ПВР:
    1)”ОсновныеНачисления”, исп. период действия, зав. от базы от периода действия.
    Предопр. эл-ты:
    “ОкладПоДням”, вытесняющие “Отпуск”, “Прогул”;
    “Отпуск”, базовые и ведущие “Оклад”, “ПремияКвартальная”
    “Прогул”, вытесняющие и вед. “Отпуск”

    2)”ДополнительныеНачисления” зав. от базы от периода действия.
    Предопр. эл-ты:
    “ПремияКвартальная”, базовые “Оклад”, “ПремияКвартальная”, “Отпуск”.
    ведущие “Оклад”, “ПремияКвартальная”, “Отпуск”, “Прогул”.

    Регистры расчета:
    1)”ОсновныеНачисления” Измерения “Подразделение” “Сотрудник”
    Ресурсы “Результат” “Размер”
    Реквизиты “ТипГрафика”
    Галка “Период действия”, “Базовый период”, выбран график, значение, дата графика из РС.
    Периодичность – “Месяц”. Связь с графиком задана для реквизита “ТипГрафика”.
    План ВР: “ОсновныеНачисления”.

    2)”ДополнительныеНачисления” без периода действия.
    Галка “Базовый период”.
    Структура та же, кроме графика – он отсутствует.
    План ВР: “ДополнительныеНачисления”.

    Создан документ “НачислениеЗарплаты”
    “ПериодРегистрации” – дата рекв. шапки. Приводится н нач. мес.
    Две таб. части:”ОсновныеНачисления”, “ДополнительныеНачисления” с необходимыми реквизитами.

  23. Задание выполнил.  Создан регистр сведений Графики работы: Изменения – График работы (справочник),  Дата, Год; Ресурсы – Значение( 1 или 0). РС непериодический. В обработке заполнения графиков сделал булевские реквизиты дней недели, указание графика работы и года. При указании рабочих дней недели (в задании было указание выходных) обработка заполняет регистр через менеджер записи. Можно было сделать через таблицу значений, которую потом загрузить в набор записей. Но поскольку заполнение графиков – довольно редкое событие, то решил оставить через менеджер записи.  Планы видов расчета создал согласно заданию. Оклад, отпуск и прогул отнес к основным, т.к. имеют период действия, а премию – к дополнительным. Настройки видов расчета следующие. Оклад – период действия является базовым периодом, базовые и ведущие – оклад по дням (может пригодится), вытесняющие – отпуск и прогул. Отпуск: базовые и ведущие – оклад по дням. Прогул – без настроек. Премия: базовые – оклад и отпуск, ведущие – оклад, отпуск и прогул. Остался вопрос: как соотносятся прогул и отпуск – что из них будет вытесняющим. Созданы регистры расчета Основные начисления и Дополнительные начисления.  Структура следующая: измерения – сотрудник и подразделение; ресурсы – результат; реквизиты – размер. Для Основных начислений добавлен еще один реквизит – график работы связан с РС.ГрафикиРаботы. Добавлен документ Начисление заработной платы – согласно структуре, описанной в задании.

  24. Пытался установить вот такое второе условие в Отборе для РегистраСведений.ГрафикРаботы
    <code>Набор.Отбор.Дата.Значение = Дата;
             Набор.Отбор.Дата.ЗначениеС = НачалоГода(Дата);
             Набор.Отбор.Дата.ЗначениеПо = КонецГода(Дата);
             Набор.Отбор.Дата.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
             Набор.Отбор.Дата.Использование = Истина;</code>
     
    Выдавало ошибку «Недопустимый тип сравнения» на     Набор.Отбор.Дата.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы; ПОЧЕМУ?

    • Отбор в наборе записей регистра сведений можно ставить только на равенство. Об этом написано в синтакс-помощнике.

  25. Отчет ДЗ №13.
     
    Создал:
     
    Общие: Подсистему ЗП.
     
    Справочники:  «ТипыГрафиков»
     
    Рег. Сведений:  «ГрафикРаботы» измерения ТипГрафика, Дата ресурс Значение тип Число
    Для заполнения изготовил обработку ЗаполнениеГрафика (реквизиты ТипГрафика, НачалоПериода, КонецПериода, семь флажков). Добавил измерение Год для Отбора, что бы не удалять данные другого года. БЕЗ ГОДА НЕПОЛУЧАЛОСЬ, ВОПРОС ОСТАВИЛ ВЫШЕ!
     
    Планы видов расчета:
    «ОсновныеНачисления» – флаг Использует период действия, Зависит по периоду действия, флаг в Базовые планы видов расчета, предопределенные Оклад (Вытесняющие Отпуск, Прогул они же и Ведущие), Отпуск, Прогул.
    «Дополнительные начисления» –  Зависит по периоду действия, предопределенные Премия (Базовые Оклад, Ведущие Оклад, Отпуск, Прогул)
     
    Регистры расчета:
    “ОсновныеНачисления» – свойства план «ОсновныеНачисления», Периодичность «Месяц», флаг Период действия, ГрафикРабот …, флаг Базовый период. Реквизиты ТипГрафика (данные связь с графиком ТипГрафика) и Размер
    «ДополнительныеНачисления» – свойства план «ДополнительныеНачисления», Периодичность Квартал, Реквизит Размер
    Измерения Сотрудник и Подразделение, Ресурсы Результат
     
     Документы
     «НачислениезаработнойПлаты», Оперативное проведение: Запретить. В табличной части Период выполнения начислений это 2-а реквизита ДатаНачала и ДатаОкончания.

  26. Юрий Торговцев 12.06.2011 в 22:37

    Задание выполнил.
    Создал регистр сведений “Графики работы”.
    Создал пречисление ДниНедели значения которого можно добавлять в табличную часть формы обработки ЗаполнениеГрафика.
    <code>
    Для каждого ВыходнойДень Из Объект.Выходные Цикл
    Если Формат(ТекДата,”ДФ=дддд”) = Строка(ВыходнойДень.ДеньНедели) Тогда
    ЭтоВыходной = Истина;
    КонецЕсли; 
    КонецЦикла;
    Если Не ЭтоВыходной Тогда
    Запись.Значение = 1;
    КонецЕсли; 
    ТекДата = ТекДата+24*3600;
    КонецЦикла;
    </code>
    Создал планы видов расчета “Основные начисления” и “Дополнительные начисления”.
    Создал предопределенные элементы в ПВР.
    Создал регистры расчета  “Основные начисления” и “Дополнительные начисления”.
    Создал документ “Начисление заработной платы”.
     

  27. Yuri Golovko 12.06.2011 в 21:43

    Обработка «Заполнение графика». Реквизиты формы «Период»  с типом Стандартный период, «ТипГрафика», тип СправочникСсылка.ТипыГрафиков, «ВыходныеДни» с типом СписокЗначений и строковый реквизит «НомераВыходных» с длиной 7. У ТипГрафика и Период  свойство «Проверка заполнения» установлено в «Выдавать ошибку». В таблице формы ВыходныеДни показываются только пометка и значение и ее свойство «Положение командной панели» установлено в «Нет». При создании формы таблица ВыходныеДни заполняется днями недели:
    <code>
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
                ВыходныеДни.Добавить(1, “Понедельник”);
                ВыходныеДни.Добавить(2, “Вторник”);
                ВыходныеДни.Добавить(3, “Среда”);
                ВыходныеДни.Добавить(4, “Четверг”);
                ВыходныеДни.Добавить(5, “Пятница”);
                ВыходныеДни.Добавить(6, “Суббота”);
                ВыходныеДни.Добавить(7, “Воскресенье”);
    КонецПроцедуры
    </code>
    В начале выполнения обработки команды формы «Заполнить» номерами дней недели, соответствующих отмеченным выходным дням в таблице ВыходныеДни, заполняется строка НомераВыходных. Также проверяется заполнение типа графика и периода, правильность заполнения периода и отметки выходных дней. Далее следует вызов процедуры, непосредственно заполняющей график:
    <code>
    Процедура Заполнить(Команда)
                Если Не ПроверитьЗаполнение() Тогда
                            Возврат;
                КонецЕсли;
                ВыходныеУказаны = Ложь;
                НомераВыходных = “”;
                Для каждого ЭлементСписка Из ВыходныеДни Цикл
                            Если ЭлементСписка.Пометка Тогда
                                       ВыходныеУказаны = Истина;
                                       НомераВыходных = НомераВыходных + (ВыходныеДни.Индекс(ЭлементСписка) + 1);
                            КонецЕсли;
                КонецЦикла;
                Если Не ЗначениеЗаполнено(Период.ДатаНачала) Или Не ЗначениеЗаполнено(Период.ДатаОкончания) Или Период.ДатаОкончания < Период.ДатаНачала Тогда
                            Сообщение = Новый СообщениеПользователю;
                            Сообщение.Текст = “Неправильно задан период”;
                            Сообщение.Поле = “Период”;
                            Сообщение.УстановитьДанные(ЭтаФорма);
                            Сообщение.Сообщить();
                            Возврат;
                КонецЕсли;
                Если Не ВыходныеУказаны Тогда
                            Режим = РежимДиалогаВопрос.ДаНет;
                            Ответ = Вопрос(“Вы уверены, что в графике не будет выходных?”, РежимДиалогаВопрос.ДаНет);
                            Если Ответ = КодВозвратаДиалога.Нет Тогда
                                       Возврат;
                            КонецЕсли;
                КонецЕсли;
                ЗаполнитьГрафик(Период, ТипГрафика, НомераВыходных);
    КонецПроцедуры
    </code>
    При заполнении графика считывается набор записей регистра сведений ГрафикиРаботы с отбором по измерению ТипГрафика, указанному в форме обработки. Набор выгружается в таблицу значений. При переборе в цикле всех дней выбранного периода проверяется, есть ли соответствующая запись в наборе, и если нет, то в таблицу значений добавляется соответствующая строка. После завершения цикла таблица значений выгружается в набор и затем он записывается:
    <code>
    &НаСервереБезКонтекста
    Процедура ЗаполнитьГрафик(Период, ТипГрафика, НомераВыходных)
                Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
                Набор.Отбор.ТипГрафика.Установить(ТипГрафика);
                Набор.Прочитать();
                Таблица = Набор.Выгрузить();
                ТекДата = Период.ДатаНачала;
                Пока ТекДата <= Период.ДатаОкончания Цикл
                            СтрокаТаблицы = Таблица.Найти(НачалоДня(ТекДата));
                            Если СтрокаТаблицы = Неопределено Тогда
                                       СтрокаТаблицы = Таблица.Добавить();
                                       СтрокаТаблицы.ТипГрафика = ТипГрафика;
                                       СтрокаТаблицы.Дата = ТекДата;
                            КонецЕсли;
                            Если Найти(НомераВыходных, Строка(ДеньНедели(ТекДата))) = 0 Тогда
                                       СтрокаТаблицы.Значение = 1;
                            Иначе
                                       СтрокаТаблицы.Значение = 0;
                            КонецЕсли;
                            ТекДата = ТекДата + 24*60*60;
                КонецЦикла;
                Набор.Загрузить(Таблица);
                Набор.Записать();
    КонецПроцедуры // ЗаполнитьГрафик()
    </code>
     В плане видов расчета «Основные начисления» созданы предопределенные элементы ОкладПоДням, Отпуск и Прогул. В плане видов расчета «Дополнительные начисления» создан предопределенный элемент ПремияКвартальная. Для вида расчета ОкладПоДням вытесняющими видами расчета являются Отпуск и Прогул, ведущими тоже Отпуск и Прогул. У вида расчета Отпуск базовыми являются виды расчета ОкладПоДням, Отпуск и ПремияКвартальная, ведущими – все предопределенные виды расчета из обоих планов видов расчета, так же как и для вида расчета ПремияКвартальная. Для квартальной премии базовыми являются виды расчета ОкладПоДням, Отпуск и сама ПремияКвартальная.

    У регистра расчета «Основные начисления» установлено использование периода действия. Указан график, значение и дата графика, соответствующие регистру сведений ГрафикиРаботы и его ресурсу и измерению. Структура регистра расчета следующая: измерения Сотрудник и Подразделение, ресурс Результат, реквизиты ТипГрафика (тип СправочникСсылка.ТипыГрафиков) и Размер (тип число). У реквизита ТипГрафика в свойстве «Связь с графиком» указано измерение ТипГрафика регистра сведений ГрафикиРаботы. У регистра расчета «ДополнительныеНачисления» структура почти такая же, только отсутствует реквизит ТипГрафика. Так как этот регистр не может использовать период действия (из-за отсутствия аналогичного свойства в связанном с ним плане видов расчета «ДополнительныеНачисления»), то, естественно, временная схема (график) для него не имеет смысла.

  28. S. Bashutin 12.06.2011 в 12:04

    Задание выполнил. Сложностей не возникло.
    1) Создал обработку заполнения регистра сведений “Графики работ”. Всё в принципе просто, на форму вывел стандартный период и семь булевских флагов дней недели, получилась очень удобная обработка. Код очень простой:
    <code>
    НовыйНаборЗаписей=РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    НовыйНаборЗаписей.Прочитать();
    Пока НачальнаяДата<=КонечнаяДата Цикл
    НоваяЗапись=НовыйНаборЗаписей.Добавить();
    НоваяЗапись.Дата=НачальнаяДата;
    НоваяЗапись.ТипГрафика=График;
    Если ДеньНедели(НачальнаяДата)=1 И Понедельник Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=2 И Вторник Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=3 И Среда Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=4 И Четверг Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=5 И Пятница Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=6 И Суббота Тогда
    НоваяЗапись.Значение=0;
    ИначеЕсли ДеньНедели(НачальнаяДата)=7 И Воскресенье Тогда
    НоваяЗапись.Значение=0;
    Иначе
    НоваяЗапись.Значение=1;
    КонецЕсли;
    НачальнаяДата=НачальнаяДата+3600*24;
    КонецЦикла;
    НовыйНаборЗаписей.Записать();
    </code>
    2) Создал два плана видов расчета(ОсновныеНачисления и ДополнительныеНачисления), настроил четыре начисления(Оклад по дням, отпуск, прогул, премия квартальная).
    3) Создал два регистра расчета(ОсновныеНачисления и ДополнительныеНачисления).
    4) Создал документ “Начисление заработной платы” и добавил в него все необходимые поля и табличные части.

  29. Майор 11.06.2011 в 23:26

    Всем доброго времени суток.

    Представляю отчёт по тринадцатому домашнему заданию.
    Создал справочник ГрафикиРаботы. Создал регистр сведений ГрафикиРаботы. Непериодический, независимый, с числовым ресурсом Значение, с измерениями ГрафикРабот (тип данных СправочникСсылка) Дата и Год. Последнее измерение для установки отбора.
    Создал обработку ЗаполнениеГрафика. Реквизиты ГрафикРаботы (тип данных СправочникСсылка), НачалоПериода, ОкончаниеПериода и семь реквизитов булевского типа (на форме объеденены в группу) с именами соответственно дням недели (с Пн по Вс).
    В связи с не очень большим объёмом задания – в обработку добавил от себя несколько проверок: на правильность указания количества выходных дней (реализовано за счёт наличия в справочнике ГрафикиРабот двух предопределённых элементов – Пятидневка и Шестидневка), на заполнение основных реквизитов и на указание периода – не меньше года (за счёт того, что в качестве отбора устанавливается год – платформа сама не даёт заполнять график за период больше года). Реализовать заполнение за период меньше года – не получилось, или пропадает возможность перезаписи уже заполненного периода, или происходит замещение заполненных записей новым периодом. Как установить более гибкий отбор по периоду без обхода всех дней года не придумал, если в решении не будет – оформлю вопрос в мастер-групу ;-)
    Привожу листинг модуля формы обработки ЗаполнениеГрафика:
    <code>

    &НаКлиенте
    Процедура Заполнить(Команда)
    ЗаполнитьГрафикНаСервере();    
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьГрафикНаСервере()

    Если НЕ ПроверитьЗаполнение() Тогда
    Возврат;
    КонецЕсли;

    НачалоПериода = Объект.НачалоПериода;
    ОкончаниеПериода = Объект.ОкончаниеПериода;
    ТекущийДень = НачалоПериода;
    ГрафикРаботы = Объект.ГрафикРаботы;

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

    Пока ТекущийДень <= ОкончаниеПериода Цикл
    Запись = НаборЗаписей.Добавить();
    Запись.ГрафикРаботы = ГрафикРаботы;
    Запись.Год = НачалоГода(ТекущийДень);
    Запись.Дата = ТекущийДень;

    Если ДеньНедели(ТекущийДень) = 1 И НЕ Объект.Пн Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 2 И НЕ Объект.Вт Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 3 И НЕ Объект.Ср Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 4 И НЕ Объект.Чт Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 5 И НЕ Объект.Пт Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 6 И НЕ Объект.Сб Тогда
    Запись.Значение = 1;
    ИначеЕсли ДеньНедели(ТекущийДень) = 7 И НЕ Объект.Вс Тогда
    Запись.Значение = 1;
    КонецЕсли;
    ТекущийДень = ТекущийДень + 3600*24;
    КонецЦикла;

    Если НаборЗаписей.Количество() < 365 Тогда
    Сообщить(“Указан неверный период! Период заполнения графика должен быть равен календарному году.”);
    Иначе
    НаборЗаписей.Записать();
    КонецЕсли;

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

    &НаСервере
    Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

    Если Объект.ГрафикРаботы = Справочники.ГрафикиРаботы.Пятидневка Тогда
    КоличествоВыходных = 2;
    ИначеЕсли Объект.ГрафикРаботы = Справочники.ГрафикиРаботы.Шестидневка Тогда
    КоличествоВыходных = 1;
    КонецЕсли;

    Если Объект.Пн Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Вт Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Ср Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Чт Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Пт Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Сб Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;
    Если Объект.Вс Тогда
    КоличествоВыходных = КоличествоВыходных – 1;               
    КонецЕсли;

    Если КоличествоВыходных <> 0 Тогда
    Сообщить(“Отметьте правильное число выходных дней”);    
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
    </code>

    Создал планы видов расчёта ОсновныеНачисления и ДополнительныеНачисления.  Первый использует период действия, второй нет. У обоих установлена зависимость по периоду действия. У первого в качестве базового плана видов расчёта указан ОсновныеНачисления, у второго – оба GDH/
    В ПВР Основные начисления создал три предопределённых элемента: Оклад (период действия является базовым периодом, базовых видов расчёта нет, вытесняющие – Отпуск и Прогул, ведущие – они же), Отпуск (базовый вид расчёта – Оклад, ведущий – он же, вытесняющих нет), Прогул (базовых, вытесняющих и ведущих видов расчёта нет). В ПВР создал один предопределённый элемент – ПремияКвартальная (базовые виды расчёта – Оклад и ПремияКвартальная, ведущие – все виды расчётов без исключения).

    Создал два регистра расчёта – ОсновныеНачисления и ДополнительныеНачисления. Периодичность – месяц, в ОсновныхНачислениях отметил базовый период и период действия, привязал к регистру сведений ГрафикиРаботы. Регистр расчёта ДополнительныеНачисления без периода действия и базового периода. В обоих регистрах – измерения Сотрудник и Подразделение, ресурс Начисления, в первом регистре реквизит ПлановыйРазмерОклада, во втором – ПроцентКвартальнойПремии. Справочник Сотрудники у меня уже давно был сделан (кажется, ещё со времён создания АвансовогоОтчета), справочник ПодразделенияОрганизаций подчинил справочнику Организации, а Наименование подменил на реквизит с типом данных СправочникСсылка.Отделы, для разделения подразделений в филиалах. В связи с этим вопрос – имеет смысл делать проверку на присутствие работников из разных организаций в документе или пусть так остаётся?
    Создал документ НачислениеЗП, без оперативного проведения. Структура документа достаточно подробно описана в задании. В модуле объекта добавил приведение Периода регистрации к началу месяца и дозаполнение периода выполнения начисления в табличной части, в случае если пользователю было лень.
    И ещё вопрос, судя по описанию в синтакс-помощнике процедура ОбработкаПроверкиЗаполнения вызывается только при интерактивной записи объекта, при програмной записи – проверку заполнения необходимо принудительно вызывать?
    Привожу листинг модуля объекта документа НачислениеЗП:
    <code>
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПериодРегистрации = НачалоМесяца(ПериодРегистрации);
    Для каждого Строчка Из Начисление Цикл
    Если Строчка.НачалоПериода = ‘00010101’ И
    НЕ Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.НачалоПериода = НачалоМесяца(Строчка.ОкончаниеПериода);
    ИначеЕсли НЕ Строчка.НачалоПериода = ‘00010101’ И
    Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.ОкончаниеПериода = КонецДня(КонецМесяца(Строчка.НачалоПериода));
    ИначеЕсли Строчка.НачалоПериода = ‘00010101’ И
    Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.НачалоПериода = ПериодРегистрации;                      
    Строчка.ОкончаниеПериода = КонецДня(КонецМесяца(Строчка.НачалоПериода));
    КонецЕсли;            
    КонецЦикла;
    КонецПроцедуры
    </code>

  30. Задание выполнил.
    Для заполнения регистра в обработку добавил реквизиты ДатаНачала,  ДатаОкончания, ГрафикРаботы и ДниНедели (с типом СписокЗначений ). Текст модуля формы обработки:
    <code>
    Процедура Заполнить(Команда)
    ЗаполнитьОтбор();
    КонецПроцедуры

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ДеньНедели = НачалоНедели(ТекущаяДата());
    Для  НомерДня = 1 по 7 Цикл
    Объект.ДниНедели.Добавить(НомерДня,Формат(ДеньНедели,”ДФ=ддд”));
    ДеньНедели = ДеньНедели+24*3600;
    КонецЦикла
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьОтбор()
    Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
    Набор.Отбор.ГрафикРаботы.Установить(Объект.ГрафикРаботы);
    Набор.Прочитать();
    ТаблЗаписей = Набор.Выгрузить();
    ДатаЗаписи = Объект.ДатаНачала;
    Пока ДатаЗаписи <= Объект.ДатаОкончания Цикл
    НовЗапись = ТаблЗаписей.Найти(ДатаЗаписи);
    Если ТаблЗаписей.Найти(ДатаЗаписи)= Неопределено Тогда
    НовЗапись = ТаблЗаписей.Добавить();
    НовЗапись.ГрафикРаботы = Объект.ГрафикРаботы;
    НовЗапись.Дата=ДатаЗаписи;
    КонецЕсли;
    ДеньНед = ДеньНедели(ДатаЗаписи);
    ЗначЗаписи = Объект.ДниНедели.НайтиПоЗначению(ДеньНед);
    НовЗапись.Значение = ?(ЗначЗаписи.Пометка,1,0);
    ДатаЗаписи = ДатаЗаписи+24*3600;
    КонецЦикла;
    Набор.Загрузить(ТаблЗаписей);
    Набор.Записать();
    КонецПроцедуры

    </code>
    ОкладПоДням, Отпуск и прогул добавил в план ОсновныеНачисления.    ПремияКвартал в план ДополнительныеНачисления.
     

  31. Вроде как выполнил… ДЗ показалось простым – может чего не учел…
    В основном время ушло на заполнение графика работы.
    Для задания параметров ТипГрафика,Период, Номера выходных дней в неделе использовал обработку, которую модально вызываю из списка набора записей.
    Для заполнения же самого набора использовал объект Регистра сведений МенеджерЗаписи. (Для набора записи не работает отбор на сравнение)

    Для каждой даты из указанного интервала 1) читаю запись 2) устанавливаю значения 3) записываю
    …………
     Запись = РегистрыСведений.ГрафикРаботы.СоздатьМенеджерЗаписи();
     
     ВыхДни = Парам.МассивВыходныхДней;
     ТекДата = Парам.НачалоПериода;
     
     Пока ТекДата <= Парам.КонецПериода Цикл
      
      Запись.Дата    = ТекДата;
      Запись.ТипГрафика   = Парам.ТипГрафика;
      Запись.Прочитать();
      
      Запись.Дата    = ТекДата;
      Запись.ТипГрафика   = Парам.ТипГрафика;
      Запись.Значение   = ?(ВыхДни.Найти(ДеньНедели(ТекДата)) <> Неопределено,0,1);
      Запись.Записать();//с замещением
      
      ТекДата = ТекДата + 24*3600;
     КонецЦикла;
    …………..

  32. Выполнено.  Настройка объектов без затруднений. В обработке «Заполнение графика» данные о выходных вводятся через список на форме. Для реализации удобного отбора  рассматривала  как вариант  создание реквизита Месяц либо Год в регистре сведений. Но так как неизвестно, понадобится ли он в дальнейшем,  реализовала так:

    Создается набор записей и устанавливается отбор по типу графика. 2. Выполняется запрос к регистру Графики и  где отбираются все записи регистра с годом, не равным текущему и указанным  типом графика 3. Данные запроса загружаются в набор записей.  4. В набор  с данными добавляются новые записи по текущему году.

  33. Майор 11.06.2011 в 00:07

    Я так понимаю – при заполнении графиков за 2009 и 2010 года – праздничных дней у работников не будет?

    • Да, праздники отменили :)

      • Майор 11.06.2011 в 23:33

        А в связи с чем такие ограничения? Не думаю, что реализация проверки дополнительных 16 (+-) выходных дней так уж сложна ))

        • Раз не сложна, зачем ее делать? :)

          • Майор 12.06.2011 в 00:19

            Чтоб условия задачи и решение были максимально приближены к “боевым”. ))