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