Имя: Пароль:
1C
1С v8
Эти управляемые формы
,
0 Tester
 
30.05.14
12:09
Всем привет. Кодю в основном на 7.7. Но на 8.2 уже тоже приходится. Элементарная обработка с управляемой формой:
1. Реквизит Чек типа ДокументСсылка.ЧекККМ;
2. Элемент формы ТекущийСтатус типа Чек.СтатусЧекаККМ;
3. Реквизит НовыйСтатус типа ПеречислениеСсылка.СтатусыЧековККМ.
4. Команда УстановитьНовыйСтатус с кнопкой на форме.

2 процедурки:

&НаСервере
Процедура УстановитьНовыйСтатусСервер()
    Если (НЕ Чек.Пустая()) и (НЕ НовыйСтатус.Пустая()) Тогда        
        ЧекОбъект = Документы.ЧекККМ.НайтиПоНомеру(Чек.Номер, Чек.Дата).ПолучитьОбъект();
        ПервоначальныйСтатус = ЧекОбъект.СтатусЧекаККМ;
        Если ПервоначальныйСтатус <> НовыйСтатус Тогда
            ЧекОбъект.СтатусЧекаККМ = НовыйСтатус;
            Сообщить("Статус "+ЧекОбъект+" изменен с "+ПервоначальныйСтатус+" на "+ НовыйСтатус);
            ЧекОбъект.Записать(РежимЗаписиДокумента.Запись);            
        КонецЕсли;
    КонецЕсли;    
КонецПроцедуры

&НаКлиенте
Процедура УстановитьНовыйСтатус(Команда)
    УстановитьНовыйСтатусСервер();    
КонецПроцедуры

Так вот статус чека меняется, но элемент формы ТекущийСтатус не обновляется и все равно показывает старый статус, даже если перевыбрать чек.
Какая логика работы должна быть в этой вроде бы простой ситуации?
1 vmv
 
30.05.14
12:14
ЧекОбъект = Документы.ЧекККМ.НайтиПоНомеру(Чек.Номер, Чек.Дата).ПолучитьОбъект();

модифицируемый объект ты получаешь программно, а на форме визиулизирован другой, так

Вывод какой? Сделай сам его

Действия твои какие? Подсказка-вопрос: как обновить визуализированный на форме обект знают - сп, Нуралиев, Обама, ты?
2 Borteg
 
30.05.14
12:16
(0) я так понимаю в обработке не меняется статус, а в объекте меняется?
3 Borteg
 
30.05.14
12:17
НовыйСтатус = ЧекОбъект.СтатусЧекаККМ;
4 Borteg
 
30.05.14
12:18
(3) после записать
5 Tester
 
30.05.14
12:25
(2) Ага. (3) Реквизит НовыйСтатус я выбираю на форме.
(1) На форме ДокументСсылка, получаю ДокументОбъект. Можно получать не поиском, а ЧекОбъект = Чек.ПолучитьОбъект() - ничего не меняется.
Обновить визуализированный объект не знаю как :)
6 По-читатель
 
30.05.14
12:36
(5) А если на сервере добавить

Элементы.ТекущийСтатус = НовыйСтатус;
7 Timon1405
 
30.05.14
12:44
А если на клиенте дописать Этаформа.ОбновитьОтображениеДанных();
8 alexei366
 
30.05.14
12:45
(0) ЗначениеВРеквизитФормы(), почитай в синтаксис помошнике (также есть РеквизитФормыВЗначение())
9 Tester
 
30.05.14
12:51
(6) Элемент формы ТекущийСтатус типа Чек.СтатусЧекаККМ недоступен для записи
(7) Не влияет ни на что.
(8) Замудрено слишком.
Тут проблема такая. После выполнения процедуры значение реквизита объекта меняется (в списке документов видно). Но даже если потом выбрать другой чек в обработке, а потом выбрать тот, у которого меняли статус, то все равно отображается старый статус.
Похоже как-то данные берутся из кэша и нужно как-то перечитать данные из базы...
10 Рэйв
 
30.05.14
12:51
(0)Если Статус- реквизит формы, а не объекта, то тебе придется вызов сервера сделать функцией ,вернуть новый статус на клиент и присвоить реквизиту формы.

Если статус- реквизит объекта, то(8).
11 Рэйв
 
30.05.14
12:53
(9)>> Замудрено слишком.

Чего замудренно?
Превращаешь структуру формы Объект в реальный объект на сервере с помощью РеквизитФормыВЗначение
Заполняешь что надо и возвращаешь снова в Объект формы через
ЗначениеВРеквизитФормы

Просто как табуретка.
12 Tester
 
30.05.14
13:06
(11) Спасибо, но тут проблема немного в другом.
Кто мне объяснит почему в списке документов у меня статус Архивный, но когда я даже закрываю и открываю обработку и выбираю в форме Чек, то значение элемента формы ТекущийСтатус типа Чек.СтатусЧекаККМ у меня Пробитый? o_O
13 Tester
 
30.05.14
14:08
Ааа, хелп. Статус при выборе чека в обработке правильно отображается после переоткрытия базы данных. Если сменить статус обработкой, то снова при выборе чека показывает старый статус.
Блин, зачем тогда сделана возможность отображения элементом формы не самого реквизита, а его свойств?
14 alexei366
 
30.05.14
14:15
(13) Нормально поясни, что за форма, есть ли на ней ключевой реквизит и какой он, что делаешь и с чем.
А то расплывчито (для меня по крайнемере), поэтому и непонятно что у тебя не так
15 Tester
 
