Вопрос: Как программным путем отменить проведение документа в 1С v8?
Ответ Для этого используется метод записи с параметром «РежимЗаписиДокумента.ОтменаПроведения»
Пример: Рассмотрим на примере отмены проведения всех документов «ПриходныйОрдерНаТовары», на основании которых (в структуре подчиненности) нет ни одного проведенного документа.
Для получения структуры подчиненных документов используется метод «ПолучитьСписокДокументовПоКритериюОтбора», подробно описанный в статье Как программно получить список документов, подчиненных текущему.
Текст процедуры, решающей такую задачу отмены проведения таких документов:
Процедура ОтменаБесплодныхПриходныхОрдеров(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходныйОрдерНаТовары.Ссылка |ИЗ | Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары |ГДЕ | ПриходныйОрдерНаТовары.Проведен"; // документы нужно проверять только проведенные Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Отпенять = Истина; ТаблицаПодчиненных = ПолныеПрава.ПолучитьСписокДокументовПоКритериюОтбора("СвязанныеДокументы", Выборка.Ссылка); Если ТаблицаПодчиненных.Количество() > 0 Тогда // подчиненные документы есть, значит, есть что проверять Для каждого СтрокаТП Из ТаблицаПодчиненных Цикл Если СтрокаТП.Ссылка.Проведен Тогда // если все подчиенные не проведены, то можно будет распровести, а иначе - нельзя Отпенять = Ложь; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Если Отпенять Тогда ДокОбъект = Выборка.Ссылка.ПолучитьОбъект(); ДокОбъект.Комментарий = ДокОбъект.Комментарий + "Отменено проведение, т.к. нет проведенных подчиненных документов"; ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения); // собственно отмена проведения КонецЕсли; КонецЦикла; КонецПроцедуры