Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрос с двумя периодами
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
mavrik
Есть два периода один за 2010 год, второй за 2011.Нужно вывести сотрудников и их обороты.Пример в отчете что то похожее: Сотрудник ИНН Сельрада ДО1 ДО2. ДО1 это обороты за 2010 а ДО2 2011.Проблема для меня в том что количество сотрудником изменилось в 2011 году и обороты нк совпадают.
Процедура Сформировать()  
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Сотрудник");
    ТЗ.НоваяКолонка("ИНН");
    ТЗ.НоваяКолонка("СельРада");
    ТЗ.НоваяКолонка("Нараховано");    
    
    ТЗ1 = СоздатьОбъект("ТаблицаЗначений");
    ТЗ1.НоваяКолонка("Сотрудник");
    ТЗ1.НоваяКолонка("ИНН");
    ТЗ1.НоваяКолонка("СельРада");
    ТЗ1.НоваяКолонка("Нараховано");    
        
    Таб = СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Шапка");
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Опер = Операция.ТекущийДокумент;
    |Сумма = Операция.Сумма;
    |Счет = Операция.Счет;    
    |Сотрудник = Операция.Субконто.Сотрудники;
    |ИНН = Операция.Субконто.Сотрудники.ИНН;    
    |СельРада = Операция.Субконто.Сотрудники.СельРада;
    |Функция СуммаДО = ДО(Сумма);
    |Группировка Сотрудник;
       |"//}}ЗАПРОС
   ;
              
       ТекстЗапроса = ТекстЗапроса + "
       |Условие(Счет=СчетПоКоду(""68511""));
       |";
  
   Если ПустоеЗначение(Пайовики) =  0 Тогда           
       ТекстЗапроса = ТекстЗапроса + "
       |Условие(Пайовики = Сотрудник);
       |";                            
   ИначеЕсли Пайовики.Выбран()=1 Тогда       
       ТекстЗапроса = ТекстЗапроса + "
       |Условие(Сотрудник=Пайовики);
       |";
   КонецЕсли;
  
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;  
    
    Запрос1 = СоздатьОбъект("Запрос");
    ТекстЗапроса1 =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода1 по ВыбКонПериода1;
    |Опер = Операция.ТекущийДокумент;
    |Сумма = Операция.Сумма;
    |Счет = Операция.Счет;    
    |Сотрудник = Операция.Субконто.Сотрудники;
    |ИНН = Операция.Субконто.Сотрудники.ИНН;
    |СельРада = Операция.Субконто.Сотрудники.СельРада;
    |Функция СуммаДО = ДО(Сумма);
    |Группировка Сотрудник;
       |"//}}ЗАПРОС
   ;
              
       ТекстЗапроса1 = ТекстЗапроса1 + "
       |Условие(Счет=СчетПоКоду(""68511""));
       |";
  
   Если ПустоеЗначение(Пайовики) =  0 Тогда           
       ТекстЗапроса1 = ТекстЗапроса1 + "
       |Условие(Пайовики = Сотрудник);
       |";                            
   ИначеЕсли Пайовики.Выбран()=1 Тогда       
       ТекстЗапроса1 = ТекстЗапроса1 + "
       |Условие(Сотрудник=Пайовики);
       |";
   КонецЕсли;
    
    Если Запрос1.Выполнить(ТекстЗапроса1) = 0 Тогда
        Возврат;
    КонецЕсли;  
    
    
    Пока Запрос.Группировка("Сотрудник")=1 Цикл
        Если Запрос.Сотрудник.ПометкаУдаления()=1 Тогда
             Продолжить;
        КонецЕсли;
        Если Запрос.Сотрудник.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
        ТЗ.НоваяСтрока();
        ТЗ.Сотрудник=Запрос.Сотрудник;
        ТЗ.ИНН=Запрос.ИНН;
        ТЗ.СельРада=Запрос.СельРада;
        ТЗ.Нараховано=Запрос.СуммаДО;
    КонецЦикла;
      
    Пока Запрос1.Группировка("Сотрудник")=1 Цикл  
        Если Запрос1.Сотрудник.ПометкаУдаления()=1 Тогда
             Продолжить;
        КонецЕсли;
        Если Запрос1.Сотрудник.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
        ТЗ1.НоваяСтрока();
        ТЗ1.Сотрудник=Запрос1.Сотрудник;
        ТЗ1.ИНН=Запрос1.ИНН;
        ТЗ1.СельРада=Запрос1.СельРада;
        ТЗ1.Нараховано=Запрос1.СуммаДО;
    КонецЦикла;
              
    ТЗ.Сортировать("Сотрудник+");
    ТЗ1.Сортировать("Сотрудник+");    
    ТЗ.ВыбратьСтроки();    
    ТЗ1.ВыбратьСтроки();
    Пока (ТЗ.ПолучитьСтроку()=1) и (ТЗ1.ПолучитьСтроку()=1) Цикл    
        Если ТЗ.Сотрудник<>ТЗ1.Сотрудник Тогда            
            //ТЗ.Сотрудник=0;
            //ТЗ.Сотрудник=ТЗ.Сотрудник;      
        //    ИначеЕсли
            //ТЗ1.Сотрудник<>ТЗ.Сотрудник Тогда            
        КонецЕсли;
        Таб.ВывестиСекцию("Секция_3");        
    КонецЦикла;        
        
    Таб.ТолькоПросмотр(1);
    Таб.Показать();
КонецПроцедуры
Vofka
Навскидку. Делаете 2 запроса, за соответствующие года, выгружаете из в 2 ТЗ. Далее перебираете (1) таблицу, ищите данные по сотруднику во (2) таблице и если находите - присоединяете и удаляете эту строчку из (2) ТЗ. Если не находите - значит оборот за период (2) равен 0. После этого добавляете все оставшиеся строки, при этом ясно, что оборот за период (1) у них будет равен 0. В общем итоге получится следующее:

Сотрудник / Оборот 2010 / Оборот 2011

Петров / 1000 / 1200
Иванов / 1500 / 1300
Сидоров / 1000 / 0 // не найдено соответствие во (2) ТЗ
Васильев / 0 / 1000 // этот сотрудник есть только во (2) ТЗ
Kaliban
Я бы сделал так.
Навскидку:

тз1-выкинуть
тз - видоизменить
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Сотрудник");
    ТЗ.НоваяКолонка("ИНН");
    ТЗ.НоваяКолонка("СельРада");
    ТЗ.НоваяКолонка("Нараховано0"); // !!!
    ТЗ.НоваяКолонка("Нараховано1"); // !!!


в цикле первого запроса заполняем
ТЗ.Нараховано0=Запрос.СуммаДО; // !!!

в цикле второго запроса:

    Пока Запрос1.Группировка("Сотрудник")=1 Цикл  
        Если Запрос1.Сотрудник.ПометкаУдаления()=1 Тогда
             Продолжить;
        КонецЕсли;
        Если Запрос1.Сотрудник.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
      
// моё
нс="";
если тз.найтиЗначение(Запрос1.Сотрудник,нс>0,"сотрудник") тогда
тз.ПолучитьСтрокуПоНомеру(нс);
тз.Нараховано1=Запрос1.СуммаДО; // !!!
иначе
       ТЗ.НоваяСтрока();
        ТЗ.Сотрудник=Запрос1.Сотрудник;
        ТЗ.ИНН=Запрос1.ИНН;
        ТЗ.СельРада=Запрос1.СельРада;
        ТЗ.Нараховано1=Запрос1.СуммаДО; // !!!
конецесли;


    КонецЦикла;


ну и перед выводом делаем

тз.Группировать("Сотрудник, и прочая","Нараховано0,Нараховано1")


смысл, думаю понятен.



Хе, даблшот.
Кстати внутри тега <код> не работает тег <b>
mavrik
Всем спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.