Back to top

Дополнительная вычисляемая колонка в табличной части

Опубликовано e-1c@mail.ru - вс, 05/21/2017 - 06:09

Иногда возникает необходимость вывода в табличное поле документа (или любого другого объекта, имеющего табличную часть) дополнительных колонок с данными, которые не содержатся непосредственно в табличной части. Реализовать это на платформе 1С: Предприятие 8.1 или 8.2 в режиме обычного приложения (без использования управляемых форм) было достаточно просто, чего не скажешь об управляемых формах в 1С 8.2.

Реализация на платформе 1С: Предприятие 8.1 (или в обычном приложении)

В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1.

Предположим, что у нас есть некий документ с табличной частью “Товары” (с колонками “Номенклатура” и “Количество”) и нам нужно вывести дополнительную колонку “Цена”, которая бы содержала данные реквизита “Цена” элементов справочника “Номенклатура”, выбранных в строках табличной части.

Для этого нам достаточно добавить в форме документа новую колонку “Цена” в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события “ПриПолученииДанных” этого табличного поля:
// обработчик события «ПриПолученииДанных» табличного поля «Товары»

Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура;
        Если ЗначениеЗаполнено(Номенклатура) Тогда
            ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
            ОформлениеСтроки.Ячейки.Цена.Текст = Формат(Номенклатура.Цена,«ЧЦ=15; ЧДЦ=2»);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.

Реализация на платформе 1С: Предприятие 8.2 (8.3 управляемое приложение)

На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности – например, у табличного поля отсутствуют обработчики событий “ПриПолученииДанных” и “ПриВыводеСтроки”, которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.

Пусть в нашей конфигурации есть документ “ВводОстатковДолга” с табличной частью “Контрагенты” (с колонками “Контрагент” и “Сумма”). В свою очередь у справочника “Контрагенты” есть реквизит “ИНН”, значение которого необходимо выводить в строках табличного поля.

Примечание:
в статье взят неудачный пример т.к. реквизиты вынести можно получить гораздо проще, но тем не менее статья полезна для рассмотрения в учебных целях

Откроем управляемую форму документа, добавим новую колонку “ИНН” реквизита “Контрагенты” и перенесём её на закладку “Элементы” (для отображения в форме).

dopkol1_KontargentINN-dobalvenie-v-polya-tablitsy.jpg

Откроем палитру свойств поля “КонтрагентыКонтрагент” и добавим обработчик события “ПриИзменении”

// служебная функция получения значения реквизита объекта (выполняется на сервере)
&НаСервере
Функция ЗначениеРеквизита(Объект,ИмяРеквизита);
    Возврат Объект[ИмяРеквизита];
КонецФункции
// обработчик события «ПриИзменении» поля «Контрагент» в табличном поле «Контрагенты»
&НаКлиенте
Процедура КонтрагентыКонтрагентПриИзменении(Элемент)
    ТекДанные = Элементы.Контрагенты.ТекущиеДанные;
    ТекДанные.ИНН = ЗначениеРеквизита(ТекДанные.Контрагент,«ИНН»);
КонецПроцедуры
 

Это обеспечит нам изменение значения поля “ИНН” при выборе контрагента в строке табличного поля.
Теперь необходимо предусмотреть заполнение колонки “ИНН” при открытии формы документа, а так же после записи и при чтении на сервере.

Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки “ИНН” будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки “ИНН” опишем в модуле формы служебную серверную процедуру:

// служебная процедура для заполнения колонки «ИНН» табличного поля «Контрагенты»
&НаСервере
Процедура ОбновитьДанныеКолонкиИНН()
    Запрос = Новый Запрос(
    «ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    Контрагенты.Ссылка КАК Контрагент,
    |    Контрагенты.ИНН
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Ссылка В(&СписокКонтрагентов)»
    );
    Запрос.УстановитьПараметр(«СписокКонтрагентов»,Объект.Контрагенты.Выгрузить().ВыгрузитьКолонку(«Контрагент»));
    Выборка = Запрос.Выполнить().Выбрать();
    Для Каждого Стр Из Объект.Контрагенты Цикл
        Если Выборка.НайтиСледующий(Стр.Контрагент,«Контрагент») Тогда
            Стр.ИНН = Выборка.ИНН;
        Иначе
            Стр.ИНН = «»;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
 

Затем добавим в модуль формы документа обработчики событий “ПриОткрытии”, “ПриЧтенииНаСервере” и “ПослеЗаписиНаСервере”, в каждой из которых будем вызвать описанную ранее служебную процедуру “ОбновитьДанныеКолонкиИНН”

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    ОбновитьДанныеКолонкиИНН();
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    ОбновитьДанныеКолонкиИНН();
КонецПроцедуры
 
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОбновитьДанныеКолонкиИНН();
КонецПроцедуры 
 

Всё готово. Можно посмотреть на результат.

dopkol2_Primer-dopolnitelnoj-kolonki-v-spiske.jpg