|
v7: Не отрабатывает обработка. Проблема только на быстрых компьютерах | ☑ | ||
---|---|---|---|---|
0
Джордж1
05.01.21
✎
20:08
|
Из формы открываю обработку, которая отрабатывает без открытия формы.
Данные передаются через СписокЗначений в Форма.Параметр. В этот СЗ добавляется параметр "ЕстьОшибка" - так вот этот параметр не добавляется в СЗ, причем проблема только новых (быстрых) компьютерах. В режиме отладки - тоже все ОК Если ПустоеЗначение(Форма.Параметр)=0 Тогда //работаем не в интерактивном режиме СтатусВозврата(0); СЗ=Форма.Параметр; Команда=СЗ.Получить("Команда"); Если Команда="ВыписатьЧек" Тогда//формируем чек ДокЧек=СЗ.Получить("ДокЧек"); Статус=ВыписатьЧек(ДокЧек); Если Статус=0 Тогда Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",1); КонецЕсли; Иначе Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",0); КонецЕсли; КонецЕсли; |
|||
1
Крэкпэк
05.01.21
✎
20:42
|
Добавь логирование после каждой строки. Смотри где не отрабатывает.
|
|||
2
Джордж1
05.01.21
✎
20:53
|
(1)Попробую, только вот ошибка пока воспроизводится только на одном компе в магазине на кассе. И то вчера ее не было, а сегодня появилась
|
|||
3
Крэкпэк
05.01.21
✎
20:57
|
Логирование поможет проблеме быстрых компьютеров. С таким не встречался.
Обычно тупо ошибка в коде например в строке Статус=ВыписатьЧек(ДокЧек); хз что там происходит что в переменной ДокЧек? может просто замена на ДокЧек.ТекущийДокумент() решит проблемы |
|||
4
Джордж1
05.01.21
✎
21:05
|
(3)Я же пишу - 3 компа в сети. Тот на котором база выдает ошибку, на других все нормально
В режиме отладки тоже все ОК Было бы так просто - я бы сам отладил |
|||
5
ДенисЧ
05.01.21
✎
21:17
|
(2) Замени компьютер на более медленный.
|
|||
6
Джордж1
05.01.21
✎
21:24
|
(5)Медленным компьютерам уже лет под 10, боимся сдохнут уже
|
|||
7
Злопчинский
05.01.21
✎
23:46
|
Отпиши когда порешаешь
|
|||
8
ДенисЧ
06.01.21
✎
06:02
|
(6) Хм.... У меня сейчас музыку играет ноут, которому 12 лет... И ничего, не дохнет...
|
|||
9
Джордж1
06.01.21
✎
07:56
|
(8)так и в магазинах может не сдохнут, но лучше до этого не доводить.
Один комп загружается 10 минут. А покупатели ждут |
|||
10
Джордж1
06.01.21
✎
08:04
|
(7)пока решилось добавлением параметра в СЗ сразу в начале модуля. (2-я строчка).
Если ПустоеЗначение(Форма.Параметр)=0 Тогда //работаем не в интерактивном режиме Форма.Параметр.Установить("ЕстьОшибка",0); СтатусВозврата(0); СЗ=Форма.Параметр; Команда=СЗ.Получить("Команда"); Если Команда="ВыписатьЧек" Тогда//формируем чек ДокЧек=СЗ.Получить("ДокЧек"); Статус=ВыписатьЧек(ДокЧек); Если Статус=0 Тогда Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",1); КонецЕсли; Иначе Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",0); КонецЕсли; КонецЕсли; |
|||
11
ДедМорроз
06.01.21
✎
10:30
|
А слабо сразу из параметра получить СЗ проверить,что там список и только потом идти далее?
Просто,возможна ситуация,когда у вас в ВыписатьЧек создаётся Com-объект выписывается,который начинает работать в своем потоке и вы из него получаете значение,когда он что-то делает. |
|||
12
Джордж1
12.01.21
✎
09:55
|
Посмотрел повнимательнее
вот кусок кода СЗ=СоздатьОбъект("СписокЗначений"); СЗ.Установить("Команда","ВыписатьЧек"); СЗ.Установить("ДокЧек",ДокЧек); СЗ.Установить("ЕстьОшибка",0); ОткрытьФорму("Обработка.ККМ",СЗ); ЕстьОшибка=СЗ.Получить("ЕстьОшибка"); Ошибка вылезает на последней строке. Причем ошибка "Поле агрегатного объекта не обнаружено" - т.е. переменная СЗ каким-то макаром обнуляется иногда. в Обработка.ККМ мы с СЗ кроме чтения и установки параметров ничего не делаем - проверил |
|||
13
Bigbro
12.01.21
✎
10:00
|
выходит что-то делаете все же.
попробуй перед возвратом в явном виде пересоздать СЗ и добавить в него "ЕстьОшибка" |
|||
14
Джордж1
12.01.21
✎
10:03
|
(13)пока ошибка проявляется только на одном компе из 10-ка и воспроизвести ее не удается устойчиво
там в СЗ еще ряд параметров добавляется - нельзя пересоздавать |
|||
15
НЕА123
12.01.21
✎
10:13
|
||||
16
Джордж1
12.01.21
✎
10:15
|
(15)Тоже самое и делаю
|
|||
17
НЕА123
12.01.21
✎
10:25
|
(11) проверили? может там и не СЗ...
|
|||
18
Джордж1
12.01.21
✎
10:44
|
(17)СЗ. я же пишу ошибка не воспроизводится
|
|||
19
Ёпрст
12.01.21
✎
11:05
|
где то есть перем сз в коде или реквизит формы с таким идентификатором
|
|||
20
Ёпрст
12.01.21
✎
11:05
|
И..ибо нехрен давать короткие имена переменным
|
|||
21
Ёпрст
12.01.21
✎
11:06
|
+ Не ясно, на кой хрен проверять тип значения параметра формы, если РАНЬШЕ уже используешь метод списка значения через Получить.
|
|||
22
Ёпрст
12.01.21
✎
11:06
|
не боясь получить ошибки, что это не список значений.
|
|||
23
Джордж1
12.01.21
✎
11:37
|
(19)Нет. проверил. Внутри одно другой процедуры используется такое же имя переменной, ну так она не должна никак влиять - переменная в модуле обработки не объявлена
(21)Потому что обработка может открываться и в нормальном режиме. |
|||
24
Ёпрст
12.01.21
✎
11:54
|
(23) нормальный, это какой ?
|
|||
25
Ёпрст
12.01.21
✎
11:55
|
Ты один хрен не проверяешь что прилетело в Форму.Параметр и сразу обращяешься к методу списка значений через Получить().
А в форму.параметр можно запихать что угодно |
|||
26
Ёпрст
12.01.21
✎
11:56
|
И зачем только потом проверяешь на тип - загадка..
|
|||
27
Джордж1
12.01.21
✎
11:58
|
(24)нормальный это с показом формы
т.е. без СтатусВозврата(0); Возврат; |
|||
28
ChMikle
12.01.21
✎
12:11
|
(0) платформы 1С все одинаковые ?
|
|||
29
Джордж1
12.01.21
✎
12:21
|
(28)Да, должны быть 27, т.к. часть компов на WinXP еще
|
|||
30
Джордж1
12.01.21
✎
12:23
|
Используется FormEx.dll - но раньше не было к нему претензий
Попробую я сделать все тоже самое, только с Форма.Закрыть() в конце |
|||
31
Salimbek
12.01.21
✎
13:13
|
(12) "ОткрытьФорму("Обработка.ККМ",СЗ);"
Синтаксис: ОткрытьФорму (<Параметр1>, <КонтекстФормы>, где <КонтекстФормы> Необязательный параметр. Имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр. После исполнения данного метода система вернет в данную переменную контекст открытой формы (см. Передача контекста в качестве параметра). С помощью значения этого контекста можно затем произвольно манипулировать открытой формой, пока она открыта. Пока форма открыта, тип значения данного параметра равен 100 (см. ТипЗначения), если закрыта — 0. т.е. этот параметр перезаписывается. Поэтому на ИС рекомендуют так: Список = СоздатьОбъект("СписокЗначений"); ПередаваемыйПараметр = Список; // т.е. присвоить список в переменную, а потом передать эту переменную в форму ОткрытьФорму("Обработка.<ИмяФормы>",ПередаваемыйПараметр); или так: http://catalog.mista.ru/1c/articles/17048/ |
|||
32
Джордж1
12.01.21
✎
13:15
|
(31)Да я так и делаю
|
|||
33
Builder
12.01.21
✎
13:20
|
(32) В (0) приведи все к одному виду, а то вразнобой все записано.
Где-то через Форма.Параметр, где то через СЗ, который тоже Форма.Параметр. |
|||
34
Джордж1
12.01.21
✎
13:25
|
(33)
Вот этот код вызывается из справочника (документа). Т.е. тут переменная СЗ локальная СЗ=СоздатьОбъект("СписокЗначений"); СЗ.Установить("Команда","ВыписатьЧек"); СЗ.Установить("ДокЧек",ДокЧек); СЗ.Установить("ЕстьОшибка",0); ОткрытьФорму("Обработка.ККМ",СЗ); ЕстьОшибка=СЗ.Получить("ЕстьОшибка"); Дале в форме обработки ККМ работаю только с Форма.Параметр. То что я тут использую тоже переменную СЗ - тоже нормально, она же локальная Форма.Параметр.Установить("ЕстьОшибка",0); СтатусВозврата(0); СЗ=Форма.Параметр; Команда=СЗ.Получить("Команда"); Если Команда="ВыписатьЧек" Тогда//формируем чек ДокЧек=СЗ.Получить("ДокЧек"); Статус=ВыписатьЧек(ДокЧек); Если Статус=0 Тогда Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",1); КонецЕсли; Иначе Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда Форма.Параметр.Установить("ЕстьОшибка",0); КонецЕсли; КонецЕсли; |
|||
35
Salimbek
12.01.21
✎
13:35
|
(34) Блин, я же показал уже в (31)
Вместо: ОткрытьФорму("Обработка.ККМ",СЗ); Пишут: вПараметр = СЗ; ОткрытьФорму("Обработка.ККМ",вПараметр); Потому что по условию этой команды в эту Переменную запишется КонтекстФормы. Ну или в конце своей процедуры делай принудительно (хотя по учебнику говорят, что так надо делать в ПриЗакрытии): Форма.Параметр = СЗ; Или после ОткрытьФорму жди, пока вернется правильный параметр (тТак как ниже - делать совсем нельзя, но для понимания напишу именно так) ОткрытьФорму("Обработка.ККМ",СЗ); Пока ТипЗначения(СЗ)=100 Цикл КонецЦикла; |
|||
36
Джордж1
12.01.21
✎
15:26
|
(35)Чувствую вы правы.
Но как это черт возьми работает? Сначала возвращается контекст, а потом только параметр? |
|||
37
Джордж1
12.01.21
✎
15:38
|
Почему так не всегда происходит?
|
|||
38
Ёпрст
12.01.21
✎
15:40
|
Модально поди изначальное изделие открывается ?
|
|||
39
Джордж1
12.01.21
✎
15:54
|
(38)Нет, были мысли в этом направлении - что бы форму открывать как для эквайринга сберовского - что бы повисела секунду
|
|||
40
DJ Anthon
12.01.21
✎
16:05
|
помню, как писал универсальную обработку объектов из формы самих же объектов. вызывал двойным щелчком правой кнопки мыши на любой точке формы. это событие было единственным незанятым.
как известно, ничего с объектом сделать нельзя, он заблокирован, когда он открыт. НО! я нашел способ разблокировать его. надо было развернуть форму на весь экран и обратно. либо если он уже развернут, то свернуть и развернуть. в этот момент объект освобождался на микросекунду, но этого хватало, чтобы успеть произвести отмену проведения или пометку удаления или еще чего. юзер просто видел небольшое моргание экрана и все. почему-то я поверил, что такой фокус с базой проканает и я его нашел. очень удобно стало работать с семеркой после этого, но снеговик уже подкрадывался... |
|||
41
Arbuz
12.01.21
✎
16:14
|
(40) Может что-то более правдоподобное надо выдумывать? Или это под грибами было?
|
|||
42
Cthulhu
12.01.21
✎
16:29
|
обрабатывай результат через форма.обработкаожидания("ЧоТамВернулось",1);
|
|||
43
Cthulhu
12.01.21
✎
16:31
|
(42)+ в "Процедура ЧоТамВернулось()", в которой "форма.обработкаожидания("",0);", а все возвраты пихай в переменную модуля.
|
|||
44
Cthulhu
12.01.21
✎
16:31
|
в смысле - параметр при вызове и потом для анализа в той процедуре
|
|||
45
DJ Anthon
12.01.21
✎
16:33
|
(41) могу скинуть. я сам в шоке был
|
|||
46
Arbuz
12.01.21
✎
16:35
|
(45) Скидывай конечно
|
|||
47
DJ Anthon
12.01.21
✎
16:36
|
(41) меня бесило, что в типовых постоянно была проблема в том, что надо пометить на удаление элемент или документ, который у тебя открыт в данный момент, а найти его трудно - ты не знаешь ни наименования элемента, на владельца. этой обработкой можно было узнать и поменять его скрытые реквизиты - код, владелец, наименование; узнать его статус - проведен ли, помечен ли. можно было открыть родителя и владельца (привет, банковские счета и договоры). для программирования было удобно узнать его название в конфигураторе, и так далее. и все это вызывается менюшкой правой кнопкой мыши.
|
|||
48
Джордж1
12.01.21
✎
16:53
|
(43)Так нет такого в 7-ке. Есть просто ОбработкаОжидания, но работает она криво
|
|||
49
Cthulhu
12.01.21
✎
17:04
|
(48): есть такое в 7-ке. просто ты не в курсе.
|
|||
50
Cthulhu
12.01.21
✎
17:05
|
(48): и обработкаожидания работает не криво - просто надо знать как ей пользоваться и помнить о том. что 7-ка это тупо один поток в котором оно и ждет. в смысле - и тут "просто ты не в курсе".
|
|||
51
Джордж1
12.01.21
✎
17:12
|
(50)вот именно что ждет, на модальные окна не реагирует. А у тебя очередь из покупателей аж на улице стоит
(49)22 года с 7-кой, а такого помню - просветите. В СП заглянул - нет такого |
|||
52
Cthulhu
12.01.21
✎
17:20
|
(51): странное замечание. человеку, знакомому с 7-кой єто понятно в качестве стандартного свойства а не в качестве претензии на несоответствие факта документации.
(51): с чем вас и поздравляю. IdToStr/StrToId/_Getperformansecounter и много чего еще "нет в СП". что не мешает быть достаточно продвинутому прогеру (даже не гуру) знать и использовать все эти возможности. |
|||
53
Джордж1
12.01.21
✎
17:33
|
(52)честно никогда ОбработкаОжидания в форме не требовалась
А чем плохо? Пока ТипЗначения(СЗ)=100 Цикл КонецЦикла; |
|||
54
Arbuz
12.01.21
✎
17:45
|
(53) Мощу жрёт
|
|||
55
Джордж1
12.01.21
✎
17:54
|
(54)Да если в сетевом режиме на отдельном компе - вроде и не страшно
|
|||
56
Salimbek
12.01.21
✎
22:26
|
(53) Если есть 1С++, то можно:
Система=СоздатьОбъект("Система"); Пока ТипЗначения(СЗ)=100 Цикл Система.Уснуть(200); //Уснуть на 200 миллисекунд, без нагрузки процессора КонецЦикла; |
|||
57
victuan1
13.01.21
✎
05:17
|
Сколько я нового узнал))
|
|||
58
Джордж1
13.01.21
✎
06:49
|
Вот такая конструкция совсем не работает. Уходит в вечный цикл
Пока ТипЗначения(СЗ)=100 Цикл КонецЦикла; |
|||
59
Salimbek
13.01.21
✎
07:43
|
(58) Блин, точно. Дело в том, что и у СписокЗначений и у Контекст это значение одно и то же - 100. Тогда надо смотреть через ТипЗначенияСтр
Для Списка значений ------ ТипЗначения: 100 ТипЗначенияСтр: СписокЗначений Для открытой формы ------ ТипЗначения: 100 ТипЗначенияСтр: ГрупповойКонтекст |
|||
60
Джордж1
13.01.21
✎
07:48
|
(59)не стал я мучаться, а возвращаю значения через глобальную СЗ - глСЗ
Сегодня попробую |
|||
61
ДедМорроз
14.01.21
✎
16:48
|
ТипЗначенияСтр используйте.
ТипЗначения возвращает 100 для любого объекта,кроме связанных с базой данных(справочник,документ и т.п.) |
|||
62
ДедМорроз
14.01.21
✎
16:56
|
А обработка ожидания имитировалась,насколько я помню через функцию в поле информации и вызов закрытия формы в ней,когда закрытие отменяется,тогда несколько форм обрабатывались параллельно.
|
|||
63
Arbuz
14.01.21
✎
17:03
|
Жаль, что получения стека вызовов так и не добили в 1с++, а то можно было бы замутить класс красиво имитирующий статические переменные и даже иерархию области видимости переменных.
|
|||
64
DJ Anthon
16.01.21
✎
06:21
|
(46) https://files.fm/u/2u6vzgnp8
я последний релиз где-то потерял, вот нашел какой-то. Посмотри файл описаний отличий от стандартного ЗиКа и файл скриншотов про то, что я говорил. В глобальнике краткое описание изменений, по нему нельзя сказать, что я адекватный человек, потому что писалось это на эмоциях и для себя, так что не обессудь, все-таки это было 12 лет назад ) |
|||
65
Arbuz
25.01.21
✎
17:14
|
(64) Посмотрел. Смелость твоя похвальна, конечно. Очень внимательно посмотрел. Н-да. Как я и говорил - завязывай фантазировать вслух и употреблять, чего ты там...
Про говнокодерство не будем углубляться, типа переобъявления объектов в цикле и неиспользования их далее, дублирование условий ветвлений в разных комбинациях, исполняющиеся куски кода не имеющие значения, постоянное изобретение новых сущностей, повтор функционала, и т.д. 12 лет назад тормозило это безобразно, похоже. Хотя нет, это же клюшки. Но для снеговиковости норм, почти стандарт, надеюсь у тебя всё ок с этим. >>>я нашел способ разблокировать его Ничего ты не нашёл. Все действия, такие как проведение/распроведение/удаление/сдвиг_по_времени/смена_владельца/etc из открытой формы совершаются банальным закрытием_формы>действием>открытием, с диспетчеризацией через глобальный список значений и внешние события formex. Единственное удаление строк документа там делается через твой "способ". Но доступ к методам/переменным контекста давным давно реализован в так не любимой тобой 1с++ безо всякого шаманства. А удаление/изменение строк через передачу контекста так вообще можешь глянуть в типовой ТиС "ГрупповаяОбработкаМнЧДокументов" без какого-либо изврата (если таковым не считать родную модальность обработки для гарантии существования оного контекста). Я понимаю, что эффект "выцветания" и субъективизации памяти на 12 годах имеет значительный размер, но утверждать, что: (40) >>> я нашел способ разблокировать его. надо было развернуть форму на весь экран и обратно. либо если он уже развернут, то свернуть и развернуть. в этот момент объект освобождался на микросекунду, но этого хватало, чтобы успеть произвести отмену проведения или пометку удаления или еще чего. - это явный перебор, о чём я сразу и сказал. |
|||
66
DJ Anthon
26.01.21
✎
00:11
|
(65) тормозов не было, хотя у нас были базы и по 5000 человек. основная задача была решить проблемы с округлениями, с разделением ВСЕХ отчетов по сложной структуре (как сейчас легко делается штатно в 8ке), что было успешно сделано. а для этого была необходима срочная отладка, и вот эти свистоперделки я сделал специально для себя, ими редко кто пользовался, так и появилось это меню. лично я считаю, что это вообще мелочь по сравнению с остальными вещами. не спорю, говнокода там много, но он работал отлично. банальное закрытие и открытие формы я сейчас не вспомню, но оно у меня не взлетало по каким-то причинам. 1cpp я избегал всеми способами, потому что я не мог оставить там код, который потом никто больше сопровождать не мог. То есть все сделано практически на штатных функциях. Я тогда на начальника айти-конторы работал. Что значит никто не смог бы? А все просто, город маленький, как только спецы доходили до уровня 1cpp, они резко сваливали в европейскую часть россии. У меня таких три конфигурации - торговля и бухгалтерия для бюджетников.
Ну и я тогда кодил всего 3-й или 4-й год, мне простительно. Я больше на сях тогда писал, чем на 1С. Ланчер вон забабахал свой, до сих пор работает ) Правда, только в двух конторах, где еще с 7.7 слезти не могут. |
|||
67
UFOdriver
26.01.21
✎
00:25
|
Я помню на старых Пентиумах была кнопка TURBO. Она не турбировала, она как раз для подобных целей понижала
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |