Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 июл 2024, 06:50

Запрос из регистра сведений

Автор programmister, 16 июл 2018, 10:32

0 Пользователей и 1 гость просматривают эту тему.

programmister

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

Alex26

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

      стр = Объект.ТабЧасть.Добавить(); //ТабЧасть это на форме Табличную часть создай с полями Колонка, ДатаНач, ДатаОкон
      стр.Колонка = ТЗ.ВидОтклонения;
      стр.ДатаНач = ТЗ.ДатаНачала;
      стр.ДатаОкон = ТЗ.ДатаОкончания;

КонецЦикла;

LexaK

дело не в запросе,

а в обработке результата
сразу одна из явных ошибок
для всего цикла, вы берете только одну(первую) строку из таблицы результатов ТЗ[0]
ну и т.д.
если помогло нажмите: Спасибо!

programmister

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

         ИначеЕсли Колонка = "бл" Тогда
            бл = бл + 1;
         ИначеЕсли Колонка = "ко" Тогда
            ко = ко+1;
         КонецЕсли;
         
         Если Номер = 15 Тогда
            ЧМ1 = ЧМ;
            ДМ1 = ф;
         КонецЕсли;
      КонецЦикла;
      //
      Строка.ОтработаноМесяцДней = ф;
      Строка.Отпуск = от;
      Строка.Болезнь = бл;
      Строка.ОтпускБезСодержания = бс;
      Строка.Командировка = ко;
      Строка.ОтработаноМесяцЧасов = ЧМ;
      Строка.Отработано1дней = ДМ1;
      Строка.Отработано1часов = ЧМ1;
      Строка.Отработано2дней = ф - ДМ1;
      Строка.Отработано2часов = ЧМ - ЧМ1;
   КонецЦикла;
Все равно заполняет только первое значение из регистра

Alex26

Цитата: programmister от 16 июл 2018, 12:35

         Если ТЗ.Количество() > 0 Тогда
         Если (Номер >= ДЕНЬ(ТЗ[0].ДатаНачала)) и (Номер <= ДЕНЬ(ТЗ[0].ДатаОкончания)) и (Колонка = "я") Тогда
Все равно заполняет только первое значение из регистра
ты когда пишешь ТЗ[0] то автоматически берется первая строка из запроса остальные откидываются, я тебе написал же запрос выше, чем тебя не устраивает? что ты заполняешь?

LexaK

так ТЗ[0] по прежнему во всех циклах :D
если помогло нажмите: Спасибо!

programmister

Заполняю колонки в тч в которых числа месяца с 1 по 31 и снизу рабочее время сотрудника явка командировка и т.д. поэтому условие есть что Если (Номер >= ДЕНЬ(ТЗ[0].ДатаНачала)) и (Номер <= ДЕНЬ(ТЗ[0].ДатаОкончания)) и (Колонка = "я") Тогда
               Колонка = НРег(Лев(ТЗ[0].ВидОтклонения,2));
               Строка["Колонка" + Номер] = Колонка;
а как сюда прикрутить то что вы предложили незнаю<_<

Alex26


programmister

Бухгалтерия 2.0 самописная обработка

LexaK

вам даже пример выложили

Пока ТЗ.Следующий Цикл
и т.д.
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск