Как выполнить дополнительную обработку документа при записи, но после проведения? Пояснение вопроса: предопределенная процедура ПриЗаписи() модуля формы вызывается ДО обработки проведения (в модуле документа). Необходимо же выполнить некие действия ПОСЛЕ успешности проведения, но в модуле формы.
Нет, нельзя, потому что используются переменные, введенные в модуле формы.
Провести(<Режим>,<Знач>) Назначение: Выполнить проведение документа. Возвращает: 1 - если проведение документа выполнено, 0 - иначе. Параметры: <Режим> - необязательный параметр. Число: 0 - проводить документ без сдвига ТА; 1 - проводить непроведенный документ реальным временем (со сдвигом ТА); 2 - перепроводить проведенный документ реальным временем (со сдвигом ТА); 3 - проводить любой (непроведенный, проведенный) документ реальным временем (со сдвигом ТА). Значение по умолчанию - 0. <Знач> - выражение произвольного типа, которое передается при запуске предопределенной процедуры ОбработкаПроведения (
Не получается использовать процедуру Провести(..) Попробую описать задачу: нужно составить Журнал регистрации доверенностей. В этом журнале есть колонка "Отметка об использовании доверенности", в которой указывается документ, которым доверенность закрыта. Обычно это два документа "Приходная накладная" и "Авансовый отчет". В этих документах я ввел дополнительный реквизит Доверенность. Это только половина дела - для возможности прямо из документа указывать доверенность, которую документ закрывает. Но чтобы в процессе построения отчета не перелопачивать массу документов в поисках доверенностей, в самой доверенности также есть ссылки на документы, которыми покрывается доверенность (одна доверенность может закрываться несколькими документами). Как храню эти ссылки - это отдельная песня. Суть в другом: обновление ссылок в документе Доверенность из Авансового отчета производится из процедуры ПриЗаписи(). Запись происходит ДО проведения документа. Если были ошибки ввода, то документ не проводится. Если он был не проведен, то документ можно сохранить - сохранится и ссылка на выбранную доверенность. Если до этого он был проведен, а мы пытаемся его перепровести, то документ не проводится и не сохраняется. Ссылка на выбранную доверенность конечно не сохранится, но в самой доверенности ссылка на Авансовый отчет уже записана, т.к. процедура ПриЗаписи() вызывается ДО проведения. Хотя проверки на правильность заполнения производятся ПРИ проведении. Было бы логично процедуру ПриЗаписи() обозвать ПередПроведением(), а сама ПриЗаписи() вызывалась-бы системой именно при записи, а не перед проведением.
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0
Цитата(vadim007 @ 08.09.11, 17:00)
Не получается использовать процедуру Провести(..) Попробую описать задачу: нужно составить Журнал регистрации доверенностей. В этом журнале есть колонка "Отметка об использовании доверенности", в которой указывается документ, которым доверенность закрыта. Обычно это два документа "Приходная накладная" и "Авансовый отчет". В этих документах я ввел дополнительный реквизит Доверенность. Это только половина дела - для возможности прямо из документа указывать доверенность, которую документ закрывает. Но чтобы в процессе построения отчета не перелопачивать массу документов в поисках доверенностей, в самой доверенности также есть ссылки на документы, которыми покрывается доверенность (одна доверенность может закрываться несколькими документами). Как храню эти ссылки - это отдельная песня. Суть в другом: обновление ссылок в документе Доверенность из Авансового отчета производится из процедуры ПриЗаписи(). Запись происходит ДО проведения документа. Если были ошибки ввода, то документ не проводится. Если он был не проведен, то документ можно сохранить - сохранится и ссылка на выбранную доверенность. Если до этого он был проведен, а мы пытаемся его перепровести, то документ не проводится и не сохраняется. Ссылка на выбранную доверенность конечно не сохранится, но в самой доверенности ссылка на Авансовый отчет уже записана, т.к. процедура ПриЗаписи() вызывается ДО проведения. Хотя проверки на правильность заполнения производятся ПРИ проведении. Было бы логично процедуру ПриЗаписи() обозвать ПередПроведением(), а сама ПриЗаписи() вызывалась-бы системой именно при записи, а не перед проведением.
В кнопке ОК - снкачала проведите, а потом, если провелось успешно, Записать ().
Написано через ж. Вызываем кнопкой ОК или провести как там у Вас процедуру в которой пишем Провести(), и если все нормально делаем то что хотим и Записать(). Вот так должно работать.
Причина редактирования: Не цитируйте свои сообщения!!!! В следующий раз удалю и все.
Спочатку запишіть документ без закриття форми (тобто мають дві кнопки: Записати і Провести із закриттям форми або 3: Записати, Провести, Закрити), а далі проводьте.
Цитата
Нет, они будут изменять другие объекты, но только в случае успешного проведения.
у даному випадку пропоную ці дії помістити в процедуру ПриЗакрытии(), при закритті форми документу можна змінювати інші об*єкти.
Всё равно ничего не понял. У Вас есть процедура "Провести", которая может получать значение от формы У Вас есть процедура "ОбработкаПроведения", которая может получать значение от "Провести" Если ОбработкаПроведения дошла до конца - значит документ провелся нормально и перед "КонецПроцедуры" с ним можно продолжать свои операции. Что не так?
Судя из описанного, что понял: У вас в кнопке провести записано: #Записать Провести? Закрыть. Значит первой у вас вызывается процедура ПриЗаписи(), потом ОбработкаПроведения(). Получается вы при записи Авансового отчета прописываете ссылку на него в Доверенность, выбранную в этом Авансовом. И по том если сам авансовый непроводится, то в доверенности всеравно остается ссылка на него, хоть он и непровелся, так как вы уже записали АО. Вот тут ошибка, вдруг вы в этом АО замените ссылку на другую доверенность, соответственно ПриЗаписи(), вы запишите уже в другую доверенность ссылку на этот АО. А в старой доверенности останется ссылка на это же АО, хотя он уже к ней никак непривязан. Выход, нужно использовать ОбработкуПроведения() и ОбработкуУдаленияПроведения() для удаления ссылок на АО.
Цитата
Нет, нельзя, потому что используются переменные, введенные в модуле формы.
ну тут просто, используйте не переменные формы, а глобальные переменные. В форме присваиваете им значения, в модуле проведения получаете, можете в конце их обнулить.
Судя из описанного, что понял: У вас в кнопке провести записано: #Записать Провести? Закрыть. Значит первой у вас вызывается процедура ПриЗаписи(), потом ОбработкаПроведения(). Получается вы при записи Авансового отчета прописываете ссылку на него в Доверенность, выбранную в этом Авансовом. И по том если сам авансовый непроводится, то в доверенности всеравно остается ссылка на него, хоть он и непровелся, так как вы уже записали АО. Вот тут ошибка, вдруг вы в этом АО замените ссылку на другую доверенность, соответственно ПриЗаписи(), вы запишите уже в другую доверенность ссылку на этот АО. А в старой доверенности останется ссылка на это же АО, хотя он уже к ней никак непривязан. Выход, нужно использовать ОбработкуПроведения() и ОбработкуУдаленияПроведения() для удаления ссылок на АО.
Если документ в 1С не проведен, и есть ошибки, которые не дают документу провестись, то документ хотя-бы сохраняется. Если-же документ был проведен, и мы что-то в нем изменили, и возникли ошибки, из-за которых документ не проводится, то документ не сохраняется. Но процедура ПриЗаписи() отрабатывается. Наверное, стоит поменять местами вызовы #Записать Провести? в кнопке ОК. Попробовал. Вывод: если ранее проведенный документ не перепровелся, то он и не сохраняется. В принципе это логично. В моем случае не нужно привязываться к проведению. Мне важен сам факт, что документ был сохранен. И в случае успешного сохранения - выполнить свои действия. Процедура ПриЗаписи(), получается, не подходит. Если-бы было что-то типа ПослеЗаписи(), или ПослеСохранения(). Т.е мне нужно отслеживать результат события не ДО его возникновения ( ПриЗаписи() ), а после его отработки. Как-бы это смоделировать в рамках 1с?
Эврика! Нашел! Значит делаем так: В процедуре ПриОткрытии() комментируем вызов ПриЗаписиПерепроводить(1); В процедуре ПриЗаписи() добавляем строки:
Процедура ПриЗаписи() Автор = Пользователь; глПроверкаДатыДок(Контекст,"Запись"); //! Ручное перепроведение Если Проведен() = 1 Тогда Если Провести() = 0 Тогда СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; //! Обновление реквизита Документы связанных Доверенностей УчестьИзмененияДоверенности(Доверенность, 0); Если СтатусВозврата() = 0 Тогда Возврат; КонецЕсли; Если ПрежняяДоверенность <> Доверенность Тогда УчестьИзмененияДоверенности(ПрежняяДоверенность, 1); КонецЕсли; Если СтатусВозврата() = 0 Тогда Возврат; КонецЕсли; ПрежняяДоверенность = Доверенность; //! Конец вставки КонецПроцедуры
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!