Имя: Пароль:
1C
 
Можно ли изменить контекст у функции Вычислить()?
0 DTX 4th
 
08.08.18
12:38
Дано:

Стр = "СубконтоДт2.Подразделение";
Запись = ...; // У Запись есть реквизит СубконтоДт2, а там есть Подразделение

Хочу:

Знач = Вычислить(Стр, Запись);


Да, в начало Стр можно добавить "Запись.", но Стр может быть сложнее:
"Функ(СубконтоДт2.Подразделение)"
1 Вафель
 
08.08.18
12:39
делай через выполнить. контекст пишай туда же
2 DTX 4th
 
08.08.18
12:49
(1) А как в выполнить контекст подменить?
3 catena
 
08.08.18
12:50
//Эта функция позволяет в любой момент выполнить любой код на языке 1С над любыми данными, переданными ей.
//Примеры:
//= Сообщает некий текст
//Ду("Сообщить(1)")
//
//= Присваивает переменной Отказ  значение истина
//Ду("П=истина", Отказ)
//
//= Закрывает форму
//Ду("П.Закрыть()", ЭтаФорма)
//
//= В отладчике нельзя вызвать процедуру, но можно это сделать через ДУ:
//Ду("ЗавершитьРаботуСистемы()");
Функция Ду(Код, П=Неопределено, П1=Неопределено,  П2=Неопределено, П3=Неопределено, П4=Неопределено)  Экспорт
    Перем Р;
    Выполнить(Код);
    Возврат Р;
КонецФункции
4 Вафель
 
08.08.18
12:51
(2) текстом попределяешь все  свои переменные
А = Значение1
Б = Значение2
Результат = А + Б
5 DTX 4th
 
08.08.18
13:05
(3) Немного не то. Потому что

(4) У меня эта строка задаётся в режиме предприятия ("СубконтоДт2.Подразделение")

На примете пока только регулярки. VBScript могёт в (?R)?
6 Вафель
 
08.08.18
13:06
(5) ну так тебе просто нужно вычислить

Вычслить("Запись." + МояСтрока)
7 DTX 4th
 
08.08.18
13:09
(6) В (0) же написал, почему так не прокатит. Строка может быть такой:

МояСтрока = "Функ(СубконтоДт2.Подразделение)";
МояСтрока = "Функ(123)+СубконтоДт2.Подразделение";

И т.д.
8 Вафель
 
08.08.18
13:12
(7) тогда не понятно что же ты такое хочешь вычислить?
9 Вафель
 
08.08.18
13:13
Ну или определи перед процедурой

СубконтоДт2 = Запись.СубконтоДт2
10 DTX 4th
 
08.08.18
13:28
(8) Строку с контекстом переменной же :|

(9) Думал об этом, но в Выполнить() нельзя переменную объявить

В итоге во так вроде получается:

Процедура ОсновныеДействияФормыТест(Кнопка)
    Перем Рез;
    выполнить("А = 1;Сообщить(А);Рез = А;");
    Сообщить(Рез+1);
КонецПроцедуры

Ну и программно обойти все свой записи.

Спасибо (:
11 DTX 4th
 
08.08.18
13:28
свойства*
12 catena
 
08.08.18
13:29
(7)ДУ("Функ(П.Подразделение)",Запись.СубконтоДт2)
13 DTX 4th
 
08.08.18
13:30
(12) Там может быть всё что угодно, а не только СубконтоДт2
14 Вафель
 
08.08.18
13:32
(13) ну все переменные контекста то заренее известны, а там (4)
15 DTX 4th
 
08.08.18
13:37
(14) По большому счету, нет. В конфу могут добавить новый реквизит, например. Но из-за оптимизационный расчетов решил так и сделать.
16 Вафель
 
08.08.18
13:40
(15) ну бери реквизиты из метаданных тогда
17 DTX 4th
 
08.08.18
13:42
(16) Об этом, собственно, и шла речь в (10) (: