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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке и доработке конфигураций на платформе 1С:Предприятие 8.3 (в частности, в 1С:Управление торговлей 11) разработчики часто сталкиваются с задачей массового заполнения одной и той же колонки в табличной части документа. Например, при нажатии специальной кнопки на форме документа Внутреннее потребление товаров необходимо одновременно во всех строках проставить нужную Статью расходов.

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

Анализ ошибки: почему возникает «Поле объекта не обнаружено»?

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


к = 0;
Для к + 1 По Объект.Товары.Количество() Цикл
    Объект.Товары.СтатьяРасходов = ЭтотОбъект.СтатьяРасхода;
КонецЦикла;

При выполнении такого кода система 1С выдает ошибку: Поле объекта не обнаружено (СтатьяРасходов).

Проанализируем причину этой ошибки:

  1. Выражение Объект.Товары обращается ко всей табличной части (объекту типа ДанныеФормыКоллекция или ТабличнаяЧасть), а не к конкретной строке.
  2. Коллекция строк сама по себе не содержит реквизитов элементов (таких как СтатьяРасходов, Номенклатура или Количество). Эти реквизиты есть только у конкретной строки.
  3. Попытка присвоить значение напрямую свойству коллекции приводит к тому, что платформа ищет это свойство у всей таблицы и, не находя его, генерирует исключение.

Способ 1. Корректный обход строк в цикле «Для Каждого»

Чтобы изменить значение реквизита в каждой строке табличной части, необходимо обращаться к каждой строке коллекции по очереди. В языке 1С для этого используется цикл Для Каждого ... Из ... Цикл.

Рассмотрим правильный вариант реализации обхода строк:


Для Каждого СтрокаТовары Из Объект.Товары Цикл
    СтрокаТовары.СтатьяРасходов = СтатьяРасходов;
КонецЦикла;

В этом примере на каждом шаге цикла переменная СтрокаТовары ссылается на текущую строку табличной части (объект типа ДанныеФормыЭлементКоллекции или СтрокаТабличнойЧасти). Через эту переменную мы получаем прямой доступ к реквизитам конкретной строки и успешно устанавливаем значение колонки СтатьяРасходов.

Способ 2. Быстрое заполнение с помощью метода ЗаполнитьЗначения()

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

Код при использовании этого метода сокращается всего до одной строки:

Объект.Товары.ЗаполнитьЗначения(СтатьяРасходов, "СтатьяРасходов");

Разберем основные преимущества метода ЗаполнитьЗначения():

  1. Высокая производительность: метод выполняется на платформенном уровне (С++), что работает значительно быстрее стандартного цикла 1С на табличных частях с большим количеством строк.
  2. Чистота кода: отсутствие громоздких циклов делает исходный код модуля формы более читаемым и легким для поддержки.

Важные особенности и прикладные нюансы в УТ 11

При программной установке реквизитов в типовых конфигурациях 1С (Управление торговлей, ERP, Комплексная автоматизация) важно учитывать взаимосвязь реквизитов и особенности клиент-серверной архитектуры.

1. Зависимость между реквизитами «Статья расходов» и «Аналитика расходов»

В документе Внутреннее потребление товаров реквизит СтатьяРасходов жестко связан с реквизитом АналитикаРасходов:

  1. В справочнике статей расходов для каждой статьи определяется тип аналитики (например: *Подразделение*, *Склад*, *Физическое лицо* или *Прочие расходы*).
  2. Если программно установить только статью расходов, но оставить аналитику пустой (или если старая аналитика не соответствует типу новой статьи), документ не проведется и выдаст ошибку контроля заполнения.
  3. Решение: При заполнении статьи расходов необходимо одновременно сбрасывать или пересчитывать аналитику расходов в строке, либо запрашивать её у пользователя вместе со статьей.

2. Вызов событий формы (ПриИзменении)

При программном изменении колонок (как через цикл, так и через метод ЗаполнитьЗначения()) клиентские события элементов формы (например, СтатьяРасходовПриИзменении) автоматически не срабатывают.

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

3. Клиент-серверное взаимодействие

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


&НаКлиенте
Процедура КомандаЗаполнитьСтатью(Команда)
    ЗаполнитьСтатьюНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСтатьюНаСервере()
    Объект.Товары.ЗаполнитьЗначения(СтатьяРасхода, "СтатьяРасходов");
КонецПроцедуры

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

4. Использование возможностей БСП (без программирования)

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

  1. В командной панели таблицы «Товары» доступно меню «Заполнить».
  2. Пользователи могут выделить нужные строки (используя клавиши Shift или Ctrl) и выбрать встроенную команду для изменения реквизита в выделенных строках без привлечения программиста.

Мы подробно разобрали причины ошибки при обращении к коллекциям, рассмотрели правильный синтаксис обхода строк через цикл Для Каждого, платформенный метод ЗаполнитьЗначения(), а также учли особенности логики типовых решений 1С.

← На главную