Объединение Справочников Через Тз

  • Автор темы nestovby
  • Дата начала
N

nestovby

Гость
#1
Вновь возвращаюсь к моей проблеме с обьединением нескольких справочников (3-ех). С запросами не получилось решить проблему http://codeby.net/forum/threads/45776.html
По советам сделал через Таблицу Значений, но результат точно такой же - не получается вывести все в одной строке.
вот картинка:
новый_1с.jpg
Нужно чтобы выделенные ставки выводились напротив свох Степеней и Званий, а они выводятся отдельно.
Вроде бы правильно написал "Свернуть", но видимо как-то ошибка в структуре вывода справочников. Не могу никак понять в чем ошибка.
Подскажите, пожалуйста, как мне решить мою ошибку и в чем я не прав.
Я вывожу сначала главный справочник, потом по отдельности два других - но видимо это не правильно, так где же мне их вывести?.
вот мой код:
Код:
Процедура Сформировать()
перем пд, ИтогоЗаСтепень, ИтогоЗаЗвание;
Таб=СоздатьОбъект("ТаблицаЗначений");
Если Подр=1 Тогда
Таб.НоваяКолонка("Подразделение","Справочник.Подразделения");
КонецЕсли;
СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
ПрикДл=СоздатьОбъект("Справочник.ПриказыДлительногоДействия");
КадрДанные=СоздатьОбъект("Справочник.КадровыеДанные");
ДопУчСт= СоздатьОбъект("Справочник.ДоплатыЗаУченуюСтепень");
ДопУчЗв= СоздатьОбъект("Справочник.ДоплатыЗаУченыеЗвания");
Таб.НоваяКолонка("Степень2","перечисление.УченаяСтепень");
Таб.НоваяКолонка("Степень","перечисление.УченаяСтепень");
Таб.НоваяКолонка("Ставка","Число",4,2);
Таб.НоваяКолонка("ЧислоСтавокНеППС","Число",4,2);
Таб.НоваяКолонка("ЧислоСтавокДляППС","Число",4,2);
Таб.НоваяКолонка("Звание","Перечисление.УченоеЗвание");												
Таб.НоваяКолонка("Звание2","Перечисление.УченоеЗвание"); 
Таб.НоваяКолонка("Совместитель","Справочник.ВнутренниеСовместители");
СпрСотр.ИспользоватьДату(ДатаОт);
СпрСотр.ПорядокНаименований();
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
Если СпрСотр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Если СпрСотр.Родитель = СпрУволенные Тогда
Продолжить;
КонецЕсли;
Если (СпрСотр.ВидРаботника=Перечисление.ВидыРаботников.ТрудовойДоговор) Тогда
Продолжить;
КонецЕсли;

ПрикДл.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
ПрикДл.ВыбратьЭлементы();
Пока ПрикДл.ПолучитьЭлемент()=1 Цикл
пр=0;
Если (ПрикДл.Приказ.Вид()="ПостоянныеНачисленияУдержания") и (ПрикДЛ.Приказ.ВидРасч=ВидРасчета.ПрочиеНачисления) Тогда
Если (ПрикДл.Приказ.Вид.Код="4") или (ПрикДл.Приказ.Вид.Код="5") Тогда
пр=1;
КонецЕсли;
Если пр=1 Тогда
Сообщить(СпрСотр.Наименование);
КадрДанные.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
КадрДанные.ВыбратьЭлементы();
пока кадрДанные.ПолучитьЭлемент()=1 цикл
Таб.НоваяСтрока();
Таб.Степень=КадрДанные.УченаяСтепень.ученаястепень;
Таб.Звание=КадрДанные.УченоеЗвание;
// Таб.Зв=?(ПустоеЗначение(КадрДанные.УченоеЗвание)=1,ДопУчЗв.УченоеЗвание,КадрДанные.УченоеЗвание);  
Таб.Ставка=?(ПустоеЗначение(ПрикДл.Приказ.ВнСовместитель)=1,СпрСотр.Ставка,ПрикДл.Приказ.ВнСовместитель.Ставка.Получить(ДатаОт));  
Таб.Совместитель=ПрикДл.Приказ.ВнСовместитель;
конеццикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;																 

// ПЕРВЫЙ СПРАВОЧНИК Я ВЫВЕЛ ПРАВИЛЬНО, ТЕПЕРЬ ВЫВОЖУ ДВА ДРУГИХ. МОЖЕТ БЫТЬ ИХ НУЖНО ГДЕ-ТО В ДРУГОМ МЕСТЕ ВЫВЕСТИ, ЧТОБЫ СОЕДИНИТЬ ОДИНАКОВЫЕ ПОЛЯ? 

ДопУчЗв.выбратьэлементы();
пока ДопУчЗв.получитьЭлемент()=1 цикл
Таб.НоваяСтрока();
Таб.Звание2=ДопУчЗв.УченоеЗвание;
Таб.ЧислоСтавокДляППС=ДопУчЗв.ЧислоСтавокДляППС.Получить(ДатаОт);
конеццикла; 

ДопУчСт.выбратьэлементы();
пока ДопУчСт.получитьэлемент()=1 цикл
Таб.НоваяСтрока();			 
Таб.Степень2=ДопУчСт.УченаяСтепень;
Таб.ЧислоСтавокНеППС=ДопУчСт.ЧислоСтавокНеППС;						
конеццикла;	 

