7.7 Объединение справочников через "Таблицу Значений"

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем nestov, 28 фев 2012.

  1. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    Вновь возвращаюсь к моей проблеме с обьединением нескольких справочников (3-ех). С запросами не получилось решить проблему http://www.1c-pro.ru/topic39208.html/page__fromsearch__1
    По советам сделал через Таблицу Значений, но результат точно такой же - не получается вывести все в одной строке.
    вот картинка:
    Посмотреть вложение 10370
    Нужно чтобы выделенные ставки выводились напротив свох Степеней и Званий, а они выводятся отдельно.
    Вроде бы правильно написал "Свернуть", но видимо как-то ошибка в структуре вывода справочников. Не могу никак понять в чем ошибка.
    Подскажите, пожалуйста, как мне решить мою ошибку и в чем я не прав.
    Я вывожу сначала главный справочник, потом по отдельности два других - но видимо это не правильно, так где же мне их вывести?.
    вот мой код:

    Код:
    Процедура Сформировать()
    перем пд, ИтогоЗаСтепень, ИтогоЗаЗвание;
    Таб=СоздатьОбъект("ТаблицаЗначений");
    Если Подр=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;
    

    Вложения:

  2. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Почему в первом цикле заполняются поля ТЗ Степень и Звание, а во втором и третьем Степень2 и Звание2?
    Поэтому и не сворачивается.
  3. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    а где нужно заполнить Степень2 и Звание2?
    Я везде пробовал вставлять эти циклы, но но все-равно результат такой же :(
    Подскажите пожалуйста структуру, в каком порядке как правильно выводить эти циклы?
    может быть поле Степень и Звания нужно как-то в первом цикле обьединить, т.е. поставить общий тип, например
    Код:
    Таб.Звание=?(ПустоеЗначение(КадрДанные.УченоеЗвание)=1,ДопУчЗв.УченоеЗвание,КадрДанные.УченоеЗвание);    
    ?
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    А для чего вообще используются поля с суффиксом "2"?

    Если Степень и Степень2 это по смыслу одно и тоже поле, то нужно использовать только одно.

    Рассказать, как работает метод свернуть - видимо целая статья получится, не вижу в этом смысла.
  5. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    Как свернуть работает я знаю, ведь в моем случае его правильно использую.

    меня интересует как прописать два одинаковых поля (но с разных справочников)?
    Вот в этом примере правильно прописано, подскажите пожалуйста:
    Код:
    Таб.Степень=?(ПустоеЗначение(КадрДанные.УченоеЗвание)=1,ДопУчЗв.УченаяСтепень,КадрДанные.УченаяСтепень.ученаяСтепень); 
  6. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    Так Степень и Степень2 - это ведь разные справочники (даже не подчиненные друг к другу). Но тип одинаковый и нужно как-то обьединить их в одно. В каком цикле мне их вывести нужно?
  7. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    После этой фразы можно дискуссию заканчивать, видимо больше информации не будет, значит попробую пальцем в небо:
    Код:
    Процедура Сформировать()
    перем пд, ИтогоЗаСтепень, ИтогоЗаЗвание;
    Таб=СоздатьОбъект("ТаблицаЗначений");
    Если Подр=1 Тогда
    Таб.НоваяКолонка("Подразделение","Справочник.Подразделения");
    КонецЕсли;
    СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
    ПрикДл=СоздатьОбъект("Справочник.ПриказыДлительногоДействия");
    КадрДанные=СоздатьОбъект("Справочник.КадровыеДанные");
    ДопУчСт= СоздатьОбъект("Справочник.ДоплатыЗаУченуюСтепень");
    ДопУчЗв= СоздатьОбъект("Справочник.ДоплатыЗаУченыеЗвания");
    Таб.НоваяКолонка("Степень","перечисление.УченаяСтепень");
    Таб.НоваяКолонка("Ставка","Число",4,2);
    Таб.НоваяКолонка("ЧислоСтавокНеППС","Число",4,2);
    Таб.НоваяКолонка("ЧислоСтавокДляППС","Число",4,2);
    Таб.НоваяКолонка("Звание","Перечисление.УченоеЗвание");		   
    Таб.НоваяКолонка("Совместитель","Справочник.ВнутренниеСовместители");
    СпрСотр.ИспользоватьДату(ДатаОт);
    СпрСотр.ПорядокНаименований();
    СпрСотр.ВыбратьЭлементы();
    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    Если СпрСотр.ЭтоГруппа() = 1 Тогда
    Продолжить;
    КонецЕсли;
    Если СпрСотр.Родитель = СпрУволенные Тогда
    Продолжить;
    КонецЕсли;
    Если (СпрСотр.ВидРаботника=Перечисление.ВидыРаботников.ТрудовойДоговор) Тогда
    Продолжить;
    КонецЕсли;
    
    ПрикДл.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
    ПрикДл.ВыбратьЭлементы();
    Пока ПрикДл.ПолучитьЭлемент()=1 Цикл
    пр=0;
    Если (ПрикДл.Приказ.Вид()="ПостоянныеНачисленияУдержания") и (ПрикДЛ.Приказ.ВидРасч=ВидРасчета.ПрочиеНачисления) Тогда
    Если (ПрикДл.Приказ.Вид.Код="4") или (ПрикДл.Приказ.Вид.Код="5") Тогда
    пр=1;
    КонецЕсли;
    Если пр=1 Тогда
    Сообщить(СпрСотр.Наименование);
    КадрДанные.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
    КадрДанные.ВыбратьЭлементы();
    пока кадрДанные.ПолучитьЭлемент()=1 цикл
    Таб.НоваяСтрока();
    Таб.Степень=КадрДанные.УченаяСтепень.ученаястепень;
    Таб.Звание=КадрДанные.УченоеЗвание;
    // Таб.Зв=?(ПустоеЗначение(КадрДанные.УченоеЗвание)=1,ДопУчЗв.УченоеЗвание,КадрДанные.УченоеЗвание);  
    Таб.Ставка=?(ПустоеЗначение(ПрикДл.Приказ.ВнСовместитель)=1,СпрСотр.Ставка,ПрикДл.Приказ.ВнСовместитель.Ставка.Получить(ДатаОт));  
    Таб.Совместитель=ПрикДл.Приказ.ВнСовместитель;
    конеццикла;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;				 
    // ПЕРВЫЙ СПРАВОЧНИК Я ВЫВЕЛ ПРАВИЛЬНО, ТЕПЕРЬ ВЫВОЖУ ДВА ДРУГИХ. МОЖЕТ БЫТЬ ИХ НУЖНО ГДЕ-ТО В ДРУГОМ МЕСТЕ ВЫВЕСТИ, ЧТОБЫ СОЕДИНИТЬ ОДИНАКОВЫЕ ПОЛЯ?
    ДопУчЗв.выбратьэлементы();
    пока ДопУчЗв.получитьЭлемент()=1 цикл
    Таб.НоваяСтрока();
    Таб.Звание=ДопУчЗв.УченоеЗвание;
    Таб.ЧислоСтавокДляППС=ДопУчЗв.ЧислоСтавокДляППС.Получить(ДатаОт);
    конеццикла;
    
    ДопУчСт.выбратьэлементы();
    пока ДопУчСт.получитьэлемент()=1 цикл
    Таб.НоваяСтрока();	
    Таб.Степень=ДопУчСт.УченаяСтепень;
    Таб.ЧислоСтавокНеППС=ДопУчСт.ЧислоСтавокНеППС;	 
    конеццикла;	
    Таб.Свернуть("Степень,звание,Совместитель,ЧислоСтавокНеППС,ЧислоСтавокДляППС","Ставка");
    ТабД=СоздатьОбъект("Таблица");
    ТабД.ВывестиСекцию("Заголовок");
    ТабД.ПовторятьПриПечатиСтроки(3,3);
    ТабД.ВывестиСекцию("Шапка");
    Если Подр=1 Тогда
    Таб.Сортировать("Ставка");
    Иначе
    Таб.Сортировать("Ставка");
    КонецЕсли;
    Таб.ВыбратьСтроки();
    Пока Таб.ПолучитьСтроку()=1 Цикл
    ТабД.ВывестиСекцию("Строка");
    КонецЦикла;
    КС=ТабД.КоличествоСтраниц();
    ТабД.ВывестиСекцию("Итого");
    ТабД.Показать("Доплаты за степень и звание");
    КонецПроцедуры
    ДатаОт=ТекущаяДата();
    СтрОрг=Перечисление.СтруктураОрганизации.ОсновнойСостав;
    Подр=1;
    
  8. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    Спасибо. Некоторые ошибки я понял.
    Но в этом случае все-равно справочники не группируются. Выводятся по отдельности почему-то.
  9. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Значит сюда http://www.1c-pro.ru/topic39208.html/page__view__findpost__p__200332
  10. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    Не помогает и через запросы. Хотелось бы просто понять, что в коде не правильно написано, раз не может групировать ?
  11. TopicStarter Overlay
    nestov
    Offline

    nestov Опытный в 1С

    Регистрация:
    25 апр 2011
    Сообщения:
    65
    Симпатии:
    0
    Баллы:
    26
    вот нашел метод:
    Код:
    КадрДанные.ИспользоватьВладельца(СпрСотр.ТекущийЭлемент());
    КадрДанные.ВыбратьЭлементы();
    Пока кадрДанные.ПолучитьЭлемент()=1 цикл
    Таб.НоваяСтрока();
    Таб.Степень=КадрДанные.УченаяСтепень.ученаястепень;
    Таб.Звание=КадрДанные.УченоеЗвание;
    Таб.Ставка=?(ПустоеЗначение(ПрикДл.Приказ.ВнСовместитель)=1,СпрСотр.Ставка,ПрикДл.Приказ.ВнСовместитель.Ставка.Получить(ДатаОт));
    Таб.Совместитель=ПрикДл.Приказ.ВнСовместитель;
    ДопУчЗв.НайтиЭлемент(КадрДанные.УченоеЗвание);
    Таб.ЧислоСтавокДляППС=ДопУчЗв.ЧислоСтавокДляППС.Получить(ДатаОт);
    
    ДопУчСт.НайтиЭлемент(КадрДанные.УченаяСтепень);
    Таб.ЧислоСтавокНеППС=ДопУчСт.ЧислоСтавокНеППС;
    КонецЦикла;
    ...
    Таб.Свернуть("Звание,Степень,ЧислоСтавокНеППС,ЧислоСтавокДляППС","Ставка");
    
    через метод НайтиЭлемент, но все-равно не хочет выводить отчет. Поля ставок вообще не выводятся, одни нули
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    А вообще находит ли? НайтиЭлемент это функция... Надо было через учловие проверять

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