Здравствуйте. Подскажите пожалуйста как лучше сделать. Есть документ отсутствия, например сотрудник отсутствует с 1 августа по 30 августа, нужно (желательно запросом) найти разницу дней когда у сотрудника необоснованный прогул, т.е. допустим с 5 августа по 10 у него больничный, потом с 20 по 25 тоже больничный, нужно получить следующее с 1 по 4 разница 4 дня, с 11 по 19 разница 9, с 26 по 30 разница 5. Всегда будет использоваться документ отсутствия и больничный, если больничного нет, то прогул. это зуп/
Сделал так, но не совсем так:
Сделал так, но не совсем так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрогулНеявка.ДатаНачала КАК ДатаНачала,
| ПрогулНеявка.ДатаОкончания КАК ДатаОкончания
|ИЗ
| Документ.ПрогулНеявка КАК ПрогулНеявка
|ГДЕ
| ПрогулНеявка.Сотрудник = &Сотрудник
|
|УПОРЯДОЧИТЬ ПО
| ДатаНачала";
Запрос.УстановитьПараметр("Сотрудник", СтрокаДанных.Сотрудник);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ТЗ = Новый ТаблицаЗначений;
Тз.Колонки.Добавить("ДатаС", Новый ОписаниеТипов("Дата"));
Тз.Колонки.Добавить("ДатаПо", Новый ОписаниеТипов("Дата"));
Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда
Запрос2 = Новый Запрос;
Запрос2.Текст =
"ВЫБРАТЬ
| БольничныйЛист.ДатаНачала КАК ДатаНачала,
| БольничныйЛист.ДатаОкончания КАК ДатаОкончания
|ИЗ
| Документ.БольничныйЛист КАК БольничныйЛист
|ГДЕ
| БольничныйЛист.Сотрудник = &Сотрудник
| И ВЫБОР
| КОГДА БольничныйЛист.ДатаНачала < &ДатаНачала
| ТОГДА БольничныйЛист.ДатаОкончания
| ИНАЧЕ ВЫБОР
| КОГДА БольничныйЛист.ДатаНачала >= &ДатаНачала
| ТОГДА БольничныйЛист.ДатаОкончания <= &ДатаОкончания
| КОНЕЦ
| КОНЕЦ
|
|УПОРЯДОЧИТЬ ПО
| ДатаНачала";
Запрос2.УстановитьПараметр("Сотрудник", СтрокаДанных.Сотрудник);
СтруктураДанных.Вставить("Прогулы", Новый Массив);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Тз.Очистить();
Запрос2.УстановитьПараметр("ДатаОкончания", ВыборкаДетальныеЗаписи.ДатаОкончания);
Запрос2.УстановитьПараметр("ДатаНачала", ВыборкаДетальныеЗаписи.ДатаНачала);
РезультатЗапроса2 = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи22 = РезультатЗапроса2.Выгрузить();
ПервыйРаз = Истина;
ВтораяДата = Дата("00010101");
Сч = 1;
Для Каждого ВыборкаДетальныеЗаписи2 ИЗ ВыборкаДетальныеЗаписи22 Цикл
Если ВыборкаДетальныеЗаписи.ДатаНачала = ВыборкаДетальныеЗаписи2.ДатаНачала И ВыборкаДетальныеЗаписи2.ДатаОкончания = ВыборкаДетальныеЗаписи.ДатаОкончания Тогда
Продолжить;
КонецЕсли;
Если ПервыйРаз Тогда
ТЗСтр = ТЗ.Добавить();
ТЗСтр.ДатаС = ВыборкаДетальныеЗаписи2.ДатаОкончания;
ВтораяДата = ВыборкаДетальныеЗаписи2.ДатаОкончания;
Если ВыборкаДетальныеЗаписи22.Количество() = 1 Тогда
ТЗСтр.ДатаПо = ВыборкаДетальныеЗаписи.ДатаОкончания;
КонецЕсли;
ПервыйРаз = Ложь;
Иначе
ТЗСтр = ТЗ.Добавить();
ТЗСтр.ДатаС = ВыборкаДетальныеЗаписи2.ДатаОкончания;
Отбор = Новый Структура;
Отбор.Вставить("ДатаС",ВтораяДата);
Резолт = ТЗ.НайтиСтроки(Отбор);
Резолт[0].ДатаПо = ВыборкаДетальныеЗаписи2.ДатаНачала;
Если Сч = ВыборкаДетальныеЗаписи22.Количество() Тогда
ТЗСтр.ДатаПо = ВыборкаДетальныеЗаписи.ДатаОкончания;
Иначе
ВтораяДата = ВыборкаДетальныеЗаписи2.ДатаОкончания;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Тз.Сортировать("ДатаС УБЫВ",);
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Скажу как можно получить, но это не самый идеальный способ.
Документы, полагаю, проведены с режиме "Утверждено бухгалтером" ?
Тогда читайте виртуальную таблицу РегистрРасчета.Начисления.ФактическийПериодДействия.
Примерно так
Здесь вам сразу и длительность каждого периода в днях по фактическому периоду действия
Если надо учитывать график сотрудника, тогда нужна таблица периодов (с шагом день), она накладывается на "график работы по видам времени" сотрудника, каждому дню периода присваивается "маркер" рабочего или нет, потом всё это соединяется в "Фактическим периодом действия" по условиям вхождения каждого дня в диапазон между датами начала и окончания таблицы ФПД. Ну, в общем, всё это не сложно, если есть понимание ЗУПовских регистров (интервальных), навыки и сноровка.
Документы, полагаю, проведены с режиме "Утверждено бухгалтером" ?
Тогда читайте виртуальную таблицу РегистрРасчета.Начисления.ФактическийПериодДействия.
Примерно так
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияФактическийПериодДействия.ПериодДействия КАК Период,
НачисленияФактическийПериодДействия.ПериодРегистрации КАК ПериодРегистрации,
НачисленияФактическийПериодДействия.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
НачисленияФактическийПериодДействия.Результат КАК Результат,
НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
РАЗНОСТЬДАТ(НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1 КАК ДнейФПД,
НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало,
НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрРасчета.Начисления.ФактическийПериодДействия(Организация = &Организация
И СторноТекущегоПериода = НЕОПРЕДЕЛЕНО) КАК НачисленияФактическийПериодДействия
ГДЕ
НачисленияФактическийПериодДействия.Сотрудник = &Сотрудник
ПоказатьЗдесь вам сразу и длительность каждого периода в днях по фактическому периоду действия
Если надо учитывать график сотрудника, тогда нужна таблица периодов (с шагом день), она накладывается на "график работы по видам времени" сотрудника, каждому дню периода присваивается "маркер" рабочего или нет, потом всё это соединяется в "Фактическим периодом действия" по условиям вхождения каждого дня в диапазон между датами начала и окончания таблицы ФПД. Ну, в общем, всё это не сложно, если есть понимание ЗУПовских регистров (интервальных), навыки и сноровка.
(7) Здравствуйте. Ок, попробую спасибо.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияФактическийПериодДействия.ПериодДействия КАК Период,
НачисленияФактическийПериодДействия.ПериодРегистрации КАК ПериодРегистрации,
НачисленияФактическийПериодДействия.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
НачисленияФактическийПериодДействия.Результат КАК Результат,
НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
РАЗНОСТЬДАТ(НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1 КАК ДнейФПД,
НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало,
НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрРасчета.Начисления.ФактическийПериодДействия(Организация = &Организация
И СторноТекущегоПериода = НЕОПРЕДЕЛЕНО) КАК НачисленияФактическийПериодДействия
ГДЕ
НачисленияФактическийПериодДействия.Сотрудник = &Сотрудник
ПоказатьНачисленияФактическийПериодДействия.ПериодДействия КАК Период,
НачисленияФактическийПериодДействия.ПериодРегистрации КАК ПериодРегистрации,
НачисленияФактическийПериодДействия.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
НачисленияФактическийПериодДействия.Результат КАК Результат,
НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
РАЗНОСТЬДАТ(НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1 КАК ДнейФПД,
НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало,
НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрРасчета.Начисления.ФактическийПериодДействия(Организация = &Организация
И СторноТекущегоПериода = НЕОПРЕДЕЛЕНО) КАК НачисленияФактическийПериодДействия
ГДЕ
НачисленияФактическийПериодДействия.Сотрудник = &Сотрудник
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот