1с отказ истина ошибка

Отказ = Истина или ВызватьИсключение?

Я
   бомболюк

24.11.14 — 10:41

Всего мнений: 11

Всем привет!

Как Вы думаете, что правильнее писать, например, в ОбработкаПроведения, если документ проводить нельзя?

   Kuein

1 — 24.11.14 — 10:42

Отказ = Истина

   Wobland

2 — 24.11.14 — 10:43

а что, если нельзя, то это сразу исключение?

   Ник второй

3 — 24.11.14 — 10:44

только не «сообщить», а конечно должно быть Предупреждение. )

   Любопытная

4 — 24.11.14 — 10:44

А разве ВызватьИсключение не к Попытка-Исключение относится?

   бомболюк

5 — 24.11.14 — 10:45

(4) нет

   Wobland

6 — 24.11.14 — 10:45

(4) нет. иногда удобно открывать незапущенный конфигуратор ;)

   бомболюк

7 — 24.11.14 — 10:46

(2) ну вроде как да.

   Поpyчик-4

8 — 24.11.14 — 10:47

Посмотреть в типовых и поступать, как специалисты. Им там виднее.

   Kuein

9 — 24.11.14 — 10:48

(3) Эммм… Особенно это круто выглядит в транзакции на несколько документов…

   Любопытная

10 — 24.11.14 — 10:49

(5) , (6) все равно мне кажется — это неправильно.

   бомболюк

11 — 24.11.14 — 10:50

(8) В типовых первый вариант.

   Wobland

12 — 24.11.14 — 10:51

(10) да нормально ;)

Если к=40 Тогда

  ВызватьИсключение «Нельзя делить на 40!»

   Любопытная

13 — 24.11.14 — 10:53

(12) Исключение это обработка исключительной ситуации, когда выполнение кода может завершиться ошибкой исполнения. Это как микроскопом гвозди забивать, вам не кажется?

   бомболюк

14 — 24.11.14 — 10:54

Вот мое мнение, интересно, что Вы думаете:

при использовании первого варианта могут возникнуть ситуации, когда мы не сможем узнать о причине того, что документ не проведен, например, при создании документа из модуля веб-сервиса. В этом случае причина, которую мы бы выводили в Сообщить(«Док. не проведен по причине…») просто потеряется. А если использовать второй вариант мы всегда можем поднять сообщение об ошибке на нужный уровень и правильно его обработать.

2. ВызватьИсключение «Док. не проведен: …»

   Wobland

15 — 24.11.14 — 10:55

(13) хм.. логично

   Любопытная

16 — 24.11.14 — 10:56

(14) почему потеряется?

   Wobland

17 — 24.11.14 — 10:58

(14) а я когда-то в логи выводил все сообщить. потом утром читал

   бомболюк

18 — 24.11.14 — 11:00

(16) конечно потеряется. вызов метода веб-сервиса просто завершится ошибкой, описание будет что то типа «документ не записан.»

   бомболюк

19 — 24.11.14 — 11:01

+(18) а то что мы выводим в Сообщить просто канет хз куда.

   Drac0

20 — 24.11.14 — 11:01

(13) Исключение выгодно использовать ,когда ошибку надо реально обработать. Например, необходимо внести информацию по ошибке и контексту в таблицу и по окончании процесса вывести ее пользователю.

   Лефмихалыч

21 — 24.11.14 — 11:03

(0) Если документ проводить нельзя, то сообщение должно быть в обработке проверки заполнения, а не в обработке проведения.

Ошибки (которые прерывают транзакцию) должны сообщаться путем ВызватьИсключение. Чтобы система правильно все понимала и, например, в журнале регистрации отразила

   Drac0

22 — 24.11.14 — 11:03

(19) Созданные, но не выведенные пользователю можно собрать через ПолучитьСообщенияПользователю()

   Drac0

23 — 24.11.14 — 11:05

(14) У ВызватьИсключение есть очень большой минус для групповой обработки — ломает транзакцию. Вместо того, чтобы записать/обработать 100500 элементов одной транзакцией приходится без нее в этом случае делать.

   бомболюк

24 — 24.11.14 — 11:05

(21) ну то есть я правильно понимаю: вы тоже считаете, что Отказ лучше не использовать?

   Kamas

25 — 24.11.14 — 11:05

все зависит от случая …

мне больше нравится. Хотя я уверен что это не правильно (Есть такое мнение что все что мне нравится не правильно)

2. ВызватьИсключение «Док. не проведен: …»

   Лефмихалыч

26 — 24.11.14 — 11:06

(24) я считаю, что об исключительных ситуациях надо сообщать путем ВызватьИсключение

   Kamas

27 — 24.11.14 — 11:07

(23) в одной транзакции нужно обрабатывать только те данные в верность которых ты уверен на 1000 процентов.

   бомболюк

28 — 24.11.14 — 11:08

(26) если мы проводим документ, а он не проводится (в результате проверок внутри обработки проведения) — это разве не исключительная ситуация?

   tridog

29 — 24.11.14 — 11:09

(23) Скажите, а для чего, как Вам кажется, нужна транзакция?

   Drac0

30 — 24.11.14 — 11:10

(29) Целостность данных, конечно же. Но как побочный результат, можно слегка оптимизировать работу с БД.

   бомболюк

31 — 24.11.14 — 11:12

Отказ = Истина; тоже генерирует исключение, только описание ошибки будет совсем не информативное: «Ошибка при вызове метода контекста (Записать): Операция не выполнена!»

   StaticUnsafe

32 — 24.11.14 — 11:44

(3) модальные вызовы в транзакции. за такое руки отрубают вместе с головой.

   DrZombi

33 — 24.11.14 — 11:48

(14) Как напишешь, то и получаешь :)

   DrZombi

34 — 24.11.14 — 11:49

(17) Судя по приставке «Когда-то», ты перестал заниматься пустым :)

   DrZombi

35 — 24.11.14 — 11:50

(18) Пиши свои ошибки в Доп.Свойство Объекта, потом анализируй. Все в твоих руках, если они есть :)

   бомболюк

36 — 24.11.14 — 11:53

(35) в чем плюсы?

   DrZombi

37 — 24.11.14 — 11:54

(36) Что плюсы? Судя по вопросам, «Ты хочешь и Рыбку съесть и на стуле посидеть». Ты программист или Дворник?

«Будь мужиком, напиши свой обработчик ошибок!»   :)

   бомболюк

38 — 24.11.14 — 11:56

(37) ну вообще то объекто в моем примере создается на стороне веб-сервиса, а сообщение об ошибке надо получать на клиенте, и каким боком мне тут помогут доп. свойства объекта?

   DrZombi

39 — 24.11.14 — 11:56

+(36) Ошибка «Не заполнен реквизит <Реквизит № 1>» Может быть всего лишь верхушкой Айзберга.

А ошибок может быть куева туча.



Но а ты со своим Исключением получишь только одну, да и то мало внятную, если напишешь в ошибку весь талмуд всех ошибок :)

   DrZombi

40 — 24.11.14 — 11:57

(38) Объект в любом случае создается на сервере 1С :)

А кто дал команду, это уже дело пятое :)

   бомболюк

41 — 24.11.14 — 11:58

(39) при использовании вариант 1 я и одной ошибки не получаю.

   ukolabrother

42 — 24.11.14 — 11:59

Вызвать исключение тебе потом не даст проводить «роботом», будешь искать где же это я накосячил.

1. Отказ = Истина; Сообщить(«Док. не проведен: …»

   DrZombi

43 — 24.11.14 — 12:00

(41) Читай (37)… И программируй :)

Если лень, то пиши через Исключение.

Если энтузиаст своего дела, то придумай свой велосипед :)



Предлагаю написать по человечески в зависимости от потребности детализации ошибка на стороне Веб-Клиента :)

   tridog

44 — 24.11.14 — 12:03

(30) Так какая в опу может быть целостность данных, если одна из операций не выполнена?

   Drac0

45 — 24.11.14 — 12:05

(44) Какое в опу нарушение целостности ,когда не обновлен/создан один из 100500 несвязанных элементов? А нагрузка на БД, если делать одной транзакцией будет меньше и отработает шустрее.

   DrZombi

46 — 24.11.14 — 12:07

(44) Есть легенда, что на определенных объемах информации, через транзакцию быстрее пишутся данные.

Но есть и другая версия, о том, что при этой транзакции все курят бамбук. А так же если превысить определенный объем информации в транзакционном пакете, то скорость упадет куда больше ,чем простая запись :)

   бомболюк

47 — 24.11.14 — 12:08

(45) связанные они или нет — неважно. к транзакционным системам есть требование атомарности, то есть или все изменения прошли, или ни одно.

   бомболюк

48 — 24.11.14 — 12:09

«не даст проводить «роботом»» — это что за зверь?

«будешь искать где же это я накосячил» — я и искал, пока у меня не было нормальных сообщений об ошибках, потом сразу стало гораздо легче.

   tridog

49 — 24.11.14 — 12:13

(45) Т.е. ты все-таки не знаешь, для чего нужны транзакции?

   tridog

50 — 24.11.14 — 12:14

(46) С учетом того, сколько времени отнимает встроенный язык, трансляция запросов и т.д. — кто-то правда задрачивает на оверхед от транзакционной машины в СУБД?

   фобка

51 — 24.11.14 — 12:20

Отказ это не анахронизм, это именно тот параметр который предназначен для этой ситуации

1. Отказ = Истина; Сообщить(«Док. не проведен: …»

   бомболюк

52 — 24.11.14 — 12:24

(51) чем хуже второй вариант (про его выгоды читаем 14)?

   Serginio1

53 — 24.11.14 — 12:30

(52) Есть запись в журнал регистрации.

Опять же во многих случаях желательно проверить все ветки алгоритма. Вызов исключения приостанавливает выполнение.

   бомболюк

54 — 24.11.14 — 12:34

(53) Отказ = Истина это то же самое исключение.

   DrZombi

55 — 24.11.14 — 12:35

(50) Есть такие :)

   бомболюк

56 — 24.11.14 — 12:35

+(53) «Вызов исключения приостанавливает выполнение» — смотря как его обрабатывать.

   DrZombi

57 — 24.11.14 — 12:36

(54) Конечно, это уже поставка от 1С, т.е. если документ не провелся, то получи исключение. Все нормально и логично. Я бы сказал ожидаемо :)

   lllllllllllllll

58 — 24.11.14 — 12:38

Если доступен флаг Отказ, то стараюсь нужно использовать его. Для случаев, когда Отказ недоступен можно использовать ВызватьИсключение.

+ установка Отказ в Истина не прерывает исполнения процедуры/функции.

1. Отказ = Истина; Сообщить(«Док. не проведен: …»

   бомболюк

59 — 24.11.14 — 12:43

(58) какой смысл в дальнейшем выполнении процедуры после того, как Отказ встал в Истина (транзакция полюбому отменяется)? Если только он в дальнейшем опять изменится на Ложь. Такое где нибудь применяется? В типовых точно нет.

   lllllllllllllll

60 — 24.11.14 — 12:47

(59) Отказ отработает поле завершения процедуры. Отказ можно установить в Истина, но не прерывать выполнения процедуры, например выполнить все проверки и сразу сообщить об их результатах пользователю, а не выдавать сообщения по частям.

   tridog

61 — 24.11.14 — 12:50

(55) Господи, дай мозгов этим людям

   _KaA

62 — 24.11.14 — 12:51

— «Сообщить» в обработке проведения однозначно нельзя, так как ты находишься на сервере а метод клиентский;

— вызвать исключение тоже не камильфо: например при пакетном проведении документов (так сказать пачкой) мы остановим весь процесс;

Свой вариант :)))

   бомболюк

63 — 24.11.14 — 12:54

(60) это конечно же тема отдельного разговора (выводить пользователю все найденные ошибки или только первую), так что давайте его на другой раз отложим. но извольте: пусть второй вариант опроса реализован чуть иначе: заведена отдельная переменная (например МойОтказ), а в конце процедуры ее значение анализируется и, если оно истинно, то уже вызывается исключение. ведь в этом случае второй вариант несет только плюсы?

   бомболюк

64 — 24.11.14 — 12:54

(62) можно, метод не только клиентский.

   tridog

65 — 24.11.14 — 12:55

(62) Сообщить вполне себе есть на сервере. Даже при вызове из фонового задания вполне работает. Даже то, что было запихано в Сообщить внутри фонового задания потом прочитать можно.

А вообще да, абстракции такие абстракции)

   бомболюк

66 — 24.11.14 — 12:56

+(62) Отказ = Истина при выходе из ОбработкаПроведения точно так же все остановит, потому что Отказ = Истина это тоже генерация исключения.

   Serginio1

67 — 24.11.14 — 13:00

(56) Если ты обрабатываешь исключение, то это просто перевод (goto) кода в обработчик исключение

Отказ это не исключение это ОтменитьТранзакцию

   _KaA

68 — 24.11.14 — 13:02

(64)

Да, согласный.

>Доступность:

>Сервер, толстый клиент, внешнее соединение.

Но суть в том, что ошибки которые мы хотим Сообщить, покажутся на клиенте только после окончания серверного вызова.

Проверяется легко, обработка:

С клиента вызываем серверную процедуру и в цикле выводим сообщения.

Нет смысла выводить сообщение сразу: лучше сформировать стек, сгруппировать сообщения, потом вывести.

В этом плане, ИМХО, подход в бухе 7.7 (кажется) был самым правильным (после попытки провести отчет с результатом)…

PS Все написанное мое личное мнение и может отличаться и других :)

   Drac0

69 — 24.11.14 — 13:05

(50) 10-25% процентов экономии порой. Не ахти-что, но иногда экономит лишние полчаса-час. Конечно, надо учитывать блокировки. А кто-то предлагает бездумно что-то использовать?

   lllllllllllllll

70 — 24.11.14 — 13:06

(63) Есть есть транзакция, то используется Отказ, если код выполняестся вне транзации — ВызватьИсключение.

На ИТС есть статья по этому поводу (Система стандартов и методик разработки):

http://its.1c.ru/db/v8std#content:2149184049:hdoc:_top:вызватьисключение

   _KaA

71 — 24.11.14 — 13:06

+ к (64)

Если еще немного порассуждать, использование СообщениеПользователю в ОбработкеПроведения не дает возможности привязать сообщение к элементам формы (прилипалки в 8.3)…

Вообще, надо смотреть, что там за сообщение в проведение. Кажется мне, что вместо «ОбработкаПроверкиЗаполнения» используется «ОбработкаПроведения».

   бомболюк

72 — 24.11.14 — 13:07

(67) «Отказ это не исключение» — именно исключение. А откат транзакции это лишь следствие исключения. Если не веришь — попробуй в Попытка — Исключение записать объект, у которого в модуле объекта в «ПередЗаписью» стоит Отказ = Истина. Вывалишься в исключение.

   бомболюк

73 — 24.11.14 — 13:09

(70) нет подписки, не можешь основные тезисы сюда скопипастить?

   tridog

74 — 24.11.14 — 13:13

(69) Как все запущено…

Если такой любитель наслаждаться сайд-эффектами — найди в коде все вызовы Новый БлокирвокаДанных и закомментируй. Тоже немало производительности выиграешь.

   Drac0

75 — 24.11.14 — 13:16

(74) «А кто-то предлагает бездумно что-то использовать?»

   Drac0

76 — 24.11.14 — 13:25

(74) Представляю, что ты скажешь на то, что я использую обновляю реквизиты документа прямым запросом :)

   Serginio1

77 — 24.11.14 — 13:28

(72) Вообще то передЗаписью выполняется вне Транзакции.

Но это не суть. Смысл Отказа это установка флага ошибки.

Которое внутри процедуры не прекращает ход выполнения.

Но обрабатывается при выходе из предопределенной процедуры.

А дальше уже может вызываться исключение, Отмена Транзакции.

Просто по смылу отказ ближе к ОтменаТранзакциию

Смысл исключения перед отменой именно в немедленном прекращении процедуры с записью ошибки в журнал регистрации и вывода исключения для пользователя

Исключения которые перехватываются внутри процедуры это просто оператор перехода в обработчик исключения.

   Serginio1

78 — 24.11.14 — 13:33

77+ Прошу прощения по поводу перед записью

Возникает перед выполнением записи элемента справочника. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи элемента справочника.

да флаг отмена вызывает отмену транзакции и исключение по выходе из процедуры.

   бомболюк

79 — 24.11.14 — 13:35

(77) «Вообще то передЗаписью выполняется вне Транзакции»

ПередЗаписью модуля объекта выполняется уже в транзакции

Здравая мысль про запись в журнал регистрации (1-й вариант не пишет, 2-й пишет), это я как то упустил. Но все равно думаю это не очень существенно.

   Serginio1

80 — 24.11.14 — 13:38

Но отмена например могла бы быть и результатом выполнения.

Например вместо

Попытка

    Объект.Записать();

Исключение

    Предупреждение(«Не удалось записать объект «»» + Объект + «»»!

                   |» + ОписаниеОшибки(), 60);

КонецПопытки;

Если не Объект.Записать() Тогда

действия

Данные об ошибки можно передавать в ДополнительныеСвойства

(79) Читай 78.

   Serginio1

81 — 24.11.14 — 13:40

(79) И во втором не будет писать если явно отключить запись ошибок в ЖР

   tridog

82 — 24.11.14 — 13:52

(76) Молча посочувствую твоему работодателю

   Drac0

83 — 24.11.14 — 13:56

(82) Ожидаемо. Мир чуть больше, чем тебе кажется.

   tridog

84 — 24.11.14 — 14:16

(83) Правда думаешь, что я никогда на T-SQL ничего не разрабатывал? :D

   Drac0

85 — 24.11.14 — 14:20

(84) При чем тут это?

   tridog

86 — 24.11.14 — 14:27

(85) Это к вопросу осознания ширины мироздания быдлокодерами на встроенном языке без названия)

   Drac0

87 — 24.11.14 — 14:29

(86) Т.е. ты считаешь, что никогда и ни в коем случае, нельзя лезть в 1С прямыми запросами? И что же случится при этом? Мир рухнет, сатана вылезет из ада, солнце потухнет?

   tridog

88 — 24.11.14 — 14:36

(87) Тебе — точно не стоит)

   Serginio1

89 — 24.11.14 — 14:38

(79) Есть еще один минус исключений. Иногда невозможно полностью оттестить все ветки алгоритма, и например проведение записи документа ставишь в обработчик исключений.

Записываешь в ЖР, а пользователю сообщаешь что бы обратился к программисту.

То есть нужно еще разделять пользовательские исключения и исключения системы. В нормальных языках это регулируется классом ошибок.

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

   Drac0

90 — 24.11.14 — 14:39

(88) смелое заявление. Обоснуй.

   tridog

91 — 24.11.14 — 14:48

(90) Кхе-кхе:

v8: СКД. Вывод поля через точку в Настройках. Как убрать префикс?

v8: 1С 8.2. Как сделать таблицу в поле запроса «вручную».

v8: 1С 8.2 УФ. Событие НаКлиенте после отмены проведения.

А ведь этим темам не больше года.

Диагноз:

1. «Мальчик паталогически не переносит учебу» — т.е. на лицо банальная аллергия на на чтение документации

2. При этом самомнение — как у вчерашнего девственника, оценивающего свой сексуальный опыт

3. Первое и второе вместе — я бы тебе даже доступа в рабочую базу не дал.

   Drac0

92 — 24.11.14 — 15:03

(91) И что не так в этих темах? Ты уверен, что знаешь все? Уверен, что документация раскрывает все возможные проблемы? Я, например, не уверен.

А самомнение только у тебя. Т.к. твое представление о работе с транзакциями кажется единственно верным. А бедные быдлокодеры из шаражки Oracle напридумывали и используют такую ересь, как автономные транзакции. Не понимают своей ущербности :(

   Drac0

93 — 24.11.14 — 15:12

(91) Кстати, по мотивам v8: 1С 8.2 УФ. Событие НаКлиенте после отмены проведения. ,а тебе самому не показалось странным и нелогичным, что есть клиентское событие ПередЗаписью, серверное ПередЗаписьюНаСервере, но нет клиентского ПослеЗаписи? Мне вот показалось. Но у меня нет такого самомнения, чтобы быть уверенным в безвыходности этой ситуации :(

   tridog

94 — 24.11.14 — 15:26

(92) Я уверен, что Вам объективно рано делать заявления, подобные (83) :)

А про вложенные транзакции — это ведь просто обертка над вторым коннектом к БД. Ваша «вложенная транзакция» не разделяет блокировок основной и т.д. И, что самое главное — описываемого Вами «ускорения» операций в транзакции Вы уже не получите — с таким же успехом, можете просто запускать фоновое задание в коде на встроенном языке и дожидаться его завершения из кода, выполняемого в транзакции — будет тоже самое.

Через эту штуку удобно делать всякие аудиторские записи, инкременты счетчиков за т.д — это да.

А за алгоритм вида «делаем построчный update, где не сделался — пропускаем» любой опытный ораклоид сперва оторвет Вам руки, а затем понесет директору служебку о Вашем несоответствии занимаемой должности :)

   Drac0

95 — 24.11.14 — 15:30

(94)  «Я уверен, что Вам объективно рано делать заявления, подобные (83) » Т.е. Вы считаете ,что видели все и знаете обо всем? Печально, жить скучно, должно быть.

   tridog

96 — 24.11.14 — 15:35

(95) Я видел достаточно, чтобы гордые рассказы об ускорении обработки за счет транзакций и прямые запросы к 1Сной базе вызывали у меня только facepalm. Остальное — Ваши домыслы

.

   Drac0

97 — 24.11.14 — 15:39

(94) «А про вложенные транзакции — это ведь просто обертка над вторым коннектом к БД.» Вы это с постгрёй не путаете?..

   Drac0

98 — 24.11.14 — 15:41

(96) Т.е. Вы мыслите исключительно основываясь на парадигме, что собеседник — дебил? Не спорю, это намного безопаснее и помогает избежать негативных последствий его действий, но вот в рациональности есть сомнения.

   tridog

99 — 24.11.14 — 15:46

(97) https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm — особенно много внимания уделяем разделу «Usage Notes» — про пересечения блокировок, дедлокам с вложенными транзакциями и т.д.

(98) Это зависит от того, что говорит собеседник. И как аргументирует свою точку зрения.

   фобка

100 — 24.11.14 — 15:48

100

greenLiss
22.09.2015 10:45 Прочитано: 8347

База УТ11, но это не важно. Платформа 8.3

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

Правильно или не правильно, определяется в обработке проверки заполнения.

Но вот в чём проблема, если пытаться провести из формы документа(когда Отказ = Истина), то будут появляться сообщения только те, которые прописаны в коде конфигурации(это хорошо), а вот если попытаться провести из формы списка документов, то будет появляться сообщение типа:»При проверке заполненности данных произошли ошибки», и на каждый такой документ, придется нажимать «ОК».

Как можно обойти этот механизм, что бы пользователям не нужно было нажимать «ОК»?

Заранее, спасибо.

Yandex
Возможно, вас также заинтересует

Реклама на портале

IBReiter
22.09.2015 14:40 Ответ № 1

А документ должен проверятся или нет?

greenLiss
22.09.2015 15:11 Ответ № 2

Да, что бы работало так же, как и всегда, но без этого сообщения )Вы думали на счет стандартного инструмента «ПроведениеДокументов»? Если да, но это не подходит, к сожалению…

EMigachev
22.09.2015 15:59 Ответ № 3

если выдается сообщение — значит в документе не все правильно! — надо же исправить проблему

или вам все-равно как проводится!?

greenLiss
23.09.2015 15:59 Ответ № 4

Да я же не против того, что не проводится… Проблема в самом сообщении, вот нужно пользователю провести 20 документов, он в списке их выделил, нажал «Провести», а там 10 ошибок (которые и так видно в окне сообщений), и он должен еще 10 раз нажать на «ОК». Зачем? Вот именно это и нужно убрать… Просто что бы не выдавалось терминирующее сообщение, с кнопкой «Ок», всё, что нужно, пользователь видит в обычных сообщениях…

IBReiter
23.09.2015 16:49 Ответ № 5

Тогда код нужно исправлять, другого варианта не вижу

greenLiss
24.09.2015 11:48 Ответ № 6

Конфига изменена, так что, проблемы изменения кода нет. Но где его менять??? 

Для примера: создаю новую конфигу, добавляю документ, в модуле объекта делаю только одну проц. «ОбработкаПроверкиЗаполнения» и пишу одну строку Отказ = Истина; И этого достаточно, что бы выходило сообщение при проведении из списка… 

EMigachev
24.09.2015 13:07 Ответ № 7

Нужно понять каким образом выводится это предупреждение:

1. Это механизм платформы — проверка заполнения реквизита:

2. это написано в коде

Проверить можно отладчиком и отключить это механизм проверки

greenLiss
24.09.2015 18:09 Ответ № 8

В ответе №6, можно понять, что это механизм платформы, сообщение выдаётся, когда Отказ в стандартных проц. равен истине. 

Но что делать дальше? 

Отказ = истине, когда что-то не правильно, и так должно быть (Иначе бы воспользовался стандартной «Проведение документов»)…

EMigachev
24.09.2015 23:16 Ответ № 9

отключите проверку на реквизиты по которым ругается

greenLiss
28.09.2015 11:52 Ответ № 10

Кроме проверки реквизитов происходит еще куча дополнительных проверок, которые обязательны… Отключение части проверок — не вариант. Нужно только отключить сообщение при отказе, но сам отказ должен остаться… Я так понимаю, что на данный момент, это не возможно. Напишу письмо в 1С, вдруг… 

IBReiter
28.09.2015 12:58 Ответ № 11

Попробуйте, действительно, вдруг…;)

rudnitskij
08.08.2017 16:31 Ответ № 12

Можно попробовать использовать команду ВОЗВРАТ при невыполнении условия проверки, без использования команды ОТКАЗ.

Чтоб документ не проводился — вам всего лишь нужно не выполнить процедуру ОбработкаПроведения до конца, прервать ее в нужном вам месте. Значение флажка ОТКАЗ на это никак не влияет

Подсказка: Вы можете добавить любую страничку в Избранное щелкнув по значку

Описание проблемы

При работе в онлайн-режиме
иногда возникает ситуация, что документ Mobile SMARTS невозможно сохранить и (или) провести в информационной базе 1C.

При этом на ТСД выводится сообщение с предложением загрузить документ в интерактивном режиме (через обработку обмена).

Возможны два варианта данной проблемы:

  1. Документ записывается, но не проводится в интерактивном режиме (логические ошибки).
  2. Документ записывается и проводится в интерактивном режиме (технологические причины).

Подробнее рассмотрим решение проблемы для второго случая, т.к. для первого при попытке проведения документа в ручном режиме 1С обычно явно указывает причину невозможности действия (это определяется настройками учета в конкретной информационной базе 1С).

Общие сведения

Для взаимодействия с базой 1С Mobile SMARTS использует технологию внешнего соединения через COM-коннектор (V8.COMConnector).

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

Все взаимодействие с базой 1С происходит через обращение к свойствам, методам объектов информационной базы, без какого-либо прямого доступа к базе данных.

Для некоторых действий используется вызов функций общих модулей конкретной конфигурации 1С, но все такие объекты доступны во внешнем соединении.

Однако, возможны непрямые вызовы. Например, в 1С используется технология «подписки на события» — выполнение связанных процедур и функций 1С при наступлении некоторого события (например, записи документа). При этом возможно использование процедур и функций из общих модулей, которые недоступны во внешнем соединении, либо некоторые функции ведут себя по-разному при работе в режиме приложения и режиме внешнего соединения.

Таким образом, возникает исключительная ситуация: нормальный алгоритм работы нарушается, и документ не записывается/ не проводится.

В поддерживаемых типовых и прочих конфигурациях 1С бизнес-процессы
Mobile SMARTS проверяются на такие ситуации, и, как правило, все действия, производимые при записи/ проведении документа, доступны во внешнем соединении. Бывают исключения, но обычно они устраняются в следующих релизах.

Однако, если в ИБ 1С имеются изменения, используются расширения, то измененные или добавленные объекты могут быть недоступны во внешнем соединении. И это приводит к ситуации, когда документ в интерактивном режиме (через обработку обмена) успешно записывается и (или) проводится, а при работе в онлайн-режиме происходит ошибка, и документ в базу 1С не попадает (при этом он остается на сервере Mobile SMARTS).

При этом, так как возникает цепочка исключений, к пользователю на ТСД поступает только информация о том, что документ не записан/не проведен в базу 1С, без уточнения подробностей.

Некоторые рекомендации по поиску и устранению проблемы

Из описания видно, что универсального решения проблемы со стороны Mobile SMARTS быть не может, т.к. она вызвана особенностями конфигурации 1С: Mobile SMARTS вызывает метод документа «Записать», а в ответ получает исключительную ситуацию.

Иногда проблему можно решить, отказавшись (в настройках бизнес-процесса) от автоматического проведения документа. При простой записи объекта происходит меньше изменений в базе 1С, и, возможно, не будет обращения к проблемным модулям.

При этом нужно будет дополнительно проводить созданные или измененные документы (вручную, либо регламентным заданием и т. д.).

Но, как правило, для нормальной работы необходимо вносить изменения в конфигурацию 1С (основную, либо расширение).

Внимание! Изменение объектов основной конфигурации требует некоторых минимальных знаний и навыков!

Общая схема решения проблемы

  • найти объекты конфигурации 1С, которые недоступны во внешнем соединении, и сделать их доступными.
  • найти процедуры/ функции конфигурации 1С, которые по-разному работают в режиме приложения и внешнего соединения, и изменить их — напрямую, либо через расширение.

После применения изменений в базе 1C необходимо перезапустить службу сервера Mobile SMARTS (COM-коннектор через панель управления Mobile SMARTS)

Для общих модулей достаточно поставить флаг «внешнее соединение», при этом нужно следить, чтобы не изменились состояния других флагов, иначе можно нарушить логику работы всей конфигурации

Если общий модуль находится в основной конфигурации, для него необходимо включить возможность изменения и установить режим «Редактируется с сохранением поддержки». В некоторых случаях требуется снять конфигурацию с поддержки (при этом нужно учитывать последствия).

Общие модули показаны для примера, для них изменять режим доступа не обязательно.

Поиск проблемных объектов

В первую очередь необходимо посмотреть записи журнала регистрации для события «КлеверенсТСД». В типовых конфигурациях реализуется через меню «Сервис», либо «Все функции»

Как правило, в описании ошибки будет название общего модуля, либо название функции, процедуры, при обращении к которым было вызвано исключение. При этом текст ошибки может не указывать на действительную причину, например «Попытка передачи с клиента на сервер мутабельного значения» — в этом случае, вместо работы с объектом, недоступным в контексте внешнего соединения, происходит попытка обратится к серверу.

Если конфигурация доработанная или есть расширения — все новые общие модули, у которых стоит флаг «Сервер», но не стоит «Внешнее соединение» могут быть источником ошибки.

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

В конфигураторе 1С нужно открыть обработку, указанную в настройках внешнего соединения в панели управления Mobile SMARTS:

Подключится к COM-процессу, запущенному Mobile SMARTS:

В момент завершения документа на ТСД вызывается функция модуля объекта обработки:

	 ДокументЗавершен(…)

Непосредственно запись готового документа в базу 1С происходит в функции

	 ГлЯдро_ЗаписатьИПровестиДокумент1С().

Завершенный на ТСД документ в случае невозможности записи в 1С остается на сервере Mobile SMARTS, поэтому для повторной записи не нужно заново заполнять данные на ТСД, достаточно открыть и снова завершить документ Mobile SMARTS.

Завершенный документ по умолчанию не виден на ТСД, но его видимость можно включить через панель конфигурации MS, либо в разделе «Документы» снять флаг «Завершен» для нужного документа.

Методика отладки стандартная.

Если нужно, поставьте точку останова в начало функции

	 ДокументЗавершен(..,)

Но можно сразу в функции

	 ГлЯдро_ЗаписатьИПровестиДокумент1С()

, на строках вида:

	 ДокументДляЗаписи.Записать(РежимЗаписиДокумента.Проведение

и на строках в блоках исключение, после строки

	 ОписаниеОшибки = ОписаниеОшибки();

Так вы остановитесь в процессе отладки перед началом записи и в случае исключения.

Сначала выполняете строку записи документа через F10, и если при записи будет вызвано исключение, вы перейдете в блок «Исключение».

Получаете значение «ОписаниеОшибки», анализируете.

Если информации недостаточно, производим последовательный проход по всех вызовам.

Начиная со строки «Записать ()», последовательно «проваливаетесь» через F11 во все вызовы общих объектов и находите проблемный.

Важно понимать, что недостаточно найти один модуль, установить ему флаг доступности во внешнем соединении и сразу обновлять конфигурацию 1С, лучше проанализировать ошибку и найти все связанные модули.

Частные рекомендации по известным ошибкам для конфигураций 1С

«Управление торговлей 11.4», «ERP: Управление предприятием», «Комплексная автоматизация»

Изменения типовых конфигураций не требуются, но есть популярные надстройки (встраиваемые в основную конфигурацию, либо через расширение), которые могут вызывать проблемы.

В версии 13.51 данных конфигураций в свойствах общего модуля «РазборКодаМаркировкиИССлужебныйВызовСервера» необходимо проставить флаг «внешнее соединение» вручную.

Синхронизация с Битрикс24, Б24

Добавляется множество объектов с префиксом «СинхронизацияСБитрикс24_», «Б24_», у которых по умолчанию не установлен флаг «Внешнее соединение». Рекомендуется для всех объектов с флагом «Сервер» добавить также «Внешнее соединение».

Подсистема CRM

Аналогично предыдущему, множество общих модулей, префикс «CRM_», без флага «Внешнее соединение». Решение аналогично предыдущему.

Иногда внешне правильный код выполняется неверно, например сбрасывается ПривилегированныйРежим.

Пример: «Комплексная автоматизация», Модуль набора записей регистра сведений «РеестрДокументов»:

Эта процедура вызывается для любого документа, но при работе с внешним соединением привилегированный режим по каким-то причинам сбрасывается, и условие внутри процедуры выполняет отказ.

Процедура ПередЗаписью(Отказ, Замещение)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Не ПривилегированныйРежим() Тогда
Отказ = Истина;
КонецЕсли;

В последующих версиях условие было изменено, и ошибка исчезла, но если нет возможности обновить конфигурацию, можно вынести эту процедуру в расширение, взяв программный код из текущей конфигурации.

Управление небольшой фирмой 1.6

В типовой конфигурации 1С УНФ 1.6 нужно установить флаг «внешнее соединение» (если не установлен) для следующих общих модулей:

  • УправлениеНебольшойФирмойСобытия
  • УправлениеНебольшойФирмойСобытияПереопределяемый
  • РаботаСНоменклатуройКлиентСервер
  • РаботаСФормойДокумента
  • ОбменМобильноеПриложениеОбщее

Данная ошибка выходит в событийной процедуре, добавленной в расширении табличного поля в режиме «после», при попытке установить «Отказ = Истина»

Для исправления перенесите ее вперед типовой процедуры.

Закон рекламы: родившись, брэнд нуждается в рекламе для своего существования.

  1. Всем привет!

    В обработке проведения делаю проверку на наличие проведенных документов на основании, и если таковые есть — выдаю ошибку, что нужно их распровести и делаю «Отказ = Истина». При этом выдается сервисное сообщение «Не удалось провести [название документа]. Ок, Подробно…».

    Начальника хочет, чтобы выводилось одно сообщение о том, что не проведено, т.к. есть документы на основании. Как вывести свое сообщение и не выводить сервисное?


  2. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

  3. Если можно, чуть подробнее. В каком месте использовать попытку и что в ней пытаться сделать? Я же не программно провожу, а стандартными средствами.


  4. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Если кодить не умеете, лучше не лезьте, да и мой вам совет, не нужно переделывать штатный функционал, потом при обновлении замучаетесь. Это ваша «хотелка» ничего не значит для бизнес-логики, так что оставьте эту затею.


  5. shurikvz

    Offline

    shurikvz
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    TylerDurdenIII
    в суть не вдумывался. Пока вопросы:
    1) почему вы это делаете (проверку) именно в обработке проведения документа? Почему например нельзя сделать это раньше, например перед записью документа?
    2) всю задачу не знаю, это зависит уже от нее, поэтому может быть не актуально, но: судя по первому посту подразумевается что это проведение ваше запускает пользователь, и ему выводится какое-то сообщение. В итоге: вашу проверку действительно в модуле объекта надо делать, или же допустимо вообще убрать ее в модуль формы?

  6. 1) Если делать в процедуре ПередЗаписью также придется ставить Отказ=Истина, который приведет к сообщению «Не удалось провести [название документа]».
    2) Если в форму поместить код, то не отработает при проведении из списка.


  7. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Главный вопрос — для чего это ????
    Это влияет на бизнес-логику ?
    Это влияет на скорость работы ИБ ?
    Это влияет на оперативность ?
    На что это влияет ????

  8. Есть такие люди, которые хотят и все тут. Мешает им видите ли лишнее отвлекающее от основного сообщение. Буду убеждать, что не надо это, просто уже интересно как же можно это сделать если это возможно.


  9. shurikvz

    Offline

    shurikvz
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    2) Понял. Принимается.
    1) ПередЗаписью() использовать в любом случае лучше, не будет лишних расчетов, выполняемых в процедуре проведения

    Еще уточняющий вопрос: контролировать (выводить ваше сообщение) надо именно при проведении документа или при отмене проведения?


  10. shurikvz

    Offline

    shurikvz
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    Ну ок.
    Смотрите, я не знаю как вы выводите ваше сообщение (Предупреждение())? Т.е. модальным окном что-ли, что у вас два она появляется?
    Если так, то рекомендуемый мной вариант: сделать точно также как реализовано стандартно. Т.е. выводите причину ошибки при помощи «ОбщегоНазначения.СообщитьОбОшибке()», она появляется внизу экрана в окне сообщений, и на экране это ваше системное окно о том что невозможно провести (записать) документ.
    Если же упорно так не хотите, ну единственный вариант который я знаю: вызовите собственное исключение в процедуре проведения (ВызватьИсключение <Текст>).

  11. В данный момент все как вы и описали — служебное сообщение выскакивает, а мое сообщение внизу экрана. Клиент упорно хочет одно сообщение.
    Есть ли подводные камни у вызова исключения из проведения? Не делает ли платформа еще чего важного кроме вывода сообщения при отказе?


  12. shurikvz

    Offline

    shurikvz
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    Да нет. Чего она важного может делать? Вызываете исключение — транзакция записи прерывается.

Похожие темы

  1. Vertex
    Ответов:
    12
    Просмотров:
    1.235


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • 1с мобильное приложение содержит синтаксические ошибки
  • 1с мобильное приложение ошибка разбора xml
  • 1с линк ошибка инициализации ssl соединения
  • 1с линк ошибка 405
  • 1с линк ошибка 404