Имя: Пароль:
1C
1С v8
Как узнать, есть ли глобальная переменная в частично-закрытой конфе?
0 MWWRuza
 
гуру
04.06.18
22:25
Сабж... Конфа не типовая, модуль обычного приложения и все глобальные модули закрыты. Нужно для правильного написания внешней обработки. По идее, должна быть такая переменная, с нужным мне именем. Но, как проверить? Все модули, где она может быть объявлена, открываются с сообщением: "Исходный текст отсутствует"...
1 quest
 
04.06.18
22:30
точка останова и смотри в отладчике - если есть то будет значение, если нет - то будет неопределено.
2 quest
 
04.06.18
22:30
тьфу, ошибка будет если нет такой переменной
3 youalex
 
04.06.18
23:24
вычислить() в попытке
4 Cyberhawk
 
04.06.18
23:45
"модуль обычного приложения и все глобальные модули закрыты" // Сурово
5 Franchiser
 
гуру
05.06.18
01:54
Легко декомпилировать закрытые модули
6 vier
 
05.06.18
02:16
ГлобальнаяП = ГлобальнаяП;
Если ГлобальнаяП <> Неопределенно Тогда
    Сообшить("Есть");
Иначе
    Значение = Новый УникальныйИдентификатор;
    ПрисвоитьГлобальнойП(Значение);
    Если ГлобальнаяП = Неопределено Тогда
        Сообщить("Нет");
    Иначе
        ГлобальнаяП = Неопределено;
        Сообшить("Есть");
    КонецЕсли;
КонецЕсли;
...
Процедура ПрисвоитьГлобальнойП(Значение)
    ГлобальнаяП = Значение;
КонецПроцедуры;


Попытошники хреновы
7 Tateossian
 
05.06.18
02:42
(3) Это если примерно понимать, что вычислять. На самом деле, рефлексии иногда очень не хватает, но половина взломов происходит через реверс инжиниринг с помощью вот рефлексии, например. Функциональности метаданных не хватает - была бы возможность опрашивать общие модули на наличие функций/процедур - и вызывать их, в том числе модификатор Экспорт программно устанавливать...
8 vier
 
05.06.18
02:52
(7) И какой бы пиздец начался. И так народ старается отделить публичный апи от внутреннего, хотя бы областями, чтобы хоть на уровне договоренностей знать, что рефакторить, а что для совместимости тащить, чтобы потребители не поломались...
А тут такой персонаж сбоку херакс, экспорт сам воткнул, права доступа нахер послал, на следующий день на изменение вызываемого кода наступил и опять "эта ваша 1с виновата".
Попробуй написать что-то посерьёзнее внешней обработки.
9 Emery
 
05.06.18
06:43
> как проверить?

Можно просто выгрузить конфигурацию в xml-файлы и сделать поиск в UTF-8 по искомому имени. Даже в закрытых модулях все используемые имена присутствуют.
10 mehfk
 
05.06.18
06:58
(9) ЕМНИП, закрытые модули в файлы не выгружаются.
11 Emery
 
05.06.18
07:16
(10) > закрытые модули в файлы не выгружаются

Что за глупости! Вполне себе выгружаются. Только не с расширением *.bsl, а с расширением *.bin, вроде Module.bin. А в этих файлах в кодировке UTF-8 все используемые имена присутствуют. Правда, не исключена обфускация, если применяется не парольная защита, а внешние инструменты, типа WiseAdvise. Но, как правило, обфусцируют обычно локальные имена, а глобальные не меняют.
12 mehfk
 
05.06.18
08:08
(11) Докажи.
13 Адинэснег
 
05.06.18
08:22
(6)
Если ГлобальнаяП <> Неопределенно Тогда

А если ГП есть и содержит значение Неопределено?
14 Фрэнки
 
05.06.18
08:37
Как бы если модуль "закрыт" и документации на установленные внутри модуля переменные нет, то такие переменные следует считать "приватными". Какой смысл обращаться к таким переменным, если они не документированы...

Я с такими вещами сталкивался и до того, как подсел на 1С и там было принято обращаться к внутренним переменным классов "через точку" или параметрами функций/процедур. И предполагалось, что использовать глобальные/внешние переменные в классах моветон.

В данном примере разработчик мог и должен был создать глобальные в виде Параметров сеанса, например, если это могло создать существенный и полезный эффект
15 Emery
 
05.06.18
14:04
(12) > Докажи.

Вот возьмем, например, 1С-КАМИН:Зарплата. Версия 5.0 (5.0.49.2). Там есть защищенные модули, например:

\CommonModules\МенеджерИБСервер\Ext\Module.bin
и
\CommonModules\МодульЗащиты\Ext\Module.bin

В первом модуле используются глобальные переменные:

//Перем СтандартныеПодсистемыСервер;
//Перем ОбщегоНазначенияКлиентСервер;
//Перем ОбновлениеИнформационнойБазыСлужебный;
//Перем Метаданные;

А во втором, переменные:

//Перем ОбходРезультатаЗапроса;  // Глобальная переменная
//Перем _CКМYЩaE2OdЁKсцGоxУШyйяч;  // Локальная псевдопеременная для создания проблем с
// восстановлением кода

Понятно, что эти переменные там не определяются, а только используются, но цель, была, как я понимаю, проверить именно используемые глобальные имена в защищенных модулях.

Если «хотится», что-то более конкретное, выкладывайте базу на Яндекс-Диск, а там посмотрим.
16 1Сергей
 
05.06.18
14:21
ета... А через табло никак?
17 youalex
 
05.06.18
20:02
Если просто узнать, то, наверное, можно и через локальные переменные..
18 АнализДанных
 
05.06.18
20:10
В EDT есть возможность просматривать все локальные переменные, может там и глобальные будут видны. У меня сейчас нет возможности проверить.
19 Tateossian
 
05.06.18
20:35
(18) Локальные и в конфигураторе видно.
20 АнализДанных
 
06.06.18
10:28
(19) читай внимательно: может там и глобальные будут видны. сейчас нет возможности проверить
21 Buster007
 
06.06.18
10:38
(15) так замучаешься каждому доказывать...
22 MWWRuza
 
гуру
06.06.18
11:28
Не, если так все сложно, надо попробовать просто у разработчика конфы спросить. Я думал, есть какой-то более простой способ, что можно увидеть и не "дергать" по пустякам уважаемого человека.

По сути - это все связано с пресловутыми онлайн-кассами. Есть некая полузакрытая конфа. Купленная честным образом два года назад. Работала все это время с ЕНВД чековым принтером. Сейчас - понадобилось онлайн. Но, в силу некоторых моих "шкурных" интересов, ККТ, довольно редко-используемой в малом бизнесе модели. У разработчика их под рукой нет, зато у меня вагон - и в том числе и с эмулятором ФН(МГМ). Обработку я написал, переделав штриховскую из поставки конфигурации. Все в принципе работает, уже второй день в реальном магазине - полет нормальный.
Но! Не нравится мне как это все сделано. При каждом обращении к кассе, происходит ее подключение, загрузка драйвера, создание объекта драйвера, получение его ID и т.д... А это около 3 секунд задержка. Потому, что переменная, в которой в виде структуры хранится объект драйвера вместе с параметрами - локальная, объявлена в этой обработке. Естественно, при закрытии обработки она убивается, и при следующем обращением к ней все заново. Было-бы гораздо правильнее, создав объект при первом обращении к кассе, хранить его в глобальной переменной, и при последующих обращениях только проверять что он есть. Все работало-бы быстрее. Но, не имея доступа к закрытым модулям конфигурации, это трудно реализовать...  Поэтому и возник вопрос.
23 Emery
 
06.06.18
15:30
(22) > не имея доступа к закрытым модулям конфигурации, это трудно реализовать

Если будет cf-файл конфы, то могу глянуть ее закрытые модули и если их меньше 100 КБ, то может быть и декомпилировать.
24 Вафель
 
06.06.18
15:33
а резве синтаксис контроль не сможет это все проверить?