Четверг, 10.10.2024, 14:05
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Регистр имен модулей линукс
nickstonaliДата: Понедельник, 04.12.2023, 09:44 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 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], ТипМетаданных);
            Результат = Менеджер.ПолучитьФорму(ПолноеИмяФайла, ИмяФормы, Владелец, Уникальность);
         КонецЕсли;
      Иначе
         Результат = ирПортативный.ПолучитьФормуЛкс(ПолноеИмяФормы, Параметры, Владелец, Уникальность, Окно);
      КонецЕсли;
   КонецЕсли;
   Если ТипЗнч(Результат) = Тип("Форма") Тогда
      ирОбщий.СлужебныеДанныеФормыЛкс(Результат).Вставить("ИмяФормы", ПолноеИмяФормы);
   КонецЕсли;
   Если Результат <> Неопределено И НачатьОтслеживание Тогда
      НачатьОтслеживаниеФормыЛкс(Результат);
   КонецЕсли;
   Возврат Результат;
   
КонецФункции
ирКлиент
В линуксе в отличие от винды регистр имеет значение и приведение к нижнему регистру приводить к не видимости файлов

Вот эту правку видимо пропустили, вынес ее в отдельную тему (http://devtool1c.ucoz.ru/forum/2-2458-1).


Сообщение отредактировал nickstonali - Понедельник, 04.12.2023, 09:49
 
tormozitДата: Понедельник, 04.12.2023, 22:25 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
К сожалению пока вынужден отказать в этой правке. Функция эта слишком важная и имеет большое число способов вызова, включая передачу имени формы в нижнем регистре. Тестировать это будет очень затратно. У тебя 3 выхода:
1. Перейти на расширение
2. Сидеть на собственной ветке со своим вариантом этой функции
3. Сделать такую правку, которая будет работать только в ОС Linux и не будет сильно дублировать код.
 
nickstonaliДата: Вторник, 05.12.2023, 10:01 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
1 и 2 плохие варианты.
3 какой смысл в дубле?

В текущей функции строка делится на части и ее части сверяются со строкой в нижнем регистре, Для этого, чтобы каждый раз не преобразовывать в нижний регистр это делается в начале.
Суть моей доработки в том, что в начале не приводить к нижнему регистру, а поделить как есть. А уже далее когда идет сравнение со строкой приводить фрагменты к нижнему регистру , только для сравнения и все. 

Код как был так и остался, изменено только сравнение.
Зато мы получаем во фрагментах части строки в правильном регистре и когда передаем эти фрагменты для получения пути и тд, они соберутся в правильном регистре.
это вот 4 решение, мне думается менее затратное.
Даже если еще откуда то передаются имена в нижнем регистре пока такого не встречал, если будет можно поправить, но в винде это по-любому ни на что не влияет. а в линуксе дает возможность нормально работать.

есть еще и 5 решение, но оно так себе - сделать имена модулей в нижнем регистре
 
tormozitДата: Вторник, 05.12.2023, 22:14 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
Цитата nickstonali ()
когда идет сравнение со строкой приводить фрагменты к нижнему регистру
Не увидел этого в твоем варианте кода. Увидел только удаление приведения к нижнему регистру.
 
nickstonaliДата: Среда, 06.12.2023, 09:17 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн

Код
Функция ПолучитьФормуЛкс(ПолноеИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено, ТолькоВнешниеФормы = Ложь, Знач НачатьОтслеживание = Истина) Экспорт
   
   ПроверитьФормыСсылокЛкс(); 
   //Начлао
   //НПолноеИмяФормы = НРег(ПолноеИмяФормы);
   НПолноеИмяФормы = (ПолноеИмяФормы);
   //Конец
   Фрагменты = ирОбщий.СтрРазделитьЛкс(НПолноеИмяФормы, "::");
   Если Фрагменты.Количество() > 2 Тогда
      // Внешняя обработка/отчет
      Менеджер = ирОбщий.МенеджерВнешнегоОбъектаЛкс(Фрагменты[1]);
      ИмяФормы = ирОбщий.СтрРазделитьЛкс(Фрагменты[2])[2];
      Если Не ЗначениеЗаполнено(ИмяФормы) Тогда
         ОсновнаяФорма = Менеджер.Метаданные().ОсновнаяФорма;
         Если ОсновнаяФорма <> Неопределено Тогда
            ИмяФормы = ОсновнаяФорма.Имя;
         КонецЕсли;
      КонецЕсли;
      Результат = Менеджер.ПолучитьФорму(ИмяФормы, Владелец, Уникальность);
   Иначе
      Фрагменты = ирОбщий.СтрРазделитьЛкс(НПолноеИмяФормы);
      #Если Сервер И Не Сервер Тогда
         Фрагменты = Новый Массив;
      #КонецЕсли
      Если Истина
         И Фрагменты.Количество() = 4   
         //Начало 
         //И Фрагменты[2] = "форма"
         И НРег(Фрагменты[2]) = "форма"
         //конец
      Тогда
         ИмяФормы = Фрагменты[3];
      Иначе
         ИмяФормы = Неопределено;
      КонецЕсли;
   КонецЕсли;
   Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда
      #Если Сервер И Не Сервер Тогда
         // Такой прием нужен для обхода ошибка компиляции в портативном режиме
         // http://www.hostedredmine.com/issues/883626
         Если Истина
            И (Ложь 
            //Начало
               //Или Фрагменты[0] = "обработка" 
               //Или Фрагменты[0] = "отчет") 
               Или НРег(Фрагменты[0]) = "обработка" 
               Или Нрег(Фрагменты[0]) = "отчет")
               //Конец
            И Фрагменты.Количество() > 2  
            //начало
            //И Найти(Фрагменты[1], "ир") = 1 
            И Найти(НРег(Фрагменты[1]), "ир") = 1 
            //конец
            И Не ирОбщий.СтрокиРавныЛкс(Фрагменты[1], Метаданные.Обработки.ирДинамическийСписок.Имя) 
         Тогда
            Если Не ТолькоВнешниеФормы Тогда
               ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]);
               #Если Сервер И Не Сервер Тогда
                  ОбъектМД = Метаданные.Обработки.ирАнализДанных;
               #КонецЕсли
            КонецЕсли;
            Если ОбъектМД = Неопределено Тогда
               ВызватьИсключение "Не найден объект метаданных " + ПолноеИмяФормы;
            КонецЕсли; 
            Если ОбъектМД = Метаданные.Обработки.ирПлатформа Тогда 
               Менеджер = ирКэш.Получить(); // Так управляемые формы нельзя получать
            Иначе
               Менеджер = Новый (ирОбщий.ПеревестиСтроку(Фрагменты[0]) + ирОбщий.ПеревестиСтроку("Менеджер") + "." + Фрагменты[1]);
            КонецЕсли;
            Если Не ЗначениеЗаполнено(ИмяФормы) И ОбъектМД.ОсновнаяФорма <> Неопределено Тогда 
               // Нужно для отчетов. Иначе будет ошибка "неизвестный идентификатор формы" 
               ИмяФормы = ОбъектМД.ОсновнаяФорма.Имя;
               ПолноеИмяФормы = ПолноеИмяФормы + "." + ИмяФормы;
            КонецЕсли;
            Результат = Менеджер.ПолучитьФорму(ИмяФормы, Владелец, Уникальность);
         КонецЕсли; 
         Если Результат = Неопределено Тогда
            // Форма не инструмента или управляемая форма инструмента или форма отчета подсистемы при запрещенном использовании обычных форм
            Результат = ПолучитьФорму(ПолноеИмяФормы, Параметры, Владелец, Уникальность, Окно);
         КонецЕсли; 
         //Если Найти(ПолноеИмяФормы, "Обработка.ирПлатформа.") = 1 Тогда
         //   Попытка
         //      ЭтоЗапрещено = Результат.ЭтотОбъект.Метаданные().ПолноеИмя() = ирОбщий.ПеревестиСтроку("Обработка") + ".ирПлатформа";
         //   Исключение
         //      ЭтоЗапрещено = Ложь;
         //   КонецПопытки; 
         //   Если ЭтоЗапрещено Тогда
         //      ирОбщий.СообщитьЛкс("Создан лишний экземпляр обработки ирПлатформа");
         //   КонецЕсли; 
         //КонецЕсли; 
      #КонецЕсли
   Иначе
      Если Не ТолькоВнешниеФормы Тогда
         ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]);
      КонецЕсли;
      Если ОбъектМД = Неопределено Тогда  
         //начало
         //Если Фрагменты[1] = "ирпортативный" Тогда
         Если НРег(Фрагменты[1]) = "ирпортативный" Тогда
            //конец
            Результат = ирПортативный.ПолучитьФорму(ИмяФормы, Владелец, Уникальность);
         Иначе
            ТипМетаданных = Фрагменты[0];
            Менеджер = ирПортативный.ПолучитьМенеджерТипаМетаданныхЛкс(ТипМетаданных);
            ПолноеИмяФайла = ирПортативный.ПолноеИмяФайлаПортативногоОбъектаМетаданныхЛкс(Фрагменты[1], ТипМетаданных);
            Результат = Менеджер.ПолучитьФорму(ПолноеИмяФайла, ИмяФормы, Владелец, Уникальность);
         КонецЕсли; 
      Иначе
         Результат = ирПортативный.ПолучитьФормуЛкс(ПолноеИмяФормы, Параметры, Владелец, Уникальность, Окно);
      КонецЕсли; 
   КонецЕсли;
   Если ТипЗнч(Результат) = Тип("Форма") Тогда
      ирОбщий.СлужебныеДанныеФормыЛкс(Результат).Вставить("ИмяФормы", ПолноеИмяФормы);
   КонецЕсли;
   Если Результат <> Неопределено И НачатьОтслеживание Тогда
      НачатьОтслеживаниеФормыЛкс(Результат);
   КонецЕсли;
   Возврат Результат;
   
КонецФункции


Это я обновился на 7.03 она затерла правильные изменения, 
вот этот с "нрег"
опять изменения //начало и //конец выделены
 
tormozitДата: Суббота, 09.12.2023, 11:12 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
Принято https://www.hostedredmine.com/issues/976465
 
tormozitДата: Воскресенье, 10.12.2023, 22:13 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
Исправлено в 7.04
 
  • Страница 1 из 1
  • 1
Поиск: