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