Имя: Пароль:
1C
 
Помощь с алгоритмом объединения документов
,
0 Mr-FReSH
 
30.03.17
06:01
Доброго времени суток, господа.

Никак не могу придумать более-менее адекватный алгоритм объединения документов по одному признаку, может у кого уже был подобный опыт.

Задача такая: есть 2000 документов с разными физ лицами, среди них есть документы, где физ лица одинаковые, и вот такие документы нужно объединить. т.е. на выходе из 2000 документов в районе 900 нужно будет найти и обработать, но каким образом это сделать я придумать не могу.

Спасибо
1 Злопчинский
 
30.03.17
06:14
хз на какой платформе
для 77 есть COMMONITER - смотри на ИС
2 Mr-FReSH
 
30.03.17
06:29
(1) 8.3

Придумал пользоваться методом НайтиСтроки и объединять по тому что нашло

Пока что написал примерно такое (еще в процессе написания)


Процедура ОбъеденитьНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Случай.Ссылка,
        |    Случай.Пациент
        |ИЗ
        |    Документ.Случай КАК Случай
        |ГДЕ
        |    Случай.ДатаНачала МЕЖДУ &ДатаНачала И &ДатаОкончания";
    
    Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);
    
    Случаи = Запрос.Выполнить().Выгрузить();
    
    МассивПациентов = Новый Массив;
    Для Каждого Случай Из Случаи Цикл
        
        Если МассивПациентов.Найти(Случай.Пациент) = 0 ИЛИ МассивПациентов.Найти(Случай.Пациент) = Неопределено Тогда
            МассивПациентов.Добавить(Случай.Пациент);
            НовыйСлучай = Документы.Случай.СоздатьДокумент();
            
            Отбор = Новый Структура;
            Отбор.Вставить("Пациент", Случай.Пациент);
            НайденныеДокументы = Случаи.НайтиСтроки(Отбор);
            
            Если НайденныеДокументы.Количество() > 1 Тогда
                Для Каждого Документ Из НайденныеДокументы Цикл
                    НовыйСлучай.Пациент = Случай.Пациент;
                    
                    
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    
    
КонецПроцедуры
3 Мимохожий Однако
 
30.03.17
06:47
(2) А вот это " НовыйСлучай = Документы.Случай.СоздатьДокумент();" Зачем?!
Лучше уточни задачу. Тебе надо проигнорировать документы, в которых пациент встречается только один раз?
4 Злопчинский
 
30.03.17
06:55
хрен какая-то, явно в запросе д.б чтото типа

Выбрать
  ссылка,
  поциент;
  1 как счетчик
...
далее в запросе сгруппировать по поциент с суммированием счетчик на первом уровне, на втором уровне группировка по ссылка, отрезать те где на 1 уровне счетчик=1
.
я в запросах восмерочных ноль
5 Mr-FReSH
 
30.03.17
07:02
я создаю новый документ из данных старых документов, а старые удаляю
6 Mr-FReSH
 
30.03.17
07:02
т.е. в новом документе у меня объединяются табличные части старых
7 Мимохожий Однако
 
30.03.17
07:05
Сделай группировку по пациентам и выборку по группе
8 mexanik_96
 
30.03.17
07:05
группировать по контрагенту не предлагали ещо?
9 Мимохожий Однако
 
30.03.17
07:06
(8) Я успел))
10 Mr-FReSH
 
30.03.17
07:13
Ладно, за час, который мне на это выделили сделал так, знаю что коряво и не оптимизированно, но работает как надо


&НаСервере
Процедура ОбъеденитьНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Случай.Ссылка,
        |    Случай.Пациент
        |ИЗ
        |    Документ.Случай КАК Случай
        |ГДЕ
        |    Случай.ДатаНачала МЕЖДУ &ДатаНачала И &ДатаОкончания";
    
    Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);
    
    Случаи = Запрос.Выполнить().Выгрузить();
    
    МассивПациентов = Новый Массив;
    Для Каждого Случай Из Случаи Цикл
        
        Если МассивПациентов.Найти(Случай.Пациент) = 0 ИЛИ МассивПациентов.Найти(Случай.Пациент) = Неопределено Тогда
            МассивПациентов.Добавить(Случай.Пациент);
            НовыйСлучай = Документы.Случай.СоздатьДокумент();
            
            Отбор = Новый Структура;
            Отбор.Вставить("Пациент", Случай.Пациент);
            НайденныеДокументы = Случаи.НайтиСтроки(Отбор);
            
            Если НайденныеДокументы.Количество() > 1 Тогда
                ДатаНачалаСлучая = ТекущаяДата();
                ДатаОкончанияСлучая = ТекущаяДата();
                Для Каждого Документ Из НайденныеДокументы Цикл
                    ДокументОбъект = Документ.Ссылка.ПолучитьОбъект();
                    Если ДокументОбъект.ДатаНачала < ДатаНачалаСлучая Тогда
                        НовыйСлучай.ДатаНачала = ДатаНачалаСлучая
                    Иначе
                        ДатаНачалаСлучая = ДокументОбъект.ДатаНачала;
                    КонецЕсли;
                    Если ДокументОбъект.ДатаОкончания < ДатаОкончанияСлучая Тогда
                        НовыйСлучай.ДатаОкончания = ДатаОкончанияСлучая;
                    Иначе
                        ДатаОкончанияСлучая = ДокументОбъект.ДатаОкончания;
                    КонецЕсли;
                    ЗаполнитьЗначенияСвойств(НовыйСлучай, ДокументОбъект);
                    ДокументОбъект.ДатаНачала = ДатаНачалаСлучая;
                    ДокументОбъект.ДатаОкончания = ДатаОкончанияСлучая;
                    
                    Для Каждого Строка Из ДокументОбъект.Услуги Цикл
                        СтрокаНовУслуга = НовыйСлучай.Услуги.Добавить();
                        ЗаполнитьЗначенияСвойств(СтрокаНовУслуга, Строка);
                    КонецЦикла;
                    НовыйСлучай.Номер = "";
                    НовыйСлучай.Объединен = Истина;
                КонецЦикла;
                НовыйСлучай.Записать(РежимЗаписиДокумента.Проведение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    
    
КонецПроцедуры
11 Злопчинский
 
30.03.17
07:30
и вот такие восьмерочники будут стыдить нас, клюшечников, что мы ковыряемся в носу?
я думаю что выборку дублирующих документов или наоборот недублирующих документов если упрусь то и чорным запросом в клюшках получу
12 Мимохожий Однако
 
30.03.17
07:50
(11) Фактор времени...
13 Mr-FReSH
 
30.03.17
07:53
И что вы так прицепились к этому запросу, знаю что можно было получить все дубли с помощью него, но возиться с проверкой всего не хотелось
14 Мимохожий Однако
 
30.03.17
08:06
(13) Вот теперь к тебе прицепятся. Пакетным запросом можно было бы получить только нужные документы и отсортировав по пациентам сформировать документы с пометкой удаления не нужных.
15 aleks_default
 
30.03.17
09:23
(11)Вот он как раз похоже семерочник. Все восьмерочники давно такое запросами делают.
16 aleks_default
 
30.03.17
09:26
(15)Налицо у пациента использование запроса только для выборки - что характерно как раз для семерочников.