Имя: Пароль:
1C
1C 7.7
v7: Баг 7.7 не сохраняется реквизит?
0 AlexSTAL
 
04.08.15
07:54
Справочник, редактирование в списке, есть реквизит "ДатаРедактирования", которого нет на форме.
Если в процедуре ПриЗаписи формы списка присваивать значение ТекущаяДата, то всё ок, если вынести в глобальную процедуру

Процедура ПриЗаписи(СписокПериодРекв)
    Если глПрисвоитьОбщиеРеквизитыСправочника("ЗаписьЭлемента", Контекст) = 0 Тогда СтатусВозврата(0); Возврат; КонецЕсли;
КонецПроцедуры

Функция глПрисвоитьОбщиеРеквизитыСправочника(Вид, Конт) Экспорт
    Если Метаданные.Справочник(Конт.Вид()).Реквизит("ДатаРедактирования").Выбран() <> 0 Тогда
        Конт.ДатаРедактирования = ТекущаяДата();
        Конт.УстановитьАтрибут("ДатаРедактирования", ТекущаяДата()); // по всякому
    КонецЕсли;
    Возврат 1;
КонецФункции

то в отладчике значение меняется, а в результате не сохраняется!

Если добавить реквизит на форму списка - то значение начинает сохранятся!

Что это????
1 AlexSTAL
 
04.08.15
08:05
Вот выгрузка конфы
https://yadi.sk/d/JvFWzsmFiFigg
там есть отчёт, который выводит этот реквизит для проверки
2 AlexSTAL
 
04.08.15
08:05
проверьте пожалуйста у себя, коллеги
3 1Сергей
 
04.08.15
08:16
Для формы списка "Контекст" - это не контекст элемента справочника, ИМХО
4 AlexSTAL
 
04.08.15
08:28
(3) Хм... но реквизит то устанавливается!
в отладчике он в самой форме списка установлен

Процедура ПриЗаписи(СписокПериодРекв)
    Если глПрисвоитьОбщиеРеквизитыСправочника("ЗаписьЭлемента", Контекст) = 0 Тогда СтатусВозврата(0); Возврат; КонецЕсли;
    Сообщить(ДатаРедактирования);
КонецПроцедуры

возвращает правильное значение
5 AlexSTAL
 
04.08.15
08:40
То же самое, если поставить "Редактировать в диалоге" - работает без проблем
6 PuhUfa
 
04.08.15
08:40
(0) Помести его на форму раз 1С так хочет и поставь галочки невидимый, недоступный и т.п.
7 AlexSTAL
 
04.08.15
08:41
(6) Да, так и сделал, но это же не верно, и про это нужно помнить! При чём, как я написал, для Редактировать в диалоге всё корректно работает
8 PuhUfa
 
04.08.15
08:47
(7) Есть подозрение, что 1С пишет именно строку, точнее данные которые в ней есть. Нет реквизита в строке... на нет и суда нет...
9 palpetrovich
 
04.08.15
09:07
(0 ) может дело в том, что это именно Контекст Формы. Нет реквизита на форме - нет его и в контексте
10 HawkEye
 
04.08.15
09:09
(0)
поместил на форму вызов функции:

Функция лкНаформе()
    Сообщить("" + Форма.ТекущаяКолонка() + " " + ТекущийЭлемент().ДатаРедактирования);
    Возврат "";
КонецФункции

сообщает в окне:
Код 04.08.15
Код   .  .  
Код   .  .  
Наименование   .  .  
Наименование 04.08.15
Наименование 04.08.15

т.е. реквизит записывается...
11 HawkEye
 
04.08.15
09:11
(0) ну и конечно

Конт.ДатаРедактирования = ТекущаяДата();  
Конт.УстановитьАтрибут("ДатаРедактирования", ТекущаяДата());

надо что-то одно оставить...
12 AlexSTAL
 
04.08.15
09:33
(10) скиньте конфу мне, у меня не выходит
13 AlexSTAL
 
04.08.15
09:33
(11) это я пробовал и так и так
14 AlexSTAL
 
04.08.15
09:40
(9) а как же всё тоже самое с Диалоговыми формами? Там нет этого реквизита, но всё работает
15 HawkEye
 
04.08.15
12:01
(12) так твоя конфа, я поменял только:
1. закоментировал в глобальнике УстановитьАтрибут()
2. кинул на форму функцию, текст функции в (10)..

все.
16 HawkEye
 
04.08.15
12:04
открыл форму
Код 04.08.15  
нажал INS
Код 04.08.15  
Код   .  .  
Нажал Enter в коде
Код   .  .  
Нажал Enter в наименовании
Наименование   .  .  
Наименование 04.08.15
Наименование 04.08.15
17 AlexSTAL
 
04.08.15
12:38
(16) Это ты добавляешь строку, а попробуй существующую отредактировать
18 AlexSTAL
 
04.08.15
12:39
там, где ДатаРедактирования пустая
19 Alexor
 
04.08.15
12:49
На форме списка надо

Контекст заменить на ТекущийЭлемент()
Т.к. Контекст относиться к Форме, а не выбранному элементу.
20 Alexor
 
04.08.15
12:49
+19 т.е.

Процедура ПриЗаписи(СписокПериодРекв)
    Если глПрисвоитьОбщиеРеквизитыСправочника("ЗаписьЭлемента", ТекущийЭлемент()) = 0 Тогда СтатусВозврата(0); Возврат; КонецЕсли;
КонецПроцедуры
21 AlexSTAL
 
04.08.15
12:57
(19) На всякий случай я и так пробовал
Не взлетает!

А вообще ТекущийЭлемент() - это доступ к значению до сохранения элемента справочника.
Т.е. ДатаРедактирования и ТекущийЭлемент().ДатаРедактирования - реквизит текущий и до записи.
22 AlexSTAL
 
04.08.15
12:58
(19) +В отладчике в Конт есть реквизит ДатаРедактирования, хотя на форме его нет!
23 AlexSTAL
 
04.08.15
12:59
(All) Вы попробуйте пожалуйста сами у себя, конфа 5 байт
В режиме редактирования старой строки, не добавления новой

P.S. Ещё один баг выловил на этой же почве
24 Злопчинский
 
04.08.15
13:08
нет там багов.
есть непонимание.
соответственно преждевременно свое непонимание трактовать как баги платформы
25 GreyK
 
04.08.15
13:09
(0) Познай секретную процедуру ГлВзятьКонтекст(Конт), применяемую во всех типовых.
26 Mikeware
 
04.08.15
13:09
(24) "Ошибка не в программе, ошибка в ДНК"©
27 Alexor
 
04.08.15
13:21
(25) Не поможет.
28 Alexor
 
04.08.15
13:22
(23) Единственный вариант.

Разместить в списке справочника реквизит ДатаРедактирования и сделать ее скрытой.
Тогда работает.
29 Pit0n_08
 
04.08.15
13:33
А что, в глобальных процедурах создавать Объект уже не нужно? Старею, видимо...
30 trad
 
04.08.15
13:44
(24) (26)
че накинулись то, баг есть - подтверждаю
31 AlexSTAL
 
04.08.15
13:48
(24) по подробнее, вот скрин:
https://yadi.sk/i/Pm3ljsZFiG7wJ
32 AlexSTAL
 
04.08.15
13:49
(28) да, именно так сейчас пришлось делать, так работает
33 AlexSTAL
 
04.08.15
13:49
(29) какой объект? Контекст передаётся, не работает только в форме списка, только при отсутствующем реквизите
34 AlexSTAL
 
04.08.15
13:50
(30) спасибо, что поддерживаете
35 Злопчинский
 
04.08.15
13:54
(32) и без этого можно было обойтись.
36 Злопчинский
 
04.08.15
13:58
(32) а попробовать:
1. убрать реквизит из формы списка
2. СпрЧ = СоздатьОбъект("Справочник.Ч");
3. СпрЧ.НайтиЭлемент(ТекущийЭлемент());
4. СпрЧ.ДатаРедактирования = КакаяТоДата;
5. СпрЧ.Записать();
37 Pit0n_08
 
04.08.15
13:59
(33) Естественно. Передаёте контекст элемента формы списка у которого нет реквизита "ДатаИзменения".
Если хочется изменить в глобальной процедуре, я бы делал через СоздатьОбъект() и НайтиЭлемент()
38 AlexSTAL
 
04.08.15
14:00
(36) Как можно перезаписать заблокированный (в режиме редактирования) элемент???
39 AlexSTAL
 
04.08.15
14:01
(37) Как это нет?
а это что, барабашки?
https://yadi.sk/i/Pm3ljsZFiG7wJ
40 AlexSTAL
 
04.08.15
14:03
Ещё раз, товарищи. При работе с формой элемента, где НЕТ этого реквизита, всё работает. Так же передаётся контекст ФОРМЫ. Ну что вы, читать не умеете что ли?
41 AlexSTAL
 
04.08.15
14:04
С 2000 года работаю по совместительству (невольному) бета-тестером...
42 Злопчинский
 
04.08.15
14:04
(40) Еще раз, товарищ. в (0) идет речь о форм есписка. Откуда внезапно вылез форма элемента?
43 AlexSTAL
 
04.08.15
14:04
(37) +а при создании элемента нового всё прекрасно работает
это наверное фича такая. Реквизита нет, но он есть. Браво
44 Злопчинский
 
04.08.15
14:05
(40) В форме элемента контекст формы (упрощенно) совпадает с элементом. в Форме списка - контекст формы - к какому элементу относится? ни к какому.
45 AlexSTAL
 
04.08.15
14:06
(42) В результате экспериментов.
В форме списка при создании нового элемента работает, а при редактировании существующего не работает.

Не ужели это не убийственный неопровержимый аргумент?
46 Pit0n_08
 
04.08.15
14:06
Просто в целом по ТС - непонятно для чего тогда целый ЖР с отбором по объекту существует?
47 AlexSTAL
 
04.08.15
14:06
(44) см 45
48 AlexSTAL
 
04.08.15
14:07
(46) зачем мне отбирать этот объект, если он выбран, заблокирован и находится в режиме редактирования??
49 hhhh
 
04.08.15
14:09
(48) но Конт не относиттся к этому объекту. Хоть вы его 10 раз заблокируйте.

Поэтому Конт.ДатаРедактирования тоже не относится к этому объекту.
50 Ёпрст
 
04.08.15
14:09
(0)
https://cloud.mail.ru/public/FoGQ/JF4v5PhNf

на вот, занимайся
51 Ёпрст
 
04.08.15
14:09
И по х, какой там элемент, новый/старый..
52 AlexSTAL
 
04.08.15
14:13
(50) И? реквизит на форме, передаётся 1 параметр...
не мой случай, обходные пути всегда находятся....
Мне нужно менять 50 реквизитов, предлагается в процедуре 50 параметров вставлять?
53 AlexSTAL
 
04.08.15
14:13
(49) при создании нового относится, при редактировании не относится. Смешно
54 Злопчинский
 
04.08.15
14:14
(51) Неинтересно... ибо есть колонкас реквизитом
55 Злопчинский
 
04.08.15
14:16
(53) ну вот есть у тебя форма списка. ДЛЯ ВИЗУАЛЬНОГО осмотра. Элемент справочника "весит" допустим 10 мб. на списке у тебя 20 строк. и что - системе тянуть в кеш 200 МБ при каждом листании? нафейхоа?
56 AlexSTAL
 
04.08.15
14:17
Off: нашёл схожий баг, описать полностью его не могу, потому что не воспроизвёл на демо базе из-за недостатка времени и нахождении простой затычки

Суть в чём, обновляю существующий документ из файла. Все реквизиты устанавливаю через
Док.УстановитьАтрибут()
Так он не обновляется!
Если прописать хоть один реквизит
Док.ИмяРеквизита = Док.ИмяРеквизита;
то всё начинает работать как часы!
57 AlexSTAL
 
04.08.15
14:18
(55) Мы говорим про строку, которая редактируется
С помощью отладчика легко выяснить, что все не существующие на форме реквизиты подтягиваются ПриНачалеРедактированияСтроки
58 Злопчинский
 
04.08.15
14:18
(52) рецепт тебе дали: позиционируйся на текущем объекте. Тогда будут доступны все реквизиты
59 Злопчинский
 
04.08.15
14:20
(57) имхается что они доступны только для чтения...
???
60 Злопчинский
 
04.08.15
14:20
(56) Ты сильный шаман, однако! ;-)
61 AlexSTAL
 
04.08.15
14:21
(58) Какой рецепт??? Вы бы хоть попробовали....
Объект блокируется, это не возможно...

Единственный вариант - это реквизит на форме, скрытый
62 AlexSTAL
 
04.08.15
14:21
(60) Я просто делаю зачастую не стандартные вещи и всегда ищу баги
63 Pit0n_08
 
04.08.15
14:22
+(46), (48) речь о журнале регистрации. Если речь в целом о выявлении багов в платформе, то поговорить и сформировать список для общеогуманитарных целей полезно. Использовать такую поделку в рабочей базе я бы не стал ни в коем случае - "ни к чему плодить лишние сущности".
64 AlexSTAL
 
04.08.15
14:22
(59) Нифига, значение правильное возвращается
65 AlexSTAL
 
04.08.15
14:24
(63) Что не так делаю? Всё по уставу

Намного легче сказать, что ошибка в ДНК, чем признать существование бага
66 AlexSTAL
 
04.08.15
14:27
ладно, камрады, спасибо за участие
будут затычки стоять
67 Pit0n_08
 
04.08.15
14:28
(65) в журнале регистрации пишется дата, время и имя пользователя, изменившего элемент справочника - зачем изобретать велосипед?
68 AlexSTAL
 
04.08.15
14:30
(67) абстрагируйтесь от названия реквизита....
69 Злопчинский
 
04.08.15
14:34
(64) было бы странно если при чтении возвращалось бы неправильное значение...
70 Злопчинский
 
04.08.15
14:35
(61) в конце процедуры ПриЗаписи сгенери внешнее событие и после окончания транзакции записи - делай с элементом что хочешь
71 Злопчинский
 
04.08.15
14:36
я, например, в списке редактирую только самые простые справочники. все остальное только через форму элемента.
72 AlexSTAL
 
04.08.15
14:55
(69) я устал уже писать одно и тоже, вы не правы, проверять не хотите
(70), (71) Всё что вы пишите - это обходные пути, к делу не относятся
73 Ёпрст
 
04.08.15
15:01
Утомил, на вот, занимайся

https://cloud.mail.ru/public/K6dw/BAaiZsyDH
74 Ёпрст
 
04.08.15
15:02
Хоть все реквизиты меняй
75 Злопчинский
 
04.08.15
15:02
(72) вы задолбали извините за выражение ;-)
какое при чтении возвращается "правильное" значение?
хочеь прочитать значение из базы а не из кэша читай через
конт.ТекущийЭлемент().КакойТоРеквизит
76 Ёпрст
 
04.08.15
15:03
(75) Чебур, это же не наш метод
:)
77 HawkEye
 
04.08.15
15:06
(17) ты прав однако... я бы переделал на форму элемента
78 Злопчинский
 
04.08.15
15:07
кстати на рисунке автора https://yadi.sk/i/Pm3ljsZFiG7wJ
неудивительно что ДатаРедактирования = пусто. так как оператор присвоения еще не выполнился... ;-)
79 AlexSTAL
 
04.08.15
15:16
(78) млин... ну выложу я ещё 10 скринов, до, после, во время

на вас это не подействует
80 AlexSTAL
 
04.08.15
15:17
(77) да, или так, или скрытый реквизит
81 Ёпрст
 
04.08.15
15:39
(80) Чего, (73) не осилил ?
82 trad
 
04.08.15
15:53
(81) ну изврат же, а
83 HawkEye
 
04.08.15
15:55
(81) для новых работает, для существующих - то-же самое.. меняет только то, что показано на форме...
84 HawkEye
 
04.08.15
15:56
+83 т.е. по сути все то-же самое, что и в (1).. хотя подход и интересный
85 Ёпрст
 
04.08.15
16:00
(82) И ? Что это меняет ?
:))

(83) Че курим ?
86 Ёпрст
 
04.08.15
16:01
+85 что напишешь в глобальнике, то и присвоит, хоть для новый, хоть для старых.
87 trad
 
04.08.15
16:06
(85) ничего не меняет - костыль для обхода бага, как и добавление скрытого реквизита в МЧ. При этом последнее - менее ужасный изврат.
88 Злопчинский
 
04.08.15
16:09
(82) почему, вполне себе универсально
89 Злопчинский
 
04.08.15
16:10
(86) тут интересно почему твой код присваивает (сам не проверял, надеюсь на гуру), а вот как описано в (0) - нет...
90 Злопчинский
 
04.08.15
16:12
описанное в (0) - не работает потому что общаеться с элементом через непонятный контекст, а с шаблоном - напрямую к реквизитам - то есть к реквизитам редактируемой строки
???
91 Ёпрст
 
04.08.15
16:12
(87) Сто-стоп-стоп.
Нет никакого СКРЫТОГО реквизита в МЧ.
92 Ёпрст
 
04.08.15
16:14
Если че, в глобальнике доступны ВСЕ реквизиты, более того, ВСЕ переменные модуля формы.
93 Злопчинский
 
04.08.15
16:14
(91) ну так он про это и говорит. что шаблон, что добавление скрытого реквизита = костыль
94 Ёпрст
 
04.08.15
16:14
И... это баян древнейший
95 Ёпрст
 
04.08.15
16:15
(93) Какой скрытый реквизит ?
ЕГО НЕТ!"
96 Ёпрст
 
04.08.15
16:16
А всё, проитал, что там trad ответил.
Не, Шаблон, вполне себе универсальное средство.
97 Ёпрст
 
04.08.15
16:16
и. это лучше , чем лепить реквизиты на форму, как в первом случае.
98 Злопчинский
 
04.08.15
16:16
(95) я в курске.
1. твой шаблон
2. чье-то предложение добавить скрытый реквизит
- типа это костыли.
99 Злопчинский
 
04.08.15
16:16
(97) почему?
100 Злопчинский
 
04.08.15
16:17
можно сказать, что это не баг, а фича.
как и http://www.forum.mista.ru/topic.php?upd&id=749211
101 Ёпрст
 
04.08.15
16:22
(99) форма быстрее работает
102 Ёпрст
 
04.08.15
16:23
ведь в форме списка нет лишних реквизитов.
А если их все нужно обновлять ?
Ну не лепить же все в форму списка ?
А в шаблоне - пожалуйста, перечисляй через метаданные и присваивай шо хошь и когда хошь
103 HawkEye
 
04.08.15
20:10
(85) в отличии от тебя, ничего..
что в (0) что у тебя - выполняется абсолютно идентично, за исключением твоего ЧСВ с наименованием... к чему тут слюной брызгать?
104 ДенисЧ
 
04.08.15
20:16
Сидели в ветке два олдфага и трясли поседевшими )))
105 Злопчинский
 
04.08.15
22:45
(104)  не
Олдскулеров здесь больше чем два