Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Не отрабатывает обработка. Проблема только на быстрых компьютерах

v7: Не отрабатывает обработка. Проблема только на быстрых компьютерах
Я
   Джордж1
 
05.01.21 - 20:08
Из формы открываю обработку, которая отрабатывает без открытия формы.
Данные передаются через СписокЗначений в Форма.Параметр. В этот СЗ добавляется параметр "ЕстьОшибка" - так вот этот параметр не добавляется в СЗ, причем проблема только новых  (быстрых) компьютерах. В режиме отладки - тоже все ОК

Если ПустоеЗначение(Форма.Параметр)=0 Тогда //работаем не в интерактивном режиме
        СтатусВозврата(0);
        СЗ=Форма.Параметр;
        Команда=СЗ.Получить("Команда");
        Если Команда="ВыписатьЧек" Тогда//формируем чек
            ДокЧек=СЗ.Получить("ДокЧек");
            Статус=ВыписатьЧек(ДокЧек);
            Если Статус=0 Тогда
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",1);
                КонецЕсли;    
            Иначе
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",0);
                КонецЕсли;    
            КонецЕсли;
   Крэкпэк
 
1 - 05.01.21 - 20:42
Добавь логирование после каждой строки. Смотри где не отрабатывает.
   Джордж1
 
2 - 05.01.21 - 20:53
(1)Попробую, только вот ошибка пока воспроизводится только на одном компе в магазине на кассе. И то вчера ее не было, а сегодня появилась
   Крэкпэк
 
3 - 05.01.21 - 20:57
Логирование поможет проблеме быстрых компьютеров. С таким не встречался.
Обычно тупо ошибка в коде
например в строке
 Статус=ВыписатьЧек(ДокЧек);
хз что там происходит
что в переменной ДокЧек?
может просто замена на ДокЧек.ТекущийДокумент() решит проблемы
   Джордж1
 
4 - 05.01.21 - 21:05
(3)Я же пишу - 3 компа в сети. Тот на котором база выдает ошибку, на других все нормально

В режиме отладки тоже все ОК

Было бы так просто - я бы сам отладил
   ДенисЧ
 
5 - 05.01.21 - 21:17
(2) Замени компьютер на более медленный.
   Джордж1
 
6 - 05.01.21 - 21:24
(5)Медленным компьютерам уже лет под 10, боимся сдохнут уже
   Злопчинский
 
7 - 05.01.21 - 23:46
Отпиши когда порешаешь
   ДенисЧ
 
8 - 06.01.21 - 06:02
(6) Хм.... У меня сейчас музыку играет ноут, которому 12 лет... И ничего, не дохнет...
   Джордж1
 
9 - 06.01.21 - 07:56
(8)так и в магазинах может не сдохнут, но лучше до этого не доводить.
Один комп загружается 10 минут. А покупатели ждут
   Джордж1
 
10 - 06.01.21 - 08:04
(7)пока решилось добавлением параметра в СЗ сразу в начале модуля.   (2-я строчка).


Если ПустоеЗначение(Форма.Параметр)=0 Тогда//работаем не в интерактивном режиме

        Форма.Параметр.Установить("ЕстьОшибка",0);
        СтатусВозврата(0);
        СЗ=Форма.Параметр;
        Команда=СЗ.Получить("Команда");
        Если Команда="ВыписатьЧек" Тогд//формируем чек

            ДокЧек=СЗ.Получить("ДокЧек");
            Статус=ВыписатьЧек(ДокЧек);
            Если Статус=0 Тогда
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",1);
                КонецЕсли;    
            Иначе
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",0);
                КонецЕсли;    
            КонецЕсли;
   ДедМорроз
 
11 - 06.01.21 - 10:30
А слабо сразу из параметра получить СЗ проверить,что там список и только потом идти далее?
Просто,возможна ситуация,когда у вас в ВыписатьЧек создаётся Com-объект выписывается,который начинает работать в своем потоке и вы из него получаете значение,когда он что-то делает.
   Джордж1
 
12 - 12.01.21 - 09:55
Посмотрел повнимательнее

вот кусок кода

СЗ=СоздатьОбъект("СписокЗначений");
СЗ.Установить("Команда","ВыписатьЧек");
СЗ.Установить("ДокЧек",ДокЧек);
СЗ.Установить("ЕстьОшибка",0);
ОткрытьФорму("Обработка.ККМ",СЗ);
ЕстьОшибка=СЗ.Получить("ЕстьОшибка");

Ошибка вылезает на последней строке. Причем ошибка "Поле агрегатного объекта не обнаружено" - т.е. переменная СЗ каким-то макаром обнуляется иногда. в Обработка.ККМ мы с СЗ кроме чтения и установки параметров ничего не делаем - проверил
   Bigbro
 
13 - 12.01.21 - 10:00
выходит что-то делаете все же.
попробуй перед возвратом в явном виде пересоздать СЗ и добавить в него "ЕстьОшибка"
   Джордж1
 
14 - 12.01.21 - 10:03
(13)пока ошибка проявляется только на одном компе из 10-ка и воспроизвести ее не удается устойчиво

там в СЗ еще ряд параметров добавляется - нельзя пересоздавать
   НЕА123
 
15 - 12.01.21 - 10:13
   Джордж1
 
16 - 12.01.21 - 10:15
(15)Тоже самое и делаю
   НЕА123
 
17 - 12.01.21 - 10:25
(11) проверили? может там и не СЗ...
   Джордж1
 
18 - 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
не боясь получить ошибки, что это не список значений.
   Джордж1
 
23 - 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
И зачем только потом проверяешь на тип - загадка..
   Джордж1
 
27 - 12.01.21 - 11:58
(24)нормальный это с показом формы
т.е. без 
СтатусВозврата(0);
Возврат;
   ChMikle
 
28 - 12.01.21 - 12:11
(0) платформы 1С все одинаковые ?
   Джордж1
 
29 - 12.01.21 - 12:21
(28)Да, должны быть 27, т.к. часть компов на WinXP еще
   Джордж1
 
30 - 12.01.21 - 12:23
Используется FormEx.dll - но раньше не было к нему претензий

Попробую я сделать все тоже самое, только с Форма.Закрыть() в конце
 
 Рекламное место пустует
   Salimbek
 
31 - 12.01.21 - 13:13
(12) "ОткрытьФорму("Обработка.ККМ",СЗ);"

Синтаксис:

ОткрытьФорму (<Параметр1>, <КонтекстФормы>,

где
<КонтекстФормы>
    

Необязательный параметр. Имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.

После исполнения данного метода система вернет в данную переменную контекст открытой формы (см. Передача контекста в качестве параметра). С помощью значения этого контекста можно затем произвольно манипулировать открытой формой, пока она открыта. Пока форма открыта, тип значения данного параметра равен 100 (см. ТипЗначения), если закрыта — 0.

т.е. этот параметр перезаписывается.
Поэтому на ИС рекомендуют так:

Список   = СоздатьОбъект("СписокЗначений");
ПередаваемыйПараметр  = Список;// т.е. присвоить список в переменную, а потом передать эту переменную в форму

ОткрытьФорму("Обработка.<ИмяФормы>",ПередаваемыйПараметр); 


или так: http://catalog.mista.ru/1c/articles/17048/
   Джордж1
 
32 - 12.01.21 - 13:15
(31)Да я так и делаю
   Builder
 
33 - 12.01.21 - 13:20
(32) В (0) приведи все к одному виду, а то вразнобой все записано.
Где-то через Форма.Параметр, где то через СЗ, который тоже Форма.Параметр.
   Джордж1
 
34 - 12.01.21 - 13:25
(33)
Вот этот код вызывается из справочника (документа). Т.е. тут переменная СЗ локальная
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.Установить("Команда","ВыписатьЧек");
СЗ.Установить("ДокЧек",ДокЧек);
СЗ.Установить("ЕстьОшибка",0);
ОткрытьФорму("Обработка.ККМ",СЗ);
ЕстьОшибка=СЗ.Получить("ЕстьОшибка");


Дале в форме обработки ККМ работаю только с Форма.Параметр. То что я тут использую тоже переменную СЗ - тоже нормально, она же локальная 

        Форма.Параметр.Установить("ЕстьОшибка",0);
        СтатусВозврата(0);
        СЗ=Форма.Параметр;
        Команда=СЗ.Получить("Команда");
        Если Команда="ВыписатьЧек" Тогд//формируем чек


            ДокЧек=СЗ.Получить("ДокЧек");
            Статус=ВыписатьЧек(ДокЧек);
            Если Статус=0 Тогда
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",1);
                КонецЕсли;    
            Иначе
                Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
                    Форма.Параметр.Установить("ЕстьОшибка",0);
                КонецЕсли;    
            КонецЕсли;
   Salimbek
 
35 - 12.01.21 - 13:35
(34) Блин, я же показал уже в (31)

Вместо:
ОткрытьФорму("Обработка.ККМ",СЗ);

Пишут:
вПараметр = СЗ;
ОткрытьФорму("Обработка.ККМ",вПараметр);

Потому что по условию этой команды в эту Переменную запишется КонтекстФормы.


Ну или в конце своей процедуры делай принудительно (хотя по учебнику говорят, что так надо делать в ПриЗакрытии):
Форма.Параметр = СЗ;

Или после ОткрытьФорму жди, пока вернется правильный параметр (тТак как ниже - делать совсем нельзя, но для понимания напишу именно так)
ОткрытьФорму("Обработка.ККМ",СЗ);
Пока ТипЗначения(СЗ)=100 Цикл
КонецЦикла;
   Джордж1
 
36 - 12.01.21 - 15:26
(35)Чувствую вы правы.

Но как это черт возьми работает? Сначала возвращается контекст, а потом только параметр?
   Джордж1
 
37 - 12.01.21 - 15:38
Почему так не всегда происходит?
   Ёпрст
 
38 - 12.01.21 - 15:40
Модально поди изначальное изделие открывается ?
   Джордж1
 
39 - 12.01.21 - 15:54
(38)Нет, были мысли в этом направлении - что бы форму открывать как для эквайринга сберовского - что бы повисела секунду
   DJ Anthon
 
40 - 12.01.21 - 16:05
помню, как писал универсальную обработку объектов из формы самих же объектов. вызывал двойным щелчком правой кнопки мыши на любой точке формы. это событие было единственным незанятым.
как известно, ничего с объектом сделать нельзя, он заблокирован, когда он открыт. НО! я нашел способ разблокировать его. надо было развернуть форму на весь экран и обратно. либо если он уже развернут, то свернуть и развернуть. в этот момент объект освобождался на микросекунду, но этого хватало, чтобы успеть произвести отмену проведения или пометку удаления или еще чего. юзер просто видел небольшое моргание экрана и все. почему-то я поверил, что такой фокус с базой проканает и я его нашел. очень удобно стало работать с семеркой после этого, но снеговик уже подкрадывался...
   Arbuz
 
41 - 12.01.21 - 16:14
(40) Может что-то более правдоподобное надо выдумывать? Или это под грибами было?
   Cthulhu
 
42 - 12.01.21 - 16:29
обрабатывай результат через форма.обработкаожидания("ЧоТамВернулось",1);
   Cthulhu
 
43 - 12.01.21 - 16:31
(42)+ в "Процедура ЧоТамВернулось()", в которой "форма.обработкаожидания("",0);", а все возвраты пихай в переменную модуля.
   Cthulhu
 
44 - 12.01.21 - 16:31
в смысле - параметр при вызове и потом для анализа в той процедуре
   DJ Anthon
 
45 - 12.01.21 - 16:33
(41) могу скинуть. я сам в шоке был
   Arbuz
 
46 - 12.01.21 - 16:35
(45) Скидывай конечно
   DJ Anthon
 
47 - 12.01.21 - 16:36
(41) меня бесило, что в типовых постоянно была проблема в том, что надо пометить на удаление элемент или документ, который у тебя открыт в данный момент, а найти его трудно - ты не знаешь ни наименования элемента, на владельца. этой обработкой можно было узнать и поменять его скрытые реквизиты - код, владелец, наименование; узнать его статус - проведен ли, помечен ли. можно было открыть родителя и владельца (привет, банковские счета и договоры). для программирования было удобно узнать его название в конфигураторе, и так далее. и все это вызывается менюшкой правой кнопкой мыши.
   Джордж1
 
48 - 12.01.21 - 16:53
(43)Так нет такого в 7-ке. Есть просто ОбработкаОжидания, но работает она криво
   Cthulhu
 
49 - 12.01.21 - 17:04
(48): есть такое в 7-ке. просто ты не в курсе.
   Cthulhu
 
50 - 12.01.21 - 17:05
(48): и обработкаожидания работает не криво - просто надо знать как ей пользоваться и помнить о том. что 7-ка это тупо один поток в котором оно и ждет. в смысле - и тут "просто ты не в курсе".
   Джордж1
 
51 - 12.01.21 - 17:12
(50)вот именно что ждет, на модальные окна не реагирует. А у тебя очередь из покупателей аж на улице стоит

(49)22 года с 7-кой, а такого помню - просветите. В СП заглянул - нет такого
   Cthulhu
 
52 - 12.01.21 - 17:20
(51): странное замечание. человеку, знакомому с 7-кой єто понятно в качестве стандартного свойства а не в качестве претензии на несоответствие факта документации.
(51): с чем вас и поздравляю. IdToStr/StrToId/_Getperformansecounter и много чего еще "нет в СП". что не мешает быть достаточно продвинутому прогеру (даже не гуру) знать и использовать все эти возможности.
   Джордж1
 
53 - 12.01.21 - 17:33
(52)честно никогда ОбработкаОжидания в форме не требовалась

А чем плохо?
Пока ТипЗначения(СЗ)=100 Цикл
КонецЦикла;
   Arbuz
 
54 - 12.01.21 - 17:45
(53) Мощу жрёт
   Джордж1
 
55 - 12.01.21 - 17:54
(54)Да если в сетевом режиме на отдельном компе - вроде и не страшно
   Salimbek
 
56 - 12.01.21 - 22:26
(53) Если есть 1С++, то можно:

      Система=СоздатьОбъект("Система");
      Пока ТипЗначения(СЗ)=100 Цикл
            Система.Уснуть(200);//Уснуть на 200 миллисекунд, без нагрузки процессора

      КонецЦикла;
   victuan1
 
57 - 13.01.21 - 05:17
Сколько я нового узнал))
   Джордж1
 
58 - 13.01.21 - 06:49
Вот такая конструкция совсем не работает. Уходит в вечный цикл
Пока ТипЗначения(СЗ)=100 Цикл
КонецЦикла;
   Salimbek
 
59 - 13.01.21 - 07:43
(58) Блин, точно. Дело в том, что и у СписокЗначений и у Контекст это значение одно и то же - 100. Тогда надо смотреть через ТипЗначенияСтр
Для Списка значений
------
ТипЗначения: 100
ТипЗначенияСтр: СписокЗначений

Для открытой формы
------
ТипЗначения: 100
ТипЗначенияСтр: ГрупповойКонтекст
   Джордж1
 
60 - 13.01.21 - 07:48
(59)не стал я мучаться, а возвращаю значения через глобальную СЗ - глСЗ

Сегодня попробую
 
 Рекламное место пустует
   ДедМорроз
 
61 - 14.01.21 - 16:48
ТипЗначенияСтр используйте.
ТипЗначения возвращает 100 для любого объекта,кроме связанных с базой данных(справочник,документ и т.п.)
   ДедМорроз
 
62 - 14.01.21 - 16:56
А обработка ожидания имитировалась,насколько я помню через функцию в поле информации и вызов закрытия формы в ней,когда закрытие отменяется,тогда несколько форм обрабатывались параллельно.
   Arbuz
 
63 - 14.01.21 - 17:03
Жаль, что получения стека вызовов так и не добили в 1с++, а то можно было бы замутить класс красиво имитирующий статические переменные и даже иерархию области видимости переменных.
   DJ Anthon
 
64 - 16.01.21 - 06:21
(46) https://files.fm/u/2u6vzgnp8
я последний релиз где-то потерял, вот нашел какой-то. Посмотри файл описаний отличий от стандартного ЗиКа и файл скриншотов про то, что я говорил.
В глобальнике краткое описание изменений, по нему нельзя сказать, что я адекватный человек, потому что писалось это на эмоциях и для себя, так что не обессудь, все-таки это было 12 лет назад )


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.