Регистр имен модулей линукс
|
|
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
|
|
| |