Имя: Пароль:
1C
 
Что за барабашка - как будто контекстный вызов сервера, хотя на другой машине работает
0 RomaH
 
naïve
03.04.20
14:52
Win 10
1С:Предприятие 8.3 (8.3.15.1565)

писал и отлаживал
есть вызов процедуры НаСервереБезКонтекста через обработчик ожидания

все работало (и работает) как надо - текст редактирования не обновляется ...
работает в продакшене, уже вот как месяц/два - работают порядка 10 пользователей

но вот появилось новое рабочее место - и форма начала вести так как будто вызов сервера контекстный - при выходе из подписаной процедуры текст редактирования обнуляется

фишка в том, что нашли вторую машину на которой это воспроизводится - у нач отдела АСУ
у меня работа как надо

что это может быть?
1 RomaH
 
naïve
03.04.20
14:53
&НаКлиенте
Процедура ПолучитьСписокПоследнихФайлов()
    
    Попытка
        
        Shell = Новый COMОбъект("WScript.Shell");
        
        ПутьДоЯрлыков = Shell.ExpandEnvironmentStrings("%AppData%\Microsoft\Office\Последние файлы");
        
        //ПутьДоЯрлыков = "\\a276\c$\Users\d.belyaev\AppData\Roaming\Microsoft\Office\Последние файлы";
        
        ПоследниеФайлы = НайтиФайлы(ПутьДоЯрлыков,"*.lnk");
        
        МассивФайлов = Новый Массив;
        
        Для Каждого Ярлык Из ПоследниеФайлы Цикл
            
            
            ЯрлыкОбъект = Shell.CreateShortcut(Ярлык.ПолноеИмя);
            ПутьДоОбъекта = ЯрлыкОбъект.TargetPath;
            
            Если СтрНайти(ПутьДоОбъекта,"\AppData\") Тогда //Убираем файлы открытые через 1С
                Продолжить;    
            КонецЕсли;
            
            РасширениеФайла = Сред(ПутьДоОбъекта,СтрНайти(ПутьДоОбъекта,".",НаправлениеПоиска.СКонца) + 1);
            
            Если Не (РасширениеФайла = "doc" ИЛИ РасширениеФайла = "docx" ИЛИ РасширениеФайла = "rtf") Тогда
                Продолжить;    
            КонецЕсли;
            
            ФайлОбъект = Новый Файл(ПутьДоОбъекта);
            
            Если СтрНайти(ПутьДоОбъекта,"$") Тогда //Убираем файлы открытые по сети
                Продолжить;    
            КонецЕсли;
            
            Если НЕ ФайлОбъект.Существует() Тогда
                Продолжить;
            КонецЕсли;
            
            //Структура = Новый Структура("ИмяЯрлыка,ПолноеИмяЯрлыка,ДатаЯрлыка,ПутьДоОбъекта"
            //    ,Ярлык.ИмяБезРасширения,Ярлык.ПолноеИмя,ФайлОбъект.ПолучитьВремяИзменения(),ПутьДоОбъекта);
            Структура = Новый Структура("ИмяЯрлыка,ПолноеИмяЯрлыка,ДатаЯрлыка,ПутьДоОбъекта"
                ,Ярлык.ИмяБезРасширения,Ярлык.ПолноеИмя,Ярлык.ПолучитьВремяИзменения(),ПутьДоОбъекта);
            
            МассивФайлов.Добавить(Структура);
            
        КонецЦикла;
        
        //Получили массив структур
        
        МассивСпискаФайлов = Новый Массив;
        
        ПолучитьСписокПоследнихФайловНаСервере(МассивФайлов,МассивСпискаФайлов);//Вызов сервера
        
        Для КоличествоФайловОфис = 0 По МассивСпискаФайлов.ВГраница() Цикл
            
            //Если КоличествоФайловОфис > 10 Тогда
            //    Прервать;    
            //КонецЕсли;
            
            СтрокаТЗ = МассивСпискаФайлов[КоличествоФайловОфис];
            
            СтрокаСписка = СписокФайлов.НайтиПоЗначению(СтрокаТЗ.ПутьДоОбъекта);
            
            Если СтрокаСписка = Неопределено Тогда
                Если СписокФайлов.Количество() Тогда
                    СписокФайлов.Вставить(Мин(КоличествоФайловОфис,СписокФайлов.Количество()),СтрокаТЗ.ПутьДоОбъекта,СтрокаТЗ.ИмяЯрлыка,,БиблиотекаКартинок.ФорматWord);
                Иначе
                    СписокФайлов.Добавить(СтрокаТЗ.ПутьДоОбъекта,СтрокаТЗ.ИмяЯрлыка,,БиблиотекаКартинок.ФорматWord);
                КонецЕсли;
                
                Если СписокФайлов.Количество() > 10 Тогда
                    СписокФайлов.Удалить(10);    
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЦикла;
        
    Исключение
        Сообщить(ОписаниеОшибки());    
    КонецПопытки;
    
    ПодключитьОбработчикОжидания("ПолучитьСписокПоследнихФайлов",3,Истина);

КонецПроцедуры
2 RomaH
 
naïve
03.04.20
15:07
&НаСервереБезКонтекста
Процедура ПолучитьСписокПоследнихФайловНаСервере(Знач МассивФайлов,СписокФайлов)
    
Процедура ПолучитьСписокПоследнихФайловНаСервере(Знач МассивФайлов,Знач СписокФайлов) //Если так - то не обнуляет текст редактирования
    ПоследниеОткрытыеФайлы = Новый ТаблицаЗначений;
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ИмяЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ПолноеИмяЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ДатаЯрлыка");
    ПоследниеОткрытыеФайлы.Колонки.Добавить("ПутьДоОбъекта");
    
    Для Каждого Ярлык Из МассивФайлов Цикл
            
        СтрокаТЗ = ПоследниеОткрытыеФайлы.Добавить();    
        
        СтрокаТЗ.ИмяЯрлыка = Ярлык.ИмяЯрлыка;
        СтрокаТЗ.ПолноеИмяЯрлыка = Ярлык.ПолноеИмяЯрлыка;
        СтрокаТЗ.ДатаЯрлыка = Ярлык.ДатаЯрлыка;
        СтрокаТЗ.ПутьДоОбъекта = Ярлык.ПутьДоОбъекта;
                
    КонецЦикла;
    
    ПоследниеОткрытыеФайлы.Сортировать("ДатаЯрлыка УБЫВ");
    
    //СписокФайлов = Новый Массив;
    
    Для КоличествоФайловОфис = 0 По ПоследниеОткрытыеФайлы.Количество() - 1 Цикл
        
        Если КоличествоФайловОфис > 10 Тогда
            Прервать;    
        КонецЕсли;
        
        СтрокаТЗ = ПоследниеОткрытыеФайлы[КоличествоФайловОфис];
        
        Структура = Новый Структура("ПутьДоОбъекта,ИмяЯрлыка",СтрокаТЗ.ПутьДоОбъекта,СтрокаТЗ.ИмяЯрлыка);
        
        СписокФайлов.Добавить(Структура);
        
    КонецЦикла;
    
    //Получили массив стурктур с последними по дате открытыми файлами
    
КонецПроцедуры
3 RomaH
 
naïve
03.04.20
15:08
проблема в том, что если здесь я могу все на клиенте сделать,
но есть формы где аналогично прикручен обработчик ожидания с без контекстным вызовом сервера ... и когда там это сломается, и как чинить ... вопрос

проверил 16 платформу - воспроизводится
4 Cyberhawk
 
03.04.20
15:20
Так может ты внутрь передаешь реквизит формы и меняешь его, по возвращению он обновляется и вызывает неявный контекстный вызов сервера.
Что такое СписокФайлов?
5 RomaH
 
naïve
03.04.20
15:20
единственное что объединяет компы в группы - на эти два винда была поставлена совсем недавно - неделя/две

я обновился с 7 на 10 - месяц назад - и все ок как и у остальных с еще более старой утановкой
6 RomaH
 
naïve
03.04.20
15:21
(4) списокФайлов - это список значений
фишка в том, что контекст "передается" только на ДВУХ компах из ДВЕНАДЦАТИ
на остальных 10 - работает ка и ожидалось - без контекста
7 Cyberhawk
 
03.04.20
15:23
(6) Готовь минимально объемный и максимально простой способ воспроизведения
8 RomaH
 
naïve
03.04.20
15:23
(4) это реквизит формы и он меняется ... почему он должен вызывать неявный вызов сервера?
9 RomaH
 
naïve
03.04.20
15:24
(7) зачем?
10 rphosts
 
03.04.20
15:25
Эээээ, кэш чистили?
11 RomaH
 
naïve
03.04.20
15:26
(10) да
12 rphosts
 
03.04.20
15:26
(9) видимо чел хочет сам увидеть
13 rphosts
 
03.04.20
15:26
(11) и на сервере и на клиенте?
14 RomaH
 
naïve
03.04.20
15:26
(10) проблемный комп - совсем новое рабочее место - новое железо, новая ОС
15 RomaH
 
naïve
03.04.20
15:26
(13) на сервере - нет, .... как на сервере почистить?
16 Cyberhawk
 
03.04.20
15:27
А, у тебя толстый клиент что ли. Ну тогда забей.
17 RomaH
 
naïve
03.04.20
15:27
но сервера два - воспроизводится как на рабочем, так и на разработке
18 RomaH
 
naïve
03.04.20
15:27
(16) с чего ты это взял?
19 rphosts
 
03.04.20
15:27
20 palsergeich
 
03.04.20
15:28
(14) В каком событии это происходит?
У меня была похожая хрень.
Лечится или Знач, или на клиент возвращаешь список значений и меняешь его там.
Очень не любит 1с, когда реквизиты формы меняются по ссылке в входных параметрах.
21 palsergeich
 
03.04.20
15:30
(20) Причем штука бородатая.
Посмотри описание обработчика, из которого все происходит - если там написано запрещены серверные вызовы, то изменение реквизитов формы во внеконтекстных вызовыах ведет к куче багов.
22 RomaH
 
naïve
03.04.20
15:33
23 RomaH
 
naïve
03.04.20
15:34
в поле ввода вводим "1" - и ждем 3 секунды - пропало?
у меня не пропадает, а у соседа - пропадает
24 RomaH
 
naïve
03.04.20
15:35
25 palsergeich
 
03.04.20
15:39
(23) Тут что то другое, такого я еще не видел, я видел схожее поведение в других ситуациях, и рецепт 1 - не менять Списокзначений, который пеквизит формы через параметр процедуры, а делать возврат и менять его в том контексте, откуда шел вызов.
Багля знакомая, но именно в обработчике ожидания я ее не ловил
26 palsergeich
 
03.04.20
15:40
(25) Там что то внутри механизма синхронизации ломается и он считает, что реквизит значительно изменилсяи надо сделать контекстный вызов.
27 RomaH
 
naïve
03.04.20
15:41
(25) еще раз - тут переписать я смогу и пользователи подождут

у меня есть более нагруженные интерфейсы где применяется сходная технология - если там сломается ... надо выяснить сейчас что это и почему
28 palsergeich
 
03.04.20
15:43
(27) Только Вендор может сказать точно
29 RomaH
 
naïve
03.04.20
15:43
(10) б... сбросил серверный кэш (удалением базы) ... теперь и у меня воспроизводится
30 RomaH
 
naïve
03.04.20
15:45
+(29) а обработка работает "как надо" ... чем дальше в лес тем толще партизаны
31 Cyberhawk
 
03.04.20
15:58
(9) Затем, чтоб тебе рассказать, что у тебя по два вызова, а не по одному за каждый такт
32 RomaH
 
naïve
03.04.20
15:59
(31)??
33 RomaH
 
naïve
03.04.20
16:00
34 RomaH
 
naïve
03.04.20
16:03
(31) вызова чего?
35 Cyberhawk
 
03.04.20
16:05
(32) (34) Даже три. И, видимо, только про один из них надежно можно говорить, что он безконтекстный - это твой метод.
Остальные два: создание СОМ-объекта и обращение к библиотеке картинок.
Такие дела.
36 Cyberhawk
 
03.04.20
16:06
+(35) Это в файловой. Щас к-с проверим.
37 Cyberhawk
 
03.04.20
16:11
+(36) А не, не проверим. Давай сам короче.
38 RomaH
 
naïve
03.04.20
16:28
(35) см (2)
если не возвращаем СЗ - то вызовов сервера больше нет ... так что не надо ля-ля
39 Сергиус
 
03.04.20
17:30
(0)Почему надо передавать именно реквизит формы, а не просто СписокЗначений?
40 RomaH
 
naïve
04.04.20
07:59
(39) потому-что вопрос в другом - разное поведение
41 RomaH
 
naïve
04.04.20
08:05
(39) да не пе5редается на сервер ни один из реквизитов
        
МассивФайлов = Новый Массив;
....
        МассивСпискаФайлов = Новый Массив;
        ПолучитьСписокПоследнихФайловНаСервере(МассивФайлов, МассивСпискаФайлов);
42 RomaH
 
naïve
04.04.20
08:32
Все нормально - по коду так и должно быть
когда изменяется список значений выведенный на форму - происходит обновление текста редактирования на форме - всегда

фишка в том, что список должен был меняться только тогда когда пользователь не работал с формой - только при сохранении вородового документа


а тут - получи, фашист, гранату

https://dl.dropboxusercontent.com/s/xl9mnu9yehz9i1c/2020-04-04_08h28_10.png?dl=0

таким образом

        Для КоличествоФайловОфис = 0 По МассивСпискаФайлов.ВГраница() Цикл
            
            СтрокаТЗ = МассивСпискаФайлов[КоличествоФайловОфис];
            
            СтрокаСписка = СписокФайлов.НайтиПоЗначению(СтрокаТЗ.ПутьДоОбъекта);//Тут искал то чего небыло
            
            Если СтрокаСписка = Неопределено Тогда


весь список был заполнен пустой датой, и постоянно обновлялся посредством "Вставить" что не было заметно глазу на форме
вот такая вот непонятность ... сейчас уже не вспомню какой тип задавал - строку или произвольный, но точно не дату

и в рабочей базе получается у одних пользователей там строка - у других "дата", ох уж это демоническое обновление, но без него будет скучно и одиноко
43 RomaH
 
naïve
07.04.20
09:16
если на тесте все нормально заработало (я добился воспроизведения у себя сбросом кеша сервера (пересоздал базу))
то на рабочей воспроизвести у себя не могу
базу пересоздал, локальный кеш сбросил

у меня не воспроизводится - у пользователя так и видит дату в типе значения списка
реквизит формы пересоздал

что еще сделать?
44 RomaH
 
naïve
07.04.20
09:17
ну в смысле на тестовой воспроизвел и исправил
а на рабочей у себя не воспроизвел, и исправить там где воспроизводится - не получилось
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn