8.х как из запроса обработать тз

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем katod, 13 июн 2017.

  1. TopicStarter Overlay
    katod
    Offline

    katod

    Регистрация:
    30 мар 2017
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте! Подскажите, как в Зарплата и управление персоналом, редакция 3.1 из тз запроса

    фио дата перевода подразделение должность событие
    петров 01.01.2013 подр1 должн1 прием
    петров 01.01.2014 подр2 должн2 перевод
    петров 01.01.2015 подр2 должн2 перевод
    петров 01.01.2016 подр3 должн3 перевод
    иванов 01.01.2014 подр1 должн8 прием
    иванов 01.01.2016 подр3 должн5 перевод

    получить след таблицу (нужно отразить все переводы по подразделению)
    петров 01.01.2013 подр1,должн1(прием) 01.01.2014подр2,должн2(перевод)
    петров 01.01.2014 подр2,должн2 01.01.2015 подр2,должн2
    петров 01.01.2015 подр2,должн2 01.01.2016 подр3,должн3
    иванов 01.01.2014 подр1,должн8 01.01.2016 подр3,должн5
  2. TopicStarter Overlay
    katod
    Offline

    katod

    Регистрация:
    30 мар 2017
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    сделала так и получилось.
    Код:
    аа = 0;    ии=0;
        Для каждого стр из тз цикл
    
            всегостр = тз.Количество();
            сообщить(всегостр);
            для ии = 0 по всегостр-1 цикл
                ОбластьСтрока.Параметры.Сотрудник = стр.Сотрудник;
    
                ОбластьСтрока.Параметры.старМРаб    = тз[ии].Подразделение;
                ОбластьСтрока.Параметры.старОплата  = тз[ии].ДатаПеревода;
    
                ОбластьСтрока.Параметры.новМРаб     = тз[ии+1].Подразделение;
                ОбластьСтрока.Параметры.новОплата   = тз[ии+1].ДатаПеревода;
    
                ТабличныйДокумент.Вывести(ОбластьСтрока);
            конеццикла;
        КонецЦикла;

    но выдает ошибку: Индекс находится за границами массива ОбластьСтрока.Параметры.новМРаб = тз[ии+1].Подразделение; к примеру всего строк 4.
  3. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    143
    Симпатии:
    16
    Баллы:
    29
    это вам надо использовать двойное левое соединение.
    и при условии что у вас правильные данные (т.е. один сотрудник в одну дату не может иметь несколько должностей)
    вот пример (сокращенный)

    Код:
    Выбрать "Петров" как Сотрудник, ДатаВремя(2014,1,1) как Дата, "Должн1" как Должность поместить Таб
    объединить все Выбрать "Петров", ДатаВремя(2014,5,1), "Должн2"
    объединить все Выбрать "Петров", ДатаВремя(2015,2,1), "Должн3"
    объединить все Выбрать "Петров", ДатаВремя(2016,7,1), "Должн5"
    объединить все Выбрать "Иванов", ДатаВремя(2017,1,1), "Должн1"
    объединить все Выбрать "Иванов", ДатаВремя(2017,5,1), "Должн2"
    ;
    
    //выбрать * из Таб
    
    
    выбрать
        Таб.Сотрудник,
        Т1.Дата как ПредыдущаяДата,
        Т1.Должность как ПредыдущаяДолжность,
        Таб.Дата,
        Таб.Должность
    из Таб
    
    левое соединение Таб Т1
        по Таб.Сотрудник = Т1.Сотрудник
        и Таб.Дата > Т1.Дата
    
    левое соединение Таб Т2
        по Таб.Сотрудник = Т2.Сотрудник
        и Таб.Дата > Т2.Дата
        и Т1.Дата < Т2.Дата
    
    где
        Истина
    и    Т1.Сотрудник Есть не Null //если у сотрудника одна запись, закоментарить
    и    Т2.Сотрудник Есть Null
    
    упорядочить по
    1,2
  4. TopicStarter Overlay
    katod
    Offline

    katod

    Регистрация:
    30 мар 2017
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    с двойным левым не стала делать.
    там иначе запрос построен. т.к. надо еще было прием вытаскивать
    сделала так и так заработало:

    ии=0; номер = 0;
    всегостр = тз.Количество();
    Для каждого стр1 из тз цикл
    Для каждого стр2 из тз цикл
    Если СокрЛП(стр1.сотрудник) = СокрЛП(стр2.сотрудник) И СокрЛП(стр1.Дата1) = СокрЛП(стр2.Дата1) тогда
    Продолжить;
    ИначеЕсли СОкрЛП(стр1.сотрудник) = СокрЛП(стр2.сотрудник) И СокрЛП(стр1.Дата1) <> СокрЛП(стр2.Дата1) И ии<>всегостр-1 Тогда

    ОбластьСтрока.Параметры.номерПП = номер+1;
    ОбластьСтрока.Параметры.Сотрудник = стр1.Сотрудник;

    ОбластьСтрока.Параметры.старМРаб = тз[ии].ПодразделениеПолное + Символы.ПС + тз[ии].Должность + Символы.ПС + Формат(тз[ии].Дата1,"ДЛФ=Д") ;
    ОбластьСтрока.Параметры.старОплата = тз[ии].Оплата;

    ОбластьСтрока.Параметры.новМРаб = тз[ии+1].ПодразделениеПолное + Символы.ПС + тз[ии+1].Должность + Символы.ПС + Формат(тз[ии+1].Дата1,"ДЛФ=Д");
    ОбластьСтрока.Параметры.новОплата = тз[ии+1].Оплата + Символы.ПС + тз[ии+1].Оклад;

    ТабличныйДокумент.Вывести(ОбластьСтрока);
    номер = номер + 1;
    ии = ии+1;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

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