При разработке в среде 1С:Предприятие 8 начинающие программисты часто сталкиваются с вопросом: почему простая конструкция присвоения, которая работает для реквизитов шапки, не применима к табличной части? Разберем эту ситуацию подробно, проанализируем различные сценарии — от массового заполнения строк до передачи данных между объектами — и выясним, какие инструменты платформы подходят для каждой задачи.
Важно понимать фундаментальное различие: реквизит шапки — это одиночное значение, в то время как Табличная часть (ТЧ) — это коллекция строк. Мы не можем просто написать Объект.Товары.Цена = 100, так как система «не знает», в какой именно строке нужно изменить цену. Чтобы передать значение в ТЧ, нам необходимо сначала «сузить» множество строк до одной конкретной или перебрать все строки в цикле.
Рассмотрим основные способы решения этой задачи в зависимости от бизнес-логики вашего приложения.
Если перед нами стоит задача прописать значение реквизита из шапки (например, Склад или СтавкаНДС) во все существующие строки таблицы, мы используем обход коллекции. Проанализируем пример кода, который лучше всего выполнять на стороне сервера:
// Пример массового заполнения строк на сервере
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.Склад = Объект.СкладШапка;
КонецЦикла;
В данном примере Объект.Товары — это наша табличная часть, а СтрокаТЧ — это переменная, которая поочередно принимает значение каждой строки. Этот метод является наиболее универсальным и прозрачным.
Иногда мы точно знаем, в какую строку нужно передать данные. Например, если в таблице всегда гарантированно одна строка или нам нужна самая первая. В этом случае мы можем использовать обращение по индексу (индексация начинается с нуля). Посмотрим на реализацию:
// Присвоение значения первой строке ТЧ (индекс 0)
Если Объект.РасшифровкаПлатежа.Количество() > 0 Тогда
Объект.РасшифровкаПлатежа[0].Сумма = Объект.СуммаДокумента;
КонецЕсли;
Важный момент: всегда проверяйте количество строк перед обращением по индексу, иначе программа вызовет ошибку «Индекс находится за границами диапазона», если таблица окажется пустой.
Часто требуется передать значение только в ту строку, которую пользователь выбрал в данный момент на форме. В этом случае мы работаем в контексте клиента и используем свойство ТекущиеДанные расширения таблицы формы. Разберем алгоритм:
Элементы.СписокТоваров).
&НаКлиенте
Процедура КомандаЗаполнитьТекущуюСтроку(Команда)
Строка = Элементы.Товары.ТекущиеДанные;
Если Строка <> Неопределено Тогда
Строка.Цена = Объект.УстановленнаяЦена;
КонецЕсли;
КонецПроцедуры
Использование ТекущиеДанные — это стандартный способ взаимодействия с интерфейсом в управляемых формах.
Если нам нужно максимально быстро заполнить одну и ту же колонку во всех строках таблицы значений (например, при сложной обработке данных на сервере), можно использовать метод ЗаполнитьЗначения(). Однако стоит помнить, что этот метод работает с объектом ТаблицаЗначений. Если ваши данные находятся в ТабличнойЧасти документа, их сначала нужно выгрузить, обработать и загрузить обратно, что не всегда оправдано.
Рассмотрим ситуацию, когда из одного документа (например, «Заявка») нужно создать другой («Заказ поставщику») и передать туда значения реквизитов и строк ТЧ. Выясним, как это сделать правильно с точки зрения архитектуры 1С:
Механизм «ОбработкаЗаполнения»
Самый верный способ — прописать логику в модуле объекта создаваемого документа в процедуре ОбработкаЗаполнения. Рассмотрим пример кода внутри модуля «Заказа поставщику»:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаявкаПокупателя") Тогда
// Заполняем реквизиты шапки
ЭтотОбъект.Организация = ДанныеЗаполнения.Организация;
ЭтотОбъект.Контрагент = ДанныеЗаполнения.Поставщик;
// Заполняем табличную часть из документа-основания
Для Каждого СтрокаОснования Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = ЭтотОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаОснования);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ЗаполнитьЗначенияСвойств значительно упрощает жизнь, автоматически копируя значения из полей с одинаковыми именами.
Параметр «ЗначенияЗаполнения» при открытии формы
Если вы открываете форму нового документа программно с помощью ОткрытьФорму, вы можете передать структуру в параметре ЗначенияЗаполнения. Система сама попытается подставить эти данные в соответствующие реквизиты.
При работе с данными объекта (чтение и запись строк ТЧ) старайтесь выполнять операции на сервере. Обращение к Объект.ТабличнаяЧасть в серверном коде работает быстрее и предоставляет доступ ко всем методам коллекций, таким как НайтиСтроки() или Итог(). На клиенте работа с большими таблицами может замедлять интерфейс, поэтому массовые циклы всегда лучше выносить в серверные процедуры модуля формы или модуля объекта.
Подводя итог, можно сказать, что передача значения в ТЧ — это всегда работа с коллекцией. Выбирайте цикл Для Каждого для массовых изменений или ТекущиеДанные для интерактивной работы пользователя. Для связки разных документов используйте механизм ввода на основании и процедуру ОбработкаЗаполнения.