From 30934dafcf4b980bba5c03d2074ae773fe31926b Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Wed, 2 Sep 2026 10:19:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BB?= =?UTF-8?q?=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D1=83=D1=80=D0=B5=D0=B7=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При запуске из процессов с неполным окружением (например, дочерние процессы IDE и агентов) переменные ProgramW6432, ProgramFiles(x86), ALLUSERSPROFILE и ProgramData могут отсутствовать. Стандартные пути установки превращались в относительные (<1Cv8>, <1Cv82>), таблица версий оказывалась пустой, а ПутьКПредприятию() возвращал "". - фолбэк ProgramW6432 -> ProgramFiles при сборе стандартных путей - пустые базовые каталоги пропускаются, относительные пути в поиск не попадают - фолбэк ALLUSERSPROFILE -> ProgramData для чтения 1CEStart.cfg - предупреждение в лог, если не найдено ни одной версии платформы Co-Authored-By: Claude Fable 5 --- packagedef | 2 +- ...0\276\321\200\320\274\320\2601\320\241.os" | 73 ++++++++++++------- .../1Cv8/8.3.99.1111/bin/1cv8.exe | 0 .../1Cv8/8.3.99.1111/bin/1cv8c.exe | 0 .../1Cv8/8.3.99.1111/bin/rac.exe | 0 ...\321\200\320\274\320\2601\320\241_test.os" | 52 +++++++++++++ 6 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8.exe create mode 100644 tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8c.exe create mode 100644 tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/rac.exe diff --git a/packagedef b/packagedef index a689145..224199d 100644 --- a/packagedef +++ b/packagedef @@ -4,7 +4,7 @@ // Описание.Имя("v8find") - .Версия("0.3.1") + .Версия("0.3.2") .Автор("Khorev Aleksey") .АдресАвтора("Khorevaa@gmail.com") .Описание("Библиотека поиска исполняемых файлов платформы 1С Предприятие") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241.os" index f935f12..3da36eb 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241.os" @@ -356,13 +356,18 @@ Лог.Отладка("Поиск платформы в <%1> каталогах", МассивКаталоговПоиска.Количество()); Для каждого ОписаниеКаталогаПоиска Из МассивКаталоговПоиска Цикл - + ВыполнитьПоискВКаталоге(ОписаниеКаталогаПоиска); ОписаниеКаталогаПоиска.ПоискВыполнен = Истина; КонецЦикла; - + + Если ТаблицаВерсийПлатформы.Количество() = 0 Тогда + Лог.Предупреждение("Не найдено ни одной установленной версии платформы 1С (каталогов поиска: %1)", + МассивКаталоговПоиска.Количество()); + КонецЕсли; + КонецПроцедуры Процедура ВыполнитьПоискВКаталоге(Знач ОписаниеКаталогаПоиска); @@ -455,8 +460,13 @@ МассивПутейКонфигурационногоФайла = СобратьВозможныеКаталогиУстановкиПлатформыWindows(); Если Это64ОС Тогда - + КаталогПрограммWindows_x64 = ПолучитьПеременнуюСреды("ProgramW6432"); + Если Не ЗначениеЗаполнено(КаталогПрограммWindows_x64) Тогда + // Дочерние процессы могут получать урезанное окружение без ProgramW6432, + // при этом ProgramFiles в нем обычно присутствует + КаталогПрограммWindows_x64 = ПолучитьПеременнуюСреды("ProgramFiles"); + КонецЕсли; КаталогПрограммWindows_x86 = ПолучитьПеременнуюСреды("ProgramFiles(x86)"); ПутьУстановки_x64_1Cv8 = ОбъединитьПути(КаталогПрограммWindows_x64, "1Cv8"); ПутьУстановки_x64_1Cv82 = ОбъединитьПути(КаталогПрограммWindows_x64, "1Cv82"); @@ -465,11 +475,15 @@ ПутьУстановки_x86_1Cv8t = ОбъединитьПути(КаталогПрограммWindows_x86, "1Cv8t"); ПутьУстановки_x86_1Cv82 = ОбъединитьПути(КаталогПрограммWindows_x86, "1Cv82"); - ДобавитьКаталоГПоиска(ПутьУстановки_x64_1Cv8, РазрядностьПлатформы.x64, Неопределено); - ДобавитьКаталоГПоиска(ПутьУстановки_x64_1Cv82, РазрядностьПлатформы.x64, Неопределено); - ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8, РазрядностьПлатформы.x86, Неопределено); - ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8t, РазрядностьПлатформы.x86, Неопределено); - ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv82, РазрядностьПлатформы.x86, Неопределено); + Если ЗначениеЗаполнено(КаталогПрограммWindows_x64) Тогда + ДобавитьКаталоГПоиска(ПутьУстановки_x64_1Cv8, РазрядностьПлатформы.x64, Неопределено); + ДобавитьКаталоГПоиска(ПутьУстановки_x64_1Cv82, РазрядностьПлатформы.x64, Неопределено); + КонецЕсли; + Если ЗначениеЗаполнено(КаталогПрограммWindows_x86) Тогда + ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8, РазрядностьПлатформы.x86, Неопределено); + ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8t, РазрядностьПлатформы.x86, Неопределено); + ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv82, РазрядностьПлатформы.x86, Неопределено); + КонецЕсли; Для каждого ПутьУстановки Из МассивПутейКонфигурационногоФайла Цикл @@ -497,12 +511,14 @@ Иначе КаталогПрограммWindows = ПолучитьПеременнуюСреды("ProgramFiles"); - + ПутьУстановки_x86_1Cv8 = ОбъединитьПути(КаталогПрограммWindows, "1Cv8"); ПутьУстановки_x86_1Cv82 = ОбъединитьПути(КаталогПрограммWindows, "1Cv82"); - ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8, РазрядностьПлатформы.x86, Неопределено); - ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv82, РазрядностьПлатформы.x86, Неопределено); + Если ЗначениеЗаполнено(КаталогПрограммWindows) Тогда + ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv8, РазрядностьПлатформы.x86, Неопределено); + ДобавитьКаталоГПоиска(ПутьУстановки_x86_1Cv82, РазрядностьПлатформы.x86, Неопределено); + КонецЕсли; Для каждого ПутьУстановки Из МассивПутейКонфигурационногоФайла Цикл @@ -554,31 +570,36 @@ // Ищем в расположениях для Vista и выше. // Желающие поддержать пути в Windows XP - welcome КаталогВсеПользователи = ПолучитьПеременнуюСреды("ALLUSERSPROFILE"); + Если Не ЗначениеЗаполнено(КаталогВсеПользователи) Тогда + КаталогВсеПользователи = ПолучитьПеременнуюСреды("ProgramData"); + КонецЕсли; КаталогТекущегоПользователя = ПолучитьПеременнуюСреды("APPDATA"); - + МассивПутей = Новый Массив; - + СуффиксРасположения = "1C\1CEStart\1CEStart.cfg"; - - ОбщийКонфиг = ОбъединитьПути(КаталогВсеПользователи, СуффиксРасположения); - ДополнитьМассивРасположенийИзКонфигурационногоФайла(ОбщийКонфиг, МассивПутей); - ПользовательскийКонфиг = ОбъединитьПути(КаталогТекущегоПользователя, СуффиксРасположения); - ДополнитьМассивРасположенийИзКонфигурационногоФайла(ПользовательскийКонфиг, МассивПутей); + + ДополнитьМассивРасположенийИзКонфигурационногоФайла(КаталогВсеПользователи, СуффиксРасположения, МассивПутей); + ДополнитьМассивРасположенийИзКонфигурационногоФайла(КаталогТекущегоПользователя, СуффиксРасположения, МассивПутей); Лог.Отладка("Выполняем поиск расположения конфигурационного файла для учебной версии платформы."); СуффиксРасположения = "1C\1CEStartt\1CEStart.cfg"; - ОбщийКонфиг = ОбъединитьПути(КаталогВсеПользователи, СуффиксРасположения); - ДополнитьМассивРасположенийИзКонфигурационногоФайла(ОбщийКонфиг, МассивПутей); - ПользовательскийКонфиг = ОбъединитьПути(КаталогТекущегоПользователя, СуффиксРасположения); - ДополнитьМассивРасположенийИзКонфигурационногоФайла(ПользовательскийКонфиг, МассивПутей); - + ДополнитьМассивРасположенийИзКонфигурационногоФайла(КаталогВсеПользователи, СуффиксРасположения, МассивПутей); + ДополнитьМассивРасположенийИзКонфигурационногоФайла(КаталогТекущегоПользователя, СуффиксРасположения, МассивПутей); + Возврат МассивПутей; - + КонецФункции -Процедура ДополнитьМассивРасположенийИзКонфигурационногоФайла(Знач ИмяФайла, Знач МассивПутей) - +Процедура ДополнитьМассивРасположенийИзКонфигурационногоФайла(Знач БазовыйКаталог, Знач СуффиксРасположения, Знач МассивПутей) + + Если Не ЗначениеЗаполнено(БазовыйКаталог) Тогда + Возврат; + КонецЕсли; + + ИмяФайла = ОбъединитьПути(БазовыйКаталог, СуффиксРасположения); + ФайлКонфига = Новый Файл(ИмяФайла); Если Не ФайлКонфига.Существует() Тогда Лог.Отладка("Конфигурационный файл " + ИмяФайла + " не найден."); diff --git a/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8.exe b/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8.exe new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8c.exe b/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/1cv8c.exe new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/rac.exe b/tests/fixtures/windows-programfiles/1Cv8/8.3.99.1111/bin/rac.exe new file mode 100644 index 0000000..e69de29 diff --git "a/tests/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241_test.os" "b/tests/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241_test.os" index 65bb5b3..2616637 100755 --- "a/tests/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241_test.os" +++ "b/tests/\320\237\320\273\320\260\321\202\321\204\320\276\321\200\320\274\320\2601\320\241_test.os" @@ -16,6 +16,7 @@ ИменаТестов.Добавить("ТестДолжен_НайтиВерсию_8_5_x_Windows"); ИменаТестов.Добавить("ТестДолжен_НайтиВерсию_8_5_x_OSX"); ИменаТестов.Добавить("ТестДолжен_НайтиНесколькоВерсий_Windows"); + ИменаТестов.Добавить("ТестДолжен_НайтиПлатформуВУрезанномОкружении_Windows"); Возврат ИменаТестов; @@ -183,6 +184,57 @@ КонецПроцедуры +// Урезанное окружение: ProgramW6432, ProgramFiles(x86), ALLUSERSPROFILE и ProgramData не заданы. +// Стандартные пути установки должны собраться от ProgramFiles, а не превратиться в относительные. +Процедура ТестДолжен_НайтиПлатформуВУрезанномОкружении_Windows() Экспорт + + Если Не ЭтоWindows Тогда + Сообщить("Тест выполняется только на windows"); + юТест.ТестПройден(); + Возврат; + КонецЕсли; + + КаталогFixtures = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures"); + КаталогПрограмм = ОбъединитьПути(КаталогFixtures, "windows-programfiles"); + + ИменаПеременных = СтрРазделить("ProgramW6432|ProgramFiles(x86)|ProgramFiles|ALLUSERSPROFILE|ProgramData", "|"); + ИсходныеЗначения = Новый Соответствие; + Для каждого ИмяПеременной Из ИменаПеременных Цикл + ИсходныеЗначения.Вставить(ИмяПеременной, ПолучитьПеременнуюСреды(ИмяПеременной)); + КонецЦикла; + + Попытка + + УстановитьПеременнуюСреды("ProgramW6432", ""); + УстановитьПеременнуюСреды("ProgramFiles(x86)", ""); + УстановитьПеременнуюСреды("ALLUSERSPROFILE", ""); + УстановитьПеременнуюСреды("ProgramData", ""); + УстановитьПеременнуюСреды("ProgramFiles", КаталогПрограмм); + + Платформа1С = Новый Платформа1С; + ПутьКПредприятию = Платформа1С.ПутьКПредприятию("8.3.99.1111"); + + Исключение + ВосстановитьПеременныеСреды(ИсходныеЗначения); + ВызватьИсключение; + КонецПопытки; + + ВосстановитьПеременныеСреды(ИсходныеЗначения); + + ЭталонныйПуть = ОбъединитьПути(КаталогПрограмм, "1Cv8", "8.3.99.1111", ОбъединитьПути("bin", "1cv8.exe")); + Ожидаем.Что(НРег(ПутьКПредприятию), "платформа найдена через фолбэк на ProgramFiles").Равно(НРег(ЭталонныйПуть)); + +КонецПроцедуры + +Процедура ВосстановитьПеременныеСреды(Знач ИсходныеЗначения) + + Для каждого КлючИЗначение Из ИсходныеЗначения Цикл + Значение = ?(КлючИЗначение.Значение = Неопределено, "", КлючИЗначение.Значение); + УстановитьПеременнуюСреды(КлючИЗначение.Ключ, Значение); + КонецЦикла; + +КонецПроцедуры + Лог = Логирование.ПолучитьЛог("oscript.lib.v8find"); Лог.УстановитьУровень(УровниЛога.Отладка);