Простейшая процедура, куда уж проще:
Процедура ПриНачалеВыбораЗначения(ИДпуть, Фл)
Если ИДпуть = "ПутьСохр" Тогда
Фл = 1;
ПутьККат = СокрЛП(ПутьСохр);
Если ФС.ВыбратьКаталог(ПутьККат, "Выберите каталог для сохранения файлов выгрузок", 5) = 1 Тогда
ПутьСохр = ПутьККат;
Иначе
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
И вот такой эффект: https://cloud.mail.ru/public/DoXm/a3grHdjXt
Ерунда какая-то... По таймауту окно выбора каталога не закрывается, а только кнопки пропадают...
Что-это за нах? У меня что-то не так, или глюк/фича известная, но с которой мне не приходилось ранее сталкиваться?
Да, повторилось такое поведение. Я сначала было подумал может это какой-то плагин OpenConf-a. Но не нашел у себя ничего такого.
Ну, я у себя тоже просматривал, единственное, что из присутствуещего у меня в конфе, на это хоть-как-то относительно могло влиять - это "OpenFileDialogsManager.dll"... Очень удобная штучка, использую с 2012 года, когда только первые алко-декларации появились с огромными по длинне именами файлов. Никогда ни каких проблем не замечал.
Но, пробовал отключать ее загрузку - ни чего не меняется, так, что зря я на нее грешил.
Глюк платформы :(
Интересно будет посмотреть на старой Винде, может на новой что сломалось?
А так, да - на оригинальной голой 7.70.027 на Windows7 - воспроизводится.
Причем у всех троих:
ФС.ВыбратьФайл() - по таймеру исчезают кнопки и путь, но окошко не закрывается;
ФС.ВыбратьФайлКартинки() - по таймеру исчезает предпросмотр, но окошко не закрывается;
ФС.ВыбратьКаталог() - по таймеру окошко не закрывается.
При этом после закрытия окна все функции возвращают 0 (нажата кнопка "Отмена"), а не -1 (превышен таймаут).
Работа через созданный объект
ФСО = СоздатьОбъект("ФС");
ФСО.ВыбратьКаталог();картину не меняет.
Баг.
Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
.
"Клюшки неисчерпаемы как атом"
Тебе в "копилку" :-)
Раньше как-то не ставил таймаут, и не вылезало. А тут, черт дернул, и пару часов потерял, пока понял что кнопки пропадают именно по таймауту, а не от скролинга или выбора каталога... По началу было не понятно, открывается диалог, все ок. Начинаешь выбирать каталог - бах, пропали... А потом, перепробовав кучу всего, перезрузив комп и т.п. пляски с бубном, просто открыл диалог, и тупо смотрел в экран, почесывая репу, и думая, что-бы еще попробовать... Бах - пропали, без моих действий... Вот это уже и навело на мысль о таймауте...
Цитата: Злоп от 04 июля 2026, 19:38Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
Ии? Что не так?
А что по-твоему должно произойти после окончания таймаута?
Какая вообще цель указания таймаута для выбора?
Цитата: cr от 05 июля 2026, 10:17Какая вообще цель указания таймаута для выбора?
Ну, ИМХО - как и везде, окно выбора должно просто закрыться, если юзверь открыл выбор и задумался на долго...
И, просто по тому, что он там есть, и описан в СП.
Цитата: cr от 05 июля 2026, 10:17Цитата: Злоп от 04 июля 2026, 19:38Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
Ии? Что не так?
А что по-твоему должно произойти после окончания таймаута?
Какая вообще цель указания таймаута для выбора?
Выбор альтернативы - взять файл/отказаться от файла.
Взятие файла приводит к продвижению по шкале процесса "вперед". То есть будут какие-то изменения. Это д.б. осознанный выбор пользователя, т.к. в большинстве случаев это приводит к каким-либо изменениям. Если юзер "задумался/отошел" - оставлять висеть модальное окно есть плохо. Поэтому модальное окно искусственно делаем выбор по таймауту такой, который минимизирует возможный ущерб/последующие действия. Такой выбор из двух - один=отказ.
Поэтому таймаут истек - окно закрылось, процесс дальше не пошел. Я.п. что код должен предусматривать возможность обработки таймаута спецобразом или же как экиваалент отказа. Имхо.
Никогда с таймаутом проблем по логике обработки у меня не было. У себя даже не припомню, чтобы таймаут итерпретировался по коду как-то иначе чем "отказ".
.
И - это самое - повырывать ноги прмяо до гланд тем, кто дает типа Предупреждение("АлеЧтоТо") - без таймаута, ругаюсь, плююсь и атата! и всегда походя сразу вкорячиваю таймаут если есть возможность. Ибо нефиг. Особенно в модуле проведения (в прошлом году не далее как пару раз натыкался на такое в самописке).
Семерка ещё сырая ;)
Цитата: Злоп от 06 июля 2026, 04:04И - это самое - повырывать ноги прмяо до гланд тем, кто дает типа Предупреждение("АлеЧтоТо") - без таймаута, ругаюсь, плююсь и атата! и всегда походя сразу вкорячиваю таймаут если есть возможность. Ибо нефиг. Особенно в модуле проведения (в прошлом году не далее как пару раз натыкался на такое в самописке).
Орефков, кажется, рассказывал что контролы окон типа Предупреждения, Вопрос разработчик нарисовал сам, вместо того чтобы взять системные, еще удивлялся, зачем разработчик движка потратил время впустую? Поэтому таймаут там срабатывает.
А выбор файла/каталога - это системное окно.
И "закрыть" это окно (скорее всего, тот же Виндовс) приложению не дают. Таймаут явно срабатывает - кнопки исчезают, но события (закрытия окна) не происходит, поэтому -1 никогда не возвращается.
НачВремя=_GetPerformanceCounter();
ПутьК="";
ТаймАут=5;
Ответ=ФС.ВыбратьКаталог(ПутьК, "Выберите каталог для сохранения файлов выгрузок", ТаймАут);
КонВремя=_GetPerformanceCounter();
Если Ответ=0 Тогда
Если (КонВремя-НачВремя+1)/1000 > ТаймАут Тогда
Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)");
Иначе
Сообщить("Отмена выбора");
КонецЕсли;
Иначе
ПутьККат=ПутьК;
Сообщить(""+ПутьК);
КонецЕсли;
КонецЕсли;
И, кстати, у системной библиотеки таймаута нет.
ФСВинды = СоздатьОбъект("Shell.Application");
НачПапка=ФСВинды.NameSpace(КаталогИБ());
Попытка
ВыбКат = ФСВинды.BrowseForFolder(0,"Выберите каталог для сохранения файлов выгрузок",1+16,0); // НачПапка
Исключение
КонецПопытки;
Если ПустоеЗначение(ВыбКат)=0 Тогда
Попытка
ПутьККат=""+ВыбКат.Items().Item().Path;
Сообщить(""+ВыбКат.Items().Item().Type+": "+ВыбКат.Items().Item().Path);
Исключение
ПутьККат="";
Сообщить(""+ВыбКат.title);
КонецПопытки;
Иначе
Сообщить("Отмена выбора");
КонецЕсли;
На самом деле, никакого смысла в этом тамауте нет. Потому что окна Предупреждение или Вопрос выводятся программно, а выбор каталога предназначен только для интерактивного действия пользователя - там таймаут не только не имеет смысла, но и просто был бы игрушкой для идиотов и убогих юмористов из предыдущего сообщения.
Ты что хочешь: задать таймаут 3-5 секунд и чтобы окно выбора закрылось потому что юзер не успел выбрать?
Это ты над кем так хочешь издеваться? И для чего? Хорошо если ты ему сразу дашь начальный каталог где-то рядом, а если ему надо выбрать каталог на флешке, которую еще не вставили в комп? Он никода не успеет выбрать по твоему таймауту потому что долго будет его искать. И что он должен делать после этого? Ноги тебе до гланд вырывать за такие фокусы с таймаутом?
Вот выбор папки с таймаутом:
СпКат=СоздатьОбъект("СписокЗначений");
ФСВинды= СоздатьОбъект("Scripting.FileSystemObject");
НачПапка=ФСВинды.GetFolder(КаталогИБ());
СпКат.ДобавитьЗначение(НачПапка.Path, НачПапка.Name);
Подпапки = НачПапка.SubFolders;
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "JScript";
Скрипт.AddCode("function ПолучитьПеречислитель(Коллекция) { return new Enumerator(Коллекция); }");
ПеречислительПапок = Скрипт.Run("ПолучитьПеречислитель", Подпапки);
Пока ПеречислительПапок.atEnd(0) = 0 Цикл
СпКат.ДобавитьЗначение(ПеречислительПапок.item(0).Path, ПеречислительПапок.item(0).Name);
ПеречислительПапок.moveNext(0);
КонецЦикла;
ВыбЗнач="";
ТаймАут=5;
РезВыбора=СпКат.ВыбратьЗначение(ВыбЗнач,"Выберите каталог для сохранения файлов выгрузок",,ТаймАут,0);
Если РезВыбора=1 Тогда
ПутьККат=ВыбЗнач;
Сообщить(""+ВыбЗнач);
ИначеЕсли РезВыбора=0 Тогда
Сообщить("Отмена выбора");
ИначеЕсли РезВыбора=-1 Тогда
Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)");
КонецЕсли;
Вот выбор из всех вложенных папок с таймаутом.
Сами-то попробуйте: успеете в таймаут прокрутить список в начало и выбрать строку?
СпКат=СоздатьОбъект("СписокЗначений");
СкриптШелл = СоздатьОбъект("WScript.Shell");
НачПапка=КаталогИБ();
СпКат.ДобавитьЗначение(?(Прав(НачПапка,1)="\",Сред(НачПапка,1,СтрДлина(НачПапка)-1) ,НачПапка));
ВременныйФайл = СкриптШелл.ExpandEnvironmentStrings("%TEMP%\dir_out.txt");
СкриптШелл.Run("%comspec% /c dir """ + НачПапка + """ /b /s /ad > """ + ВременныйФайл + """", 0, 1);
Текст=СоздатьОбъект("Текст");
Текст.КодоваяСтраница(1);
Текст.Открыть(ВременныйФайл);
Для Н=1 По Текст.КоличествоСтрок() Цикл
Стр=Текст.ПолучитьСтроку(Н);
СпКат.ДобавитьЗначение(Стр);
КонецЦикла;
Текст.Очистить();
ФСВинды = СоздатьОбъект("Scripting.FileSystemObject");
ФСВинды.DeleteFile(ВременныйФайл, 1);
Для Н=1 По СпКат.РазмерСписка() Цикл
Путь=СокрЛП(СпКат.ПолучитьЗначение(Н));
ИмяПапки="";
Для Бкв=-СтрДлина(Путь) По -1 Цикл
ТекБуква=Сред(Путь,-Бкв,1);
Если ТекБуква="\" Тогда
Прервать;
КонецЕсли;
ИмяПапки=ТекБуква+ИмяПапки;
КонецЦикла;
СпКат.УстановитьЗначение(Н,Путь,ИмяПапки);
КонецЦикла;
ВыбЗнач="";
ТаймАут=5;
РезВыбора=СпКат.ВыбратьЗначение(ВыбЗнач,"Выберите каталог для сохранения файлов выгрузок",,ТаймАут,0);
Если РезВыбора=1 Тогда
ПутьККат=ВыбЗнач;
Сообщить(""+ВыбЗнач);
ИначеЕсли РезВыбора=0 Тогда
Сообщить("Отмена выбора");
ИначеЕсли РезВыбора=-1 Тогда
Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)");
КонецЕсли;
Мазахисты!
Вас к юзерам на таймаут нельзя подпускать!
Цитата: cr от 06 июля 2026, 19:49Ты что хочешь: задать таймаут 3-5 секунд и чтобы окно выбора закрылось потому что юзер не успел выбрать?
Над пользователем издеваться не надо, но и бардак - с тем же выбором файла - устраивать тоже не надо. а то везде бардак будет. И если юзер сначала тыкает выбрать файл, а потом 5 минут ищет флешку - это не кодер дятел,а пользователь раздолбай. Ну и выбор файла из произвольного места - вещь редкая, да и за 120-180 сек - если сопли не жевать, напокурить не отвлекаться - файл вполне можно выбрать. А не успел за 120-180 мин флешку найти - ну вернулся процесс в точку "начни выбор файла" - найдет флешку, втыркнет, жмакнет кнопку. Следующий раз может сразу флешку догадается воткнуть. до 180 сек - вполне хватает. Для своих скриптов я обычно ставлю 60, для пользовательских процессов 120-180 сек, тем более - как верно отмечено - место выбора уже в большинстве случаев известно, запомнено в настройках. Так что никакой проюлемы в таймауе выборов всяких - не вижу.
Цитата: cr от 07 июля 2026, 00:51Сами-то попробуйте: успеете в таймаут прокрутить список в начало и выбрать строку?
как написал чуть выше - ставить в выбор таймаут 3-5 сек - это кодер, оторваннный от реальности. таких к работе с пользователями подпускать нельзя.
Цитата: cr от 07 июля 2026, 00:51Мазахисты!
Вас к юзерам на таймаут нельзя подпускать!
Я совсем другое увидел в этой теме.
MWW_Ruza обнаружил забавный баг и проиллюстрировал его на форуме (не рабочим кодом - а чтоб быстро проверить поставил в коде 5 секунд). Баг, на который никто никогда не натыкался, просто потому что мало кто пользовался таймаутом в выборе файла вообще, мало кто пользовался коротким временем таймаута, мало кто проверял, что там случится после работы таймаута.
Все посмотрели, проверили, намотали на ус - таймаут не работает как предполагается и использовать его в функциях выбора файлов и каталогов не стоит.
Плюс теперь в теме есть куча интересного кода для организации выбора другими средствами.
Все в плюсе.
Все именно так.
В конкретном отчете, "Выбор пути сохранения файлов для дальнейшего анализа", это не для пользователей, это для себя.
Расчитывал, что установив таймаут секунд на 10-15 я как минимум застрахуюсь от "любознательных юзверей, любящих тыкать на все, что ни попади" :) Там логика такая, что даже если тыкнут, то ничего страшного не случится. Если прервется по таймауту - ну и хорошо, а успели, ну и молодцы, пирожок на полке :) А для себя, этого таймаута должно хватать с избытком. И тут, случайно обнаружил такой интересный баг :-) Естественно, для демонстрации, я таймаут уменьшил "для зрелищности" :)
Цитата: Харлампий Дымба от 08 июля 2026, 22:37Все посмотрели, проверили, намотали на ус
Все в плюсе.
Не все в +.
Вот если бы все намотали на ус, что ВыбратьФайл() возвращает имя файла в виде какой-то странной 6-разрядной длины строки и поэтому этим методом объекта ФС нельзя пользоваться, или что аналогичный метод ВыбратьФайлКартинки() (и вообще ФС 7.7) нельзя использовать для драйвера Атола, потому что он "не понимает" ни сетевые, ни сколь-нибудь длинные имена файлов - вот это были бы намотанные усы.
А так ... пустой треп. Чисто поржать, да и то ... шутки ниже строки состояния.
Если бы OpenFileDialog.dll работала без регистрации, то было бы зашибись...
https://openconf.1cpp.ru/vk/vkloader/
Точно, есть же такая штука..
Спасибо.
Цитата: trad от 11 июля 2026, 19:00https://openconf.1cpp.ru/vk/vkloader/
Win Server 2008R2 Standart
Добавление VKLOADER.DLL
приводит к тому, что при закрытии 1С (после закрытия/деактивации окна 1С), вываливается системная "ошибка", окошко "Прекращена работа программы "1С:V7 Starter... Возникшая проблема привела к прекращению работы программы. Закройте эту программу." и кнопка "Закрыть программу"
Журнал приложений фиксирует:
Имя сбойного приложения: 1cv7.exe, версия: 7.70.0.27, отметка времени: 0x4573fcb7
Имя сбойного модуля: vkloader.dll_unloaded, версия: 0.0.0.0, отметка времени 0x447d8ef5
Код исключения: 0xc0000005
Никаких других побочных действий не наблюдается, база повторно запускается норм.
Но сообщение - бяка, так быть не должно...
Так что пичалька...
Как-то использовал еще SimpleDLLLoader.dll + Fdsubst.dll
- это возможно использовать вместо OpenFileDialogsManager.dll
?