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

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

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

   //добавляем массив для разбиения на страницы
   
   ВыводимыеОбласти = Новый Массив();
   ВыводимыеОбласти.Добавить(ОбластьМакетаСтрока);
   
   //заполняем строки
   Пока Выборка.Следующий()Цикл
       ВыборкаСумма = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Пока ВыборкаСумма.Следующий()Цикл
       ВыборкаПодразделение = ВыборкаСумма.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Если ВыборкаПодразделение.Следующий() тогда    
       ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаПодразделение);
       иначе ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСумма);
       
       КонецЕсли;
       // разбиение на страницы
       //ВыведеноСтрок = ВыведеноСтрок + 1;
       
   // Проверим, уместится ли строка на странице или надо открывать новую страницу
       ВывестиПодвалЛиста = Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти);
       
       
       
       Если ВывестиПодвалЛиста Тогда
           
           ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
           ТабДокумент.Вывести(ОбластьМакетаШапка);
           //ВыведеноСтраниц = ВыведеноСтраниц + 1;
           КонецЕсли;
       
               ТабДокумент.Вывести(ОбластьМакетаСтрока);
   
   КонецЦикла;
   КонецЦикла;
           
   ВыводимыеОбласти = Новый Массив();
   ВыводимыеОбласти.Добавить(ОбластьМакетаСтрока);
   ВыводимыеОбласти.Добавить(ОбластьМакетаПодвал);
   
   
   //Пока ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти, Ложь) Цикл
   //    ТабДокумент.Вывести(ОбластьМакетаСтрока);
   //КонецЦикла;
   
   
   ТабДокумент.Вывести(ОбластьМакетаПодвал);
   
   Возврат ТабДокумент;

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





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

//заполняем строки
   Пока Выборка.Следующий()Цикл
       ВыборкаСумма = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Пока ВыборкаСумма.Следующий()Цикл
       ВыборкаПодразделение = ВыборкаСумма.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Если ВыборкаПодразделение.Следующий() тогда    
       ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаПодразделение);
       иначе ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСумма);
       
       КонецЕсли;
       // разбиение на страницы
       //ВыведеноСтрок = ВыведеноСтрок + 1;
       
   // Проверим, уместится ли строка на странице или надо открывать новую страницу
       ВывестиПодвалЛиста = Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти);
       
       
       
       Если ВывестиПодвалЛиста Тогда
           
           ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
           ТабДокумент.Вывести(ОбластьМакетаШапка);
           //ВыведеноСтраниц = ВыведеноСтраниц + 1;
           КонецЕсли;
       
               ТабДокумент.Вывести(ОбластьМакетаСтрока);
   
   КонецЦикла;
   КонецЦикла;

Т.е. добавил 2 цикла.
Вопрос как мне сделать так чтобы я смог сформировать список по подразделениям, и люди не двоились
1 kuza_87
 
11.05.12
09:21
в идеале можно было бы сделать это в запросе, чтобы выбиралось подразделение на такую же дату как и дата документа, но я не знаю как. Помогите кто может плиз
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс