Имя: Пароль:
1C
1C 7.7
v7: Удаляются документы при обмене УРБД
0 Frog_i
 
03.02.12
10:38
Здравствуйте.
База 7.7 самописная релиз 27 SQL сервер 2008
При обменах УРБД в центре убиваются документы другого типа. Начали копать оказалось следующее:
Есть обработка которая пакетно начисляет штрафную неустойку (ШН) за месяц, если в какой-то день ШН не было, то документ безвозвратно удаляется Удалить(1). По непонятно причине некоторым документам другого типа, к примеру выпискам видимо присвается тот же самый ID, но тип самого документа берется как у удаленного. В результате при загрузке в центр, УРБД удаляет не только созданный и удаленный документ ШН, но и все документы которые получили не правильный тип. Есть предположение, что при прямом удалении 1С высвобождает освободившийся ID удаленного документа и другой документ другого типа, при получении ID получает, но с типом удаленного документа. Косвенно это подтверждает лог загрузки в центр:

20120202;12:26:53;Иванов;C;Distr;DistUplStatus;2;Удален ;O/46973/(RN2)2964084;Выписка RN20005103 01.02.2012 23:59:59

20120202;12:26:53; Иванов;C;Distr;DistUplStatus;2;Удален ;O/46973/(RN2)2964483;Начисление штрафов по 76 счету RN2000032
4 28.01.2012 19:58:06

Значение O/46973 определяет тип документа, можно увидеть что документы различного типа имеют один и тот же тип. На самом деле тип у выписки 6415. Сейчас я просто помечаю документы по ШН на удаление, но возможно кто-то сталуивался с такой проблемой и уже есть решение. Так как в противном случае мне как то бояздно удалять объекты на прямую из 1С, если у 1С такой глючный мезанизм получения ID.
1 nicxxx
 
02.03.12
05:32
это не механизм получения ИД глючный, это Удалить(1) лучше не пользоваться
2 mishaPH
 
02.03.12
06:17
(0) ты ИД дока с номером дока не попутал?
3 mishaPH
 
02.03.12
06:17
причем тут УРБД
4 mishaPH
 
02.03.12
06:17
вы сносите некой обработкой док
5 ЧеловекДуши
 
02.03.12
07:25
Что ты жалуешьси? Поправь на нолик и спи спокойно ;)
6 nicxxx
 
02.03.12
07:48
(2) он сносит обработкой документ, урбд пишет запись об удаленном объекте, а новый документ другого вида получает iddoc удаленного документа (узнать бы почему). в итоге при загрузке в другую базу удаляются  2 документа с одинаковым iddoc, но разными iddocdef.
кстати, возникает вопрос, iddoc может быть неуникальным в таблице журнала, кто знает? а то проверять лень
7 Злой Бобр
 
02.03.12
13:52
(0) Какой же бардак у вас в голове. Такую херню несете что аж уши вянут.
Проблема в ДНК в не в УРБД.
8 Frog_i
 
22.03.12
05:05
(7) Видимо истину знаешь только ты. Может поделишься?
9 Frog_i
 
22.03.12
05:10
(6) На самом деле это было только предположение, раскапывать реальный механизм у меня нет ни времени, ни желания. Поэтому я пришел на форум, может кто-то знает.
10 Frog_i
 
22.03.12
05:13
(5)Подход плохой, из рода: "Давайте залечим последствия, а причину не будем искать, может больше не будет". Проблема только в том, что будет обязательно только в тот момент когда ты совсем этого не ждешь.
11 nicxxx
 
22.03.12
06:37
может в обработке по начислению штрафной неустойки есть смысл сделать проверку на наличие данных в определенном дне, а не создавать документ, чтобы потом удалять его непосредственно
12 Mikeware
 
22.03.12
07:00
вся  проблема - в соотношении радиусов...
13 ЧеловекДуши
 
22.03.12
07:39
(10)Причина в ДНК, у вас физически удаляют документы, т.е. насовсем.
Что является в корне неправильно, т.к. потом виноват всегда тот, кто слабее, т.е. программист :)
И т.к. в периферийной БД удаляются объекты физически, то и в центре они удаляются.

Что ты хотел? И рыбку съесть и на х... сесть :)
14 Злой Бобр
 
22.03.12
08:59
(8) "истина где-то там ..." (с) Секретные материалы
Я б за деньги поделился, но ХЗ что там за грабли в вашей самописке. Пусть разбирается тот кто лепил самописку, так будет быстрее и дешевле. Дешевле это в плане того что исправление косяков всегда дороже их написания.
15 Frog_i
 
