Имя: Пароль:
1C
 
Последовательность действий, вешающая 1С в режиме предприятий
,
0 toypaul
 
гуру
06.12.18
17:08
Не 100% что это повторится в любой форме, но ...

ПередЗаписью
-> ПоказатьВопрос(ОповещениеВопроса), Отказ = Истина (отказ от записи)
--> ОповещениеВопроса (обработка данных объекта)
---> Записать
----> ПередЗаписью (повторный вызов события, но уже Отказ = Ложь)

после выхода из этого события получаем крах 1С.

ладно бы зациклилось, но не зацикливается.

и как быть? как правильно Записать вызвать?
1 Полбатона
 
06.12.18
17:10
зачем записывать перед записью?
отказ от записи только в случае отказ при вопросе
2 toypaul
 
гуру
06.12.18
17:12
(1) я не записываю перед записью. я записываю в оповещении.
3 Полбатона
 
06.12.18
17:12
зачем? в оповещении надо делать только отказ
4 toypaul
 
гуру
06.12.18
17:13
алгоритм такой

1) перед записью проверяем все хорошо или нет. если плохо спрашиваем юзера, он отвечает - "сделай хорошо и запиши". я делаю хорошо и записываю.
5 toypaul
 
гуру
06.12.18
17:13
(3) какой отказ в оповещении? ты о чем вообще?
6 Полбатона
 
06.12.18
17:14
(4) шо ты умничаешь, слушай что тебе дядя говорит

    Создать в форме переменную, которая будет хранить ответ пользователя при ее закрытии,
    Если ответа получено еще не было (переменная содержит Неопределено), то в обработчике ПередЗакрытием нужно показать окно выбора пользователю, например, при помощи метода ПоказатьВопрос() и прервать закрытие формы, установив Отказ=Истина,
    В процедуре-обработчике выбора следует установить переменной результат выбора и вызвать метод Закрыть() формы,
    Если переменная содержит какое-либо значение, то это значит, что идет процесс закрытия, инициированный на предыдущем шаге, результат выбора от пользователя уже получен и обработчик ПередЗакрытием может использовать его значение.
7 PR
 
06.12.18
17:14
Что это?
8 Полбатона
 
06.12.18
17:15
Стаж: 14 лет 3 месяца 25 дней
Рукалицо
9 toypaul
 
гуру
06.12.18
17:16
(6) где я про закрытии писал? очнись
11 Очевидно
 
06.12.18
17:19
(9) я может не понимаю чего-то, но почему вы спрашиваете пользователя "Перед записью" - транзакция уже открыта ... какие диалоговые окна ?! все проверки должны происходить до этих процедур...
13 toypaul
 
гуру
06.12.18
17:20
(11) какая транзакция открыта в ПриЗаписи на клиенте в управляемой форме?
17 Вафель
 
06.12.18
17:26
(11) нет, не открыта
18 Вафель
 
06.12.18
17:26
если просто крах - то это глюк платформы. попробуй на версии посвежее/постарее
19 Полбатона
 
06.12.18
17:27
(18) это не глюк платформы, это глюк хромосомы у топикстартера
20 Вафель
 
06.12.18
17:27
но лучше свою кнопку записи сделать
21 Вафель
 
06.12.18
17:27
(19) крах платформы - это всегда глюк
22 toypaul
 
гуру
06.12.18
17:27
Может я алгоритм непонятно написал?

пользователь жмакает Записать или Провести или Провести и закрыть. дальше мы проверяем - все ли хорошо в документе. если все хорошо, ничего не делаем (отрабатывает запись). если плохо, спрашиваем пользователя - у тебя плохо, исправить? может ответить нет, тогда просто отказ от записи. может ответить исправить, тогда исправляем и записываем (с тем же режимом что он и жмакнул).

последовательность событий как я это сейчас делаю я написал. эта последовательность крэшит 1С. вот думаю как правильно Записать сделать ...

свои кнопки Записи лень писать.

(17) вот именно что транзакция позже открывается. по-моему если в форме то начиная с ПриЗаписиНаСервере.
23 Очевидно
 
06.12.18
17:28
(13) честно говоря выглядит как некий велосипед, но раз уж такой путь избран ... видимо должна быть какой-то реквизит на форме, который при записи должен хранить значения "Отказ" при записи ... при первом вызове он типа Истина, а после вопроса устанавливать в ложь ..
(17) да , я понял , я пропустил, что речь об форме, мне показалось что речь про модуль объекта ...
24 toypaul
 
гуру
06.12.18
17:28
(20) дэк не охота ... Записать, Провести, Провести и закрыть. лень :)
25 Вафель
 
06.12.18
17:29
(23) в модуле аналогично
26 Полбатона
 
06.12.18
17:29
(23) в БП 3 работает именно так.
http://catalog.mista.ru/public/372973/
27 toypaul
 
гуру
06.12.18
17:30
(23) почитай (22). где тут велосипед?

можно конечно сделать некрасиво ... по-моему как в типовых и делается. исправить, но не записывать и пусть юзер второй раз сам жмакает.

попробовать что ли через обработчик ожидания. почему-то помнится, что уже было такое.

(19) ты все еще здесь что ли? не осилил вопрос все еще?
28 Очевидно
 
06.12.18
17:34
(25) нет, в модуле не так ...
ИЗ СП про "Перед записью":
Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.
29 toypaul
 
гуру
06.12.18
17:38
придется свои кнопки рисовать ... про Провести и закрыть я не подумал ...
30 Полбатона
 
06.12.18
17:38
(29) как же я был прав.
31 Очевидно
 
06.12.18
17:40
(27) ИМХО про велосипед: Думаю проверка должна происходить в обработчике "ОбработкаПроверкиЗаполненияНаСервере" и если что-то не так - выдавать ошибку ...
если пользователь хочет "Всё исправить" у него должна быть кнопка "Всё исправить" ... чтобы это был осознанный клик ...

Но если идти по вашему пути, думаю "Своя кнопка" - будет лучше...
32 PR
 
06.12.18
17:41
(4) Перед записью спрашиваем юзера?
Паша, срочно заканчивай говнокодить, ужас же
33 Полбатона
 
06.12.18
17:43
(32) в типовой бухне такого полно
34 toypaul
 
гуру
06.12.18
17:43
(32) ну а где еще спрашивать-то? если не рисовать свои кнопки?
35 toypaul
 
гуру
06.12.18
17:44
в принципе сейчас код рабочий. нужно только одну кнопку "Провести и записать" сделать.

вопрос-то с другого начинался. какого 1С падает? вроде ничего криминального.
36 youalex
 
06.12.18
17:49
(34) рисовать свои кнопки - это один из вариантов на ИТС:
https://its.1c.ru/docs/v8nonmodal/#25
37 Полбатона
 
06.12.18
17:50
(36) автор принципиально не читает ИТС. Он выше этого де..ма
38 PR
 
06.12.18
18:21
(33) В стандартном обработчике ПередЗаписью выполняется ПоказатьВопрос?
Брешешь, я так понимаю :))
39 Ник080808
 
06.12.18
18:25
(38) в форме на клиенте разве нет?
40 Ник080808
 
06.12.18
18:26
(34) ОбработкаПроверкиЗаполненияНаСервере как говорит (31)
41 PR
 
06.12.18
18:29
(39) Форму подскажешь в типовой БП?
Любую первую попавшуюся, думаю, это несложно, раз их полно
42 Вафель
 
06.12.18
18:47
(40) как ты вопрос задашь на сервере?
43 Ник080808
 
06.12.18
19:03
(41) а, вы о БП)
44 PR заднеприводнёнкин
 
06.12.18
19:23
(41) документ Платежное поручение, Ром.
45 PR
 
06.12.18
20:07
(43) Я о (26)
46 toypaul
 
гуру
07.12.18
08:21
Я если честно так и не понял в чем говнокод вызвать ПоказатьВопрос из клиентского метода?

это вообще-то единственный вариант в случае когда юзер жмакает Закрыть в модифицированной форме и потом Записать. тут уже никакие "свои" кнопки не помогут.

а про "лучи добра" в каментах из статьи я согласен. но не согласен с тем что мы в ПередЗаписью не знаем что хотел юзер. знаем, но не все - не знаем только хотел он Закрыть форму или нет. вот если бы был такой параметр в этом событии - вообще не было бы вопросов
47 toypaul
 
гуру
07.12.18
10:11
Оказалось что причина краха 1С не в вызове второй раз метода Записать. А в параметрах этого метода.

Вот такая фигня туда передавалась

ПараметрыКонтроля = Новый Структура;
ПараметрыКонтроля.Вставить("ПараметрыЗаписи", ПараметрыКонтроля);

ПараметрыКонтроля("ЧтоТо", ЧтоТо);

Записать(ПараметрыКонтроля.ПараметрыЗаписи);

вот эта строчка вешала систему
ПараметрыКонтроля.Вставить("ПараметрыЗаписи", ПараметрыКонтроля);
48 PR
 
07.12.18
10:17
(46) Ужасно, но у 1С действительно используется такая конструкция
На что только не пойдешь ради асинхронных вызовов
49 PR
 
07.12.18
10:18
(47) ПараметрыКонтроля.Вставить("ПараметрыЗаписи", ПараметрыКонтроля)?
То есть ты в структуру в одно из значений вставляешь эту же струтуру и ждешь, что не будет рекурсии?
50 toypaul
 
гуру
07.12.18
10:36
(49) это была ошибка.

правильно было

ПараметрыКонтроля.Вставить("ПараметрыЗаписи", ПараметрыЗаписи);