Пятница, 11.10.2024, 14:39
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Каталог пользователя linux
nickstonaliДата: Вторник, 21.11.2023, 17:26 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
При открытии на linux получаю такую ошибку:

Проблема в неправильном каталоге пользователя:

почему-то предполагается, что каталог пользователя будет в каталоге /home/, но это не так каталог пользователя лежит в переменной HOME:

вот тут получается пользователь, если его нет то из home берется последнее поле.
в случае с каталогом правильно брать его как раз из этой же переменной home.
модуль ирКэш
Прикрепления: 7208138.png (64.7 Kb) · 8422639.png (59.4 Kb) · 5615209.png (56.8 Kb)


Сообщение отредактировал 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
 
  • Страница 1 из 1
  • 1
Поиск: