Каталог пользователя linux
|
|
nickstonali | Дата: Вторник, 21.11.2023, 17:26 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
| При открытии на linux получаю такую ошибку:
Проблема в неправильном каталоге пользователя:
почему-то предполагается, что каталог пользователя будет в каталоге /home/, но это не так каталог пользователя лежит в переменной HOME:
вот тут получается пользователь, если его нет то из home берется последнее поле. в случае с каталогом правильно брать его как раз из этой же переменной home. модуль ирКэш
Сообщение отредактировал nickstonali - Вторник, 21.11.2023, 17:28 |
|
| |
tormozit | Дата: Вторник, 21.11.2023, 17:34 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Для тестирования на ОС Linux мне всегда приходится привлекать других пользователей, т.к. у меня его нет. Поэтому желательно, чтобы ты сам исправил, протестировал и предложил готовую правку.
|
|
| |
nickstonali | Дата: Вторник, 21.11.2023, 17:49 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
| Предпоследняя строчка. как раз оно и есть, проверенное решение. Не собирать каталог пользователя, а взять его напрямую из переменной HOME. Там каталог без слеша финального лежит, при добавлении временной папки нужно его добавлять
Сообщение отредактировал nickstonali - Вторник, 21.11.2023, 17:50 |
|
| |
tormozit | Дата: Вторник, 21.11.2023, 18:57 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Не вижу текста, который я бы мог скопировать и вставить в модуль.
|
|
| |
nickstonali | Дата: Среда, 22.11.2023, 09:48 | Сообщение # 5 |
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
| ---------------------------------------------
Код Функция ПолучитьФормуЛкс(ПолноеИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено, ТолькоВнешниеФормы = Ложь, Знач НачатьОтслеживание = Истина) Экспорт ПроверитьФормыСсылокЛкс(); //Начлао //НПолноеИмяФормы = НРег(ПолноеИмяФормы); НПолноеИмяФормы = (ПолноеИмяФормы); //Конец Фрагменты = ирОбщий.СтрРазделитьЛкс(НПолноеИмяФормы, "::"); Если Фрагменты.Количество() > 2 Тогда // Внешняя обработка/отчет Менеджер = ирОбщий.МенеджерВнешнегоОбъектаЛкс(Фрагменты[1]); ИмяФормы = ирОбщий.СтрРазделитьЛкс(Фрагменты[2])[2]; Если Не ЗначениеЗаполнено(ИмяФормы) Тогда ОсновнаяФорма = Менеджер.Метаданные().ОсновнаяФорма; Если ОсновнаяФорма <> Неопределено Тогда ИмяФормы = ОсновнаяФорма.Имя; КонецЕсли; КонецЕсли; Результат = Менеджер.ПолучитьФорму(ИмяФормы, Владелец, Уникальность); Иначе Фрагменты = ирОбщий.СтрРазделитьЛкс(НПолноеИмяФормы); #Если Сервер И Не Сервер Тогда Фрагменты = Новый Массив; #КонецЕсли Если Истина И Фрагменты.Количество() = 4 И Фрагменты[2] = "форма" Тогда ИмяФормы = Фрагменты[3]; Иначе ИмяФормы = Неопределено; КонецЕсли; КонецЕсли; Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда #Если Сервер И Не Сервер Тогда // Такой прием нужен для обхода ошибка компиляции в портативном режиме // http://www.hostedredmine.com/issues/883626 Если Истина И (Ложь Или Фрагменты[0] = "обработка" Или Фрагменты[0] = "отчет") И Фрагменты.Количество() > 2 И Найти(Фрагменты[1], "ир") = 1 И Не ирОбщий.СтрокиРавныЛкс(Фрагменты[1], Метаданные.Обработки.ирДинамическийСписок.Имя) Тогда Если Не ТолькоВнешниеФормы Тогда ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]); #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Обработки.ирАнализДанных; #КонецЕсли КонецЕсли; Если ОбъектМД = Неопределено Тогда ВызватьИсключение "Не найден объект метаданных " + ПолноеИмяФормы; КонецЕсли; Если ОбъектМД = Метаданные.Обработки.ирПлатформа Тогда Менеджер = ирКэш.Получить(); // Так управляемые формы нельзя получать Иначе Менеджер = Новый (ирОбщий.ПеревестиСтроку(Фрагменты[0]) + ирОбщий.ПеревестиСтроку("Менеджер") + "." + Фрагменты[1]); КонецЕсли; Если Не ЗначениеЗаполнено(ИмяФормы) И ОбъектМД.ОсновнаяФорма <> Неопределено Тогда // Нужно для отчетов. Иначе будет ошибка "неизвестный идентификатор формы" ИмяФормы = ОбъектМД.ОсновнаяФорма.Имя; ПолноеИмяФормы = ПолноеИмяФормы + "." + ИмяФормы; КонецЕсли; Результат = Менеджер.ПолучитьФорму(ИмяФормы, Владелец, Уникальность); КонецЕсли; Если Результат = Неопределено Тогда // Форма не инструмента или управляемая форма инструмента или форма отчета подсистемы при запрещенном использовании обычных форм Результат = ПолучитьФорму(ПолноеИмяФормы, Параметры, Владелец, Уникальность, Окно); КонецЕсли; //Если Найти(ПолноеИмяФормы, "Обработка.ирПлатформа.") = 1 Тогда // Попытка // ЭтоЗапрещено = Результат.ЭтотОбъект.Метаданные().ПолноеИмя() = ирОбщий.ПеревестиСтроку("Обработка") + ".ирПлатформа"; // Исключение // ЭтоЗапрещено = Ложь; // КонецПопытки; // Если ЭтоЗапрещено Тогда // ирОбщий.СообщитьЛкс("Создан лишний экземпляр обработки ирПлатформа"); // КонецЕсли; //КонецЕсли; #КонецЕсли Иначе Если Не ТолькоВнешниеФормы Тогда ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]); КонецЕсли; Если ОбъектМД = Неопределено Тогда Если Фрагменты[1] = "ирпортативный" Тогда Результат = ирПортативный.ПолучитьФорму(ИмяФормы, Владелец, Уникальность); Иначе ТипМетаданных = Фрагменты[0]; Менеджер = ирПортативный.ПолучитьМенеджерТипаМетаданныхЛкс(ТипМетаданных); ПолноеИмяФайла = ирПортативный.ПолноеИмяФайлаПортативногоОбъектаМетаданныхЛкс(Фрагменты[1], ТипМетаданных); Результат = Менеджер.ПолучитьФорму(ПолноеИмяФайла, ИмяФормы, Владелец, Уникальность); КонецЕсли; Иначе Результат = ирПортативный.ПолучитьФормуЛкс(ПолноеИмяФормы, Параметры, Владелец, Уникальность, Окно); КонецЕсли; КонецЕсли; Если ТипЗнч(Результат) = Тип("Форма") Тогда ирОбщий.СлужебныеДанныеФормыЛкс(Результат).Вставить("ИмяФормы", ПолноеИмяФормы); КонецЕсли; Если Результат <> Неопределено И НачатьОтслеживание Тогда НачатьОтслеживаниеФормыЛкс(Результат); КонецЕсли; Возврат Результат; КонецФункции
ирКлиент В линуксе в отличие от винды регистр имеет значение и приведение к нижнему регистру приводить к не видимости файлов
Сообщение отредактировал nickstonali - Четверг, 23.11.2023, 12:26 |
|
| |
tormozit | Дата: Среда, 22.11.2023, 22:42 | Сообщение # 6 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Первые 2 правки принял https://www.hostedredmine.com/issues/974596
3-ю правку по методу ПолучитьФормуЛкс() не могу принять, т.к. она в очень чувствительном методе и выходит за рамки ОС Linux. Сделай по ней отдельную заявку с более развернутым описанием проблемы.
|
|
| |
nickstonali | Дата: Четверг, 23.11.2023, 11:25 | Сообщение # 7 |
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
| --------------------------------------------- Код ирОбщий.ТекстМеждуМаркерамиЛкс(ПеременныеОкружения, "HOME=", Символы.ПС, Ложь);
еще тут проблема будет. функция ищет любой хоме, а их в переменных может быть несколько
Добавлено (23.11.2023, 12:02) --------------------------------------------- Поделю задачи на темы, тут по каталогу: 1) Данная функция более правильно получает значение переменной окружения, можно в общий модуль запихнуть Код Функция ЗначениеПеременнойОкружения(СтрокаПеременныхОкружения, Знач ИмяПеременной, ПраваяГраница = Неопределено) Ответ = ""; Если Не ЗначениеЗаполнено(СтрокаПеременныхОкружения) Или Не ЗначениеЗаполнено(ИмяПеременной) Тогда Возврат Ответ; КонецЕсли; Если Не СтрЗаканчиваетсяНа(ИмяПеременной, "=") Тогда ИмяПеременной = ИмяПеременной + "="; КонецЕсли; МассивПеременных = СтрРазделить(СтрокаПеременныхОкружения, Символы.ПС, Ложь); Найдено = Ложь; Для Каждого Эл Из МассивПеременных Цикл Если СтрНачинаетсяС(Эл, ИмяПеременной) Тогда Найдено = Истина; Прервать; КонецЕсли; КонецЦикла; Если Найдено = Ложь Тогда Возврат Ответ; КонецЕсли; Ответ = Сред(Эл, СтрДлина(ИмяПеременной) + 1); Если ПраваяГраница = Неопределено Тогда Возврат Ответ; КонецЕсли; Позиция = СтрНайти(Ответ, ПраваяГраница); Ответ = Лев(Ответ, Позиция - 1); Возврат Ответ; КонецФункции
2) и сама функция каталога Код Функция КаталогПлатформыВПрофилеЛкс(Знач Локальный = Ложь) Экспорт Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда //КаталогДанныхПриложения = "~/.1cv8"; // Похоже так можно только в bash. Ошибка доступа к файлу '~'. 13(0x0000000D): Permission denied #Если Клиент Тогда Если Локальный Тогда Подкаталог = ".1cv8" + ирОбщий.РазделительПутиКФайлуЛкс() + "1C"; Иначе Подкаталог = ".1C"; КонецЕсли; //начало //КаталогДанныхПриложения = "/home/" + ирКэш.ТекущийПользовательОСЛкс(Ложь) + "/" + Подкаталог; ПеременныеОкружения = ирОбщий.ВыполнитьКомандуОСЛкс("env"); КаталогПользователя = ЗначениеПеременнойОкружения(ПеременныеОкружения, "HOME="); Если Не ЗначениеЗаполнено(КаталогПользователя) Тогда КаталогДанныхПриложения = "/home/" + ирКэш.ТекущийПользовательОСЛкс(Ложь) + ирОбщий.РазделительПутиКФайлуЛкс() + Подкаталог; Иначе КаталогДанныхПриложения = КаталогПользователя + ирОбщий.РазделительПутиКФайлуЛкс() + Подкаталог; КонецЕсли; //конец #Иначе КаталогДанныхПриложения = КаталогВременныхФайлов(); #КонецЕсли Иначе Если Локальный Тогда Подкаталог = 28; Иначе Подкаталог = 26; КонецЕсли; ПриложениеОболочкиОС = Новый COMobject("Shell.Application"); КаталогДанныхПриложения = ПриложениеОболочкиОС.NameSpace(Подкаталог); Если КаталогДанныхПриложения = Неопределено Тогда // https://www.hostedredmine.com/issues/954427 КаталогДанныхПриложения = КаталогВременныхФайлов(); Иначе КаталогДанныхПриложения = КаталогДанныхПриложения.Self.Path; КаталогДанныхПриложения = КаталогДанныхПриложения + ирОбщий.РазделительПутиКФайлуЛкс() + "1C"; КонецЕсли; КонецЕсли; Возврат КаталогДанныхПриложения; КонецФункции
Сообщение отредактировал nickstonali - Четверг, 23.11.2023, 12:27 |
|
| |
tormozit | Дата: Пятница, 24.11.2023, 07:53 | Сообщение # 8 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Функция СтрНачинаетсяС недоступна в платформе 8.3.5-. Используй прикладные аналоги из ирОбщий: СтрНачинаетсяСЛкс, СтрКончаетсяНаЛкс, СтрРазделитьЛкс и т.д.
|
|
| |
nickstonali | Дата: Пятница, 24.11.2023, 09:28 | Сообщение # 9 |
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
| Код Функция ЗначениеПеременнойОкружения(СтрокаПеременныхОкружения, Знач ИмяПеременной, ПраваяГраница = Неопределено) Ответ = ""; Если Не ЗначениеЗаполнено(СтрокаПеременныхОкружения) Или Не ЗначениеЗаполнено(ИмяПеременной) Тогда Возврат Ответ; КонецЕсли; Если Не ирОбщий.СтрКончаетсяНаЛкс(ИмяПеременной, "=") Тогда ИмяПеременной = ИмяПеременной + "="; КонецЕсли; МассивПеременных = ирОбщий.СтрРазделитьЛкс(СтрокаПеременныхОкружения, Символы.ПС, Ложь); Найдено = Ложь; Для Каждого Эл Из МассивПеременных Цикл Если рОбщий.СтрНачинаетсяСЛкс(Эл, ИмяПеременной) Тогда Найдено = Истина; Прервать; КонецЕсли; КонецЦикла; Если Найдено = Ложь Тогда Возврат Ответ; КонецЕсли; Ответ = Сред(Эл, СтрДлина(ИмяПеременной) + 1); Если ПраваяГраница = Неопределено Тогда Возврат Ответ; КонецЕсли; Позиция = Найти(Ответ, ПраваяГраница); Ответ = Лев(Ответ, Позиция - 1); Возврат Ответ; КонецФункции
Переделал
|
|
| |
tormozit | Дата: Суббота, 25.11.2023, 00:06 | Сообщение # 10 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Принято
|
|
| |
tormozit | Дата: Суббота, 25.11.2023, 14:33 | Сообщение # 11 |
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Онлайн
| Исправлено в 7.02
|
|
| |