Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Запрос с двумя периодами          
mavrik Подменю пользователя
сообщение 29.11.11, 9:29
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 120
Из: Украина
Спасибо сказали: 2 раз
Рейтинг: 0

Есть два периода один за 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 Подменю пользователя
сообщение 29.11.11, 9:53
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Навскидку. Делаете 2 запроса, за соответствующие года, выгружаете из в 2 ТЗ. Далее перебираете (1) таблицу, ищите данные по сотруднику во (2) таблице и если находите - присоединяете и удаляете эту строчку из (2) ТЗ. Если не находите - значит оборот за период (2) равен 0. После этого добавляете все оставшиеся строки, при этом ясно, что оборот за период (1) у них будет равен 0. В общем итоге получится следующее:

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

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

Спасибо сказали: mavrik,

Kaliban Подменю пользователя
сообщение 29.11.11, 10:05
Сообщение #3

Говорящий
Иконка группы
Группа: Местный
Сообщений: 97
Спасибо сказали: 28 раз
Рейтинг: 0

Я бы сделал так.
Навскидку:

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


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

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

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


    КонецЦикла;


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

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


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



Хе, даблшот.
Кстати внутри тега <код> не работает тег <b>
Причина редактирования: Убрал [b] в коде, заменил на // !!!. Что это не работает - в курсе. Когда в конфигураторе появится возможность форматировать текст - тогда подумаем, как это сделать у себя. А пока пардоньте. Вофка.

Спасибо сказали: mavrik,

mavrik Подменю пользователя
сообщение 29.11.11, 11:14
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 120
Из: Украина
Спасибо сказали: 2 раз
Рейтинг: 0

Всем спасибо

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 18.04.24, 13:10
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!