Имя: Пароль:
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. Она не турбировала, она как раз для подобных целей понижала
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn