Как правильно программно перепровести документ в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации рутинных задач часто возникает необходимость программно перепровести группу документов. Однако разработчики нередко сталкиваются с тем, что после выполнения кода Записать с режимом РежимЗаписиДокумента.Проведение в регистрах остаются старые данные, либо документ не меняет свой статус в интерфейсе. Давайте разберем, почему так происходит и как сделать это правильно.

Разбор причин «зависших» движений

Основная проблема, с которой столкнулся автор темы, заключается в двух аспектах: логика обработки табличной части и механизмы оповещения платформы. Рассмотрим их детально.

Если после вызова метода Записать записи в регистрах не обновились, скорее всего, процедура ОбработкаПроведения завершилась не так, как вы ожидали, или же данные, которые вы подготовили, не прошли проверку условий внутри модуля документа.

Ошибка при работе с табличными частями в цикле

Критическая ошибка, которую мы часто допускаем — это удаление строк из табличной части прямо во время обхода этой же коллекции циклом Для каждого. Давайте посмотрим, почему это не работает:

Когда вы удаляете строку из таблицы, коллекция перестраивается: индексы строк смещаются, а счетчик цикла переходит к следующему элементу, пропуская одну строку. В итоге часть записей остается необработанной.

Решение: используйте обратный цикл или заполняйте список строк к удалению, а затем удаляйте их отдельно.


// Правильный подход к удалению строк
Для Индекс = ТабличнаяЧасть.Количество() - 1 По -1 Цикл
    Строка = ТабличнаяЧасть.Получить(Индекс);
    Если УсловиеДляУдаления Тогда
        ТабличнаяЧасть.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;

Как правильно проводить документ программно

Для программного проведения документа рекомендуется использовать метод Записать с правильными параметрами. Важно убедиться, что документ получен как объект через метод ПолучитьОбъект().


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

Обратите внимание, что РежимПроведенияДокумента.Неоперативный используется для проведения документов «задним числом». Если вы работаете с текущими документами, используйте РежимПроведенияДокумента.Оперативный.

Почему не обновляется интерфейс?

Если данные в базе данных изменились, а в списке документов вы все еще видите старую картину, дело в кэшировании отображения динамического списка. ОбновитьИнтерфейс здесь не поможет.

В управляемых формах, чтобы список увидел изменения, необходимо:

  1. Использовать оповещение. В модуле объекта или формы после завершения записи вызывайте Оповестить("Запись_ИмяДокумента", ПараметрыЗаписи, Объект.Ссылка).
  2. Для обновления самого динамического списка на форме используйте метод Элементы.ИмяСписка.Обновить(), если список находится в контексте текущей формы.

Важные рекомендации по разработке

Анализируя код, представленный в теме, мы можем выделить несколько «золотых правил» для программиста 1С:

Решая задачу программного проведения, всегда работайте с объектом последовательно: получили объект, изменили его структуру (табличные части), проверили условия, записали в нужном режиме. Только четкая логика без «удалений на лету» гарантирует корректную работу регистров накопления.

← На главную