6. Объектная модель прикладного решения
#44

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

Какой программный вызов у объекта документа гарантированно запускает режим «отмена проведения» (распроведение) и, соответственно, приводит к срабатыванию обработчиков, которые выполняются при отмене проведения?

ОтменитьПроведение(), где это метод формы документа.
Неправильно: В типовом API платформы отмена проведения инициируется не отдельным «методом формы», а записью документа в специальном режиме. На форме обычно есть команда «Отмена проведения», но в коде она не обязана соответствовать методу с таким именем.
Записать(РежимЗаписиДокумента.ОтменаПроведения), где Записать() вызывается как метод формы документа.
Неправильно: Метод формы «Записать» в управляемом интерфейсе не предназначен для передачи перечисления режима записи таким образом: у формы другой контракт вызова (часто без параметров), из-за чего передача РежимЗаписиДокумента приводит к ошибкам типов или не дает нужного режима. Для корректного распроведения нужно вызывать запись именно у объекта документа.
ОтменитьПроведение(), где это метод объекта документа.
Неправильно: У объекта документа штатного метода «ОтменитьПроведение()» нет: распроведение реализовано через метод Записать() с указанием режима отмены проведения. Поэтому такой вызов либо не скомпилируется, либо будет относиться к нештатному коду конкретной конфигурации.
Записать(РежимЗаписиДокумента.ОтменаПроведения), где Записать() - метод объекта документа.
Правильно: Распроведение документа в платформе выполняется как запись объекта в режиме «ОтменаПроведения», который задается параметром перечисления РежимЗаписиДокумента. Такой вызов корректно инициирует сценарий отмены проведения и позволяет в обработчиках отличать его по параметру «РежимЗаписи».

Пояснение

Отмена проведения (распроведение) в 1С - это не «особая кнопка», а один из режимов записи документа. Поэтому правильный способ инициировать распроведение программно - записать объект документа с режимом РежимЗаписиДокумента.ОтменаПроведения. Практический пример (серверный код): - Ссылка = ...; // ДокументСсылка - ОбъектДок = Ссылка.ПолучитьОбъект(); - ОбъектДок.Записать(РежимЗаписиДокумента.ОтменаПроведения); Если вы работаете из формы управляемого приложения: - На клиенте обычно вызывают серверную процедуру, а уже на сервере выполняют «Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения)». Это важно, потому что запись и работа с движениями/регистрами выполняются серверной частью. Что именно «срабатывает» при отмене проведения: - В модуле объекта документа события записи (например, «ПередЗаписью») получают параметр РежимЗаписи типа РежимЗаписиДокумента. По нему можно определить, что сейчас идет именно отмена проведения, и выполнить нужную логику (например, запретить распроведение при определенных условиях). Важный нюанс про движения регистров: - Удаление движений при отмене проведения зависит от настроек документа (режим удаления движений). Если включено автоматическое удаление при отмене проведения - платформа сама очистит движения; если нет - разработчик должен удалять/корректировать движения вручную в обработчиках проведения. Не путайте «распроведение» и «сторно»: - Отмена проведения снимает флаг «Проведен» и, как правило, удаляет движения документа. - Сторно - это отдельная операция, которая формирует обратные записи (движения) новым документом, а не «снимает проведение» исходного документа.