Дополнительная вычисляемая колонка в табличной части
Дополнительная вычисляемая колонка в табличной части
В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1.
Предположим, что у нас есть некий документ с табличной частью “Товары” (с колонками “Номенклатура” и “Количество”) и нам нужно вывести дополнительную колонку “Цена”, которая бы содержала данные реквизита “Цена” элементов справочника “Номенклатура”, выбранных в строках табличной части.
Для этого нам достаточно добавить в форме документа новую колонку “Цена” в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события “ПриПолученииДанных” этого табличного поля:
Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.
Реализация на платформе 1С: Предприятие 8.2 (8.3 управляемое приложение)
На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности — например, у табличного поля отсутствуют обработчики событий «ПриПолученииДанных» и «ПриВыводеСтроки», которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.
Пусть в нашей конфигурации есть документ «ВводОстатковДолга» с табличной частью «Контрагенты» (с колонками «Контрагент» и «Сумма»). В свою очередь у справочника «Контрагенты» есть реквизит «ИНН», значение которого необходимо выводить в строках табличного поля.
[qu_spoiler title=»Примечание от ‘Капитально:» open=»yes» icon=»chevron-circle»]в статье взят неудачный пример т.к. реквизиты вынести можно получить гораздо проще, но тем не менее статья полезна для рассмотрения в учебных целях[/qu_spoiler]
Откроем управляемую форму документа, добавим новую колонку «ИНН» реквизита «Контрагенты» и перенесём её на закладку «Элементы» (для отображения в форме).
Откроем палитру свойств поля «КонтрагентыКонтрагент» и добавим обработчик события «ПриИзменении»
// обработчик события «ПриИзменении» поля «Контрагент» в табличном поле «Контрагенты»
&НаКлиенте
Процедура КонтрагентыКонтрагентПриИзменении ( Элемент )
ТекДанные = Элементы . Контрагенты . ТекущиеДанные ;
ТекДанные . ИНН = ЗначениеРеквизита ( ТекДанные . Контрагент , «ИНН» ) ;
КонецПроцедуры
Это обеспечит нам изменение значения поля «ИНН» при выборе контрагента в строке табличного поля.
Теперь необходимо предусмотреть заполнение колонки «ИНН» при открытии формы документа, а так же после записи и при чтении на сервере.
Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки «ИНН» будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки «ИНН» опишем в модуле формы служебную серверную процедуру:
Затем добавим в модуль формы документа обработчики событий «ПриОткрытии», «ПриЧтенииНаСервере» и «ПослеЗаписиНаСервере», в каждой из которых будем вызвать описанную ранее служебную процедуру «ОбновитьДанныеКолонкиИНН»
Всё готово. Можно посмотреть на результат.
Статья найдена на просторах интернета
1С просто и понятно
Нажмите, чтобы связаться со мной:
Отсортировать табличную часть по колонке, которая не является реквизитом ,невозможно, используя метод «Сортировать».
Использование данного метода вернет вам ошибку: «Неверное имя колонки 1с».
Табличная часть 1С
Для того чтобы отсортировать табличную часть по вычисляемой колонке, можно использовать следующий код, который, в данном примере, прописан в процедуре нажатия кнопки:
ТабЧасть=Товары.Выгрузить(); // создаем временную таблицу
ТабЧасть.Колонки.Добавить(«Артикул»); // добавляем в нее нужную колонку
Для каждого Стр из ТабЧасть цикл
Стр.Артикул=Стр.Номенклатура.Артикул; // переписываем информацию из расчетной колонки во временную таблицу
КонецЦикла;
ТабЧасть.Сортировать(«Артикул»); // Сортируем временную таблицу по нужной колонке
Товары.Загрузить(ТабЧасть); // Загружаем временную таблицу в табличную часть
Надеюсь, эта статья была вам полезна. Если у вас остались вопросы вы можете задать их в комментариях.)
Что делать, если Ваш клиент не смог выйти из каменного века и вместо вменяемой часто модифицируемой под нужды современного мира конфигурации, у него неподъемный мамонт, который пережил несколько ледниковых эпох, такой неуклюжий, умирающий, но близкий к бизнесу и родной сердцу? Проблемы начинаются тогда, когда у этого мамонта отваливаются зубья, или его обладатель поглядывает на современные конфигурации и начинает желать новшеств в виде весоподъемности и скорости самолета. Да вообще и чтобы все, что должно работать, работало в конце концов, как, например, внезапно умерший сервис 1С:Контрагент! А у некоторых мамонтов, он, совершенно точно, провонял и усох. И вот как положить этот артефакт в микроволновку времени и вернуть к работоспособному состоянию.
12.05.2020 4257 0 G.Shatrov 6
Работа с табличной частью объектов в 1С : 7 комментариев
Приветствую!
Только начал изучать 1С.
Кое что уже знаю, но мало и опыта практически ноль.
Создал свою конфигурацию, пока только для тестов.
В данной конфигурации есть документ, назовем его «Заявка».
В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
Вопрос.
Как мне это сделать?
Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
Но как это оформить, пока не могу понять…
Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать.
Я бы порекомендовал сделать запрос к табличной части документа (именно к табличной части, а не к документу). Выбрать там ваш столбец Стоимость и другие столбцы, если нужно. И применить функцию СУММА к этому столбцу. Подробнее и с примерами смотрите в статье Группировки в запросах 1С http://chel1c.ru/querry_group/
Спасибо!
Буду пробовать.
А может это подойдет?
Табличная часть (Tabular section)
Итог (Total)
Синтаксис:
Тип: Число; Строка.
Индекс либо имя колонки, по которой подсчитывается итог.
Возвращаемое значение:
Тип: Число; Неопределено.
Суммирует значения всех строк в указанной колонке.
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Сервер, толстый клиент, внешнее соединение.
Пример:
Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.
Добрый день!
Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?
Не совсем понял, о чем конкретно вопрос.
Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.
Как получить имя реквизита табличной части, а именно выбранной колонки.
Задача обойти все элементы табличной части по определенному реквизиту.
UPD #1 – Перефразировал
Как получить ИМЯ реквизита колонки ТЧ находясь в ячейке ТЧ.
- Вопрос задан 09 апр. 2019
- 294 просмотра
Пока буду использовать такой изврат.
Надеюсь что вскоре появится правильный ответ.
Ответ зависит от варианта разрабатываемого интерфейса.
Обычный интерфейс:
Элемент формы связанный с табличной частью "ТаблицаДанных" – ЭлементыФормы.ТаблицаДанных
Текущая колонка – ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка
Имя реквизита формы для колонки – ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Имя
Имя реквизита табличной части, который связан с колонкой – ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Данные
Управляемый интерфейс
Элемент формы связанный с табличной частью "ТаблицаДанных" – Элементы.ТаблицаДанных
Текущая колонка – Элементы.ТаблицаДанных.ТекущийЭлемент
Имя реквизита формы для колонки – Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Имя реквизита табличной части, который связан с колонкой – Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)
Имя реквизита формы для колонки – Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)
Это имя элемента, но не реквизита.
Верно. В обоих блоках это именно имя элемента формы.
Но имя реквизита находится в конце данного пути, то есть необходимо разбить строку что бы получить имя реквизита. Другого варианта нет?
А в чем сложность? Однотипные строки типа Таблица.Реквизит – разбивать БСП-шной функцией на массив или самостоятельно сделать поиск точки и взять подстроку от следующего за точкой символа.