Имя: Пароль:
1C
1C 7.7
v7: Не получается проверить доки на дублирование
,
0 ЮлияКорж
 
03.01.12
13:11
Пишу обработку,чтобы проверить документиы на дублирование и что то не хочет работать
Процедура Выполнить()
Перем с3;    
с3=СоздатьОбъект("ТаблицаЗначений");
ДокПриема=СоздатьОбъект("Документ.ПриказОПриеме");
ДокПриема.ВыгрузитьТабличнуюЧасть(с3);
ДокПриема.ВыбратьДокументы();
Пока ДокПриема.ПолучитьДокумент()>0 Цикл
Если с3.Принадлежит(ДокПриема.ТекущийДокумент())=1 тогда
   Сообщить("Дубликат");
   КонецЕсли;
КонецЦикла;
КонецПроцедуры
1 andrewks
 
03.01.12
13:13
мдэ... тут в консерватории что-то менять надо...
2 Злопчинский
 
03.01.12
13:25
между вот этими двумя строками
ДокПриема=СоздатьОбъект("Документ.ПриказОПриеме");
ДокПриема.ВыгрузитьТабличнуюЧасть(с3);
- мысль не возникает написать код для ПОЗИЦИОНИРОВАНИЯ на НУЖНОМ документе?
это раз.
.
а так как КАЖДЫЙ ДОКУМЕНТ - есть УНИКАЛЬНЫЙ ОБЪЕКТ, даже если всё его наполнение совпадает с другим документом - то вам кабздец - не найдете вы дубля ниткогда
3 NS
 
03.01.12
13:26
(2) Не видишь, в коде ошибки в каждой строке!
4 Злопчинский
 
03.01.12
13:27
(3) это видимо привыкли типа как в стиралку кучей барахло закинули - на выходе - то что надо! - в программировании так не получается исчо..
5 Злопчинский
 
03.01.12
13:28
(0) с3.Принадлежит() - это метод СПИСКАЗНАЧЕНИЙ, а не таблицы значений
6 Злопчинский
 
03.01.12
13:30
(3) но радует, что буквы -то правильно названы! а то, что не смогли прочитать слово - ну так видимо еще не учили!!!
.
я вот например в пятом классе перед тем как начать изучать иностранный язык - буквы на каникулах выучил и был жутко разачарован когда оказалось что в английском языке русские слова не записываются английскими букваит...
7 Попытка1С
 
03.01.12
13:50
Сообщить("Дубликат"); - тут все верно!
8 Mikeware
 
03.01.12
13:52
(6) ты не один такой :-)))
9 Злопчинский
 
03.01.12
13:55
(8) что и ты тоже..????!! ;-) а ты был раньше в детсве уверен что вагоный друг к другу буферами примагничиваются..? а машины ездять по принципу реактивного движения из-за выхлопной трубы..?
10 NS
 
03.01.12
13:55
(7) Нет, неверно, не пишет в каком документе дубликат.
11 Злопчинский
 
03.01.12
13:57
Господа! давайте поможем гарной дивичине с Мариуполя!
12 Mikeware
 
03.01.12
13:57
(9) Про язык - я тоже. Правда, не про английский, но это вторично...
А вот про вагоны я знал. И принцип реактивного движения - тоже ...
13 Mikeware
 
03.01.12
13:58
(11) Помочь ей можно только одним...
14 Злопчинский
 
03.01.12
14:00
(12) ну так я тоже про принципи реактивного движения знал - поэтому и думал...
15 Aleksey
 
03.01.12
14:01
(13) Срочно замуж?
16 Злопчинский
 
03.01.12
14:01
(13) не надо!!! пусть помучается!
17 Злопчинский
 
03.01.12
14:02
кста, никогда не работал с девками -программистками... как они? у кого был опыт?
18 Torquader
 
03.01.12
14:03
Кстати, в журнале документов и в самих таблицах документов, в dbf-исполнении вполне встречаются дубли (у меня даже были два разных документа с одинаковым ID).
Только поиск таких документов из обработки невозможен, так как система изначально предполагает позиционирование на ID документа и считает его уникальным. В случае записи двух одинаковых ID в dbf-файл средствами 1С будет виден только первый документ.
А в случае (0), скорей всего, хотели найти документы с совпадающим содержимым, но надо сказать, что это не совсем тривиальная задача, так как нужно будет перебирать метаданные.

