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

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

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

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

Задача заполнить колонку табличной части документа или справочника одним значением возникает постоянно: нужно проставить склад во всех строках товаров, указать ставку НДС, подразделение, статью затрат или признак для сотен позиций. Делать это вручную долго и чревато пропусками, поэтому в 1С есть несколько штатных способов — от встроенных кнопок «Изменить» до программного обхода строк.

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

Способы заполнения колонки: что выбрать

Существует четыре рабочих подхода. Первый — штатная команда «Изменить» в форме табличной части, доступная пользователю без программирования. Второй — программный цикл по строкам табличной части в модуле объекта, формы или внешней обработки. Третий — заполнение при подборе или в обработчике «ПриИзменении», когда значение подставляется автоматически. Четвёртый — групповые обработки типа «Групповое изменение реквизитов», которые, впрочем, работают с реквизитами шапки, а для табличных частей обычно требуется отдельная обработка.

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

Кнопка «Изменить» в форме

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

Цикл по строкам в коде

Универсальный способ для разработчика; позволяет задавать условия, но требует аккуратности с записью объекта

Внешняя обработка заполнения

Для массового заполнения во многих документах; требует разработки и тестирования на копии базы

Заполнение колонки кнопкой «Изменить» без программирования

В типовых конфигурациях на управляемых формах (Управление торговлей, Бухгалтерия, ERP) табличная часть имеет команду «Изменить» — обычно в меню «Ещё» над списком строк. Она открывает диалог, где можно выбрать реквизит и установить его значение сразу для всех или выделенных строк.

Порядок действий
  1. 1
    Откройте документ и перейдите на вкладку с нужной табличной частью
  2. 2
    Нажмите «Ещё» в командной панели табличной части и выберите «Изменить»
  3. 3
    В диалоге отметьте флажком реквизит, который нужно заполнить, и укажите значение
  4. 4
    Выберите режим: для всех строк или только для выделенных
  5. 5
    Нажмите «Выполнить» и проверьте результат в строках
  6. 6
    Запишите документ кнопкой «Записать» или «Провести»

Важный нюанс: изменения через «Изменить» применяются к данным формы, но документ нужно записать, иначе при закрытии значения пропадут. Если команда «Изменить» недоступна, вероятно, у пользователя нет прав на редактирование документа или форма доработана и команда скрыта.

Программное заполнение колонки циклом по строкам

Базовый приём для разработчика — обход коллекции строк табличной части циклом «Для каждого». Это работает и на клиенте в форме, и на сервере в модуле объекта, и во внешней обработке.

bsl
Для каждого СтрокаТовары Из Объект.Товары Цикл
    СтрокаТовары.Склад = СкладПоУмолчанию;
КонецЦикла;

Если нужно заполнить колонку не всем значением, а по условию, добавьте проверку внутри цикла. Например, заполнить ставку НДС только в строках, где она пустая, — это безопасный вариант, который не затирает уже введённые данные.

bsl
Для каждого СтрокаТовары Из Объект.Товары Цикл
    Если Не ЗначениеЗаполнено(СтрокаТовары.СтавкаНДС) Тогда
        СтрокаТовары.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    КонецЕсли;
КонецЦикла;

Обратите внимание на контекст исполнения. В модуле формы управляемого приложения обращение идёт через Объект.Товары, а если данные получены запросом или через Документы.РеализацияТоваровУслуг.НайтиПоНомеру(), сначала нужно получить объект методом ПолучитьОбъект(), изменить строки и вызвать Записать(). Без Записать() изменения останутся только в памяти.

Заполнение колонки через запрос и выгрузку таблицы

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

bsl
ТаблицаТоваров = Объект.Товары.Выгрузить();
Для каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
    СтрокаТаблицы.Цена = ПолучитьЦену(СтрокаТаблицы.Номенклатура);
КонецЦикла;
Объект.Товары.Загрузить(ТаблицаТоваров);

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

Автоматическое заполнение при добавлении строки

Если колонка должна заполняться каждый раз при добавлении строки, правильнее не гонять циклы, а подписаться на события табличной части в форме: «ПриНачалеРедактирования» (для новых строк) или «ПриИзменении» ключевого поля, например номенклатуры.

bsl
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Отказ)
    Если НоваяСтрока Тогда
        Элемент.ТекущиеДанные.Склад = СкладПоУмолчанию;
    КонецЕсли;
КонецПроцедуры

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

Проверка результата и типичные ошибки

После заполнения колонки проверьте три вещи: значения появились во всех нужных строках, документ записан и проводится без ошибок, связанные данные (суммы, остатки, движения) пересчитались корректно. Особенно внимательно относитесь к колонкам, влияющим на проведение: изменение склада или ставки НДС в проведённом документе требует перепроведения.

Типичные ошибки
01
Забыли вызвать Записать() после изменения объекта — изменения потеряны при закрытии
02
Изменили строки в проведённом документе, но не перепровели его — движения по регистрам остались старыми
03
Использовали НайтиСтроки с пустым отбором и изменили лишние строки
04
Загрузили таблицу значений с неполным составом колонок — данные в остальных колонках обнулились
05
Пытаются обратиться к табличной части у ссылки без ПолучитьОбъект() — получают ошибку исполнения
Контрольные точки

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

Значения в строках
Норма

Колонка заполнена во всех нужных строках, пропусков нет

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

Часть строк пустая или заполнена старым значением

Состояние документа
Норма

Документ записан и проведён без сообщений об ошибках

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

При проведении ошибки заполнения или документ остался незаписанным

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

После перепроведения остатки и обороты соответствуют новым значениям

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

Отчёты показывают старые склады или ставки

FAQ

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

В форме выделите нужные строки с зажатой клавишей Ctrl, затем в диалоге «Изменить» выберите режим для выделенных строк. Программно в форме используйте коллекцию Элементы.Товары.ВыделенныеСтроки и получайте данные каждой строки по её идентификатору через Объект.Товары.НайтиПоИдентификатору().

Почему после цикла значения в колонке не сохранились?

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

Можно ли заполнить колонку табличной части во многих документах сразу?

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

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

Внутри цикла просто присвойте реквизиту значение другого реквизита той же строки: СтрокаТовары.ЦенаСНДС = СтрокаТовары.Цена * 1.2. Если нужно значение связанного объекта, например ставка НДС из карточки номенклатуры, получайте его через свойства ссылки — СтрокаТовары.Номенклатура.СтавкаНДС.

Команда «Изменить» недоступна в табличной части. Что делать?

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

Нужно ли перепроводить документ после изменения колонки?

Если изменённая колонка участвует в проведении (склад, ставка НДС, подразделение, счета учёта), документ обязательно нужно перепровести, иначе движения по регистрам останутся старыми. Если колонка чисто информационная и в модуле проведения не используется, достаточно простой записи.

Итог

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

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