Битая ссылка при программном создании документа. #719343


#0 by DimoNN
Добрый день . Помогите разобраться. В КА поступила такая задача . Нужно было что бы ЧекККМ разбивался на два. Пользователь создает одни чек с товарами и услугами, программа создает еще одни дополнительный где  выбирает только услуги ( с другой кассой и организацией ) . Я реализовал так, сделал это в событии модуля объекта ПередЗаписью.  Копируется документ, из него удаляются товары, меняется касса,организация и записывается. В исходном удаляются услуги , и добавляется ссылка на чек созданный программно. За несколько дней алгоритм проработал пару тысяч раз. И несколько раз ( около 5-8)  у пользователя случалась ситуация , что подчиненный чек не создавался. А в поле подчиненный чек вылазила надпись «объект не найден» . При записи подчиненного чека делал «Попытку исключение», но исключительная ситуация не наступала .  Как мне найти причину ?
#1 by barrgand
Пользователи на такой алгоритм вообще нормально реагируют?
#2 by Ринат-СПб
Делал то же самое, только для розницы. Правда использовал РМК (интерфейс) и обрабатывал только при закрытии чека (т.е. формировалось 2 чека и ФР выводил два чека) Может проще сделать что то типа РМК для чеков?
#3 by Ринат-СПб
+ Вместо того, что бы использовать сам документ ЧекККМ
#4 by DimoNN
Довольны даже. Сделать нужно было за 2 дня и что бы работа менеджеров и кассиров ни как не усложнилась . ( т. е. Работали как им привычно ) . Печатные формы были доработаны , что бы из исходного чека все печаталось, и некоторые еще доработки ( по их системе скидок , и авто переносу услуг в подчиненный) С розницей ни разу не работал, примерно представляю РМК, не могу представить преимущества . А собственному по мое вопросу не подскажите , куда копать ?
#5 by РенеДекарт
>Я реализовал так, сделал это в событии модуля объекта ПередЗаписью. - это главная ошибка. Ссылка еще не сформирована, и другой док может получить именно ту же ссылку. Т.к. предыдущая еще не зафиксирована и не является "действующей".
#6 by Sammo
Чудес не бывает. Если объект не найден, то значит документ с услугами не записан. Например, отрабатывает что-то "Перед Записью" Личное имхо 1. Схемы, когда в модуле одного документа создаются и проводятся взаимозависимые стоит применять в крайнем случае (точнее в _самом_ крайнем случае, когда иначе ну просто вилы). Например в данном случае возможно будет эффективнее обработка, которая будет выносить услуги отдельно от записи документа. 2. Попытка Исключение может не отработать (например, при попытке записи не создается ошибки и исключения). Поэтому после записи стоить проверять на заполненность ссылки.
#7 by barrgand
В журнале то ничего нету?
#8 by DimoNN
А как так может получится ? Зачем платформа позволят копировать не записанный в базу объект (без ссылки) ?
#9 by mehfk
Значит где-то был Отказ = Истина без исключительной ситуации.
#10 by DimoNN
Дело говоришь. Спасибо .
#11 by DimoNN
Не нет .
#12 by РенеДекарт
ты не понимаешь, что написал. > Зачем платформа позволят копировать не записанный в базу объект (без ссылки) ? - не платформа "копирует" (как ты придумал себе) документ, а выдает новому документу ту же "ссылку", которую, получается, себе уже "нацепил" предыдущий документ. База ведь файловая?
#13 by DimoNN
Хм. Одни пользователь говорил про какую ту мистику, мол чек не создался . А в структуре подчиненности основной чек ссылался на другой чек ( с услугами ) , созданный другим пользователем , а при повторно открытии перестал. Где бы почитать , про то как и когда создается ссылка ?
#14 by DimoNN
база серверная.
#15 by DimoNN
Т.е. так как чек с услугами создается раньше, основной чек перетирает его, когда ссылка одинаковая. Так получается ?  А почему так происходит не всегда ?
#16 by РенеДекарт
могут еще другие чеки создасться между ними. Вообще, никогда нельзя в 1С использовать для изменения данных ПередЗаписью и ПриЗаписи. Только просмотр и корректировка каких-то других, не связанных данных. А тут - один объект еще не досоздался до конца (скользкий момент ПередЗаписью), а уже создается другой. Проще простого - разбиваешь/формируешь первый чек, как надо, остальные данные (тело сследубщего чека) сохраняешь в ТЗ, записываешь первый, формируешь второй, заполняешь, записываешь. И никаких Перед-ПриЗаписи.
#17 by РенеДекарт
ссылка сначала создается, потом присваивается объекту при записи. А ты создать её создал, а присваиваешь в неопределенный момент времени, когда платформа точно такую же ссылку уже могла сформиовать и выдать совсем другому объекту (даже не твоему следующему чеку). Вот почему не ругается в SQL-базе на неуникальность - вопрос. Или серверная файловая?
#18 by РенеДекарт
>Так получается ? - ты сам запутал все и вывел в неопределенность. Нсчала запиши, потом формируй следующий.
#19 by lodger
а в обработке проведения разбить логику? сперва штатно сформировать 1 документ, записать полностью зафиксировать транзакцию, а потом продолжить но уже со следующим? хотя можно и в одной если заранее обозначить что объектов у тебя 2.
#20 by РенеДекарт
> а в обработке проведения разбить логику? - предлагаешь ему транзакцию в транзакции открыть? Еще больше дров наломает.
#21 by lodger
ну тогда по простому можно в ПослеЗаписи лезть. транзакция то зафиксирована.
#22 by DimoNN
Нет. Клиент - серверный вариант .
#23 by DimoNN
Я думаю самый лучший вариант уже тогда создать просто отдельную кнопку на чеке ( по которому создается подчиненный чек с услугами ) , а потом уже записывать основной.
#24 by DimoNN
Обработка проведения не пойдет . Так как менеджер чаще всего создает чеки . А проводит их уже кассир .
#25 by barrgand
Почему бы не создать обработку, которая будет создавать оба чека?
#26 by РенеДекарт
какой СУБД?
#27 by РенеДекарт
да делай как хочешь, только не лезь в Запись, когда ссылка формируется. Ты ж сути не понимаешь - делай где угодно, только события записи оставь в покое.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С