Имя: Пароль:
1C
1C 7.7
v7: Зачем функция глВзятьКонтекст?
, ,
0 Shrk_V_V_V
 
13.08.18
11:04
Тут
Книга знаний: Параметр и контекст формы
такую функцию нашел

Функция глВзятьКонтекст(Конт) Экспорт
            Возврат Конт;
      КонецФункции // глВзятьКонтекст()

Зачем она, объясните пожалуйста.
1 Провинциальный 1сник
 
13.08.18
11:12
Чтобы можно было сохранить контекст в переменную.
2 Franchiser
 
гуру
13.08.18
11:14
Наверно потому что так получишь копию контекста
3 Shrk_V_V_V
 
13.08.18
11:20
Переспрошу.
Может быть эта конструкция нужна, когда вы хотите передать свой контекст в чужую форму? А чтобы просто порулить чужой формой ничего в нее не передавая можно смело писать
ОткрытьФорму("Обработка...", ЕйныйКонтекст)
4 HawkEye
 
13.08.18
11:22
(3) смело пиши....
5 Fedor-1971
 
13.08.18
11:51
(3) Всё крайне просто: Контекст записать ни куда нельзя, т.е. кон = Контекст вызовет ошибку, а через финт ушами из (0) всё пройдёт гладко.

Смелое утверждение, но не имеющее практического применения, отправить контекст текущей формы в обработку интересно (опять же, при прямой передаче тебя пошлют в или на), но получить контекст открытой обработки - смысла нет, форма уже открыта и рулить ей будет пользователь.
6 Shrk_V_V_V
 
13.08.18
12:04
>но получить контекст открытой обработки - смысла нет

Ровно эта задача передо мной и стоит. Есть обработка, на ней 8 кнопочек, пользователь их нажимает по порядку и любуется на результат. Надо открыть, нажать 8 кнопочек по порядку автоматически и закрыть. Так что мне сейчас ровно получить контекст нужно.
7 Fedor-1971
 
13.08.18
12:19
(6) Ну раз тебе нужно просто нажать кнопки.
Не ищи себе проблемы и не геморойся с контекстами.

Передаёшь в Параметр из ОткрытьФорму() строку "АвтоматомНажатьКнопкиИЗакрыть"

в форме обработки ПриОткрытии() ловишь
Если Форма.Параметр = "АвтоматомНажатьКнопкиИЗакрыть" тогда
  //жмакаем кнопки в нужном порядке
   СтатусВозврата(0); // типа запретили открывать
   Возврат;
КонецЕсли;
8 Shrk_V_V_V
 
13.08.18
12:23
Так и хотел сначала делать)) А потом, когда прочитал про контекст, решил что мне удобнее сделать не "ПриОткрытии", а через контекст чужой формы
9 Shrk_V_V_V
 
13.08.18
12:24
Гемороя вроде как нет никакого, пока не вижу во всяком случае.
10 Shrk_V_V_V
 
13.08.18
12:29
Ну и передавать в моей задаче в варианте с ПриОткрытии надо не строку, а список значений,где строка - один из элементов, поскольку еще параметры есть.
11 Fedor-1971
 
13.08.18
12:33
(8)пока не видишь, но когда тебе придётся что-то исправить (а может и не тебе), замучаешься искать где рулил контекстом данной обработки (уберут одну кнопочку и понеслась веселуха искать где мы рулили и всюду ли поправили).
Второй момент: нужно реализовать проверку факта "Форма открыта и заполнена" (открыта - тип 100, а заполнена ли?)

(10) я предложил вариант "Замкнутая система", как делать тебе виднее.
12 Shrk_V_V_V
 
13.08.18
12:35
(11) Большое спасибо за обсуждение вам и другим коллегам, стало понятнее про контексты.
13 Злопчинский
 
13.08.18
14:48
я думаю, что ВызовМоейФункции(Контекст) или открыть форму с прямым указанием Контекста - проканает.

только становится интересно, как будет возвращаться через Конекст то, что возвращается при открытии формы обработки...
14 Shrk_V_V_V
 
13.08.18
15:07
Если честно, мне так до конца и не понятно, почему вызов функции прокладки что-то меняет. Копирования контекста не происходит, контекст явно мутабельный, т.е это ссылка. Т.е эта функция не делает ничего. Разве что 1с пытается вернуть новый контекст не по адресу старого контекста, а по адресу функции. И поэтому от прокладки получается какая-то польза.
15 Злопчинский
 
13.08.18
15:11
(14) ОткрытьФорму("Отчет",Контекст,ИмяОбработки);
- в третьем параметре _возвращается_ кое-что при открытии обработки. как думаешь, что будет с системой когда обработка в чужлй Конекст попыфтается что-то принудительно запихнуть...? мне вот тоже интересно, но лень проверять
16 Fedor-1971
 
13.08.18
15:19
(13) вызов функции проканает, предать Контекст в ОткрытьФорму, нет, т.к. считается прямым сохранением контекста (по крайней мере, когда я пытался, платформа выдавала ошибку)

(14) есть платформа и она запрещает сохранять контекст формы, но есть лазейка, его можно отправить в функцию, а то что возвращает функция, как-бы уже и не контекст, а переменная

(15)потому и реализован запрет на передачу в ОткрытьФорму контекста текущей формы на уровне платформы
17 Shrk_V_V_V
 
13.08.18
15:22
(16) Шаманство))
18 Shrk_V_V_V
 
13.08.18
15:23
Если то, что возвращает функция, отличается от того, что в нее передали, тогда что-то проясняется)
19 Shrk_V_V_V
 
13.08.18
15:25
ну да, в семерке же нет явного понятия ссылки. Если документ, полученный методом "СоздатьОбъект", и тот, который живет в реквизите. Это, наверное, способ сделать из объекта ссылку.
20 Провинциальный 1сник
 
13.08.18
18:24
(16) "есть платформа и она запрещает сохранять контекст формы, но есть лазейка"
Скорее не так. Платформа не запрещает сохранять контекст. В ней просто не реализовано обращение в контексту в операторе присваивания. Литерал "Контекст" - это не псевдопеременная, а некий псевдооператор, который может быть только параметром вызова функции. И вот из-за этой недоделки и придумали костыль - присваивать через функцию.
21 Franchiser
 
гуру
13.08.18
21:39
(0) далее в статье контекст передается через список значений, не понятно зачем пишут про эту функцию

Процедура ОткрытьПример()        
    Парам = СоздатьОбъект("СписокЗначений");
    Парам.ДобавитьЗначение(Контекст,"Конт");  
    ОткрытьФорму("Обработка.Пример",Парам);
    ПримерКонт = Парам;    
КонецПроцедуры //ОткрытьПример
22 Провинциальный 1сник
 
13.08.18
22:10
(21) Ну вот значит еще один вариант костыля - запихать контекст в переменную через список значений, без создания функции. В общем, главное чтобы контекст передавался как параметр куда-то откуда его можно взять.
23 Злопчинский
 
14.08.18
01:44
(22) взять не проблема, лучше в него ничего не пихать...
24 Провинциальный 1сник
 
14.08.18
07:43
(23) Пихать не всем требуется, многим достаточно брать оттуда что-то
25 НЕА123
 
14.08.18
07:54
(19)
>способ сделать из объекта ссылку
ИМХО, это и есть ответ на (0).
Получить ссылку на Контекст.
26 ADirks
 
14.08.18
08:59
(25) единственно правильный ответ - в (20)
всё остальное, уж простите ребята, но это ваши собственные измышления, не имеющие ничего общего с реальностью.

и да, запихать в контекст что-либо у вас просто не получится.
27 Fedor-1971
 
14.08.18
10:01
(20) простыми буквами "платформа не может" - понятно 98%,
как реализовано: нет присваивания или есть функция запрета (то же присваивание, но с вызовом исключения) - это технические варианты реализации, они волнуют около 5-10% вопрошающих / утверждающих (вот, как в 26) и не имеют достоверного ответа, а остальным тех.подробности без разницы (нет, так нет, будем извращаться).

(26) Реальность вещь изменчивая. На вопрос человека, не знакомого с благами цивилизации, "Как работает факс?" можно долго рассказывать про электричество и протоколы передачи данных, а можно ответить "Дух природы взял листок из этой коробки и отнёс в другую коробку у получателя". И ты не обманул (тем более, что тонкостей всех использованных технологий можешь и сам не знать) и человеку стал более - менее понятен принцип данного способа обмена информацией. Что немаловажно, без визгов про демонов и проч. злыдней и записывания тебя в их приспешники.
  Про телефон, ещё более круто: "Зачем это Толик залез в столь маленькую коробку и говорит из неё?" (Баба яга в одной из экранизаций сказок).
28 ADirks
 
14.08.18
12:49
(27) Чтобы было понятно всем и окончательно, как раз и надо с подробностями объяснять. а то измыщлений не избежать.
Например с факсом, после такого объяснения, может возникнуть вопрос "а почему бы духу природы не перенести получателю жареную курицу?"

Что же касается данной конкретной реальности, то это именно особенность синтаксического анализатора, а не сознательный запрет. (он у 1С вообще забавный, анализатор этот)
29 Fedor-1971
 
14.08.18
13:07
(28) не может дух отнести курицу, стащит из вредности, а бумагу 100% передаст, бо она ему не нужна (даже для самой употребимой цели, поскольку дух бесплотен)

Может синтаксический анализатор, может недоработка, может запрет, а может и ошибка - суть остаётся той-же платформа не позволяет сделать операцию. Почти плакат получился "ЛЮДИ!!! примите к сведению ..."
30 ADirks
 
14.08.18
13:35
На плакате должно быть так:

ТЫ
    ПРИНЯЛ К СВЕДЕНИЮ?!!


и красноармеец с ружьём
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший