Имя: Пароль:
1C
1C 7.7
v7: Проблема с запросом
0 ЮлияКорж
 
11.01.12
13:57
Проверка на вероятное дублирование доков совпадение по полям не могли бы подсказать правильна ли логика запроса выдает, мне необходима комбинацию полей проверит на повторение в доках приема

Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |ОбрабатыватьДокументы Все;
   |ПриказОПриеме = Документ.ПриказОПриеме.ТекущийДокумент;
   |Сотр = Документ.ПриказОПриеме.Сотрудник.Наименование;
   |ДатаПриема = Документ.ПриказОПриеме.Сотрудник.ДатаНачалаДействия;
   |Подразделение = Документ.ПриказОПриеме.Сотрудник.Подразделение;
   |НомерПриказа = Документ.ПриказОПриеме.НомерПриказа;
   |Группировка ПриказОПриеме упорядочить по ПриказОПриеме.ФИО;
   |Группировка ДатаПриема;
   |Группировка НомерПриказа;
   |Группировка Подразделение;
   |Функция СчётчикПриказ=Счётчик(ПриказОПриеме,Сотр,ДатаПриема,Подразделение,НомерПриказа);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл
           Таб.ВывестиСекцию("ПриказОПриеме");
       Пока Запрос.Группировка(2) = 1 Цикл
           Таб.ВывестиСекцию("ДатаПриема");
           Пока Запрос.Группировка(3) = 1 Цикл
               Таб.ВывестиСекцию("НомерПриказа");
               Пока Запрос.Группировка(4) = 1 Цикл
                   Таб.ВывестиСекцию("Подразделение");
               КонецЦикла;
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
   // Заполнение полей "Итого"
   //Таб.ВывестиСекцию("Итого");
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "");
КонецПроцедуры
1 filh
 
11.01.12
14:02
(0) да уж...
2 Rie
 
11.01.12
14:06
(0) Совпадение каких полей Вы собираетесь проверять (и у чего совпадение полей Вы будете проверять)? Считается ли совпадением одинаковое значение во всех проверяемых полях или одинаковое значение хотя бы в одном из проверяемых полей?
3 ЮлияКорж
 
11.01.12
14:23
В семерке дублировались доки приема по таким полям на одного сотрудника два одинаковых дока приемы совпадающим по значениям в полях указанных в запросе мне надо выдать реестр сотрудников,у которых дублируются доки приема, я думала путем запроса выбрать совпадающие поля по значениям и поставить счетчик на комбинацию этих полей, только я не знаю как правильно это прописать у меня выдает запрос все единицы напротив комбинации
4 filh
 
11.01.12
14:25
Тебе надо посмотреть, кого 2 раза принимали на работу?
5 ЮлияКорж
 
11.01.12
14:27
Да
6 Rie
 
11.01.12
14:28
(3) Если Вам надо посмотреть, на каких сотрудников по два (или более) документов приёма - то и группируйте сначала по сотрудникам.
А потом при обходе запроса смотрите - в какой группировке по сотруднику имеется куча документов.
7 ЮлияКорж
 
11.01.12
16:51
Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |ОбрабатыватьДокументы Все;
   |Сотр = Документ.ПриказОПриеме.Сотрудник;
   |ДатаПриема = Документ.ПриказОПриеме.Сотрудник.ДокументНачала;
   |Группировка Сотр упорядочить по Сотр.Код, Сотр.Наименование;
   |Группировка ДатаПриема упорядочить по ДатаПриема.ДатаДок;
   |Функция Счет=Счётчик(Сотр,ДатаПриема);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл
       // Заполнение полей Сотр
       Таб.ВывестиСекцию("Сотр");
       Пока Запрос.Группировка(2) = 1 Цикл
           // Заполнение полей ДатаПриема
           Таб.ВывестиСекцию("ДатаПриема");
       КонецЦикла;
   КонецЦикла;
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "")
8 ЮлияКорж
 
11.01.12
16:53
Все равно я уже по сотруднику отбираю он не может быть в один день два раза принят и все равно счетчик 1 пишет
9 Rie
 
11.01.12
17:17
ТекстЗапроса =
"Док = Документ.ПриказОПриеме.ТекущийДокумент;
|Сотрудник = Документ.ПриказОПриеме.Сотрудник;
|Группировка Сотрудник;
|Группировка Док;"
;
//...
Пока Запрос.Группировка("Сотрудник")=1 Цикл
   УжеБыл = 0;
   Пока Запрос.Группировка("Док")=1 Цикл
       Если УжеБыл=1 Тогда
           Сообщить("Попался! "+Сотрудник+" "+Док);
           УжеБыл = 1;
       КонецКсли;
   КонецЦикла;
КонецЦикла;
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой