Имя: Пароль:
1C
1С v8
ЗУП Экзамен Специалист Покритикуйте решение. Охрана объектов.
0 leonidkorolev
 
25.11.12
19:50
Прорешиваю задачу на специалиста про охрану объектов. Ниже кода модуля документа План охраны объектов.
Покритикуйте пожалуйста кто сдавал. Прокатит ли такое решение.
Особенно интересует код проверки правильности заполнения плана.
И насколько правильно с т.з. оптимальности работать с менеджером записи.
Все решения которые находил в интернете или неправильно решены или решены под другое условие задачи.


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


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

Процедура ОбработкаУдаленияПроведения(Отказ)
   
   УдалитьДвиженияПоДокументу();
   
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   
   Месяц = НачалоМесяца(Месяц);
   
КонецПроцедуры
1 zak555
 
25.11.12
19:52
> УдалитьДвиженияПоДокументу

убрать

проще набор записей / отбор и записать
2 zak555
 
25.11.12
19:52
огласил бы условие
3 Пеппи
 
25.11.12
19:53
А зачем Процедура УдалитьДвиженияПоДокументу() ?
4 leonidkorolev
 
25.11.12
19:55
Условие

Деятельность подразделения «Охранники» организации «Беркут» заключается в охране офисов клиентов. Оплата труда работников этого подразделения производится исходя из дневной тарифной ставки, размер которой у всех работников одинаков. Зарплата начисляется только за фактически отработанные дни.
Охрана офисов клиентов производится в дни и часы работы организации «Беркут» (с понедельника по пятницу с 10-00 до 18-00, суббота и воскресенье – выходные дни).
В последнюю пятницу каждого месяца в информационную базу вводится график охраны объектов на следующий месяц (один документ на все объекты), устанавливающий для каждого объекта охраны (первая колонка табличной части) по календарным дням месяца «1», «2» и т.д. (отдельные колонки табличной части) работника, осуществляющего его охрану. Считать, что в течение дня работник может охранять только один объект.
Необходимо:
1) Создать документ «План охраны объектов» для планирования графика охраны объектов. Форма документа должна максимально соответствовать требованию заказчика (см. выше).
2) Реализовать автоматизированный расчет работникам подразделения «Охранники» вознаграждения за труд, обеспечить его учет для целей налогообложения и обложения страховыми взносами в соответствии с законодательством.
3) Создать настраиваемый отчет «Вознаграждения охранников» (как объект конфигурации), позволяющий за произвольное количество расчетных периодов получать следующую информацию (форма отчета должна соответствовать образцу):
5 leonidkorolev
 
25.11.12
19:56
(3) Регистр сведений без привязки к регистратору. Перед записью и при распроведении надо удалять старые записи.
6 zak555
 
25.11.12
19:57
(5) пиши поверх
7 zak555
 
25.11.12
19:58
+ > МенеджерЗаписи.Записать();

убрать из цикла
это же набор
8 zak555
 
25.11.12
19:58
и
МенеджерЗаписи = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьМенеджерЗаписи();
конечно
9 leonidkorolev
 
25.11.12
20:01
(6) Пробовал черзе набор. При смене месяца или изменении графика старые данные в набор не попадают и остаются висеть. Запоминать старые данные чтоли?

(7) У меня это менеджер записи РС и надо сразу фиксировать.

(8) Щас попробую
10 leonidkorolev
 
25.11.12
20:20
(8) Не получается. Если убрать из цикла, то записывается только последняя запись.
11 zak555
 
25.11.12
20:21
МенеджерЗаписиГлавнюк = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьМенеджерЗаписи();


//в цикле

МенеджерЗаписи = МенеджерЗаписиГлавнюк.Добавить();
//твой код

//.. за циклом

МенеджерЗаписиГлавнюк . Записать();
12 leonidkorolev
 
25.11.12
20:21
Пока ничего не удалось оптимизировать, всё осталось по старому. Как считается совсем всё плохо или пойдёт такое ршение? Если есть какие предложения с удовольствием выслушаю.
13 zak555
 
