Реализация на платформе 1С: Предприятие 8.1
В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1. Предположим, что у нас есть некий документ с табличной частью “Товары” (с колонками “Номенклатура” и “Количество”) и нам нужно вывести дополнительную колонку “Цена”, которая бы содержала данные реквизита “Цена” элементов справочника “Номенклатура”, выбранных в строках табличной части. Для этого нам достаточно добавить в форме документа новую колонку “Цена” в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события “ПриПолученииДанных” этого табличного поля:
1 2 3 4 5 6 7 8 9 10 |
// обработчик события "ПриПолученииДанных" табличного поля "Товары" Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок) Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура; Если ЗначениеЗаполнено(Номенклатура) Тогда ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина; ОформлениеСтроки.Ячейки.Цена.Текст = Формат(Номенклатура.Цена,"ЧЦ=15; ЧДЦ=2"); КонецЕсли; КонецЦикла; КонецПроцедуры |
Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.
Реализация на платформе 1С: Предприятие 8.2
На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности – например, у табличного поля отсутствуют обработчики событий “ПриПолученииДанных” и “ПриВыводеСтроки”, которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.
Пусть в нашей конфигурации есть документ “ВводОстатковДолга” с табличной частью “Контрагенты” (с колонками “Контрагент” и “Сумма”). В свою очередь у справочника “Контрагенты” есть реквизит “ИНН”, значение которого необходимо выводить в строках табличного поля.
Откроем управляемую форму документа, добавим новую колонку “ИНН” реквизита “Контрагенты” и перенесём её на закладку “Элементы” (для отображения в форме).
Откроем палитру свойств поля “КонтрагентыКонтрагент” и добавим обработчик события “ПриИзменении”
1 2 3 4 5 6 7 8 9 10 11 12 |
// служебная функция получения значения реквизита объекта (выполняется на сервере) &НаСервере Функция ЗначениеРеквизита(Объект,ИмяРеквизита); Возврат Объект[ИмяРеквизита]; КонецФункции // обработчик события "ПриИзменении" поля "Контрагент" в табличном поле "Контрагенты" &НаКлиенте Процедура КонтрагентыКонтрагентПриИзменении(Элемент) ТекДанные = Элементы.Контрагенты.ТекущиеДанные; ТекДанные.ИНН = ЗначениеРеквизита(ТекДанные.Контрагент,"ИНН"); КонецПроцедуры |
Это обеспечит нам изменение значения поля “ИНН” при выборе контрагента в строке табличного поля.
Теперь необходимо предусмотреть заполнение колонки “ИНН” при открытии формы документа, а так же после записи и при чтении на сервере. Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки “ИНН” будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки “ИНН” опишем в модуле формы служебную серверную процедуру
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// служебная процедура для заполнения колонки "ИНН" табличного поля "Контрагенты" &НаСервере Процедура ОбновитьДанныеКолонкиИНН() Запрос = Новый Запрос( "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Контрагенты.Ссылка КАК Контрагент, | Контрагенты.ИНН |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Ссылка В(&СписокКонтрагентов)" ); Запрос.УстановитьПараметр("СписокКонтрагентов",Объект.Контрагенты.Выгрузить().ВыгрузитьКолонку("Контрагент")); Выборка = Запрос.Выполнить().Выбрать(); Для Каждого Стр Из Объект.Контрагенты Цикл Если Выборка.НайтиСледующий(Стр.Контрагент,"Контрагент") Тогда Стр.ИНН = Выборка.ИНН; Иначе Стр.ИНН = ""; КонецЕсли; КонецЦикла; КонецПроцедуры |
Затем добавим в модуль формы документа обработчики событий “ПриОткрытии”, “ПриЧтенииНаСервере” и “ПослеЗаписиНаСервере”, в каждой из которых будем вызвать описанную ранее служебную процедуру “ОбновитьДанныеКолонкиИНН”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
&НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) ОбновитьДанныеКолонкиИНН(); КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) ОбновитьДанныеКолонкиИНН(); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) ОбновитьДанныеКолонкиИНН(); КонецПроцедуры |
Всё готово. Можно посмотреть на результат.