Как получить общий модуль по имени?

1. sokir 2 03.03.09 10:07 Сейчас в теме
В конфигурации "Бух учёт для Украины" редакции 1.0 общие модули помечены как глобальные, соответственно процедуры и функции вызываются просто через имя, а в редакции 1.1 сняли пометку "глобальный", соответственно процедуры уже вызываются через точку - имяобщмодуля.имяпроцедуры.
Проблема в том что редакция 1.0 снята с поддержки и все отчёты теперь можно передирать из редакции 1.1. Но так как там полно вызовов процедур общих модулей, то надо нехило править модуль (тупо удалять имя общ модуля) каждого переносимого отчёта и так каждый раз когда отчёт меняется.
Вопрос: можно ли как нибуть получить общий модуль и присвоить его значению глобальной переменной.
К примеру если снять галку с общ модуля РегламентированнаяОтчетность, то у нас появится свойство глобального контекста РегламентированнаяОтчетность (если галка стоит, то такого свойства нету), а я хочу присвоить глобальной переменной РегламентированнаяОтчетность такое свойство.
Для документа это делается просто: документы["имя документа"], а вот общиемодули["имя модуля"] не получится, так как нету такого менеджера. Есть ли ещё какой нибуть способ?
Как вариант конечно можно тупо задвоить общие модули: один с галкой, а другой точно такойже, но с другим именем без неё. Сами понимаете что это фиговато мягко говоря смотреться будет.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. alexk-is 6534 03.03.09 12:51 Сейчас в теме
(1) может быть чем-то поможет...
...посмотри тут http://www.infostart.ru/projects/3344/
...и тут http://www.infostart.ru/projects/3318/
...и еще тут http://www.infostart.ru/blogs/892/
2. Душелов 4017 03.03.09 10:16 Сейчас в теме
Метаданные.ОбщиеМодули
3. sokir 2 03.03.09 10:37 Сейчас в теме
Метаданные.ОбщиеМодули

Так не выйдет. метаданные.ОбщиеМодули.РегламентированнаяОтчетность возвращает значение типа "Объект метаданных". Из этого значения я могу получить только имя, синоним и прочие ненужные мне вещи, а имя процедуры/функции - нет.
Если снять галку у общего модуля, то тип значения этого модуля будет "Общий модуль", вот именно значение такого типа мне и надо получить.
метаданные.ОбщиеМодули.РегламентированнаяОтчетность.имяпроцедуры - не работает!!!

К сожаленью и задвоение не срабатывает - пишит что такая процедура уже существует. Зачем было снимать галку "глобальный" и писать всё через точку?
4. Душелов 4017 03.03.09 10:44 Сейчас в теме
(3) Я ответил на вопрос "как получить общий модуль по имени".
А получить список процедур общего модуля не представляется возможным, только как самому разбирать текст, предварительно выгрузив модули в текстовые файлы.
5. coder1cv8 3470 03.03.09 12:35 Сейчас в теме
(4) Он имеет ввиду контекст модуля, а не его метаданные.
Ответ - никак.
7. wasiliy 29.06.18 10:58 Сейчас в теме
У меня работает такой вариант:
Вычислить(Метаданные.ОбщиеМодули["РегламентированнаяОтчетность"]).НужнаяФункция()
9. sokir 2 17.07.18 01:49 Сейчас в теме
(7)
Вычислить(Метаданные.ОбщиеМодули["РегламентированнаяОтчетность"]).НужнаяФункция()

Не работает
Вычислить(Метаданные.ОбщиеМодули["БухгалтерскийУчетПереопределяемый"]) - выдает ошибку
Ошибка в выражении
Бухгалтерский<<?>> учет переопределяемый

СП говорит что внутри Вычислить должна быть строка.
10. SlavaKron 17.07.18 08:49 Сейчас в теме
(9)
ОбщийМодуль = Вычислить("БухгалтерскийУчетПереопределяемый");
ОбщийМодуль.НужнаяФункция();
COMPER; odinsmot; sizeoff; eeeio; AnryMc; atdonya; salt7; adhocprog; nikolav; Mahon83; LosevI; lnnr; axsebur; gr0m; serm; dynamicsystems; Maikl_kar; butchxtlan; pal_alex; +19 Ответить
8. sokir 2 17.07.18 01:46 Сейчас в теме
Сегодня задался таким же вопросом.
Каково же удивление, что я создавал эту тему почти 10 лет назад.
Еще одно удивление что кто-то менее месяца назад ответил.
dehro; AndrewKop; user785225; AnryMc; atdonya; adhocprog; ilyanet; romankoav; boogie; butchxtlan; +10 Ответить
11. serm 07.06.19 14:05 Сейчас в теме
ОбщийМодуль = Вычислить("БухгалтерскийУчетПереопределяемый");

мне помогло. спасибо.
понадобилось в УПП для переноса из УТ кода интерактивного разбиения строк ТЧ - "ЭтотОбъект" в общем модуле не работал.
пишите ответы даже если тема старая, кому-нибудь пригодится
atdonya; adhocprog; +2 Ответить
12. rule_2 47 06.10.22 11:54 Сейчас в теме
Если вдруг кто-то наткнулся на эту ветку, вот рабочий код:

// Скопировано из БСП ОбщегоНазначения.ОбщийМодуль, лишнее убрано
// Возвращает ссылку на общий модуль по имени.
//
// Параметры:
//  Имя - Строка - имя общего модуля.
//
// Возвращаемое значение:
//   ОбщийМодуль
//   Неопределено - Если общий модуль с переданным именем не существует
//
// Пример:
//	МодульДопОбработки = ОбщийМодуль("ДополнительныеОтчетыИОбработки");
//	МодульДопОбработки .<Имя метода>();
//
Функция ОбщийМодуль(Имя) Экспорт
	
	Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
		Модуль = Вычислить(Имя);
	Иначе
		Модуль = Неопределено;
	КонецЕсли;
	
	Возврат Модуль;
	
КонецФункции

Показать
birk; fixin; +2 Ответить
13. fixin 4253 14.06.23 20:41 Сейчас в теме
(12) спасибо, именно это и искал.
14. ixijixi 1801 07.07.23 10:29 Сейчас в теме
Штош, и я отмечусь =)
Используем БСП
Модуль = ОбщегоНазначения.ОбщийМодуль(Имя)

Нюанс в том, что если такого модуля нет, то будет вызвыно исключение, поэтому немного модифицировав код получим
&НаСервереБезКонтекста
Функция ОбщийМодуль(Имя) Экспорт
	
	Модуль = Неопределено;
	
	Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
		Модуль = ОбщегоНазначения.ОбщийМодуль(Имя)
	КонецЕсли;
	
	Возврат Модуль;
	
КонецФункции
Показать

Такой код гарантированно работает и проходит аудит по 1С:Фреш
buy_sale; fixin; 0x00; +3 Ответить
15. 7OH 69 24.08.23 21:48 Сейчас в теме
(14), а в обратную сторону можно ?
Есть модуль - надо имя получить
16. пользователь 24.08.23 23:00
Сообщение было скрыто модератором.
...
17. 7OH 69 25.08.23 00:09 Сейчас в теме
(16) метаданные что ?
На входе в функцию ссылка на модуль, полученная через бсп функцию.
Надо имя модуля узнать.
Метаданные то тут чем помогут?
18. пользователь 25.08.23 00:12
Сообщение было скрыто модератором.
...
20. user1880116 25.08.23 09:58 Сейчас в теме
(18) Пойду на кухню я, доем, мои друзья, последнюю из десяти котлет...
19. user1880116 25.08.23 09:56 Сейчас в теме
(17)
Метаданные то тут чем помогут
Перебираешь в цикле, выбрасываешь глобальные и те, которые текущему контексту клиента-сервера не соответствуют. Для остальных делаешь "вычислить", результат сравниваешь с тем что у тебя есть.
21. fixin 4253 10.02.24 21:10 Сейчас в теме
А можно ли как-то без вычислить вызвать общий модуль.
т.е. цель в том, чтобы пройти аудит во фреш и если нет в конфигурации модуля ОбщегоНазначения, то чтобы не было ошибки компиляции. Это, наверное, невозможно?
26. Xershi 1486 11.02.24 16:17 Сейчас в теме
(21) в БСП есть проверка на наличие модуля. Они так например в УТ делают. Т.к. это обрезаная версия УП и КА.
Еще приколько пишут, если НЕ УТКА (УТ и КА=))).
22. SlavaKron 11.02.24 10:38 Сейчас в теме
(21) Если Фреш пропустит такое, то
Если Метаданные.ОбщиеМодули.Найти("МойОбщийМодуль") <> Неопределено Тогда
	
	ДвоичныеДанныеОбработки = ПолучитьМакет("ПодключаемыйМодуль");
	АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
	ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище);
	ПодключаемыМодуль = ВнешниеОбработки.Создать(ИмяОбработки);
	ПодключаемыМодуль.ВыполнитьКоманду();
	