30.05.14
14:26
Если можно, сброшу ссылку на картинку:
http://s006.radikal.ru/i215/1405/60/365b34e2dbfe.jpg
16 Tester
 
30.05.14
14:29
Текущий статус (реквизит) верный, т.к. выполнился при выборе чека код ТекущийСтатусРеквизит = Чек.СтатусЧекаККМ;
А вот Текущий статус (элемент формы) неверный и отображает прошлый статус пока не переоткроешь базу данных!
17 Drac0
 
30.05.14
14:30
(13) Элементы формы через точку кэшируются. Что обновить их используй ОповеститьОбИзменении()
18 Tester
 
30.05.14
14:32
(17) Вот, я этого ответа наверное и ждал!
Но нужно на сколько я понимаю писать обработчик оповещения об изменении?
19 Timon1405
 
30.05.14
14:32
Проверил, поведение платформы такое же как у ТС! плюс если на форму вытащить еще раз этот статус(в поле надписи а не ввода!), но путь к данным написать ЧекККМ.Статус.Ссылка, то обновляется правильно!
20 vmv
 
30.05.14
14:34
(13) если при закрытии и открытии формы все ок, то это говорить о том, что объект был успешно записан и при открытии формы перечитался естественно.

что я непонятного написал в (1)?

зачем столько бреда, если нужно все-го лишь перечитать данные ОБЪЕКТА в ФОРМЕ, когда эти данные были модифицированы их ОБЪЕКТА ПОЛУЧЕННОГО ПО ССЫЛКЕ.

Это разные объекты в контексте задачи, но ссылка у них одна и таже.

почему детей учат в школе пить и напрочь выбивают талант думать?

последний вопрос филофский, конеш
21 vmv
 
30.05.14
14:35
(19) правильно, такой путь перечитывает данные по записанной ссылке
22 Tester
 
30.05.14
14:36
(19) у меня статус перечисление, т.е. путькданным ЧекККМ.Статус.Ссылка невозможен.
23 SUA
 
30.05.14
14:40
ОповеститьОбИзменении()
24 SUA
 
30.05.14
14:41
обработчик не нужен
воткнуть после
УстановитьНовыйСтатусСервер();
25 DexterMorgan
 
30.05.14
14:43
Про РеквизитФормыВЗначение уже было?
26 DexterMorgan
 
30.05.14
14:45
Гыыыыы
Документы.ЧекККМ.НайтиПоНомеру(Чек.Номер, Чек.Дата)
27 vmv
 
30.05.14
14:50
(25) это очень сложно, все ищут лекий путь
28 DexterMorgan
 
30.05.14
14:51
Я щетаю что нужно добавить еще функцию

СсылкаНаЧек = Документы.ЧекККМ.НайтиПоНомеру(Чек.Номер, Чек.Дата);

СсылкаНаЧек = ПолучитьЧекККМ(СсылкаНаЧек);

Функция ПолучитьЧекККМ(СсылкаНаЧек)

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЧекККМ.Ссылка
        |ИЗ
        |    Документ.ЧекККМ КАК ЧекККМ
        |ГДЕ
        |    ЧекККМ.Ссылка = &Ссылка";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();

    Выборка.Следующий();
        Возврат Выборка.Ссылка;
КонецФункции
29 Tester
 
30.05.14
15:04
(19) Ничего не меняется, если сменить с поле ввода на поле надписи и с ЧекККМ.Статус на ЧекККМ.Статус.Ссылка!
(24) Ща попробую.
(26) Очень смешно...
(20) Меня в школе пить не учили. Вы пишете фразу: "если при закрытии и открытии формы все ок, то это говорить о том, что объект был успешно записан и при открытии формы перечитался естественно. ". Где я написал, что у меня при закрытии и открытии формы все ок? Я писал, что у меня все ок при закрытии и открытии программы (базы)!
30 Tester
 
30.05.14
15:31
В общем Drac0 (17) и SUA (23) были правы, за что им огромное спасибо! После оповещения об изменении все работает. Хотя мне кажется, что скоро на C++ будет проще что-то написать, чем на 1С, но это уже другая тема.
Остальным тоже спасибо за советы! А некоторым пожелаю быть добрее ;)
31 DexterMorgan
 
30.05.14
15:32
(29) Ну объясни тада мне чем "Документы.ЧекККМ.НайтиПоНомеру(Чек.Номер, Чек.Дата)" отличается от "Чек"?
32 Tester
 
30.05.14
15:37
(31) Да это я писал, когда пытался разными способами получать объект, пробовал разные варианты. Такой код мне самому не нравится, особенно когда напарница по 1С часто меня подбешивает еще более крутыми ухищрениями :)
Раз уж так ЧекОбъект = Чек.ПолучитьОбъект() норм прокатит?
33 vmv
 
30.05.14
15:41
(32) познакомлюсь с напарницей, я думаю мы решим твою проблему посиделками за чашкой кофе, только без сахара.
34 hhhh
 
30.05.14
16:11
(32) Чек.ПолучитьОбъект()  - получает другой объект, не этот. Они по виду похожи. 2 объекта у тебя будет.
35 Tester
 
30.05.14
16:19
Кстати, неужели нужно было выносить на совесть разработчиков необходимость в оповещении об изменении объектов или типов?
Получается я меняю обработкой какое-нить значение, потом открываю другую обработку и вижу данные до изменения! Потом переоткрываю базу и вижу правильные значения. Или я что-то не понимаю или это явный источник ошибок.
(34) та понятно, спс.