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