То есть нужно выбирать все реквизиты документа и сравнивать их с данными в таблице значений, куда мы заносим такие реквизиты, а также не забыть применить Хэш-функцию, чтобы использовать поиск по таблице, а не полный перебор.
Кроме того, нужно на забывать, что от перестановки строк в документе его содержимое не меняется.
19 Rie
 
03.01.12
14:03
(17) Работал. Замечательные программистки. Очень аккуратный код. (Без шуток, мой опыт именно таков).
20 Torquader
 
03.01.12
14:04
(17) Иногда даже можно работать - даёшь пример, объясняешь, как его приладить к нужному месту и всё - чаще всего даже ошибки найдёт сама (конечно, если это действительно программист, а не дятел в юбке).
21 Злопчинский
 
03.01.12
14:05
(19) а код от "мужского" кода отличается (ну кроме аккурат ности)..?
22 Rie
 
03.01.12
14:16
(21) Не замечал отличий. Писали действительно очень хорошо. Потом одну конкурент сманил. Другая ушла на вольные хлеба :-(
23 Mikeware
 
03.01.12
14:17
(17) Работал с одной - прошедшей школу франча. Это был пипец. Работала аккуратно, но строго по заданию. Такое ощущение, что думать вперед не умела вообще.
24 Злопчинский
 
03.01.12
14:17
блин, судя по всему в Мариуполе внезапно кончился интернет..
25 2S
 
03.01.12
14:18
тэкс, фото не зачетное, треба сменить...
код порадовал...
26 Torquader
 
03.01.12
14:18
(24) Нет, скорей всего, кто-то понял, что программирование - не для него, и ушёл борщ варить.
27 Злопчинский
 
03.01.12
14:24
(26) ну не может все быть так плохо.. может просто у герлы еще шампусик с НГ не выветрился..???
28 Mikeware
 
03.01.12
14:25
(27)человек столько не выпьет...
29 Torquader
 
03.01.12
14:26
(27) Не верю, что спиртное может создавать кашу в голове - а в данном случае именно каша.
30 ЮлияКорж
 
03.01.12
14:39
Чесно сейчас каша в голове ,я не выспалась ну мы 8-ку данные перегрузили,
а там много ошибок один тип из которых допустим два или три одинаковых дока приемана одного сотрудника
31 Злопчинский
 
03.01.12
14:45
(30) срочно потрахаться, выспаться, ликвидировать кашу в голове. потом - приходи.
32 Torquader
 
03.01.12
14:54
(30) Так зачем искать дули в семёрке, если они в восьмёрке ?
Поди что-то не так перегрузили, раз так получилось - а не попробовать ли перегрузить ещё раз - до первого рабочего дня можно многое успеть.
Хотя, проще программиста "на коньяк" пригласить.
33 Cthulhu
 
03.01.12
14:58
03.01
выходной же, вы чо!!!
34 Злопчинский
 
03.01.12
15:14
не, я в Мариуполь не поеду...
35 Torquader
 
03.01.12
15:32
(34) Не переживай так - коньяк - вещь универсальная - её можно и по почте выслать, если что (как и готовое решение).
36 Злопчинский
 
03.01.12
15:50
(35) мариупольский коньяк? боже упаси
37 Web00001
 
03.01.12
16:12
(17) я работал, только приятные впечатления как от кода, так и от самой программистки :)
38 Web00001
 
03.01.12
16:14
(0) А что за конфа? Откуда в 77 в доке приема ТЧ?
39 Злопчинский
 
03.01.12
16:38
пока что девчушки-ппрограммистики оставляют благоприятное впечателнеи судя по отзывам
40 ЮлияКорж
 
03.01.12
16:52
Спасибо за комплементы
41 Злопчинский
 
03.01.12
16:56
(40) Юлия, срочно (31)
и усвоить разницу между комплЕментарностью и комплИментом
42 ЮлияКорж
 
03.01.12
18:09
Так на вопрос мне ни кто и не ответил как мне найти дубликат,что нельзя выгрузить табличную часть в список значений и сравнить этот список с табл частью доков пусть это будет приближенный дубликат вероятный но
43 ЮлияКорж
 
03.01.12
18:10
дока отдельно по ключевым полям таким как дата и
44 Злопчинский
 
03.01.12
18:48
(42), так, хорошо что 31 уже сделано - наступило просветление в мозгах...
45 Злопчинский
 
03.01.12
19:01
вариант раз:
открываешь список значений
идешь по выборке доков
для каждого дока формруешь ИД, в который включаешь нужные тебе поля
проверяешь список значений на наличие требуемого ИД
делаешь вывод
добавляешь текдокумент в списокзначенйи для следующего прохода
.
вариант два:
таблица значений с двумя столбцами, один столбец - счетчик, второй - строка
обходишь доки и добавлешь строки в ТЗ
документ пишешь в строку путем значениеВстроку()
пробегаешь по ТЗ - вырезаешь из строк даты и номера доков (чтобы не мешали похожести)
потом сворачиваешь ТЗ по строковому столбцу, смотришь строки где счетчик больше 1
46 Злопчинский
 
03.01.12
19:08
ну и самое главное - тч в доках не зубудь отсортировать..
47 Попытка1С
 
03.01.12
19:21
Кстати я поддержу (38)..
48 Злопчинский
 
03.01.12
19:45
(47) мне кажется, что приятнее поддерживать Юлию.. ;-)
49 Cthulhu
 
03.01.12
19:50
(48): разве что осязательно.
50 Bww_
 
03.01.12
20:08
(5) попробуй новый объект "СказкаЗначений"
51 Torquader
 
03.01.12
22:25
(47) Ну даже если и нет табличной части - человеку лучше объяснить, как это должно делаться - явно потом захотят ещё и другие документы поискать.

Как вариант, можно сделать так:

// создаём таблицу значений
// предполагается, что у документа нет аттрибута Hash
// также предполагается, что дата документа и его номер нам не важны
// (в данном случае нельзя принять одного человека дважды)
// если дата важна, то для неё нужно сделать такое же поле
// если у документа есть аттрибут Hash, то можно использовать
// в таблице значений колонку DocNum - её в документе точно нет
DocKind="ПриказОПриеме";
ValTab=CreateObject("ValueTable");
ValTab.NewColumn("Hash");
MetaDoc=Metadata.Document(DocKind);
HeadCount=MetaDoc.HeadAttribute();
For i=1 To HeadCount Do
ValTab.NewColumn(MetaDoc.HeadAttribute(i).Identifier);
EndDo;
// теперь нужно выбрать все документы
Doc=CreateObject("Document."+DocKind);
If Doc.SelectDocuments(,)=1 Then
While Doc.GetDocument()=1 Do
// рассчитываем Hash
Hash="";
 For i=1 To HeadCount Do
  Hash=Hash+"|"+String(Doc.GetAttrib(MetaDoc.HeadAttribute(i).Identifier));
 EndDo;
// ищем его в таблице
l=0;
If ValTab.FindValue(Hash,l,1)=1 Then
 // нашли совпадение - проверяем, что оно верное
 For i=1 To HeadCount Do
  If Doc.GetAttrib(MetaDoc.HeadAttribute(i).Identifier)<>ValTab.GetValue(l,i+1)Then
   i=0;
   Break;
  EndIf;
 EndDo;
 If i<>0 Then
  Message("Имеем дубликат:"+TrimAll(Doc.DocNum)+" от "+String(Doc.DocDate));
  Continue;
 EndIf;
EndIf;
// если дубликата нет, то добавляем
ValTab.NewLine();
ValTab.Hash=Hash;
// добавляем остальные реквизиты
For i=1 To HeadCount Do
 ValTab.SetValue(Doc.GetAttrib(MetaDoc.HeadAttribute(i).Identifier),ValTag.LineNum,i+1);
EndDo;
EndDo;
EndIf;
52 Злопчинский
 
04.01.12
00:38
(51) - папа, ты это с кем сейчас разговаривал...
53 Torquader
 
04.01.12
15:01
(52) С тобой.
А (ноль) или поймёт, что в (51) сказано, или поймёт, что он полный (ноль).
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn