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