Имя: Пароль:
1C
1C 7.7
v7: Ложное срабатываение ПриУдаленииСтроки()
,
0 фобка
 
15.09.11
09:18
Всем привет.
Самописная конфигурация, иногда (систематику события определить не удалость) при открытии документа срабатывает процедура "ПриУдаленииСтроки()" и "ПриДобавленииСтроки()". Обнаружил, потому что в процедурах стоит запрет на эти действия и выводятся диалоги. На тестовой конфигурации отключил запрет, при возникновении такой ситуации строки не удаляются и не добавляются, т.е. процедуры вызываются просто так (?). И так в любом другом документе этого вида, после возникновении ошибки, пока не перезапускаю программу.

Что это может быть? ПриОткрытии почти ничего не вызывается

Заранее спасибо
1 Vladal
 
15.09.11
09:20
Поставь точку останова в этих процедурах.
Когда остановится, посмотри стек вызовов.
2 Рэйв
 
15.09.11
09:20
Это барабашка.
3 andrewks
 
15.09.11
09:37
какой релиз платформы? какие ВК используются?
4 фобка
 
15.09.11
09:40
(3) 27. 1с++, formex при начале работы системы
+(0) с формы вызывается несколько процедур (простой расчет), поэтому "удаление строк" производится несколько раз
(1) ок попробую, но замер ничего не показал
5 Vladal
 
15.09.11
09:47
(4) Замер и не нужен. Ставь точку останова на предупреждении и гляди там.

Хотя, часом не формекс балуется? Прогляди-ка все обработчики и те, что на форме лежат. Мож что и наковыраешь.

Ишо проверь какие скрипты кнопконажимательные в винде запускаются. Мож там собака.
6 Aprobator
 
15.09.11
09:49
хм - а просмотр стека вызовов не помогает?
7 andrewks
 
15.09.11
09:50
какие версии 1с++, formex ?

попробуй без них - сабж исчезнет, или нет
8 Vladal
 
15.09.11
09:53
Ложное срабатывание. Ложная поганка, ложные лисички.
9 фобка
 
15.09.11
09:55
к сожалению, сабж не так просто отловить, сегодня утром наблюдал (предыдущие пару недель тоже) сейчас устал открывать документы - пока не возникает..
скриптов нет, в документах компоненты не используются, загружены только при начале работы системы.. 1с++ 3.2.2.0, формекс 2.0.5.101 b
10 andrewks
 
15.09.11
09:57
(9)обнови 1c++, для начала
или наоборот, откатись на предыдущую версию, например, 2.5.0.7
11 фобка
 
15.09.11
10:00
(8) думаешь я шучу чтоли? :)
12 Aprobator
 
15.09.11
10:02
мож документ прописан так, что при открытии документа меняются его реквизиты (не один раз на такой го...нокод натыкался уже)?
13 andrewks
 
15.09.11
10:03
(12) а при чём здесь сабжевые предопределённые процедуры?

тут явно ВК лезет
14 фобка
 
15.09.11
10:05
Procedure OnOpen()
   
   Форма.ИспользоватьЗакладки(1);    
   Форма.Закладки.ДобавитьЗначение("Перевозка");
   Форма.Закладки.ДобавитьЗначение("Слежение");
   Форма.Закладки.ДобавитьЗначение("История");
   
   Форма.ИспользоватьСлой("Общий,Основной,ТЧ_КомментДок,UseLayer,КнопкиИНомер",2);
   
   If (UserInterfaceName()    ="Экономист") Or (UserInterfaceName() = "Администраторский") Or (UserInterfaceName()    ="ОперационныйДиректор") Then
       Fl = 1;
       Форма.Закладки.ДобавитьЗначение("Ставки");
   Else
       Fl = 0;
   EndIf;
   Form.ЗакСтавка.Visible(Fl);
   Form.ПродСтавка.Visible(Fl);
   Form.Маржа.Visible(Fl);
   Form.КомментарийПоТТН.Visible(1-Fl);
   Form.КомментарийПоАкту.Visible(1-Fl);
   
   ПроМаршрутСказали = 0;
   ПроМаршрутСказалиЗакупка = 0;
   Тихо = 1;
   If (UserInterfaceName() = "Экономист") Or (UserInterfaceName() = "Администраторский") Then
       Тихо = 0;
   EndIf;
   If Перевозчик <>  pGefcoSPb Then
       If (Перевозчик <> ДокОснование.Перевозчик)
           Or (Водитель <> ДокОснование.Водитель)
           Or (Тягач <> ДокОснование.Тягач) Then
           If DoQueryBox("Данные о перевозчике/автовозе в документе и в Лоте различаются. Обновить информацию из Лота?",4) = 6 Then
               Водитель = ДокОснование.Водитель;
               Тягач = ДокОснование.Тягач;
               Прицеп = ДокОснование.Прицеп;
               Перевозчик = ДокОснование.Перевозчик;
           EndIf;
       EndIf;
   EndIf;

   Если Маршрут.ТипМаршрута = Перечисление.ТипыМаршрутов.Международный Тогда
       Форма.ДатаРастаможки.Доступность(1);
   Иначе
       Форма.ДатаРастаможки.Доступность(0);
   КонецЕсли;
   
   oRef = CreateObject("Reference.Фирмы");
   oRef.FindByCode("00001");
   Заказчик = oRef.CurrentItem();

   pMark = Клиент.Маркетинг;

   Если ПустоеЗначение(КомментарийМестонахождения)=0 Тогда
       ТЧСлежения.Загрузить(ЗначениеИзСтрокиВнутр(КомментарийМестонахождения));  
   КонецЕсли;  
   
   //Автоматическая доставка
   Если ТипЗначенияСтр(Форма.Параметр) = "Дата" Тогда
       Если Форма.Параметр >= DocDate Тогда
           ПриЗаписиДокумента();
           Записать();
           Форма.Закрыть(0);
       КонецЕсли;
   КонецЕсли;
   
   Если ПустоеЗначение(История)=0 Тогда
       ТЗИстория.Загрузить(ЗначениеИзСтрокиВнутр(История));  
   КонецЕсли;
   