Таб.Свернуть("Степень,звание,Степень2,Звание2,Совместитель,ЧислоСтавокНеППС,ЧислоСтавокДля
ППС","Ставка");

ТабД=СоздатьОбъект("Таблица");
ТабД.ВывестиСекцию("Заголовок");
ТабД.ПовторятьПриПечатиСтроки(3,3);
ТабД.ВывестиСекцию("Шапка");
Если Подр=1 Тогда
Таб.Сортировать("Ставка");
Иначе
Таб.Сортировать("Ставка");
КонецЕсли;
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
ТабД.ВывестиСекцию("Строка");
КонецЦикла;
КС=ТабД.КоличествоСтраниц();
ТабД.ВывестиСекцию("Итого");
ТабД.Показать("Доплаты за степень и звание");
КонецПроцедуры
ДатаОт=ТекущаяДата();
СтрОрг=Перечисление.СтруктураОрганизации.ОсновнойСостав;
Подр=1;
 

vbs

Well-Known Member
18.02.2007
1 708
3
#2
Код читать очень долго, но, кажется, должна выручить группировка ТЗ
 

Darlock

Well-Known Member
04.01.2008
560
1
#4
vbs, с моей колокольни. Группировка не совсем поможет.в том топике предложили использовать СКД. а сейчас увидв скрин, стало гораздо яснее. только СКД и поможет. там и группировки развернуть можно.

nestovby, опыт в 7.7 хорошая вещь, но не в этом вопросе. Обратите свой взор на возможности 8.1 (8.2) в плане СКД, а в частности на ресурсы. С их помощью ваша задача может быть ршена.
 
N

nestovby

Гость
#5
опыт в 7.7 хорошая вещь, но не в этом вопросе. Обратите свой взор на возможности 8.1 (8.2) в плане СКД, а в частности на ресурсы. С их помощью ваша задача может быть ршена.
да, но я ищу возможности решения в 7.7 версии
 
N

nestovby

Гость
#6
вот пишу такой код:
Код:
	СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
Если СпрСотр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Если ПустоеЗначение(СпрУволенные)=0 Тогда //бред
Если СпрСотр.Родитель = СпрУволенные Тогда
Продолжить;
КонецЕсли;
КонецЕсли;	

Если (СпрСотр.ВидРаботника=Перечисление.ВидыРаботников.ТрудовойДоговор) Тогда
Продолжить;
КонецЕсли;

ПрикДл.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
ПрикДл.ВыбратьЭлементы();
Пока ПрикДл.ПолучитьЭлемент()=1 Цикл
пр=0;
Если (ПрикДл.Приказ.Вид()="ПостоянныеНачисленияУдержания") и (ПрикДЛ.Приказ.ВидРасч=ВидРасчета.ПрочиеНачисления) Тогда
Если (ПрикДл.Приказ.Вид.Код="4") или (ПрикДл.Приказ.Вид.Код="5") Тогда
пр=1;
КонецЕсли;
Если (пр=1) и (ПустоеЗначение(ПрикДл.Приказ.ВнСовместитель)=0) и (ПрикДл.Приказ.ВнСовместитель.ДатаУвольнения<>Дата(0)) и (ПрикДл.Приказ.ВнСовместитель.ДатаУвольнения<ДатаОт) Тогда
пр=0;
КонецЕсли;
Если пр=1 Тогда
Сообщить(СпрСотр.Наименование); 

КадрДанные.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
КадрДанные.ВыбратьЭлементы();
пока кадрДанные.ПолучитьЭлемент()=1 цикл 
Таб.НоваяСтрока();
Таб.Степень=КадрДанные.УченаяСтепень.ученаястепень;
Таб.Звание=КадрДанные.УченоеЗвание;
Таб.Ставка=?(ПустоеЗначение(ПрикДл.Приказ.ВнСовместитель)=1,СпрСотр.Ставка,ПрикДл.Приказ.ВнСовместитель.Ставка.Получить(ДатаОт));				

Таб.Совместитель=ПрикДл.Приказ.ВнСовместитель;

Если ДопУчЗв.НайтиЭлемент(КадрДанные.УченоеЗвание,,УченоеЗвание)=1 Тогда
Таб.ЧислоСтавокДляППС=ДопУчЗв.ЧислоСтавокДляППС.Получить(ДатаОт);
Иначе
Сообщить("Не нашли "+КадрДанные.УченоеЗвание);
КонецЕсли;

Если ДопУчСт.НайтиЭлемент(КадрДанные.УченаяСтепень.УченаяСтепень)=1 Тогда 
Таб.ЧислоСтавокНеППС=ДопУчСт.ЧислоСтавокНеППС.Получить(ДатаОт); 
Иначе
Сообщить("Не нашли "+КадрДанные.УченаяСтепень.УченаяСтепень);
КонецЕсли;	 
конеццикла;
КонецЕсли;
КонецЕсли;
и не выводит ЧислоСтавокНеППС и ЧислоСтавокДляППС. Не находит элемент ДопУчСт.НайтиЭлемент(КадрДанные.УченаяСтепень.УченаяСтепень)
не пойму в чем дело.