К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как обновить табличную часть документа 1С

Как обновить табличную часть документа 1С: методы Прочитать, Записать, обработка строк, примеры кода на встроенном языке и типичные ошибки разработчиков.

Табличная часть документа в 1С — это коллекция строк, связанных с объектом: товары в накладной, начисления в документе зарплаты, этапы в заказе. Обновить её может потребоваться при загрузке данных из внешних источников, при пересчёте цен и количеств, при исправлении ошибок ввода или при программной доработке бизнес-логики. Способ обновления зависит от того, работаете вы через форму документа, программно на сервере или через обработку данных напрямую.

Главное различие, которое нужно понимать сразу: изменение табличной части в открытой форме и изменение её через объект базы данных — это разные механизмы. В первом случае данные живут в памяти и записываются только при нажатии «Записать» или «Провести». Во втором — вы работаете с объектом, который нужно явно прочитать, изменить и сохранить. Смешивание этих подходов — самая частая причина потери данных и конфликтов.

Ниже разобраны основные сценарии: программное обновление через объект документа, работа с табличной частью в форме, массовая обработка нескольких документов, контроль результата и типичные ошибки. Примеры кода приведены на встроенном языке 1С и подходят для большинства типовых конфигураций на управляемых формах.

Что нужно знать перед изменением табличной части

Табличная часть хранится в базе данных как отдельная таблица, связанная с документом по ссылке. Пока вы не вызвали запись объекта, все изменения существуют только в памяти. Это значит, что программное изменение без вызова Записать() не попадёт в базу, а запись объекта, который вы не перечитали, может затереть изменения, сделанные другим пользователем в тот же момент.

Второй важный момент — режим записи. Если документ проводится, простое обновление строк может потребовать перепроведения, чтобы движения по регистрам соответствовали новым данным. Запись в режиме РежимЗаписиДокумента.Проведение пересчитает движения, а РежимЗаписиДокумента.Запись сохранит данные без перепроведения — и тогда движения могут перестать соответствовать табличной части.

Обновление табличной части через объект документа

Базовый сценарий программного обновления выглядит так: получить объект по ссылке, изменить табличную часть, записать. Метод ПолучитьОбъект() загружает документ из базы целиком, включая все табличные части. Дальше доступны стандартные методы коллекции: Очистить(), Добавить(), Удалить(), перебор строк в цикле.

1c
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

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

// Вариант 2: точечное обновление существующих строк
Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл
    СтрокаТовары.Сумма = СтрокаТовары.Количество * СтрокаТовары.Цена;
КонецЦикла;

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

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

Обновление табличной части в форме документа

Изменение данных без перезаписи объекта

Когда документ открыт у пользователя, работать нужно с данными формы, а не с объектом базы. Обращение к табличной части идёт через Объект.Товары (в модуле формы), и все изменения сразу видны пользователю. Записывать документ в этом случае не нужно — пользователь сам решит, сохранять изменения или нет.

1c
&НаКлиенте
Процедура ПересчитатьСуммы(Команда)
    Для Каждого Строка Из Объект.Товары Цикл
        Строка.Сумма = Строка.Количество * Строка.Цена;
    КонецЦикла;
    Модифицированность = Истина;
КонецПроцедуры

Установка признака Модифицированность = Истина важна: без неё форма может считать документ неизменённым, и при закрытии пользователь не получит вопрос о сохранении. Это приводит к тихой потере внесённых изменений.

Обновление после выбора или загрузки данных

Типовой сценарий — обновить табличную часть после выбора значения в диалоге (подбор товаров, загрузка из файла). Здесь используется обработчик оповещения: открываете форму выбора с описанием оповещения, а в процедуре-обработчике заполняете табличную часть полученным результатом. Данные из файла обычно готовятся на сервере (через &НаСервере-процедуру), а результат возвращается в клиентский контекст.

Массовое обновление табличных частей нескольких документов

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

Для больших объёмов обязательны три приёма: транзакции на разумные порции (не на всю обработку целиком и не на каждый документ, если их сотни тысяч), вывод прогресса пользователю и журналирование ошибок с указанием конкретного документа. Обработка, которая падает на середине без информации о том, какие документы уже изменены, создаёт больше проблем, чем решает.

Порядок безопасной массовой обработки
  1. 1
    Сделайте резервную копию базы или выполните обработку сначала на копии
  2. 2
    Отберите документы запросом с явными условиями (период, организация, вид документа)
  3. 3
    Протестируйте логику на 2–3 документах и сверьте результат вручную
  4. 4
    Запустите полную обработку с транзакциями и журналом ошибок
  5. 5
    Проверьте выборочно движения документов и отчёты после обработки

Сравнение способов обновления

Выбор способа зависит от контекста: где выполняется код, сколько документов затрагивается и нужно ли перепроведение. Таблица ниже помогает сориентироваться.

СпособКогда применятьОграничения
Через объект (ПолучитьОбъект + Записать)Фоновые задания, обработки, обмены даннымиТребует блокировки объекта, конфликтует с открытой формой
Через данные формы (Объект.Товары)Интерактивная работа пользователя в открытом документеИзменения не сохранены до записи, работает только в контексте формы
Через запрос к табличной частиТолько чтение и анализ данных, отчётыЗапросы не изменяют данные, для записи всё равно нужен объект
Групповое перепроведение / обработкаМассовые изменения по многим документамВысокая нагрузка, риск при ошибках в условиях отбора

Сравнение вариантов

Полная замена (Очистить + Добавить)

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

Точечное изменение строк

Подходит для пересчёта сумм, цен, замены отдельных значений. Сохраняет остальные данные строк, но требует аккуратного поиска нужных строк.

Удаление по условию

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

Проверка результата после обновления

После записи документа убедитесь, что изменения применились корректно. Минимальный набор проверок: количество строк в табличной части соответствует ожидаемому, итоговые суммы документа сходятся с суммами строк, движения по регистрам обновились (если было перепроведение), документ не потерял признак проведения.

Для массовых обработок полезно до изменения сохранить контрольные значения (например, сумму документа и число строк) и после записи сравнить их с новыми. Расхождения без объяснимой причины — сигнал остановить обработку и разобраться.

Контрольные точки

Как проверить результат

Число строк табличной части
Норма

Совпадает с ожидаемым количеством после обновления

Тревожный признак

Строк больше или меньше — вероятны дубли или потерянные данные

Итоговая сумма документа
Норма

Равна сумме по строкам и ожидаемому значению

Тревожный признак

Расхождение — ошибка в формуле пересчёта или не обновлены все строки

Движения по регистрам
Норма

Соответствуют новым данным табличной части

Тревожный признак

Движения старые — документ записан без перепроведения

Состояние проведения
Норма

Документ остался проведённым, если был проведён

Тревожный признак

Проведение снято — отчёты и остатки исказятся

Типичные ошибки и как их избежать

Большинство проблем при обновлении табличных частей связано не со сложностью кода, а с невнимательностью к контексту выполнения. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Изменение объекта без Записать() — данные остаются только в памяти и теряются при завершении процедуры
02
Запись без перепроведения документа, у которого изменились суммы и количество, — движения по регистрам перестают соответствовать табличной части
03
Удаление строк в прямом цикле перебора — из-за сдвига индексов часть строк пропускается; удаляйте в обратном порядке или по собранному списку
04
Обновление объекта, открытого у пользователя в форме, — конфликт блокировок или перезапись чужих изменений при сохранении
05
Очистка табличной части без проверки связанных данных — теряются серии, характеристики, строки связанных табличных частей
06
Массовая обработка без транзакций и журнала ошибок — при сбое непонятно, какие документы уже изменены

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

Перед массовой заменой данных в табличных частях удобно выгрузить текущие значения в файл (например, через табличный документ или CSV). Если обработка сработает неправильно, у вас останется снимок «как было», по которому можно восстановить данные без полного восстановления базы из копии.
ПЗ
Практическое замечание

FAQ: частые вопросы об обновлении табличных частей

Можно ли обновить табличную часть запросом, минуя объект документа?

Нет. Запросы в 1С предназначены только для чтения данных. Чтобы изменить табличную часть, нужно получить объект документа методом ПолучитьОбъект(), внести изменения и вызвать Записать(). Прямая запись в таблицы базы в обход платформы нарушает целостность данных и не поддерживается.

Почему после записи документа движения по регистрам не изменились?

Вы записали документ в режиме РежимЗаписиДокумента.Запись, который сохраняет только данные документа без перепроведения. Чтобы движения пересчитались, используйте РежимЗаписиДокумента.Проведение или перепроведите документ отдельно после записи.

Как удалить из табличной части только строки, подходящие под условие?

Сначала соберите подходящие строки в массив при прямом переборе, затем удаляйте их методом Удалить() по элементам массива. Удаление прямо в цикле перебора коллекции приводит к сдвигу индексов и пропуску части строк.

Что делать, если документ заблокирован другим пользователем?

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

Как обновить табличную часть, не перепроводя документ?

Запишите объект в режиме РежимЗаписиДокумента.Запись. Но учитывайте: если изменённые данные участвуют в проведении, движения по регистрам перестанут соответствовать документу. Такой приём допустим только для реквизитов, не влияющих на учёт, например комментариев или служебных пометок в строках.

Можно ли отменить массовое обновление табличных частей?

Штатной кнопки «отменить» нет. Откат возможен только через восстановление базы из резервной копии или через обратную обработку по заранее сохранённым данным. Поэтому резервная копия и тестовый запуск на копии базы — обязательные этапы перед массовыми изменениями.

Итог

Что важно запомнить

Обновление табличной части сводится к трём шагам: получить объект (или работать с данными формы), изменить строки, записать с правильным режимом. Для проведённых документов используйте режим проведения, для массовых обработок — транзакции, журнал ошибок и обязательную резервную копию. Проверяйте результат по числу строк, итоговым суммам и движениям по регистрам.