КонецЕсли;
Показать
23. fixin 4253 11.02.24 11:09 Сейчас в теме
(22) сложно.
Я просто хочу, чтобы обработка запускалась и там, где нет модулей бсп, вызываемых в функции сведений о внешней обработке.

И вот сейчас мне в голову пришла гениальная мысль, вызывать в попытке исключение код:
ОбщегоНазначения=ОбщегоНазначения;


Т.е. Через самоопределение. Надо протестировать
24. SlavaKron 11.02.24 11:30 Сейчас в теме
(23) Да, это будет проще, только будет ругаться на то, что нельзя менять это значение. Если искать в этом ключе, то можно так убрать ошибку компиляции:
Если Ложь Тогда
	ОбщегоНазначения = Неопределено;
КонецЕсли;

Попытка
	ОбщегоНазначения.ВыполнитьКоманду();
Исключение
	Возврат;
КонецПопытки;
Показать
34. fixin 4253 12.02.24 09:03 Сейчас в теме
(23) Итоговый рабочий способ:

https://geniy1s.ru/odna-obrabotka-dlya-bsp-netlenok-i-fresh/

Код для вставки в СведенияОВнешнейОбработке:
Функция СведенияОВнешнейОбработке() Экспорт   
	
	//Инъекция от Гения 1С для компиляции функции в конфигурациях без БСП  https://geniy1s.ru/odna-obrabotka-dlya-bsp-netlenok-i-fresh
	Если ложь Тогда
		ДополнительныеОтчетыИОбработки = ложь;
		РаботаВБезопасномРежиме = ложь;
		ДополнительныеОтчетыИОбработкиКлиентСервер = ложь;   
		СтандартныеПодсистемыСервер = ложь;   
	КонецЕсли;

	...
	Возврат ПараметрыРегистрации;
КонецФункции
Показать
36. user1880116 12.02.24 10:15 Сейчас в теме
(34) О, какое забавное продолжение темы у тебя получилось

Механизм внешних обработок, он, собственно в БСП-то и реализован. Все вот эти СведенияОВнешнейОбработке, РаботаВБезопасномРежиме, ПараметрыРегистрации, они как раз из БСПшных подсистем и идут.

Получается, ты в свою "нетленку" просто затащил код из БСП. Гениально.
37. fixin 4253 12.02.24 10:20 Сейчас в теме
(36) видимо, вы не поняли суть решения.
оно в том, чтобы обработку можно было запускать в БСП и не в БСП, при этом можно было бы регистрировать как доп.внешнюю обработку в БСП. Причем работает даже во фреш.
Перечитайте, о чем речь идет.
38. user1880116 12.02.24 10:44 Сейчас в теме
(37)
и не в БСП
Чтобы запускать эту внешнюю обработку не в БСП тебе нужна подсистема внешних отчетов и обработок из БСП. Та самая, которая вызовет все эти "СведенияОВнешнейОбработке" и т. п. Или же копия этой подсистемы, которую ты и получаешь, стырив код из БСП.

Перечитай, о чем речь идет.
40. fixin 4253 12.02.24 11:07 Сейчас в теме
(38) не понимаю, о чем вы.
да, в неБСП можно запускать без БСП.
Но речь в задаче о том, чтобы одна обработка запускалась везде.
41. vadim1011985 100 12.02.24 15:37 Сейчас в теме
(40) А толк от этого какой ? Я даже представить не могу обработку которая может понадобится как в базе с БСП так и без БСП. Если метаданные отличаются то один фиг переделывать пол обработки. Ну разве что какой отчет по метаданным делать . Универсальность только в одной функции ??? Сэкономил 2 мин
42. fixin 4253 12.02.24 15:38 Сейчас в теме
(41) да любой универсальный отчет. Та же консоль запросов, универсальный редактор реквизитов, регистров, групповая обработка справочников и документов, универсальная выгрузка-загрузка.
43. vadim1011985 100 12.02.24 15:52 Сейчас в теме
(42) Ага, которые в своем коде могут использовать БСП.
44. laperuz 46 13.02.24 08:52 Сейчас в теме
(42)Использование универсальных обработок запрещено правилами Fresh, п. 9.7 https://1cfresh.com/articles/so_addprocess_req
Так что с большой долей вероятности практическая ценность решения близится к 0.
25. fixin 4253 11.02.24 11:31 Сейчас в теме
27. user1880116 11.02.24 16:54 Сейчас в теме
(25) А ты не хочешь для начала отдать человеку стартмани за ответ?
Ну, перед тем, как писать, что эта гениальная идея пришла в голову именно тебе?

https://web.archive.org/web/20240211134223/https://geniy1s.ru/segodnya-mne-v-golovu-prishel-genialnyj-kod/
28. user1880116 11.02.24 16:56 Сейчас в теме
Хотя, не. Ты не сможешь - тема не твоя.
31. fixin 4253 12.02.24 08:21 Сейчас в теме
(28) да, я сам добавил вознаграждение, т.к. тема была актуальна. Пусть отдадут тому, кому посчитают нужным.
29. naf2000 12.02.24 08:18 Сейчас в теме
(25) а как ловко ты присвоил чужую идею себе, это действительно гениально
30. fixin 4253 12.02.24 08:19 Сейчас в теме
(29) а можно подробнее, в чем присвоение?
32. naf2000 12.02.24 08:26 Сейчас в теме
(30) в том, что ты выложил код (24) как свой. В целом ничего особенного, но зачем ты пишешь какой ты гениальный придумал код? Это ложь получается
35. user1880116 12.02.24 09:40 Сейчас в теме
(32)
Это ложь получается
Ну вот и ты осознал принципы "гениальности" пациента.
И даже получил от него минус =]
33. fixin 4253 12.02.24 08:27 Сейчас в теме
(32) Мой гений в обмане компилятора для темы доп.внешних обработок.

Код мало написать, его нужно применить. Так то обману компилятора 100 лет в обед, применить его к доп.внешним обработкам - моя заслуга.

Я предложил код:
  Попытка
    ОбщегоНазначения = ОбщегоНазначения;
  Исключение
  КонецПопытки;


Комментатор поправил:
  Если ложь Тогда
    ОбщегоНазначения = Неопределено;
  КонецЕсли;


Я принял его правки.

Но главное тут не в формате кода, а в его применении для доп.внешних обработок.
39. user856012 13 12.02.24 10:54 Сейчас в теме
М-да. Пожалуй, дополню ветку своим кодом:
Функция СведенияОбАвторе(Автор)
   Если Автор = "Гений 1С" Тогда
      Возврат Ложь;
   Иначе
      Возврат Неопределено;
   КонецЕсли;
КонецФункции;

На гениальность не претендую - тут и без меня хватает гениотов.
45. fixin 4253 13.02.24 08:58 Сейчас в теме
(44) не запрещено, а рекомендуется не использовать.
В такие обработки можно вставить контроль ролей, для которых они запускаются и норм.
46. laperuz 46 13.02.24 10:35 Сейчас в теме
(45)Ок, переформулирую. По опыту - универсальная обработка аудит не пройдет, аудитор завернет.
Облака по технологии fresh, в которых аудит автоматический - вероятно да, пройдет, но я так понимаю речь про 1cfresh.com, а не про другие фреши.
47. fixin 4253 13.02.24 10:56 Сейчас в теме
(46) ну кроме фреша есть другие облака, где аудит по правилам, а не по понятиям. Там сгодится
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот