В конфигурации "Бух учёт для Украины" редакции 1.0 общие модули помечены как глобальные, соответственно процедуры и функции вызываются просто через имя, а в редакции 1.1 сняли пометку "глобальный", соответственно процедуры уже вызываются через точку - имяобщмодуля.имяпроцедуры.
Проблема в том что редакция 1.0 снята с поддержки и все отчёты теперь можно передирать из редакции 1.1. Но так как там полно вызовов процедур общих модулей, то надо нехило править модуль (тупо удалять имя общ модуля) каждого переносимого отчёта и так каждый раз когда отчёт меняется.
Вопрос: можно ли как нибуть получить общий модуль и присвоить его значению глобальной переменной.
К примеру если снять галку с общ модуля РегламентированнаяОтчетность, то у нас появится свойство глобального контекста РегламентированнаяОтчетность (если галка стоит, то такого свойства нету), а я хочу присвоить глобальной переменной РегламентированнаяОтчетность такое свойство.
Для документа это делается просто: документы["имя документа"], а вот общиемодули["имя модуля"] не получится, так как нету такого менеджера. Есть ли ещё какой нибуть способ?
Как вариант конечно можно тупо задвоить общие модули: один с галкой, а другой точно такойже, но с другим именем без неё. Сами понимаете что это фиговато мягко говоря смотреться будет.
Проблема в том что редакция 1.0 снята с поддержки и все отчёты теперь можно передирать из редакции 1.1. Но так как там полно вызовов процедур общих модулей, то надо нехило править модуль (тупо удалять имя общ модуля) каждого переносимого отчёта и так каждый раз когда отчёт меняется.
Вопрос: можно ли как нибуть получить общий модуль и присвоить его значению глобальной переменной.
К примеру если снять галку с общ модуля РегламентированнаяОтчетность, то у нас появится свойство глобального контекста РегламентированнаяОтчетность (если галка стоит, то такого свойства нету), а я хочу присвоить глобальной переменной РегламентированнаяОтчетность такое свойство.
Для документа это делается просто: документы["имя документа"], а вот общиемодули["имя модуля"] не получится, так как нету такого менеджера. Есть ли ещё какой нибуть способ?
Как вариант конечно можно тупо задвоить общие модули: один с галкой, а другой точно такойже, но с другим именем без неё. Сами понимаете что это фиговато мягко говоря смотреться будет.
По теме из базы знаний
- Мастер-класс SonarQube. В омут с головой
- Быстрая организация HTTP-сервиса, или О том, как я создал свой модуль с универсальными процедурами HTTP-сервиса, который позволил быстро организовывать и расширять API
- От ChatGPT до GigaChat: как объективно оценить и выбрать LLM для разработки на 1С
- Как я выбираю: костыль, рефакторинг или чистая архитектура. Мой алгоритм, выверенный многолетней практикой
- TOON на практике в 1С: модуль «Трансформер» для конвертации JSON/XML/CSV/TOON
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Метаданные.ОбщиеМодули
Так не выйдет. метаданные.ОбщиеМодули.РегламентированнаяОтчетность возвращает значение типа "Объект метаданных". Из этого значения я могу получить только имя, синоним и прочие ненужные мне вещи, а имя процедуры/функции - нет.
Если снять галку у общего модуля, то тип значения этого модуля будет "Общий модуль", вот именно значение такого типа мне и надо получить.
метаданные.ОбщиеМодули.РегламентированнаяОтчетность.имяпроцедуры - не работает!!!
К сожаленью и задвоение не срабатывает - пишит что такая процедура уже существует. Зачем было снимать галку "глобальный" и писать всё через точку?
У меня работает такой вариант:
Вычислить(Метаданные.ОбщиеМодули["РегламентированнаяОтчетность"]).НужнаяФункция()
Вычислить(Метаданные.ОбщиеМодули["РегламентированнаяОтчетность"]).НужнаяФункция()
(7)
Не работает
Вычислить(Метаданные.ОбщиеМодули["БухгалтерскийУчетПереопределяемый"]) - выдает ошибку
Ошибка в выражении
Бухгалтерский<<?>> учет переопределяемый
СП говорит что внутри Вычислить должна быть строка.
Вычислить(Метаданные.ОбщиеМодули["РегламентированнаяОтчетность"]).НужнаяФункция()
Не работает
Вычислить(Метаданные.ОбщиеМодули["БухгалтерскийУчетПереопределяемый"]) - выдает ошибку
Ошибка в выражении
Бухгалтерский<<?>> учет переопределяемый
СП говорит что внутри Вычислить должна быть строка.
Сегодня задался таким же вопросом.
Каково же удивление, что я создавал эту тему почти 10 лет назад.
Еще одно удивление что кто-то менее месяца назад ответил.
Каково же удивление, что я создавал эту тему почти 10 лет назад.
Еще одно удивление что кто-то менее месяца назад ответил.
ОбщийМодуль = Вычислить("БухгалтерскийУчетПереопределяемый");
мне помогло. спасибо.
понадобилось в УПП для переноса из УТ кода интерактивного разбиения строк ТЧ - "ЭтотОбъект" в общем модуле не работал.
пишите ответы даже если тема старая, кому-нибудь пригодится
мне помогло. спасибо.
понадобилось в УПП для переноса из УТ кода интерактивного разбиения строк ТЧ - "ЭтотОбъект" в общем модуле не работал.
пишите ответы даже если тема старая, кому-нибудь пригодится
Если вдруг кто-то наткнулся на эту ветку, вот рабочий код:
// Скопировано из БСП ОбщегоНазначения.ОбщийМодуль, лишнее убрано
// Возвращает ссылку на общий модуль по имени.
//
// Параметры:
// Имя - Строка - имя общего модуля.
//
// Возвращаемое значение:
// ОбщийМодуль
// Неопределено - Если общий модуль с переданным именем не существует
//
// Пример:
// МодульДопОбработки = ОбщийМодуль("ДополнительныеОтчетыИОбработки");
// МодульДопОбработки .<Имя метода>();
//
Функция ОбщийМодуль(Имя) Экспорт
Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
Модуль = Вычислить(Имя);
Иначе
Модуль = Неопределено;
КонецЕсли;
Возврат Модуль;
КонецФункции
Показать
Штош, и я отмечусь =)
Используем БСП
Нюанс в том, что если такого модуля нет, то будет вызвыно исключение, поэтому немного модифицировав код получим
Такой код гарантированно работает и проходит аудит по 1С:Фреш
Используем БСП
Модуль = ОбщегоНазначения.ОбщийМодуль(Имя)Нюанс в том, что если такого модуля нет, то будет вызвыно исключение, поэтому немного модифицировав код получим
&НаСервереБезКонтекста
Функция ОбщийМодуль(Имя) Экспорт
Модуль = Неопределено;
Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
Модуль = ОбщегоНазначения.ОбщийМодуль(Имя)
КонецЕсли;
Возврат Модуль;
КонецФункции
ПоказатьТакой код гарантированно работает и проходит аудит по 1С:Фреш
(17)
Метаданные то тут чем помогут
Перебираешь в цикле, выбрасываешь глобальные и те, которые текущему контексту клиента-сервера не соответствуют. Для остальных делаешь "вычислить", результат сравниваешь с тем что у тебя есть.
А можно ли как-то без вычислить вызвать общий модуль.
т.е. цель в том, чтобы пройти аудит во фреш и если нет в конфигурации модуля ОбщегоНазначения, то чтобы не было ошибки компиляции. Это, наверное, невозможно?
т.е. цель в том, чтобы пройти аудит во фреш и если нет в конфигурации модуля ОбщегоНазначения, то чтобы не было ошибки компиляции. Это, наверное, невозможно?
(21) Если Фреш пропустит такое, то
Если Метаданные.ОбщиеМодули.Найти("МойОбщийМодуль") <> Неопределено Тогда
ДвоичныеДанныеОбработки = ПолучитьМакет("ПодключаемыйМодуль");
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище);
ПодключаемыМодуль = ВнешниеОбработки.Создать(ИмяОбработки);
ПодключаемыМодуль.ВыполнитьКоманду();
КонецЕсли; Показать
(22) сложно.
Я просто хочу, чтобы обработка запускалась и там, где нет модулей бсп, вызываемых в функции сведений о внешней обработке.
И вот сейчас мне в голову пришла гениальная мысль, вызывать в попытке исключение код:
Т.е. Через самоопределение. Надо протестировать
Я просто хочу, чтобы обработка запускалась и там, где нет модулей бсп, вызываемых в функции сведений о внешней обработке.
И вот сейчас мне в голову пришла гениальная мысль, вызывать в попытке исключение код:
ОбщегоНазначения=ОбщегоНазначения;
Т.е. Через самоопределение. Надо протестировать
(23) Да, это будет проще, только будет ругаться на то, что нельзя менять это значение. Если искать в этом ключе, то можно так убрать ошибку компиляции:
Если Ложь Тогда
ОбщегоНазначения = Неопределено;
КонецЕсли;
Попытка
ОбщегоНазначения.ВыполнитьКоманду();
Исключение
Возврат;
КонецПопытки; Показать
(23) Итоговый рабочий способ:
Код для вставки в СведенияОВнешнейОбработке:
Код для вставки в СведенияОВнешнейОбработке:
Функция СведенияОВнешнейОбработке() Экспорт
//Инъекция от Гения 1С для компиляции функции в конфигурациях без БСП
Если ложь Тогда
ДополнительныеОтчетыИОбработки = ложь;
РаботаВБезопасномРежиме = ложь;
ДополнительныеОтчетыИОбработкиКлиентСервер = ложь;
СтандартныеПодсистемыСервер = ложь;
КонецЕсли;
...
Возврат ПараметрыРегистрации;
КонецФункции
Показать
(34) О, какое забавное продолжение темы у тебя получилось
Механизм внешних обработок, он, собственно в БСП-то и реализован. Все вот эти СведенияОВнешнейОбработке, РаботаВБезопасномРежиме, ПараметрыРегистрации, они как раз из БСПшных подсистем и идут.
Получается, ты в свою "нетленку" просто затащил код из БСП. Гениально.
Механизм внешних обработок, он, собственно в БСП-то и реализован. Все вот эти СведенияОВнешнейОбработке, РаботаВБезопасномРежиме, ПараметрыРегистрации, они как раз из БСПшных подсистем и идут.
Получается, ты в свою "нетленку" просто затащил код из БСП. Гениально.
(36) видимо, вы не поняли суть решения.
оно в том, чтобы обработку можно было запускать в БСП и не в БСП, при этом можно было бы регистрировать как доп.внешнюю обработку в БСП. Причем работает даже во фреш.
Перечитайте, о чем речь идет.
оно в том, чтобы обработку можно было запускать в БСП и не в БСП, при этом можно было бы регистрировать как доп.внешнюю обработку в БСП. Причем работает даже во фреш.
Перечитайте, о чем речь идет.
(37)
Перечитай, о чем речь идет.
и не в БСП
Чтобы запускать эту внешнюю обработку не в БСП тебе нужна подсистема внешних отчетов и обработок из БСП. Та самая, которая вызовет все эти "СведенияОВнешнейОбработке" и т. п. Или же копия этой подсистемы, которую ты и получаешь, стырив код из БСП.
Перечитай, о чем речь идет.
(40) А толк от этого какой ? Я даже представить не могу обработку которая может понадобится как в базе с БСП так и без БСП. Если метаданные отличаются то один фиг переделывать пол обработки. Ну разве что какой отчет по метаданным делать . Универсальность только в одной функции ??? Сэкономил 2 мин
(32) Мой гений в обмане компилятора для темы доп.внешних обработок.
Код мало написать, его нужно применить. Так то обману компилятора 100 лет в обед, применить его к доп.внешним обработкам - моя заслуга.
Я предложил код:
Комментатор поправил:
Я принял его правки.
Но главное тут не в формате кода, а в его применении для доп.внешних обработок.
Код мало написать, его нужно применить. Так то обману компилятора 100 лет в обед, применить его к доп.внешним обработкам - моя заслуга.
Я предложил код:
Попытка
ОбщегоНазначения = ОбщегоНазначения;
Исключение
КонецПопытки;
Комментатор поправил:
Если ложь Тогда
ОбщегоНазначения = Неопределено;
КонецЕсли;Я принял его правки.
Но главное тут не в формате кода, а в его применении для доп.внешних обработок.
М-да. Пожалуй, дополню ветку своим кодом:
На гениальность не претендую - тут и без меня хватает гениотов.
Функция СведенияОбАвторе(Автор)
Если Автор = "Гений 1С" Тогда
Возврат Ложь;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции;На гениальность не претендую - тут и без меня хватает гениотов.
(45)Ок, переформулирую. По опыту - универсальная обработка аудит не пройдет, аудитор завернет.
Облака по технологии fresh, в которых аудит автоматический - вероятно да, пройдет, но я так понимаю речь про 1cfresh.com, а не про другие фреши.
Облака по технологии fresh, в которых аудит автоматический - вероятно да, пройдет, но я так понимаю речь про 1cfresh.com, а не про другие фреши.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
