Как правильно выполнить перезаполнение табличной части документа в 1С?

Программист 1С v8.3 (Обычные формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Почему попытка «точечного» обновления — это путь в никуда?

Важно понимать фундаментальный принцип работы платформы 1С: метод Записать() объекта документа всегда сохраняет весь документ целиком. Даже если вы изменили всего одну строку в табличной части, при вызове записи платформа формирует транзакцию, затрагивающую все данные документа. Попытки находить различия в циклах и перезаписывать по одной строке не дают выигрыша в скорости работы с СУБД, а наоборот — увеличивают время выполнения кода из-за многократных обращений к базе данных.

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

Метод первый: полная синхронизация через Загрузить

Самый простой и надежный способ — это полная загрузка табличной части из источника. Платформа 1С оптимизирована для работы с коллекциями строк, поэтому операция Загрузить() выполняется крайне быстро.

Рассмотрим, как это выглядит на практике:


// Предположим, у нас есть документ-основание (ДокОснование) и целевой документ
ТаблицаДанных = ДокОснование.Товары.Выгрузить();
ЦелевойДокумент.Товары.Загрузить(ТаблицаДанных);
ЦелевойДокумент.Записать();

Этот подход гарантирует целостность данных и полное соответствие табличных частей. Это стандартный «тон» разработки, который исключает ошибки синхронизации.

Метод второй: предварительная проверка идентичности

Если вы хотите действительно сэкономить ресурсы и не перезаписывать документ, если данные в нем уже актуальны, используйте проверку перед выполнением действий. Вместо того чтобы пытаться найти «разные» строки, сравните коллекции целиком.

Разберем пример с использованием типовой функции КоллекцииИдентичны:


// Сравниваем две табличные части перед записью
Идентичны = ОбщегоНазначения.КоллекцииИдентичны(
    ЦелевойДокумент.Товары, 
    ДокОснование.Товары, 
    "Номенклатура, Количество, Цена, Сумма"
);

Если НЕ Идентичны Тогда
    ЦелевойДокумент.Товары.Загрузить(ДокОснование.Товары.Выгрузить());
    ЦелевойДокумент.Записать();
КонецЕсли;

Этот код выполняет сразу две задачи:

  1. Гарантирует, что лишних записей в базу не будет — если данные совпадают, метод Записать() даже не будет вызван.
  2. Поддерживает высокий уровень производительности, используя встроенные механизмы платформы.

Рекомендации по реализации

Чтобы ваша разработка была качественной, следуйте следующим рекомендациям:

Проанализировав ситуацию, можно сделать вывод, что стремление обновлять только изменившиеся строки — это классическая ошибка преждевременной оптимизации. Используйте проверенные методы Загрузить() и предварительную проверку на идентичность — это сделает ваш код чистым, понятным для коллег и быстрым для пользователя.

← На главную