22.03.12
10:00
(11)Проблему решили сразу, путем Удалить(0). Сейчас речь идет о причине.
16 Frog_i
 
22.03.12
10:10
(13) Документы действительно должны удаляться на совсем, так как это чисто техническое решение и пользователей оно не касается. Так было сделано потому, что процедура заполнения находится в форме заполнения а данные в запросе получаются на время документа, поэтому нужно было его сохранить. После выхода проверяется табличная часть, если она пуста документ удаляется (физически он больше не нужен). Выносить функцию заполнения трудозатратно и не нужно. Понятно что можно переделать все что хочешь.
Но получилось так что существующий механизм удаления в 1С отработал криво и на самом деле абсолютно не важно как написан код, но если ты написал функцию которая должна создавать объекты, а она удаляет их то как не крути это косяк только разработчика этой функции, а не того кто ей воспользовался.
17 Frog_i
 
22.03.12
10:15
(14) За деньги это тебе не сюда, это можно на job.ru сходить;-). Эта самописка разрабатывается группой разработчиков уже 10 лет в ней реализованы такие решения которые большинство 1С-ов даже не могут себе предствить.
18 Mikeware
 
22.03.12
10:20
(17) судя по топику - представить могут, но в горячечном бреду, либо в состоянии тяжелого алкогольного...
судя по иду метаданных - тоже...
19 Frog_i
 
22.03.12
10:29
(18)Исходя из 90% ответов я начинаю осознавать, что вокруг меня собралось куча умного народу, которые все знают, которые все умеют и я среди этого огромного круга интеллектуалов чувствую себя полноты дер..м, но есть одно маленькое НО. Никто пока так и не ответил на поставленный вопрос: Каким образом у типа документа 6514, вдруг появился тип 46973:

20120202;12:26:53;Иванов;C;Distr;DistUplStatus;2;Удален ;O/46973/(RN2)2964084;Выписка RN20005103 01.02.2012 23:59:59

20120202;12:26:53; Иванов;C;Distr;DistUplStatus;2;Удален ;O/46973/(RN2)2964483;Начисление штрафов по 76 счету RN2000032
4 28.01.2012 19:58:06  

жду новой волны флуда:)
20 Mikeware
 
22.03.12
10:42
(19) а что говорит товарищ Профайлер?
21 Frog_i
 
22.03.12
10:46
(20)Ничего пока не говорит. Так глубоко мы не копали, думали проблема известный, пошли к умный человек сначала.
22 Mikeware
 
22.03.12
10:51
(21) и ты называешь так поступающих "группой разработчиков"? омиздинеть...
23 Frog_i
 
22.03.12
10:59
(22)Фраза какой-то не русский, совсем непонятно ничего, что говорит умный человек.
24 Ёпрст
 
22.03.12
11:05
вообще то при присвоении документу нового iddoc  берется тупо максимум +1..и совпадающих там быть не должно по-определению.

А как ты их у себя задвоил - хз, мот были коллизии при обмене
25 Mikeware
 
23.03.12
09:55
(24) скорее всего, в одной транзакции сначала лепит документы, потом их удаляет...
хотя от "группы разработчиков", предпочитающих мизду профайлеру, можно ожидать всего, чего угодно...
26 Ёпрст
 
23.03.12
09:57
(25) ну да ..или при проведении лепит еще подчиненные доки.. че-нитьт в этом роде
27 Frog_i
 
23.03.12
10:40
(25)Белый человек много говорит, наверное он очень умный, но к такому возрасту пора бы уже знать, что нельзя делать выводы о людях которых не знаешь;-)
Код самый простой никах транзакций не открывается, внутри заполнения дополнительных документов не создаётся.
Пока ВремДата<=ДатаКон Цикл        
   Попытка
       Док=СоздатьОбъект("Документ."+ВидДок);
       Параметры = СоздатьОбъект("СписокЗначений");
       Параметры.Установить("ВариантДействия","Заполнить");
       Параметры.Установить("ВизуальноеОткрытие",0);        
       Док.Новый();
       Док.ДатаДок=ВремДата;
       Док.ДатаОперацииГААП=ВремДата;
       Док.Записать();
       Ссылка=Док.ТекущийДокумент();
       ОткрытьФормуМодально(Ссылка,Параметры);
       //За указанную дату нет данных помечаем на удаление документ
       Если Параметры=1 Тогда        
           Док.НайтиДокумент(Ссылка);
           Док.Удалить(0);
       КонецЕсли;
   Исключение                
       Возврат;
   КонецПопытки;
КонецЦикла
28 Ёпрст
 
23.03.12
10:41
(27) ага, это полный пэ
>>>>ОткрытьФормуМодально(Ссылка,Параметры);
29 Ёпрст
 
23.03.12
10:44
И записать документ чтоб его потом открыть модально и удалить.. тут что-то надо менять в консерватории

Но ясно одно - секту из "группы разработчиков" надо распустить
30 Frog_i
 
23.03.12
10:48
(25) Зная как работает профайлер я не могу представить каким образом можно найти документы которые появляются 1-2 раза в месяц, причем это нужно с эмулировать многопльзовательскую работу системы, что в тестовых условиях трудновыполнимо и по трудозатратам не соизмеримо с жаждой познания. Теоретически можно оставить ошибку и найти запрос которым создаётся документ, тут возникает вопрос, а какой документ нужен, тот который не правильный или тот который удаляется? Если тот который не правильный, то они разного типа, значит нужен тот который создаётся. Хорошо я получил запрос, но ситуация не воспроизводится постоянно, значит я должен либо ограничить запись в профайлер условием, либо потом сидеть неделю разгребать логи. Вот тут вопрос, а по какому условию я смогу отследить такую ситуацию. Ответа у меня нет, поэтому вариант посмотреть в профайлер мне не очень импонирует, хотя есть вероятность, что я полный дебил и много чего е знаю в этой жизни.
31 Frog_i
 
23.03.12
10:51
(29) Я вижу человек очень умный. При заполнении делается бух запрос на время документа, каким образом выполнить этот запрос не сохраняя документа? Вариант с СформироватьПозициюДокумента(ДатаКонца,23,59,59,1) не подходит.
32 Ёпрст
 
23.03.12
11:04
(31) че за бред с похицией ?
Я не вижу в этом коде, чтоб ты документ на конкретное время записывал - следовательно, по умолчанию он на конец дня будет.
Теперь внимание! Вопрос группе разработчиков - накой хрен вам упёрлась позиция документа, если запрос будет на конец дня ?
33 Ёпрст
 
23.03.12
11:07
+32 если дата дока <> дате ТА (или рабочей дате в случае отсутствия опер учета) док по-умолчанию запишется текущем временем. Получить его позицию не составляет особого труда.
34 Ёпрст
 
23.03.12
11:08
в общем, для начала - выкинуть бред с открытием модальной формы и попыткой.
Неудивлюсь еще, что этот код выполняется еще в 1 большой транзакции
35 Z1
 
23.03.12
11:10
(0) В УРБД
Удалить(1) не означает безусловное удаление документа.
Документ не будет удален из ЦБ
пока не придет подтверждение об удалении из всех ПБ.
Если в одной ПБ Вы выполнили Удалить(1)
а в другой ПБ  пересохранили документ то "удаленный" документ
возродиться и обычно это очень неожиданный сюрприз.
Поэтому и не рекомендуется для УРБД использовать Удалить(1)
36 Z1
 
23.03.12
11:11
(0) про id вообще не понятно
распиши в терминах iddoc + iddocdef
37 Mikeware
 
23.03.12
11:13
(35) Это уже следствие.
Первоначально у него "дублирутся" иды. Точнее, один документ какгбэ записываестя и кагбэ удаляется, а система считает, что ничего не произощло, и дает этот ид следущему доку. В общем, причину выяснили. Остается стеб.
38 Z1
 
23.03.12
11:14
(6) Два новых документа созданых в разных базах не могут иметь один номер iddoc так как три последних символа содержат
идентефикатор ПБ.
39 Z1
 
23.03.12
11:16
(17)
>>>Эта самописка разрабатывается группой разработчиков уже 10 лет
>>>в ней реализованы такие решения которые большинство 1С-ов
>>>даже не могут себе предствить.

Поделись что именно реализовано
40 Z1
 
23.03.12
11:19
(34) Скорее всего он этот код выполняет в модуле проведения
41 Mikeware
 
23.03.12
11:19
(40) забей...
42 nicxxx
 
23.03.12
11:28
(38) у него это в одной базе происходит, код базы для урбд - RN2
43 Ёпрст
 
23.03.12
11:30
(40) ага
44 Z1
 
23.03.12
11:47
(42)  поле iddoc имеет уникальный индекс. два с одним номером
никак не создашь.
в транзации создали документ удалили документ. Откатили транзакцию.
документ исчез. откатился также и счетчик (iddoc) документов.
записи о проделанной работе в журнале регистраций остались.
45 Mikeware
 
23.03.12
11:56
(44) Не только.. осталась еще и запись в таблице регистрации урбд...
46 Z1
 
23.03.12
12:06
(44) нет она откатиться при той же откатить транзакцию
47 Frog_i
 
