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


тут в начале отказ от использования нижнего регистра, так как в линуксе регистр имеет значение.
Далее по коду, где идет сравнение со строками в нижнем регистре, фрагменты приводятся к нижнему регистру только для сравнения.
 
tormozitДата: Пятница, 24.11.2023, 07:49 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6382
Репутация: 165
Статус: Оффлайн
Непонятно, зачем это нужно делать. Какую проблему вызывает текущий вариант кода?
 
nickstonaliДата: Пятница, 24.11.2023, 09:13 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 34
Репутация: 24
Статус: Оффлайн
В линуксе регистр файла имеет значение, на входе получаем нормальную строку с именем модуля но потом переводим в нижний регистр, это сделано затем, что далее идет сравнение (на пример, "обработка", те со словом в нижнем регистре), а потом используя уже куски из имени которое было на входе собираем заново имя и пытаемся открыть обработку по имени, в винде без разницы она находи файл, а вот линукс нет.
Я переделал чтобы нижний регистр был только в местах сравнения текста, а имя собиралось из первоначального текста.

вот тут продолжение этой проблемы:
http://devtool1c.ucoz.ru/forum/2-2465-1

в строке Результат ИмяОбъекта - вот сюда передается уже в нижнем регистре.

пример:
ирАнализДанных.epf - линукс найдет

иранализданных.epf уже нет


Сообщение отредактировал nickstonali - Пятница, 24.11.2023, 09:27
 
  • Страница 1 из 1
  • 1
Поиск: