При переходе на управляемые формы 1С 8.3 разработчики часто сталкиваются с изменением привычной объектной модели. Конструкции вида ВыбратьСтроки() остались в прошлом, а прямое обращение к табличной части по имени в модуле формы вызывает ошибки. Разберем по шагам, как устроена работа с табличными частями в управляемом приложении, как выполнять пересчет строк на клиенте и сервере, а также как привязать обработчик к кнопке на форме.
В управляемой форме данные документа находятся в основном реквизите формы — обычно он называется Объект. Сама табличная часть на форме представлена типом ДанныеФормыКоллекция, а не объектом прикладного типа. Поэтому прямое обращение по имени таблицы не сработает — необходимо обращаться через реквизит формы Объект.ИмяТабличнойЧасти.
Рассмотрим пример полного обхода строк таблицы в цикле:
Для Каждого Стр Из Объект.ТабЧасть Цикл
Стр.КолонкаЦ = Стр.КолонкаА + Стр.КолонкаБ;
КонецЦикла;
Такой цикл успешно выполняется как в клиентских процедурах с директивой &НаКлиенте, так и в серверных &НаСервере. Однако при работе на клиенте действуют строгие ограничения платформы.
Проанализируем ключевое различие между контекстом клиента и сервера при работе со ссылочными данными:
Стр.Товар.Артикул или Стр.Товар.СтавкаНДС) нельзя — это вызовет ошибку выполнения.Если для расчета строки требуются дополнительные данные из связанных справочников, необходимо вызывать серверную процедуру или функцию. Рассмотрим пример передачи управления с клиента на сервер:
&НаКлиенте
Процедура ПересчитатьТабличнуюЧасть(Команда)
ПересчитатьТабличнуюЧастьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПересчитатьТабличнуюЧастьНаСервере()
Для Каждого Стр Из Объект.ТабЧасть Цикл
// На сервере можно безопасно обращаться к реквизитам ссылок через точку
Если ЗначениеЗаполнено(Стр.Товар) Тогда
Стр.КолонкаЦ = Стр.КолонкаА * Стр.Товар.Коэффициент;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если требуется рассчитать значения только в той строке, которую пользователь сейчас редактирует, нет необходимости обходить всю таблицу циклом. Для этого используется свойство ТекущиеДанные элемента таблицы формы.
Выясним, как быстро выполнить расчет текущей строки на клиенте в обработчике события ПриИзменении поля ввода:
&НаКлиенте
Процедура ТабЧастьКолонкаАПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ТабЧасть.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.КолонкаЦ = ТекущаяСтрока.КолонкаА + ТекущаяСтрока.КолонкаБ;
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает мгновенный отклик пользовательского интерфейса без лишних серверных вызовов.
В управляемых формах кнопка не может ссылаться на процедуру напрямую. Связующим звеном выступает Команда формы. Разберем по шагам алгоритм создания кнопки:
РассчитатьИтоги).&НаКлиенте).При проектировании расчетов важно разделять логику отображения и целостность данных:
ПередЗаписью размещается обязательный алгоритм проверки и итогового расчета сумм. Это гарантирует, что данные запишутся корректно даже при программном создании или загрузке документа из внешних систем без открытия формы.