23.03.12
13:31
(32)время там точно есть, запрос обрезанный, что бы не спамить ветку
Если Upd=2 Тогда
Док.Новый();
глЗаполнениеРеквизитов(Док);
Док.УстановитьВремя(23,0,0);
КонецЕсли;
но это на самом деле не принципиально, вопрос состоял в том как получить запрос на время документа, не записывая этот документ предварительно? Пока документ не записан получить его время нельзя, как бы тут не тужился это к ответу по (33). Именно поэтому перед открытием формы документ записывается. Если это не так публично признаюсь что я полное дерьмо:)

Процедура глЗаполнениеРеквизитов(Конт) Экспорт
   Конт.Автор                = Пользователь.ТекущийЭлемент();
   Конт.ДатаВвода            = ТекущаяДата();
   Если ПустоеЗначение(Конт.Фирма)=1 тогда
       Конт.Фирма=Константа.ОсновнаяФирма;
   КонецЕсли;
КонецПроцедуры
(34) Ты удивишься, но транзакции нет и быть не может так как явно она не открывается, а при пустой табличной части документ не проводится, а удаляется тем самым не открывается не явная транзакция. В самом документе есть функция заполнить, которая заполняет табличную часть, поэтому самым рациональным открывать именно модально, для того что бы заполнить сначала документ, а потом при необходимости его провести или удалить. Теоретически можно вынести модуль заполнения в глобальник и потом воспользоваться им в обработке, но зачем делать это если это те же яйца только в профиль. Это кстати тоже вопрос: Какой физический смысл в операции предложенной тобой? Как по твоему мнению может повлиять попытка на работу алгоритма?
(35) Вопроса про механизм работы УРБД не было, но если тебе интересно подробнее можно почитать здесь Книга знаний: Нетипичное использование компоненты УРБД в системе 1С:Предприятие 7.7
(37) Это не причина это следствие и это предположение я высказал еще в начале поста "Есть предположение, что при прямом удалении 1С высвобождает освободившийся ID удаленного документа и другой документ другого типа, при получении ID получает, но с типом удаленного документа". Как можно воспользоваться в данном случае чудо профайлером я так и не услышал.

В итоге запостили 47 веток из них половина моя с описанием. На выходе я понял что нужно делать:
1) При любой проблеме нужно обязательно воспользоваться профайлером, если ты не воспользовался им, то к богоподобной касте программистов 1С дорога тебе закрыта. Пользоваться им нужно по любому даже если это бессмысленное занятие (видимо это просто часть ритуала)
2) Тайными способами известными только преосвященным можно получить время не записанного документа, видимо в этом случае есть способ добраться до астральной тени этого документа.
3) Нужно бояться использовать попытку и исключение, так как эта конструкция проклята и в ней могут появляется необъяснимые ошибки.
4) Нужно обязательно переделать рабочий код, вероятнее всего нужно сделать дубль уже существующего что бы всегда иметь альтернативу и поддерживать всегда два, а лучше 3 варианта.
Всем спасибо за ответы. Поржали всем отделом. Вопросов больше не имею. На вопросы по тексту отвечать не нужно, тему можно закрыть. Удачи всем ребята:-)
48 Ёпрст
 
23.03.12
13:36
(47) уволить весь отдел за профнепригодность надо
49 Ёпрст
 
23.03.12
13:37
а советовать Z1 к примеру, поделку ромикса - так вообще смешно.
50 Ёпрст
 
23.03.12
13:39
Для получения позиции лока его не обязательно записывать, это раз
Весь код нужно выносить в поделку, а не открывать форму модально, это два (хотя, людям, которые не понимают что происходит при открытии формы это не понять)
51 Ёпрст
 
23.03.12
13:41
у документа нет понятия ID , есть iddoc+iddocdef, + связка по позиции - date_time_iddoc или date + time для дбф
У тебя двоятся iddoc, задвоить можно разными способами
52 Ёпрст
 
23.03.12
13:42
да, понятие Тип у документа тоже нет - есть вид
53 Z1
 
23.03.12
13:49
(47) Вот тебе совет если он тебе еще нужен.
У тебя есть ось времени в таблице _1sjourn
У тебя есть момент времени ( Неважно как ты его вычислил)
это точка на этой оси времени.
Перебором по Док = создатьОбъект("Документ");
или прямым запросом найди ближайший существующий документ
к твоей точке.Этот документ и используй вместо того что ты создавал.
Все задача решена. Создавать документ и тут
же его удалять не нужно.
54 Mikeware
 
23.03.12
17:21
(53) "не поможет"©
Закон Брукера: Даже маленькая практика стоит большой теории.