• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы kuza87
  • Дата начала
K

kuza87

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

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

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

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

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

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

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



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

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

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

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

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

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


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

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

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

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

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


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

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



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

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

КонецЕсли;

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

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

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


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

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

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



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

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

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

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





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

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

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

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

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


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

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



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

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

КонецЕсли;

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

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

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


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

Darlock

А зачем весь модуль сюда тащить-то надо было? в каком именно месте у вас проблема?
 
K

kuza87

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

unknown181538

Кажется в РС РаботникиОрганизаций есть ресурс ЗанятыхСтавок
В секцию ПО добавить
И РаботникиОрганизаций.ЗанимаемыхСтавок>0
 
K

kuza87

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

Вложения

  • Запрос.jpg
    Запрос.jpg
    232,4 КБ · Просмотры: 529
U

unknown181538

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

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

kuza87

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

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

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

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

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

Дайнеко

Теперь нужно чтобы в заголовке выводилось подразделение, но не у каждого человека, а у группы людей с одинаковым подразделением, и когда начиналось другое подразделение - чтобы выводился заговоловок с новым именем подразделения перед сотудниками.
Чего проще? Создал переменную "ТекущееПодразделение". В цикле вывода по сотрудникам проверяешь. Если изменилось - вывести его название.
 
K

kuza87

Чего проще? Создал переменную "ТекущееПодразделение". В цикле вывода по сотрудникам проверяешь. Если изменилось - вывести его название.
это понятно, я логику понимаю. Но я начинающий, поэтому проблемы конкретно с кодом. По-русски говоря: Как написать это? Дайте кто-нибудь пример, пожалуйста
 
K

kuza87

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


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

kuza87

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

kuza87

Чего проще? Создал переменную "ТекущееПодразделение". В цикле вывода по сотрудникам проверяешь. Если изменилось - вывести его название.
Ну помогите плиз, я знаю что для вас - самых умных в мире программистов это не составит никакого труда ;)

Добавлено:
Чего проще? Создал переменную "ТекущееПодразделение". В цикле вывода по сотрудникам проверяешь. Если изменилось - вывести его название.
Ну помогите плиз, я знаю что для вас - самых умных в мире программистов это не составит никакого труда :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!