Имя: Пароль:
1C
1C 7.7
v7: Периодический реквизит получить все значения
,
0 ded20ded
 
11.05.13
16:52
Добрый день

с помощью получаю все заполненные у сотрудника ПКГ (пусть для примера подразделения)

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

а как получить все данные ПКГ (подразделения) и привязать к ним сотрудников и получить ПКГ СОТРУДНИКИ и ПКГ у которых не выбран ни один сотрудник?
1 Svetka
 
11.05.13
16:57
(0) Вам нужно вывести все подразделения и кто когда в них работал/не работал?
2 ded20ded
 
11.05.13
16:59
Мне нужно вывести все подразделения, всех людей которые работали в этих подразделениях и если есть подразделения пустышки их тоже вывести.
3 Svetka
 
11.05.13
17:05
ТЗПодр - справочник подразделения
ТЗСотр - История по сотрудникам реквизита подразделения
ТЗИтог - влить  ТЗПодр и ТЗСотр и свернуть по реквизиту подразделения
4 ded20ded
 
11.05.13
17:07
пример можно?
5 Svetka
 
11.05.13
17:08
6 Svetka
 
11.05.13
17:15
или
перебираешь справочник подразделения, спозиционировался, идешь в справочник сотрудники и перебираешь историю реквизита подразделения. Если совпадает - выводишь сотрудника.

Т.е. придется перелопатить справочник сотрудники столько раз, сколько элементов с правочнике подразделения.
7 EvgeniuXP
 
11.05.13
17:22
или

заполнить одну таблицу подразделениями

заполнить другую таблицу сотрудниками с историей

сделать соединение двух таблиц

1С++
8 sttt
 
11.05.13
18:32
(6) землячка))
9 ded20ded
 
11.05.13
19:00
Сделал так

Процедура Сформировать()
   
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   Таб.ВывестиСекцию("Шапка");
   Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);    

   
   ТЗПКГ = СоздатьОбъект("ТаблицаЗначений");
   ТЗПКГ.НоваяКолонка("Родитель",,,);
   ТЗПКГ.НоваяКолонка("ПКГ",        "Справочник.ПКГ");
   ТЗПКГ.НоваяКолонка("Оклад",    "Число", 19,2);
   
   ТЗПКГСотрудник = СоздатьОбъект("ТаблицаЗначений");
   ТЗПКГСотрудник.НоваяКолонка("ПКГ",        "Справочник.ПКГ");
   ТЗПКГСотрудник.НоваяКолонка("Родитель",,,);
   ТЗПКГСотрудник.НоваяКолонка("Оклад",    "Число", 19,2);
   ТЗПКГСотрудник.НоваяКолонка("Сотрудник",        "Справочник.Сотрудники");
   ТЗПКГСотрудник.НоваяКолонка("ОкладС",    "Число", 19,2); //оклад у сотрудника
   ТЗПКГСотрудник.НоваяКолонка("Дата",    "Дата",,);
   

   ТЗПКГОбщий = СоздатьОбъект("ТаблицаЗначений");
   ТЗПКГОбщий.НоваяКолонка("ПКГ",        "Справочник.ПКГ");
   ТЗПКГОбщий.НоваяКолонка("Родитель",,,);
   ТЗПКГОбщий.НоваяКолонка("Оклад",    "Число", 19,2);
   ТЗПКГОбщий.НоваяКолонка("Сотрудник",        "Справочник.Сотрудники");
   ТЗПКГОбщий.НоваяКолонка("ОкладС",    "Число", 19,2); //оклад у сотрудника
   ТЗПКГОбщий.НоваяКолонка("Дата",    "Дата",,);
   
   
   пер=создатьобъект("Периодический");
   СпрСотрудники = СоздатьОбъект("Справочник.Сотрудники");
   СпрСотрудники.ВыбратьЭлементы();
   
   Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
       
       Если СпрСотрудники.ЭтоГруппа()=0 Тогда
           
           Если СпрСотрудники.ОсновнойЭлемент=СпрСотрудники.ТекущийЭлемент() Тогда
               
               пер.ИспользоватьОбъект("ПКГ",СпрСотрудники.ТекущийЭлемент());
               пер.выбратьзначения(НачДата,КонДата);
               
               Пока пер.получитьЗначение()=1 цикл
                   Оклад=СпрСотрудники.Оклад.Получить(пер.ДатаЗнач);
                   сообщить("!!! "+СокрЛП(СпрСотрудники.ТекущийЭлемент())+" Оклад "+Оклад +" "+пер.ДатаЗнач+" Значение: "+СокрЛП(пер.Значение)+" "+пер.Значение.Родитель+" док "+пер.ТекущийДокумент()+" оклад по ПКГ "+пер.Значение.Оклад);
                   ТЗПКГСотрудник.НоваяСтрока();
                   ТЗПКГСотрудник.ПКГ = СокрЛП(пер.Значение);
                   ТЗПКГСотрудник.Родитель = СокрЛП(пер.Значение.Родитель);
                   ТЗПКГСотрудник.Оклад = Число(пер.Значение.Оклад);
                   ТЗПКГСотрудник.Сотрудник = СпрСотрудники.ТекущийЭлемент();
                   ТЗПКГСотрудник.ОкладС = Число(Оклад);
                   ТЗПКГСотрудник.Дата = пер.ДатаЗнач;
               КонецЦикла;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   СпрПКГ = СоздатьОбъект("Справочник.ПКГ");
   СпрПКГ.ВыбратьЭлементы();
   
   Пока СпрПКГ.ПолучитьЭлемент() = 1 Цикл
       Если СпрСотрудники.ЭтоГруппа()=0 Тогда
           ТЗПКГ.НоваяСтрока();
           ТЗПКГ.Родитель = СокрЛП(СпрПКГ.Родитель);
           ТЗПКГ.ПКГ = СпрПКГ;
           ТЗПКГ.Оклад = Число(СпрПКГ.Оклад);
           Сообщить("Родитель "+СпрПКГ.Родитель+" Наименование "+СпрПКГ+" Оклад "+СпрПКГ.Оклад);
       КонецЕсли;
   КонецЦикла;
   
   ТЗПКГ.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад");
   ТЗПКГСотрудник.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад,Сотрудник, ОкладС, Дата");
//    ТЗПКГОбщий.Свернуть("Родитель, ПКГ, Оклад","Сотрудник, ОкладС, Дата");
   
   ТЗПКГОбщий.ВыбратьСтроки();
   ННомер = 0;
   Пока ТЗПКГОбщий.ПолучитьСтроку() = 1 Цикл
       ННомер = ННомер +1;
       Родитель = СокрЛП(ТЗПКГОбщий.Родитель);
       ПКГ = СокрЛП(ТЗПКГОбщий.ПКГ);
       Оклад = ТЗПКГОбщий.Оклад;
       Сотрудник = СокрЛП(ТЗПКГОбщий.Сотрудник);
       ОкладС = ТЗПКГОбщий.ОкладС;
       ТДата =ТЗПКГОбщий.Дата;
       Таб.ВывестиСекцию("Строка");
   КонецЦикла;  
   
   Таб.ВывестиСекцию("Подвал");
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать","");

КонецПроцедуры


Но все равно не вижу пустые ПКГ у которых нет привязанных сотрудников

ПКГ справочник у спр. Сотрудники поле с выбором ПКГ

Хочу получить весь справочник ПКГ с выбранными Сотрудниками и датой выбора
10 sttt
 
11.05.13
19:04
у тебя есть типовая конфигурация? если есть, там есть обработка ЗначенияПериодическихРеквизитов посмотри как сделано
11 viktor_vv
 
11.05.13
19:07
Выгрузить для ТЗ удаляет строки из ТЗ азначения
12 viktor_vv
 
11.05.13
19:10
ТЗПКГ.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад"); ТЗПКГСотрудник.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад,Сотрудник, ОкладС, Дата");
13 viktor_vv
 
11.05.13
19:13
Выгрузи по сотрудникам, а потом в цикле добей не встречающимися в ТЗПКГСотрудник.
14 sttt
 
11.05.13
19:13
(12) это вообще бесполезная строка
15 viktor_vv
 
11.05.13
19:20
(14) Ну я и показал где косяк.
Вообще да, выгружать никуда не надо, в ТЗПКГСотрудник добить остальными ПКГ.
16 sttt
 
11.05.13
19:29
костыль:
это заменить
   ТЗПКГ.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад");
   ТЗПКГСотрудник.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад,Сотрудник, ОкладС, Дата");
//    ТЗПКГОбщий.Свернуть("Родитель, ПКГ, Оклад","Сотрудник, ОкладС, Дата");
на
   //ТЗПКГ.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад");
   ТЗПКГСотрудник.Выгрузить(ТЗПКГОбщий, , ,"Родитель, ПКГ, Оклад,Сотрудник, ОкладС, Дата");
//    ТЗПКГОбщий.Свернуть("Родитель, ПКГ, Оклад","Сотрудник, ОкладС, Дата");

и в последнем цикле удалять имеющиеся в ТЗПКГ, остаток вывести после цикла
17 Svetka
 
11.05.13
19:45
(8) ))привет
18 sttt
 
11.05.13
19:48
(17) эти приветы удаляют))
19 ded20ded
 
11.05.13
21:07
Добрый вечер
сделал
http://saveimg.ru/show-image.php?id=2ecd6bb829c6be60ac945779bb0a1bf6

но как убрать повторяющие?


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

   Пока ТЗПКГСотрудник.ПолучитьСтроку() = 1 Цикл
       ННомер = ННомер +1;
       ПКГ = СокрЛП(ТЗПКГСотрудник.ПКГ);
       Родитель = СокрЛП(ТЗПКГСотрудник.Родитель);
       Оклад = ТЗПКГСотрудник.Оклад;
       Сотрудник = СокрЛП(ТЗПКГСотрудник.Сотрудник);
       ОкладС = ТЗПКГСотрудник.ОкладС;
       ТДата =ТЗПКГСотрудник.Дата;
       Таб.ВывестиСекцию("Строка");
   КонецЦикла;  
   
   Таб.ВывестиСекцию("Подвал");
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать","");

КонецПроцедуры
20 ded20ded
 
11.05.13
21:08
три раза выводится 2 уровень, хотя должен быть 2 раза, как свернуть ТЗ при этом?
21 viktor_vv
 
11.05.13
21:31
Во первых - нафига ты к строке приводишь ссылочный тип даннх

ТЗПКГСотрудник.Родитель = СокрЛП(пер.Значение.Родитель);
ТЗПКГСотрудник.ПКГ = СокрЛП(пер.Значение);

Оставь лучше ссылки и типизируй эти колонки при создании ТЗ, тогда

  Пока СпрПКГ.ПолучитьЭлемент() = 1 Цикл
       Если СпрПКГ.ЭтоГруппа()=0 Тогда
           НомСтр =  ;
           Если ТЗПКГСотрудник.НайтиЗначение(СпрПКГ.ТекущийЭлемент(),НомСтр,"ПКГ") = 1 Тогда
                Продолжить ;
           КонецЕсли ;
22 viktor_vv
 
11.05.13
21:32
*            НомСтр = 0 ;
23 viktor_vv
 
11.05.13
21:33
Либо вариант (16), но пустоые выйдут в самом конце.