Имя: Пароль:
1C
 
Запись данных документа в процедуре проведения - возможно?
0 lenkavovka
 
02.12.20
08:26
Всем привет!
Пытаемся в процедуре проведения "на лету" сделать отметки в документе:

ФОбъект = Ссылка.ПолучитьОбъект();
Для Каждого СтрокаКодаОбъекта Из ФОбъект.ШтрихкодыУпаковок Цикл
Если СтрокаКодаОбъекта.ШтрихкодУпаковки = НужныйШтрихкод Тогда
СтрокаКодаОбъекта.ДатаПроверкиПередачиЧестныйЗнак = ТекущаяДата();
КонецЕсли;
КонецЦикла;
ФОбъект.ОбменДанными.Загрузка = Истина;
ФОбъект.Записать(РежимЗаписиДокумента.Запись); //понятно, что масло масляное, но вдруг

Делает вид, что изменения сохранились, на "Записать" не ругается, но записи не происходит.
Документ в момент выполнения этого кода не заблокирован (ФОбъект.Заблокирован() возвращает Ложь).

Выходит, что нельзя записывать проводящийся документ?
1 ДенисЧ
 
02.12.20
08:28
За это ФОбъект = Ссылка.ПолучитьОбъект(); в обработке проведения положен пожизненный эцих.
2 lenkavovka
 
02.12.20
08:31
(1) Вариантов обхода никаких?
3 Йохохо
 
02.12.20
08:35
(2) ошибки не надо обходить, их надо исправлять
4 lenkavovka
 
02.12.20
08:47
(3) Обхода ситуации в целом, имею в виду.
В момент проведения выполняется проверка в другой системе, и её результаты хотелось бы хранить в табличной части, которая проверяется. Вынести проверку из проведения сложно из-за необходимой очерёдности задействованных процедур.
Ежу понятно, что можно сделать например регистр, в который пихать сведения. Но очень не хочется заводить целый регистр.
5 Kigo_Kigo
 
02.12.20
08:50
Код конечно кривой и лучше это сделать в процедуре ПередЗаписью
ЕМНИП ИМХо не надо его получать и записывать, просто перебирайте строки и пишите туда данные
6 ДенисЧ
 
02.12.20
09:10
(4) "В момент проведения выполняется проверка в другой системе"

А за это в эцих вкручивают ржавые шурупы...
7 hhhh
 
02.12.20
09:18
(4) скорее всего не сработало Если, а записалось нормально. Проверьте отладчиком, попадает на строку эту?
8 lenkavovka
 
02.12.20
09:37
(5) спасибо за идею. Увы, в Проведении при прямом обращении к документу тоже не сохраняет:

Для Каждого СтрокаКодаОбъекта Из ЭтотОбъект.ШтрихкодыУпаковок Цикл
  Если СтрокаКодаОбъекта.ШтрихкодУпаковки = НужныйШтрихкод Тогда
    СтрокаКодаОбъекта.ДатаПроверкиПередачиЧестныйЗнак = ТекущаяДата();
  КонецЕсли;
КонецЦикла;

В "ПередЗаписью" закинул в "Если РежимЗаписи = РежимЗаписиДокумента.Проведение", отладчик проходит, в конфигураторе значения меняются, а записи нет.
Пошёл искать, не переинициализируются ли где-то после данные документа.

(7) Увы, "Если" срабатывает, в отладке данные меняются, а в сам документ не записываются.

(6) А что не так, позвольте спросить? :) Но, чур, аргументированно.
9 ДенисЧ
 
02.12.20
09:40
(8) Аргументированно? Обращение к внешнему ресурсу в транзакции, когда время доступа к этому ресурсу нерегламентированно, вызывает ожидание этой самой транзакции. А если другая система будет 10 минут отвечать? Транзакция так 10 минут и будет висеть? А потом будет висеть разработчик такого решения...
10 lenkavovka
 
02.12.20
09:56
(9) Здесь позвольте поспорить. Время ожидания ответа на http запрос штатно по умолчанию всегда ограничивается, обычно ставят в 10 секунд. Нет ответа = Отказ в проведении.
В условиях, когда бизнес-процессы должны быть жёстко сихнронизированы, зависимость проведения от ответа второй системы логична.
Если просто описать процесс: мы не можем продать товар клиенту, если он ещё нами не выкуплен с ОТХ. Выкупать с ОТХ до реализации невыгодно - нет гарантии продажи. Делать менеджеру кнопку "выкупить товар" - моветон, это лет ...цать назад делали. Делать выкуп после проведения - невозможно, на момент регистрации чека ККМ на основе реализации в ОФД товар должен быть выкуплен.
Так что Бизнес-процесс подключается именно там, где должен быть - в момент единственной процедуры, осуществляемой менеджером вручную. В случае сбоев менеджер сможет корректно отреагировать.
11 Dmitrii
 
гуру
02.12.20
10:10
(8) Интересно было бы посмотреть код, который вы написали в ПередЗаписью.
Может вы там снова какую-нибудь несусветную ересь пишете с получением объекта через Ссылка.ПолучитьОбъект().

В обработке проведения никакие данные менять нельзя. Все изменения объекта должны происходить в ПередЗаписью и/или подписках на это событие.

(10) Если речь идёт об интерактивной работе пользователя, то и делайте свои проверки интерактивно при работе с формой, а не в транзакции. И вовсе не обязательно делать менеджеру отдельную кнопку.

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

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

OFF. дополнительные 10 секунд на транзакцию проведения?... Какой эцих с гвоздями? Тут только транклюкирование на месте, без суда и следствия.

PS Всё сказанное - разумеется ИМХО. Т.к. реальная картина может отличаться от того что написал автор ветки ;)))
12 ДенисЧ
 
02.12.20
10:12
(10) 10 секунд висения транзакции. У меня в базе реализации в 20 раз быстрей проводятся.
Если у меня каждая реализация будет висеть по 10 секунд на проведении - меня точно повесят
13 Philix
 
02.12.20
10:14
(0) При необходимости совершения отметок в документе в момент его проведения, эти отметки нужно выносить в регистр сведений. Или в процедуру ПередЗаписью (11).
(10) я поддержу коллегу из (9) и предложу вариант готовить покупку вне документа, например в обработке типа ПродажаСВыкупомОТХ, по схеме: 1. Купили (с обращением к внешней системе); 2. Оформили документ продажи с чеком ККМ.
14 ДенисЧ
 
02.12.20
10:15
(11) "Тут только транклюкирование на месте, без суда и следствия."
Заметь, я уже заменил гвозди на шурупы. Ржавые... ))
15 lenkavovka
 
02.12.20
10:31
(11)(12) При всём уважении к ветеранам форума. Где же вы прочли, что транзакция будет висеть 10 секунд в фразе о том, что время ожидания ответа ограничено 10 секундами? :D А командирские часы, на которых написано "предельная глубина погружения 5 метров", тоже только под водой будете эксплуатировать? :D
16 ДенисЧ
 
02.12.20
10:47
(15) По опыту - если говорят, что ожидание 10 секунд максимум, то она, блЪ, и будет ждать все 10 секунд.
17 Йохохо
 
02.12.20
10:49
(15) сделайте уже свою кнопку и удалите с формы типовой Ок. шаблон потом обратно срастётся
(16) ты предлагаешь получить деньги только за работу, но не за доделку и переделку)
18 hhhh
 
02.12.20
10:51
(15) всё-таки выкиньте ФОбъект этот. пишите просто

Записать(РежимЗаписиДокумента.Запись);

а то получается, вы 2 раза документ записываете, сначала ФОбъект, а потом сам объект, и ФОбъект затирается.
19 lenkavovka
 
02.12.20
11:01
(18) Я, кажется, понял, почему в "ПередЗаписью" тоже не записывается. На тестирование взял документ, в котором в конце в результате проверки на наличие происходит Отказ = Истина, и возможно происходит откат транзакции.

ФОбъект убрал.
20 Dmitrii
 
гуру
02.12.20
11:03
(15) >> Где же вы прочли, что транзакция будет висеть 10 секунд.

В (10). Ты сам написал.
И вовсе не обязательно, что она всегда будет висеть 10 секнд. Достаточно, чтобы в один прекрасный день ваш http-сервис перестал отвечать на запросы (пусть даже по не зависящей от вас причине), и весь отдел разработки за ваше творчество повесят на первом же столбе за остановку отгрузки.

Просто запомни, что ставить работу системы в острую зависимость от другой системы нельзя. В особенности тогда, когда в этом нет совершенно никакой необходимости. Сломаться может всё что угодно - http-сервис, сеть, внешняя система зависла-засбоила или ушла в оффлайн, да просто админы поставили какое-нибудь обновление на сервера или на местный фаервол и т.д. и т.п. В любой нестандартной ситуации менеджер (пользователь) должен получить от системы адекватную реакцию в виде сообщения о том, что произошло, чтобы понимать - что ему делать. А не какое-нибудь тупое "в транзакции уже происходили ошибки".
21 lenkavovka
 
02.12.20
12:26
(20) Это ж "Честный знак" - если завис их http сервер, то мы перед продажей клиенту не можем выкупить товар с ОТХ, а если мы не можем выкупить товар с ОТХ, то никакой продажи клиенту быть не должно. Штраф.
22 Dmitrii
 
гуру
03.12.20
10:43
(21) Вот именно!
Так какого хрена вообще начинается проведение, если http-сервис завис?
Выкуп (или хотя бы проверка возможности его осуществления) должен происходить ДО проведения реализации, а не в момент её проведения.
Это две разные хозяйственные операции - выкуп и реализация выкупленного. Хоть и связанные межу собой.
23 ptiz
 
03.12.20
10:48
(21) Сначала делайте документ "Выкуп с ОТХ", потом - документ продажи. Два разных документа.
Программист всегда исправляет последнюю ошибку.