Заполнить реквизит по данным табличной части

Как автоматически заполнить реквизит из таб.части?

Я
   Саша Да Саша

27.12.19 — 05:34

Добрый день,подскажите пожалуйста неумёхе,как сделать,чтобы реквизит формы автоматически заполнялся,беря информацию из табличной части.

То есть есть таб. часть,в который указывается список товаров и сумма,нужно чтобы при изменении реквизита «сумма» табличной части,эта сумма добавлялась в реквизит «всего».

Я это сделал так:

&НаКлиенте

Процедура СписокТоваровСуммаПриИзменении(Элемент)

Строка = Элементы.СписокТоваров.ТекущиеДанные;

Объект.всего = Объект.всего + Строка.сумма;

        
КонецПроцедуры

  

Партнерская программа EFSOL Oblako

   PuhUfa

1 — 27.12.19 — 05:47

(0) открой СП, почитай про ТЧ, особенно удели внимание Сумма()

   Саша Да Саша

2 — 27.12.19 — 05:48

(1) ТЧ?

   PaulBC

3 — 27.12.19 — 05:50

(0) Ну, если задача именно такая, как написано «чтобы при изменении реквизита «сумма» табличной части,эта сумма добавлялась в реквизит «всего»», то все ок

   Саша Да Саша

4 — 27.12.19 — 05:55

(3) Не работает,в том-то и дело

   PaulBC

5 — 27.12.19 — 05:58

(4) что именно не работает? Не изменяется всего или неправильно считает?

   Саша Да Саша

6 — 27.12.19 — 05:59

(5) Не изменяется

   PaulBC

7 — 27.12.19 — 06:03

Всего точно реквизит объекта, а не формы? Процедура вообще выполняется? Проверь отладчиком.

   Саша Да Саша

8 — 27.12.19 — 06:07

(7) Да,реквизит объекта,тип число

   МимохожийОднако

9 — 27.12.19 — 06:21

Включи отладчик. Он эффективнее форума.

   Саша Да Саша

10 — 27.12.19 — 06:25

(9) Я не очень понимаю,как с ним работать,поставил точку останова перед этой процедурой,и 0 реакции,заполняю реквизиты-он не двигается

   Uzyf

11 — 27.12.19 — 06:31

(10) на строке «Строка = Элементы.СписокТоваров.ТекущиеДанные;» поставь точку останова

   Саша Да Саша

12 — 27.12.19 — 06:41

Ну ничего не понимаю.

Ладно,начнём с нуля,

Есть реквизит табличной части и есть просто реквизит документа,как сделать,чтобы после изменения реквизита таб.части это значение заполнялось в обычный реквизит,просто на вашем примере ?

   Саша Да Саша

13 — 27.12.19 — 06:42

Ничего не понимаю,ладно начнём с нуля.

Есть реквизит таб.части и есть просто реквизит объекта,как сделать,чтобы после заполнения реквизита таб.части это значение заполнялось в обычный реквизит?

   GreenSCI

14 — 27.12.19 — 07:16

Событие элемента «Сумма» табличной части «При изменении».

Процедура ТвояТЧСуммаПриИзменении(Элемент)

        ТекущиеДанные = Элементы.СписокТоваров.ТекущиеДанные;

        СуммаСтроки = ТекущиеДанные.СуммаСтроки;

    ТвойРеквизитФормы = СуммаСтроки;

//ИЛИ одной строкой

ТвойРеквизитФормы = Элементы.СписокТоваров.ТекущиеДанные.СуммаСтроки;

КонецПроцедуры

   Саша Да Саша

15 — 27.12.19 — 07:27

(14) Отлично,всё работает,спасибо.

Но возникла друга проблема,СуммаСтроки рассчитывается автоматически(Сумма = Количество * Цена) и вот если я сам заполню реквизит «СуммаСтроки»- всё гуд,а вот если заполнилось автоматом- не работает

   hhhh

16 — 27.12.19 — 07:43

(15) а ты точно 3 процедуры сделал? на количество, цену и сумму? И во всех трех процедурах у тебя есть это?

ТвойРеквизитФормы = Элементы.СписокТоваров.ТекущиеДанные.СуммаСтроки;

   Саша Да Саша

17 — 27.12.19 — 07:51

(16) Нет,цена изменяется автоматически после выбора товара(из Рег. сведений подтягивается).

Добавил «ТвойРеквизитФормы = Элементы.СписокТоваров.ТекущиеДанные.СуммаСтроки;» ещё в «При изменении количества» и заработало!

Спасибо.

   Саша Да Саша

18 — 27.12.19 — 07:52

Всех очень благодарю за помощь!

  

Bootini

19 — 27.12.19 — 13:49

А еще проще, тыркаешь на свой реквизит формы Всего и в окне ПутьКДанным выбираешь Объект.СписокТоваров.ИтогСумма

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Работа с табличной частью объектов в 1СДля получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1=«Значение»;

Как программно заполнить реквизиты строки табличной части

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

При работе с системами 1С на различных предприятиях может возникнуть ситуация, когда потребуется изменить определенные данные в табличных частях документов. Естественно, если система уже находится в эксплуатации, количество документов слишком велико, чтобы даже задуматься о ручном изменении. Это и не нужно, так как программист 1С может сделать обработку, которая будет автономно делать нужные исправления в документах. Это отличное решение, которое не перегружает интерфейс пользователя и позволяет прописать нужную нам логику для всех объектов системы.

Создание простой обработки в 1С 8.3

Если пользователь нуждается в простом исправлении какого-либо значения в табличной части документов, то не нужно подключать к конфигурации дополнительные обработки. Достаточно лишь создать внешнюю обработку, ее форму, разместить на ней кнопку и прописать алгоритм действий при ее нажатии. Этот метод будет оптимальным решением в случаях, когда в табличную часть документа уже функционирующей конфигурации добавили поле. Во вновь созданных документах пользователи будут самостоятельно заполнять его, а вот о тех объектах, которые уже были созданы, позаботятся программисты.

Допустим, что в табличную часть «Товары» документа «ПоступлениеТоваровУслуг» добавили реквизит «Назначение», которое должно проставляться при выборе склада. Естественно, перевыбирать склад во всех существующих документах никто не собирается, и принимается решение, что нужна внешняя обработка заполнения табличной части документа. Алгоритм наших действий следующий:

  1. Открываем ИБ в режиме конфигуратора и с помощью меню «Файл»-«Новый» создаем внешнюю обработку;
    Рис.1 Выбор вида документа
    Рис.1 Выбор вида документа
  2. Добавляем форму обработки, нажимая на кнопку в виде лупы у одноименного поля, подтверждаем предлагаемые настройки кнопкой «Готово»;
    Рис.2 Конструктор формы обработки
    Рис.2 Конструктор формы обработки
  3. В разделе «Команды» добавляем новый объект, изменяем наименование и перетаскиваем его влево, в элементы формы. Видим, что появилась кнопка с нужным нам именем;
    Рис.3 Внешняя обработка Форма
    Рис.3 Внешняя обработка Форма
  4. Чтобы добавить алгоритм заполнения нового реквизита, нам нужно создать процедуру на клиенте, вызывающую выполнение кода на сервере. Для этого вызываем контекстное меню на созданной нами кнопке и выбираем пункт «Действие команды». Выбираем «Создать на клиенте и процедуру на сервере без контекста»;
    Рис.4 Создание процедуры на клиенте
    Рис.4 Создание процедуры на клиенте
  5. Перед нашими глазами откроется текст модуля формы с 2 процедурами. Алгоритм работы с документами реализовываем в той, которая исполняется на серверной стороне. Сам текст кода состоит из следующих частей:
    • С помощью запроса определяем, в строках ТЧ каких документов новый реквизит «Назначение» не заполнен;
    • В цикле получаем объект каждого документа, заполняем реквизит строк табличной части и записываем документ для сохранения изменений.
                 
&НаКлиенте
Процедура ЗаполнитьТЧ(Команда)
        	ЗаполнитьТЧНаСервере();
