Имя: Пароль:
1C
1C 7.7
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. Она не турбировала, она как раз для подобных целей понижала
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс