Внешняя Печатная Форма Для Зупа

Тема в разделе "1C и всё что с ней связано", создана пользователем kuza87, 11 май 2012.

  1. kuza87

    kuza87 Гость

    Делал внешнюю печатная форма к ЗУП к документу "Зарплата к выплате". Там впринципе всё просто. Формирует список людей в алфавитном порядке. Расчётчики сказали мне переделать её, чтобы группировалась по подразделениям. Но тут возникла трудность. Когда выполняется запрос люди дублируются из-за подразделений, т.к. данные о подразделениях берутся из регистра, а там у людей много подразделений (были перемещения) и он отображает в каждой строчке выплату денег с каждым из подразделений.
    выглядит код вот так:

    + Code
    Функция ПечатьРеестр() Экспорт
    Запрос=Новый Запрос;

    Запрос.Текст = "ВЫБРАТЬ
    | ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо КАК Физлицо,
    | ЗарплатаКВыплатеОрганизацийЗарплата.Сумма КАК Сумма,
    | ЕСТЬNULL(РаботникиОрганизацийСрезПоследних.Сотрудник.ПодразделениеОрганизации, ДоговорНаВыполнениеРаботСФизЛицом.ПодразделениеОрганизации) КАК СотрудникПодразделениеОрганизации,
    | РаботникиОрганизацийСрезПоследних.Период КАК Период,
    | ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Номер КАК Номер,
    | ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата КАК Дата
    |ИЗ
    | Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних
    | ПО ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо = РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом
    | ПО ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо = ДоговорНаВыполнениеРаботСФизЛицом.ФизЛицо
    |ГДЕ
    | ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка = &Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    |ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо.Наименование,
    |Период УБЫВ
    |ИТОГИ ПО
    | Физлицо,
    | Сумма";

    Запрос.Параметры.Вставить("Период",СсылкаНаОбъект.Дата);
    Запрос.Параметры.Вставить("Ссылка",СсылкаНаОбъект.Ссылка); //ЗНАЧЕНИЕ(Документ.ЗарплатаКВыплатеОрганизаций.ПустаяСсылка)

    РезультатЗапроса=Запрос.Выполнить();
    Выборка=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией );//ПоГруппировкам/Прямой

    //ТЗ=РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);//ПоГруппировкам/Прямой

    //ТЗ.ВыбратьСтроку();



    //формирование табличного документа с печатной формой

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ПолеСлева = 0;
    ТабДокумент.ПолеСправа = 0;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗарплатаКВыплатеОрганизаций_Реестр";

    Макет = ПолучитьМакет("Реестр");

    ОбластьМакетаЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");

    ТабДокумент.Вывести(ОбластьМакетаЗаголовок);
    ОбластьМакетаШапка.Параметры.Номер = СсылкаНаОбъект.Номер;
    ОбластьМакетаШапка.Параметры.Дата = СсылкаНаОбъект.Дата;
    ОбластьМакетаШапка.Параметры.КакВыплачено = СсылкаНаОбъект.СпособВыплаты;
    ТабДокумент.Вывести(ОбластьМакетаШапка);

    //добавляем массив для разбиения на страницы


    ВыводимыеОбласти = Новый Массив();
    ВыводимыеОбласти.Добавить(ОбластьМакетаСтрока);

    //заполняем строки

    Пока Выборка.Следующий()Цикл
    ВыборкаСумма = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Пока ВыборкаСумма.Следующий()Цикл
    ВыборкаПодразделение = ВыборкаСумма.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Если ВыборкаПодразделение.Следующий() тогда
    ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаПодразделение);
    иначе ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСумма);

    КонецЕсли;
    // разбиение на страницы

    //ВыведеноСтрок = ВыведеноСтрок + 1;


    // Проверим, уместится ли строка на странице или надо открывать новую страницу

    ВывестиПодвалЛиста = Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти);



    Если ВывестиПодвалЛиста Тогда

    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    //ВыведеноСтраниц = ВыведеноСтраниц + 1;

    КонецЕсли;

    ТабДокумент.Вывести(ОбластьМакетаСтрока);

    КонецЦикла;
    КонецЦикла;

    ВыводимыеОбласти = Новый Массив();
    ВыводимыеОбласти.Добавить(ОбластьМакетаСтрока);
    ВыводимыеОбласти.Добавить(ОбластьМакетаПодвал);


    //Пока ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти, Ложь) Цикл

    // ТабДокумент.Вывести(ОбластьМакетаСтрока);

    //КонецЦикла;



    ТабДокумент.Вывести(ОбластьМакетаПодвал);

    Возврат ТабДокумент;

    КонецФункции
    Функция Печать () Экспорт
    Возврат ПечатьРеестр();

    КонецФункции





    Чтобы в макете люди не дублировались я сделал вот так:

    + Code
    //заполняем строки

    Пока Выборка.Следующий()Цикл
    ВыборкаСумма = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Пока ВыборкаСумма.Следующий()Цикл
    ВыборкаПодразделение = ВыборкаСумма.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Если ВыборкаПодразделение.Следующий() тогда
    ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаПодразделение);
    иначе ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСумма);

    КонецЕсли;
    // разбиение на страницы

    //ВыведеноСтрок = ВыведеноСтрок + 1;


    // Проверим, уместится ли строка на странице или надо открывать новую страницу

    ВывестиПодвалЛиста = Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти);



    Если ВывестиПодвалЛиста Тогда

    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    //ВыведеноСтраниц = ВыведеноСтраниц + 1;

    КонецЕсли;

    ТабДокумент.Вывести(ОбластьМакетаСтрока);

    КонецЦикла;
    КонецЦикла;

    Т.е. добавил 2 цикла.
    Вопрос как мне сделать так чтобы я смог сформировать список по подразделениям, и люди не двоились


    в идеале можно было бы сделать это в запросе, чтобы выбиралось подразделение на такую же дату как и дата документа, но я не знаю как. Помогите кто может плиз
     
  2. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    А зачем весь модуль сюда тащить-то надо было? в каком именно месте у вас проблема?
     
  3. kuza87

    kuza87 Гость

    проблема у меня ещё в самом запросе. когда выполняю запрос то один и тот же человек выходит несколько раз, со всеми подразделениями в которых он когда либо был. Можно ли как нибудь в запросе при помощи параметра "АктуальнаяДата" сделать так что когда выполнятся запрос человек выходил только один раз с подразделением актуальным на дату создания документа?
     
  4. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Кажется в РС РаботникиОрганизаций есть ресурс ЗанятыхСтавок
    В секцию ПО добавить
    И РаботникиОрганизаций.ЗанимаемыхСтавок>0
     
  5. kuza87

    kuza87 Гость

    Спасибо тебе огромное! Ты лучший!!!
    Только ещё одна проблема осталась. Люди которые работают по договору а не на постоянке всё равно дублируются. Они выходят столько раз сколько сколько раз с сотрудником был заключен договор подряда. Я попробовал сделать так:
    ЕСТЬNULL(ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.ДатаДоговора, РаботникиОрганизацийСрезПоследних.Период) КАК Период
    Но не помогло. Если есть мысля, подскажи.
     

    Вложения:

  6. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Тогда не поленитесь лучшему плюсик прибавить.
     
  7. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    А что ты вытаскиваешь вот этим:
    | РаботникиОрганизацийСрезПоследних.Период КАК Период,

    Можно еще попробовать сгруппировать с функцией МАКСИМУМ, но это определяется задачей.
     
  8. kuza87

    kuza87 Гость

    Всем спасибо за советы, почему-то плюсы никому поставить не могу. Всё-таки я решил проблему другим способом:

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

    Затем заполняем строки при формировании документа:

    Для Каждого Сотрудник из ТЗ.Строки Цикл
    ЗаполнитьЗначенияСвойств(Стр1, Стр1.Строки [0]);
    ОбластьМакетаСтрока.Параметры.Заполнить(Сотрудник);

    Но возникла ещё одна трудность. Я создал новую область "Подразделение" с таким же параметром "СотрудникПодразделениеОрганизации" как и в строке. Теперь нужно чтобы в заголовке выводилось подразделение, но не у каждого человека, а у группы людей с одинаковым подразделением, и когда начиналось другое подразделение - чтобы выводился заговоловок с новым именем подразделения перед сотудниками.
     
  9. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Чего проще? Создал переменную "ТекущееПодразделение". В цикле вывода по сотрудникам проверяешь. Если изменилось - вывести его название.
     
  10. kuza87

    kuza87 Гость

    это понятно, я логику понимаю. Но я начинающий, поэтому проблемы конкретно с кодом. По-русски говоря: Как написать это? Дайте кто-нибудь пример, пожалуйста
     
  11. kuza87

    kuza87 Гость

    //заполняем строки
    ПодразделениеДляСравнения = Неопределено;
    Для Каждого Сотрудник из ТЗ.Строки Цикл
    ЗаполнитьЗначенияСвойств(Стр1, Стр1.Строки [0]);
    ОбластьМакетаСтрока.Параметры.Заполнить(Сотрудник);
    ОбластьМакетаПодразделение.Параметры.Заполнить(Сотрудник);
    Если Сотрудник<>ПодразделениеДляСравнения тогда
    ТабДокумент.Вывести(ОбластьМакетаПодразделение);
    КонецЕсли;


    Добавлено: что здесь не так?
     
  12. kuza87

    kuza87 Гость

    на самом деле я вижу что не так, но как мне сделать чтобы цикл каждое значение сравнивал с предыдущим, а не с начальным неопределенным?
     
  13. kuza87

    kuza87 Гость

    Ну помогите плиз, я знаю что для вас - самых умных в мире программистов это не составит никакого труда ;)

    Добавлено:
    Ну помогите плиз, я знаю что для вас - самых умных в мире программистов это не составит никакого труда :)
     
Загрузка...

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