8.х ЗУП Рабочие и предпраздничные дни

Тема в разделе ""1С:Зарплата и управление персоналом ЗУП"", создана пользователем Korolev, 12 май 2010.

  1. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    В Производственном календаре есть рабочие и предпраздничные дни.

    Нужно сообщить об уходе сотрудника в отпуск за 1 рабочий день.
    По идее, предпраздничные дни также можно считать рабочими..

    Вот что получилось сделать, правда в итоге получаю два уведомления (потому что он он записывает один раз с ВидомДня = Рабочий, а второй с ВидомДня = Предпраздничный)

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

    Что касается ВидовДней у меня есть мысль что было бы не плохо как-нибудь их "сложить" (так сказать к датам из рабочего, добавить предпраздничные), но как это реализовать - не знаю (с 1C только начал работать :smile: ). В итоге потом можно было бы делать сравнений с ВидомДней = "Рабочий+Предпраздничный", но вот как этот вид дней получить?:) Или вообще глупая затея?

    Подкинули еще мысль сделать через отдельный запрос, где посчитать кол-во дней:
    Код:
    	Запрос = Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    |	РегламентированныйПроизводственныйКалендарь.ВидДня
    |ИЗ
    |	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    |ГДЕ
    |	(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2)
    |	И 
    |	(РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
    |    ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))";
    
    Запрос.УстановитьПараметр("Дата1",Выборка.ДатаНачала);
    Запрос.УстановитьПараметр("Дата2",ВремяФормированияЗадач);
    
    
    Но в какую сторону двинуться с этого места тоже пока не пойму.

    Благодарю за помощь. :unsure:
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Завтра гляну, только дол дому добраляся. Если что напомните....
  3. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Вроде бы сам разобрался, после того как на рабочей базе потестирую, скину решение!
  4. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Ну давайте ждем, если не получится тогда вместе будем разбираться....
  5. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    В общем получилось сделал еще один запрос, уже по видам дней и добавил в цикл:
    Код:
    	Пока Выборка.Следующий() Цикл
    ФИОСотрудника = СокрЛП(Выборка.Физлицо);
    
    Запрос = Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
    |ИЗ
    |	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    |ГДЕ
    |	(РегламентированныйПроизводственныйКалендарь.ВидДня = &Рабочий
    |			ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &Предпраздничный)
    |	И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &Дата
    |
    |УПОРЯДОЧИТЬ ПО                           	
    |	Дата УБЫВ";
    НужныйДень = Выборка.ДатаНачала - 60*60*24; 
    Запрос.УстановитьПараметр("Рабочий",Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
    Запрос.УстановитьПараметр("Предпраздничный",Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
    Запрос.УстановитьПараметр("Дата",НужныйДень);
    
    Если НачалоДня(ТекущаяДата()) = НужныйДень тогда
    ЗадачаУходВОтпуск = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
    ЗадачаУходВОтпуск.Дата			= НачалоДня(ВремяФормированияЗадач);
    ЗадачаУходВОтпуск.ВидЗадачи	= Справочники.ВидыЗадачПользователей.УходВОтпуск;
    ЗадачаУходВОтпуск.ОбъектЗадачи	= Выборка.Ссылка;
    ЗадачаУходВОтпуск.Сотрудник	= Выборка.Сотрудник;
    ЗадачаУходВОтпуск.Наименование	= "Через 1 рабочий день в отпуск уходит  " + ФИОСотрудника;
    ЗаписатьАдресациюЗадачи(ЗадачаУходВОтпуск, Справочники.Организации.НайтиПоНаименованию("ООО Ромашки"), Справочники.РолиИсполнителей.Кадровик);
    ЗадачаУходВОтпуск.Записать();
    КонецЕсли;
    
    КонецЦикла;
    
    
  6. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Запрос в цикле-Грубейшая ошибка, разве нельзя было объеденить, соеденить 2 запроса или сделать вложенный?
  7. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Наверное можно, не судите строго "я только начинаю" :unsure: но про вложенный запрос думал, просто раньше не сталкивался с ним.

    вот так правильно?
    Код:
            Запрос = Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ПриемНаРаботуВОрганизациюРаботникиОрганизации.Сотрудник,
    |    ПриемНаРаботуВОрганизациюРаботникиОрганизации.Сотрудник.Физлицо КАК ФизЛицо,
    |    ПриемНаРаботуВОрганизациюРаботникиОрганизации.ДатаПриема КАК ДатаНачала,
    |    ПриемНаРаботуВОрганизациюРаботникиОрганизации.ИспытательныйСрок КАК КолВоМесяцев,
    |    ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка
    |ИЗ
    |    Документ.ПриемНаРаботуВОрганизацию.РаботникиОрганизации КАК ПриемНаРаботуВОрганизациюРаботникиОрганизации
    |        ЛЕВОЕ СОЕДИНЕНИЕ Задача.ЗадачаИсполнителя КАК Задачи
    |        ПО ПриемНаРаботуВОрганизациюРаботникиОрганизации.Сотрудник = Задачи.Сотрудник
    |            И (Задачи.ВидЗадачи = ЗНАЧЕНИЕ(Справочник.ВидыЗадачПользователей.ОкончаниеИспытательногоСрока))
    |            И ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка = Задачи.ОбъектЗадачи,
    |    (ВЫБРАТЬ ПЕРВЫЕ 1
    |        РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
    |    ИЗ
    |        РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    |    ГДЕ
    |        (РегламентированныйПроизводственныйКалендарь.ВидДня = &Рабочий
    |                ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &Предпраздничный)
    |        И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &Дата
    |    
    |    УПОРЯДОЧИТЬ ПО
    |        Дата УБЫВ) КАК ВложенныйЗапрос
    |ГДЕ
    |    Задачи.Сотрудник ЕСТЬ NULL 
    |    И ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Проведен";
    
    
    
    ps. и будьте добры, скажите почему грубая ошибка, что может быть и т.п. )
  8. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    НУ это крайне не производительно и не эстетично раньше на аттестациях за такое двойки ставили. Но ничего я тоже так начинал писать, так что ничего страшного.

    Насчет правильно или нет. Если один запрос и нет запроса в цикле и все работает значит правильно ..... Только что то я не пойму суть вашего запроса. Вы создали просто подзапрос вложеный а никак его ни сч ем не соеденили? в выборку данные с него не попадают?Стоит вопрос для чего оон вообще там? как 5 наога собаки....
  9. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Хорошо, благодарю за ответ :)
  10. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    прочитайте что я там дописал по поводу запроса......

Поделиться этой страницей