КонецПроцедуры
 
&НаСервереБезКонтекста
Процедура ЗаполнитьТЧНаСервере()
        	Запрос = Новый Запрос;
        	Запрос.Текст =
                   	"ВЫБРАТЬ РАЗЛИЧНЫЕ
                   	|       	ПоступлениеТоваровУслугТовары.Ссылка КАК Ссылка,
                   	|       	ПоступлениеТоваровУслугТовары.Ссылка.Склад.Наименование КАК Назначение
                   	|ИЗ
                   	|       	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                   	|ГДЕ
                   	|       	ПоступлениеТоваровУслугТовары.Назначение = """"";        	
        	ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();
        	Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
                   	ДокументОбъектДляИзменения =  ВыборкаРезультатаЗапроса.Ссылка.ПолучитьОбъект();
                   	Для каждого строки из ДокументОбъектДляИзменения.Товары цикл
                               	строки.Назначение = ВыборкаРезультатаЗапроса.Назначение;       	
                   	КонецЦикла;
                   	ДокументОбъектДляИзменения.Записать(РежимЗаписиДокумента.Проведение);
                   	Сообщить("Документ "+ДокументОбъектДляИзменения.ссылка+" успешно исправлен.");        	
        	КонецЦикла;
КонецПроцедуры
  1. Сохраняем внешнюю обработку на компьютере;
  2. Запускаем информационную базу в режиме предприятия и через меню «Файл»-«Открыть…» находим нашу сохраненную обработку. Открывается форма с кнопкой, для которой мы реализовали код. Активируем исполнение описанного выше алгоритма нажатием на кнопку и получаем сообщения об успешном исправлении.
Рис.5 Внешняя обработка
Рис.5 Внешняя обработка

У этого способа есть недостаток – обработка не сохраняется в конфигурации. То есть, если через некоторое время добавят новый реквизит, то снова придется ее найти, адаптировать и открыть через основное меню. Но такие ситуации достаточно редки, так как перед вводом системы в эксплуатацию идет тщательный аудит с составлением списка нужных реквизитов. Гораздо более распространены ситуации, когда пользователям необходимо в процессе работы править данные в строках, например, изменять количество.

Добавление в ИБ дополнительной обработки

В конфигурациях, использующих библиотеку стандартных подсистем, существует возможность дополнять функциональность системы, не внося изменений в конфигурацию. Это очень удобный механизм и все компании, не снимающие типовые базы с поддержки, используют его. Реализуется это при помощи внешних обработок и отчетов одного из предусмотренных платформой видов:

  • ЗаполнениеОбъекта;
  • ДополнительнаяОбработка;
  • СозданиеСвязанныхОбъектов;
  • ПечатнаяФорма;
  • Отчет;
  • ДополнительныйОтчет.

Для пользователя управляемая обработка заполнения табличной части документов идеально подходит первого вида – «ЗаполнениеОбъекта». Для того чтобы воспользоваться этим механизмом, нам понадобится в режиме конфигуратор создать новую внешнюю обработку. Заполняем ее имя и сохраняем на компьютер, чтобы в дальнейшем после настройки, подключить ее в нашу информационную базу.

Рис.6 Заполнение данных обработки
Рис.6 Заполнение данных обработки

На следующем шаге создаем в модуле объекта внешней обработки процедуру для определения типа функционала. Она типичная для всех дополнительных обработок и отчетов, подключаемых к 1С 8.3, с небольшими отличиями в зависимости от вида. В качестве основных настроек используются следующие пункты:

  1. Вид – указывается 1 из вышеперечисленных вариантов;
  2. МасНазначений – массив, включающий в себя все объекты конфигурации, на которые предполагается добавить новый функционал;
  3. Наименование – как будет называться наша доработка в общем списке;
  4. БезопасныйРежим – ограничение определенных действий для обработки;
  5. Команды – список кнопок, которые появятся в объектах, перечисленных в МасНазначений.

 Функция СведенияОВнешнейОбработке() Экспорт
        	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.1");
        	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();  //ВидОбработкиПечатнаяФорма();
        	МасНазначений = Новый Массив;
        	МасНазначений.Добавить("Документ.ЗаказНаПеремещение");
        	МасНазначений.Добавить("Документ.ЗаказПоставщику");
        	
        	ПараметрыРегистрации.Назначение = МасНазначений;
        	ПараметрыРегистрации.Наименование = "ДобавитьКоличество";
        	ПараметрыРегистрации.БезопасныйРежим = Ложь;
        	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
        	НоваяКоманда.Представление = НСтр("ru = 'ДобавитьКоличество'");
        	НоваяКоманда.Идентификатор = "ДобавитьКоличество";
        	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
        	НоваяКоманда.ПоказыватьОповещение = Истина;
        	Возврат ПараметрыРегистрации;
КонецФункции

Далее мы добавим пустую форму обработки и переключимся на ее модуль. Переключаются между формой и ее модулем с помощью закладок в нижней части окна. Следом добавляем процедуру «ВыполнитьКоманду» на клиентской стороне с нужным нам алгоритмом. Чтобы завершить создание обработки заполнения табличных частей, осталось лишь сохранить результат работы.


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) экспорт
Для каждого стр из ВладелецФормы.Объект.Товары цикл
        	стр.Количество = стр.Количество + 10;	
        	стр.КоличествоУпаковок = стр.КоличествоУпаковок + 10; 	
КонецЦикла;
КонецПроцедуры

После сохранения внешней обработки нам остается только подключить ее в базу 1С в режиме предприятия. Запускаем 1С, заходим в раздел «НСИ и администрирование», «Печатные формы, отчеты и обработки». Открываем форму «Дополнительные отчеты и обработки» и перед нами открывается список всех подключенных объектов.

Рис.7 НСИ и администрирование
Рис.7 НСИ и администрирование

Нажав «Добавить из файла…», выбираем сохраненный файл, и 1С при помощи процедуры «СведенияОВнешнейОбработке» подгружает всю информацию. Нам лишь остается сохранить данные и зайти в документы, чтобы проверить результат работы. Так как в коде описаны действия на стороне клиента, чтобы данные попали в базу, необходимо провести документ после изменения количества.

Рис.8 Проведение документа
Рис.8 Проведение документа

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

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

Доброго дня!
Будьте добры, подскажите, пожалуйста!

Имеется:
1. Справочник «ТехнологическаяКарта». В нем реквизит — «ГотоваяПродукция» и ТЧ «Сырье» с колонкой «Номенклатура»
2. Документ «ТехнологическаяОперация» с четырмя ТЧ — «ГотоваяПродукция», «Сырье», «Комплектующие» и «Убытки».
В данному документе один из реквизитов — «ТехнологическаяКарта» имеет тип -СправочникСсылка.ТехнологическаяКарта

Задача:

Как сделать, чтобы При выборе технологической карты, автоматически заполнились табличные части данными из справочника. А именно, чтоб в колонку «Номенклатура» ТЧ «ГотоваяПродукция» попали данные из реквизита «ГотоваяПродукция» справочника «ТехнологическаяКарта», а колонка «Номенклатура» ТЧ «Сырье» и «Убытки» заполнились Номенклатурой из ТЧ «Сырье» справочника «ТехнологическаяКарта».

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

За ранее благодарен!

Добавлено через 1 час 59 минут
Попробовал вытянуть данные хотя бы для одной ТЧ:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
&НаКлиенте
Процедура ТехнологическаяКартаПриИзменении(Элемент)
         ЗаполнитьТабличнуюЧасть();
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьТабличнуюЧасть()
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ГотоваяПродукция.Наименование
        |ИЗ
        |    Справочник.ТехнологическиеКарты КАК ТехнологическиеКарты";
 
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Для каждого Стр из РезультатЗапроса Цикл
        НоваяСтрока = Объект.ГотоваяПродукция.Добавить();
        НоваяСтрока.Номенклатура = Результат.Наименование; 
    КонецЦикла
КонецПроцедуры

Что-то не получается (((

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.

Заполнение табличной части 1С 8.3

Очень часто встречается задача заполнить табличную часть какими-нибудь  значениями, например результатом выполнения запроса.  Для демонстрации реализуем пример, в котором выполняется заполнение табличной части. Сделаем небольшую учебную задачу: будем заполнять табличную часть документа всей номенклатурой, которая не помечена на удаление. Количество при этом будет равно 1. Для заполнения табличной части документа нам необходимо работать с  одноименной таблицей реквизита Объект, который является основным реквизитом управляемой формы.

Табличная часть реквизита Объект

Поскольку по условиям задачи, необходимо отобрать всю не помеченную на удаление номенклатуру, то оптимально это сделать при помощи запроса, в котором я буду получать все не помеченные элементы справочника номенклатура. Я создал команду, при выполнении которой будет заполняться табличная часть, и разместил её на форме.

Команда 1С и размещение её на форме

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

&НаСервере
Процедура ЗаполнитьТоварамиНаСервере()

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

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТоварами(Команда)
    ЗаполнитьТоварамиНаСервере();
КонецПроцедуры

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

Обратите внимание, поскольку при обходе запроса и заполнения новой строки, я использую метод ЗаполнитьЗначенияСвойств, то поля в запросе должны называться так же, как и поля табличной части.

Очистка табличной части документа 1С 8.3

Если  мы реализуем данный код, то он будет не совсем корректен: каждый раз при выполнении этого кода будут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, будем очищать имеющиеся строки,  перед добавлением новых строк. Для этого воспользуемся методом Очистить объекта СписокТоваров, который имеет тип  ДанныйФормыКоллекция.

Объект.СписокТоваров.Очистить();

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

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

Текущая строка табличной части 1С 8.3

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле  (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.

Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.

Возврат полей свойством ТекущиеДанные

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

Обработчик ПриИзменении поля таблицы формы

В этом обработчике напишем код, который будет пересчитывать значения полей текущей строки табличной части.

&НаКлиенте
Процедура СписокТоваровЦенаПриИзменении(Элемент)
	ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат; //если пустая таблица
	КонецЕсли;
	ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

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

&НаКлиенте
Процедура УмножитьНа2(Команда)
    ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат; //если пустая таблица
    КонецЕсли;
    ТекДанные.Количество = ТекДанные.Количество * 2;
    ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
ИдентификторСлед = Идентификтор + 1;

Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
    Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
КонецЕсли;

В этом коде мы получаем идентификатор текущий строки при помощи свойства таблицы управляемой формы ТекущаяСтрока, и если мы не выходим за приделы таблицы, то сдвигаем нашу текущую строку на один шаг вниз.

Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.

&НаКлиенте
Процедура СписокТоваровКоличествоПриИзменении(Элемент)
    Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
    Если Идентификтор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Обход табличной части 1С

Часто возникают задачи обойти табличную часть и изменить какие-либо значения в столбцах. В предыдущих примерах мы изменяли текущую стоку таблицы, теперь реализуем пример, когда нужно изменить все строки. В этом случае нет необходимости обращаться к элементам формы, можно работать напрямую с основным реквизитом Объект.

&НаКлиенте
Процедура УмножитьВсеНа2(Команда)

    ТабОбх = Объект.СписокТоваров;
    Для Каждого стрТабл из ТабОбх Цикл
        стрТабл.Количество = стрТабл.Количество * 2;
        стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество;
    КонецЦикла;

КонецПроцедуры

Остальные статьи по теме конфигурирования в 1С:

Конфигурирование табличный частей объектов 1С

Справочники в 1С 8.3

Документы в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

 0 

   

Распечатать

1С 8.3 : Как заполнить поле табличного поля данными при добавлении новой строки

Часто при вводе новой строки табличного поля нужно автоматически заполнить некоторые колонки, например Дата или Ставка НДС:

При добавлении в табличное поле новой строки может возникнуть ситуация, когда необходимо заполнить некоторые поля новой строки значениями по умолчанию. Для этого следует использовать событие ПриНачалеРедактирования() табличного поля. Обработчик данного события вызывается при начале редактирования старой или добавленной строки табличного поля и имеет параметры НоваяСтрока и Копирование. Параметр НоваяСтрока указывает, что происходит редактирование новой строки, а параметр Копирование указывает, что происходит копирование строки. Ниже код для управляемого приложения и обычного:

Код 1C v 8.3

 &НаКлиенте
Процедура ВерсииПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
 Если НоваяСтрока И Не Копирование Тогда
        Элемент.ТекущиеДанные.Дата = ТекущаяДата();
    КонецЕсли;
КонецПроцедуры

Результат при добавлении новой строки:


В обычном приложении:

Код 1C v 8.х

 Процедура СоставПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

    // Заполнение поля СтавкаНДС значением по умолчанию.
    Если НоваяСтрока И Не Копирование Тогда

        Элемент.ТекущиеДанные.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;

    КонецЕсли;

КонецПроцедуры

есть форма обработки, на которую брошено два поля ввода: 1ое с типом СправочникСсылка.Банк, второе — ДокументСсылка.ПереносДанных. Вопрос: как пройтись по табличной части документа «Перенос данных» с заполнением реквизита «Банк» значением из соотвествующего поля ввода. …Дааа, я чувствую, тут мне не семерка :(

Из ДокументСсылка.ПереносДанных получай объект, потом с помощью «Для каждого из» перебирай ТЧ.

Объект можно и не получать Для Каждого СтрокаПереноса Из ДокументСсылкаПереносаДанных Цикл КОнецЦикла

Внутри цикла в строка таб. части док-та переноса данных и есть строка таблицной части…. ДокументСсылкаПереносаДанных — ссылка на таблицную часть документа, т.е. <ИмяРеквизитаПоляВводаДокументаПереносаДанных>.<ИмяТабличнойЧасти>

Автор не просто считывает, а заполнить хочет.

В пример, в принципе правильный, но прокатает и без первой строки

Кто-то по-умному отличие между объектом и ссылка тут писал…

Извини, тогда ОБЪЕКТ НУЖЕН

Тогда мне непонятно почему «но» В пример, в принципе правильный, но сработает и без первой строки

Не прокатает. Записать данные можно только в объект.

+ А, сорри, я туплю… :)

— Спасибо! Вот это скорость! :)

+ Да только я поторопился с пониманием задачи :(. Не вс

ё так просто. Табличная часть документа — ни что иное, как ТаблицаРегистровСведений. А банк — это одно из измерений данного регистра сведений..Хм, хм…

Табличная часть документа — ни что иное, как ТаблицаРегистровСведений это как?

тогда тебе надо читать книжки про РегистрыСведений и НаборыРегистров…

НаборыЗаписей, то бишь…

Да, вижу — без этого, похоже, никак :( Спасибо. Подумаю над этим…

НаборЗаписей.Отбор.Документ.Установить(<ДокументСсылка.ПереносДанных>); не понимает, понимает НаборЗаписей.Отбор.Регистратор.Установить(<ДокументСсылка.ПереносДанных>). Но теперь не понимает: Запись.Банк=<СправочникСсылка.Банк>;  ( в смысле — не присваивает)..Буду дальше думать :(

ты бы лучше свой код показал, чем на пальцах рассказывать…

Да код практически тот же, что предложил: Вот присвоения и не происходит (Запись.Банк=ПолеВвода1).

А как это «не происходит» выглядит?

смотри типы в отладчике… не совпадают они…

Огромнейшее спасибо! Ну конечно же дело в типах! Ну кто же мог подумать, что банк в регистре — это контрагент, а вовсе не банк! Всем спасибо. Вопрос решен.

Тэги:

Комментарии доступны только авторизированным пользователям

Понравилась статья? Поделить с друзьями:
  • Заполнить реквизиты справочника обработка 1с
  • Дополнительное образование договор реквизиты
  • Заполярная строительная компания руководство
  • Дополнительные реквизиты для справочников 1с
  • Запрет на покупку акций иностранных компаний