EndProcedure
15 andrewks
 
15.09.11
10:05
(0) а в других программах у вас, случаем, не проявляются хаотические эффекты от якобы нажатия клавиш Ins и Del?
16 Aprobator
 
15.09.11
10:06
(13) вообще да. События то возникающие ввиду интерактивных действий.
17 Aprobator
 
15.09.11
10:09
(14) мама родная. И чего только в процедуру ПриОткрытии народ не пихает.
18 Darych
 
15.09.11
10:12
код порадовал)))...

а это зач0т:
"   ПроМаршрутСказали = 0;
   ПроМаршрутСказалиЗакупка = 0;
   Тихо = 1;
"
19 фобка
 
15.09.11
10:13
(18) гыг) это что бы по сто раз мессаги не вылезали, а у когото вообще не вылезали
20 andrewks
 
15.09.11
10:16
это называется "обфускация кода", и применяется настоящими программистами-профессионалами, л\дабы потом всякое ламерьё не лезло своими кривыми ручками и не меняло что ни попадя
21 Aprobator
 
15.09.11
10:18
за такой код в ПриОткрытии расстреливать надо. Явно просматривается изменение реквизитов документа. А уж то, что проверка на параметр в конце и выполнение ряда действий с последующим закрытием формы, после того как куча операций над самой формой сделано - просто прелесть.
(20) сказал бы я как это называется, да забанят.
22 фобка
 
15.09.11
10:20
(21) не смеши) где ты разглядел изменнеие реквизитов?
(20) это называется много программистов
23 Aprobator
 
15.09.11
10:23
(22)

.... // это чо - все изменение переменных модуля формы
               Водитель = ДокОснование.Водитель;
               Тягач = ДокОснование.Тягач;
               Прицеп = ДокОснование.Прицеп;
               Перевозчик = ДокОснование.Перевозчик;
....
24 фобка
 
15.09.11
10:24
(23) а это что?
If DoQueryBox("Данные о перевозчике/автовозе в документе и в Лоте различаются. Обновить информацию из Лота?",4) = 6 Then
25 Aprobator
 
15.09.11
10:26
(24) ну и? Наличие условия сути не меняет.
26 Aprobator
 
15.09.11
10:27
подобные проверки должны делаться в форме как минимум в событии ПередЗаписью, а уж никак ни ПриОткрытии формы. Впрочем к теме это отношения не имеет.
27 Darych
 
15.09.11
10:30
вот это непонятно...
   Если ТипЗначенияСтр(Форма.Параметр) = "Дата" Тогда
       Если Форма.Параметр >= DocDate Тогда
           ПриЗаписиДокумента();
           Записать();
           Форма.Закрыть(0);
       КонецЕсли;
   КонецЕсли;
эт пораньше бы... в начало процедуры... и форму открывать нах?... статусвозврата(0) есть)))
28 Aprobator
 
15.09.11
10:32
(27) в (20) уже писали - это чтобы никто и ни о чем не догадался.
29 фобка
 
15.09.11
10:59
(1) стек показал ПриУдаленииСтроки() и всё
30 фобка
 
15.09.11
11:21
(26) пользователь открыл документ, посмотрел и вышел, и так и не узнал о том что данные в документе различались с данными в ДокОсновании
(27) это все понятно, в данном случае документы открываются из обработки для вызова функций модуля формы
31 Aprobator
 
15.09.11
11:30
песец - посмотри наконец типовые конфигурации. Как там сделана увязка документов и как там реализован подобный контроль. То то сделано тут - методологически неверно.
32 фобка
 
15.09.11
11:32
(31) смотрел типовые, видимо их пишут такие как ты
33 фобка
 
22.09.11
15:28
Up.
Систуация повторилась. Зашел в отладчик, открыл стек вызовов, поставил точку на ПриУдаленииСтроки() в стеке "ПриУдаленииСтроки(); 121"
34 фобка
 
22.09.11
15:29
+(33) после этого иногда срабатывает ПриВводеСтроки().
Переключаюсь на другое откно, затем опять делаю активным документ - и все по новой.
35 фобка
 
11.10.11
12:19
Парадоксально, конечно,но.. поменял названия процедур на OnNewLine() и на OnDeleteLine(), так же переместил процедуры в конец модуля. И возникать перестало (уже неделю не жалуются).
Вот такие танцы.