25.11.12
20:22
(12) для начала посмотри гилёвские курсы
14 leonidkorolev
 
25.11.12
20:31
(11) Понял. Спасибо.

Вот переделал запись через набор



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


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

Процедура ОбработкаУдаленияПроведения(Отказ)
   
   УдалитьДвиженияПоДокументу();
   
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   
   Месяц = НачалоМесяца(Месяц);
   
КонецПроцедуры
15 zak555
 
25.11.12
20:32
(14) сделай подчинение регистратору
16 leonidkorolev
 
25.11.12
20:34
(15) Не это точно нельзя. Это типой регистр на нём много чего завязано.
17 zak555
 
25.11.12
20:36
(16) это регистр факта - его надо регистратором, а не плана
18 leonidkorolev
 
25.11.12
20:40
(17)

Из условия

"В последнюю пятницу каждого месяца в информационную базу вводится график охраны объектов на следующий месяц..."


Мне кажется это будет ошибкой если думать что это факт. Далее должно срабатывать вытеснение в случае невыхода.
19 zak555
 
25.11.12
20:48
(18) график факта нужен для того, чтобы определить начисление 100 % или иное в зависмости от графика плана ( на него должна быть ссылка в РР )

а на ввод невыхода -- ты орнанизуй движение по ВР невыходу, который будет вытеснять обычное начисление
20 leonidkorolev
 
25.11.12
20:57
(19)

"график факта нужен для того, чтобы определить начисление 100 % или иное в зависмости от графика плана ( на него должна быть ссылка в РР ) "

Факт получится автоматом после вытеснения. Да и вроде не надо определять 100% или не 100%. Оплата по дневному тарифу по условию.

"а на ввод невыхода -- ты орнанизуй движение по ВР невыходу, который будет вытеснять обычное начисление"

Я тут ниче не буду делать, типовой механизм должен отработать.
21 zak555
 
25.11.12
20:59
ГрафикиРаботыПоВидамВремени -- это и есть план ?
22 leonidkorolev
 
25.11.12
21:00
(21) Да, это план.
23 zak555
 
25.11.12
21:02
тогда всё ок
24 NDN
 
25.11.12
21:06
А как-то беседовал с Харитоновым по поводу этой задачи - он сказал что её через табель надо решать
25 leonidkorolev
 
25.11.12
21:11
(24) Табель?!

В условии же конкретно сказано

"Создать документ «План охраны объектов» для планирования графика охраны объектов"

А факт уже дело хозяйское чем вводить, хоть методом вытеснения , хоть табелем.

А чё экзамен Харитонов принимает?
26 NDN
 
25.11.12
21:14
(25) Дело было в 2005 году, сдавал лично ему эту задачу. Про создание документа действительно только сейчас заметил. Если мне не изменяет память - тогда этого условия не было.

Смысл был, что расчетчик в конце месяца в табеле отмечается сколько часов по каждому объекту(виду времени) было. И от этого пляшется
27 leonidkorolev
 
25.11.12
21:16
(26) Да задачи сильно меняются. Все что находил решенные в интернете сначала подумал что неправильно решены, щас понял что раньше другие условия были.
28 ProgAL
 
25.11.12
21:26
Сделай у нового документа в ПриОткрытии
ТолькоПросмотр = Проведен; Тогда будешь явно распроводить документ и добавлять при проведении новые записи, не заморачиваясь на удаление старых записей при перепроводении. Т .к перепровдения у тебя не будет.
29 leonidkorolev
 
25.11.12
21:29
(28) Спасибо. Хороший приём.
30 IBTM
 
26.11.12
11:24
(4) а эта задача из примеров на сайте или же с экзамена? Потомучто с экзамена таже задача сложнее! И вообще все задачи сводятся к тому, чтоб её решение позволо сделать требуемый отчет, а это без изменения либа документа "НачисленияЗП" либо РР ОсновныеНачисления не приветствуется преподом. Будь готов к этому.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс