Изменение реквизита в строке табличной части

Изменение данных поля строки табличной части

Я
   gmax007

24.07.13 — 15:56

8.2 Управляемые формы. Как изменить данные определенного поля во всех строках (в цикле) в уже открытой форме при нажатии на кнопку, новые данные рассчитываются умножением данных из других полей. В отладчике все считается, ошибок нет, а на форме ничего не меняется. Помогите

  

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

   ДенисЧ

1 — 24.07.13 — 16:04

Беги на сервер и там меняй…

Если это ТЧ объекта, то через Объект.ТЧ, Иначе РеквизитФормыВЗначение(«ТЧ»); ЗначениеВРеквизитФормы(); КОнецЕсли;

   Поросенок Петр

2 — 24.07.13 — 16:04

Ошибка в 4-й строке. Однозначно.

   gmax007

3 — 24.07.13 — 16:20

(1) а как на сервере к полю ТЧ обратиться чтобы его перезаписать как раз. Объект.ТЧ — сама ТЧ, а его поле

   ДенисЧ

4 — 24.07.13 — 16:23

(3) Каком кверху :-)

Для Каждого стр из Объект.Тч Цикл

 Стр.Реквизит3 = стр1.Реквизит1 + стр.Реквизит2;

КонецЦикла;

   banco

5 — 24.07.13 — 16:25

(1) можно и на клиенте

   palpetrovich

6 — 24.07.13 — 16:32

(5) +1

&НаКлиенте

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

   РаботаСДокументамиНаКлиенте.РасчитатьСумму(СтрокаТабличнойЧасти);

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

   palpetrovich

7 — 24.07.13 — 16:32

+ 6 поудалял лишнее :)

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

   gmax007

8 — 24.07.13 — 16:36

(4)  + 6

Да все это я пробовал, в отладчике все считается например

Для Каждого стр из Объект.Тч Цикл

 Сообщить(Стр.Реквизит3);

КонецЦикла;

честно сообщает, а вот

Для Каждого стр из Объект.Тч Цикл

 Стр.Реквизит3 = стр1.Реквизит1 + стр.Реквизит2;

КонецЦикла;

ну считается реквизит3 а вот на форме не меняется

   gmax007

9 — 24.07.13 — 16:38

то же и на клиенте происходит

   gmax007

10 — 24.07.13 — 16:43

&НаСервере

Процедура ПересчетПоКурсу(Курс)

ЗакРубСумма = 0;

//ТаможенныеРасходы — имя ТЧ

Для Каждого стр из Объект.ТаможенныеРасходы Цикл

 Стр.ЗакупочнаяЦенаРуб = Стр.ЗакупочнаяЦенаДол*Курс;

 ЗакРубСумма = ЗакРубСумма + Стр.ЗакупочнаяЦенаРуб;

КонецЦикла

вот конкретный пример

   palpetrovich

11 — 24.07.13 — 16:57

все работает:

// в форме документа:

&НаКлиенте

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

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

   РаботаСДокументамиНаКлиенте.РасчитатьСумму(СтрокаТабличнойЧасти);

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

// общий модуль, в свойствах флаг — только на «Клиент(упр.прил)

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

   СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;

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

   gmax007

12 — 24.07.13 — 17:00

Попробую, отпишусь, щас вспоминаю раньше тоже что-то подобное через общий модуль пришлось делать

А вот здесь

&НаСервере

Процедура ПересчетПоКурсу(Курс)

ЗакРубСумма = 0;

//ТаможенныеРасходы — имя ТЧ

Для Каждого стр из Объект.ТаможенныеРасходы Цикл

 Стр.ЗакупочнаяЦенаРуб = Стр.ЗакупочнаяЦенаДол*Курс;

 ЗакРубСумма = ЗакРубСумма + Стр.ЗакупочнаяЦенаРуб;

КонецЦикла

Реквизиты readonly штоль? почему он выводит (Сообщить), а не пишет? Так уж интересно просто

   gmax007

13 — 25.07.13 — 09:12

{ОбщийМодуль.МойОбщийМодуль.Модуль(3)}: Значение не является значением объектного типа (ЗакупочнаяЦенаРуб)

      СтрокаТабличнойЧасти.ЗакупочнаяЦенаРуб = СтрокаТабличнойЧасти.ЗакупочнаяЦенаДол*Курс;

В чем может быть дело?

   Капитан О

14 — 25.07.13 — 09:14

(13) в СтрокаТабличнойЧасти

   gmax007

15 — 25.07.13 — 09:19

Ну это я понял, а как мне посчитать то ее в общем модуле?

   Капитан О

16 — 25.07.13 — 09:21

(15) присвоить туда строку ТЧ, а не всякую хню

   gmax007

17 — 25.07.13 — 09:23

(11)

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

текущие данные это же вроде когда пользователь выделяет строку в ТЧ, а у меня должен просто дату курса доллара менять и вся ТЧ тутже пересчитываться

   Капитан О

18 — 25.07.13 — 09:25

кажется, начинает работать мозг

   gmax007

19 — 25.07.13 — 10:00

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

   cw014

20 — 25.07.13 — 10:02

Я подозреваю, что на форме таблица никак не связана с ТЧ

   Капитан О

21 — 25.07.13 — 10:06

(19) передавай данные из данных

   gmax007

22 — 25.07.13 — 10:06

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

   cw014

23 — 25.07.13 — 10:08

(22) Ну не знаю. Если увижу картинку — отвечу, иначе вариантов мильон

   gmax007

24 — 25.07.13 — 10:09

(21) Можно попроще я не профессионал, данные из данных это что конкретно вот например мне нужно передать в общий модуль данные строки

Я передаю стр = ЭтаФорма.Элементы.ИмяТЧ.(а здесь что только не пробовал)

Я понимаю что я не сами данные а форму передаю

Приведите пожалуйста пример что за данные из данных

   Капитан О

25 — 25.07.13 — 10:10

(24) пример: РассчитатьТЧ(ТЧ)

   gmax007

26 — 25.07.13 — 10:19

(23)

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

[URL=http://radikal.ru/fp/03ce8092253049279292726195c4033a][IMG]http://s55.radikal.ru/i150/1307/83/e3483044ffdft.jpg[/IMG][/URL]

   gmax007

27 — 25.07.13 — 10:20

   cw014

28 — 25.07.13 — 10:21

Код в студию

   gmax007

29 — 25.07.13 — 10:28

Модуль формы

&НаКлиенте

Процедура ПолучитьКурс(ДатаКурса)

    Курс = 0;

  ПолучениеКурса(ДатаКурса, Курс);

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

&НаСервере

Процедура ПолучениеКурса(ДатаКурса, Курс)

  Обработка = РеквизитФормыВЗначение(«Объект»);

  Курс = Обработка.ПересчетДолларовВРублиНаУказДату(ДатаКурса);

  ЗначениеВРеквизитФормы(Обработка, «Объект»);

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

&НаКлиенте

Процедура ДатаОплатыПоступленияПриИзменении(Элемент)

    ДатаКурса = Объект.ДатаОплатыПоступления; //новая дата курса

    Курс = 0;

    ПолучениеКурса(ДатаКурса, Курс);// Курс прилетает на нужную ДатаКурса

    Строка = ЭтаФорма.Элементы.ТаможенныеРасходы;    //СтрокаТабличнойЧасти = ЭтаФорма.Элементы.ТаможенныеРасходыЗакупочнаяЦенаРуб;  // здесь незнаю что нужно получить для передачи в общий модуль

    ЗакРубСумма = 0;  

    МойОбщийМодуль.ПересчитатьПоКурсуДляСебестоимости (Строка, Курс, ЗакРубСумма); // Идем в общий модуль вместе со строкой и курсом      

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

Общий модуль (должно считаться типа того и переписать данные ТЧ)

Для каждого цикл

строка.ценаРуб = строка.ценаДол*Курс

конеццикла

   Капитан О

30 — 25.07.13 — 10:30

(29) ПересчетДолларовВРублиНаУказДату — вот тут пиши верный код

   gmax007

31 — 25.07.13 — 10:33

Курс = Обработка.ПересчетДолларовВРублиНаУказДату(ДатаКурса);

В Курс записывается правильный курс из регистра, а ПересчетДолларовВРублиНаУказДату(ДатаКурса) в модуле объекта у меня, тут нормально я получаю курс, который можно передать в общий модуль, а если не оптимизировано, то это потом буду смотреть

   cw014

32 — 25.07.13 — 10:41

Строка = ЭтаФорма.Элементы.ТаможенныеРасходы;    //СтрокаТабличнойЧасти = ЭтаФорма.Элементы.ТаможенныеРасходыЗакупочнаяЦенаРуб;  // здесь незнаю что нужно получить для передачи в общий модуль

Убирай этот фееричный бред

   gmax007

33 — 25.07.13 — 10:43

(32) что мне  передать вместо моего бреда в общий модуль чтоб можно было пересчитать ТЧ

   Капитан О

34 — 25.07.13 — 10:44

(33) дату, если она не является реквизитом

   cw014

35 — 25.07.13 — 10:44

Элементы.ТвояТЧ.ТекущиеДанные

   Капитан О

36 — 25.07.13 — 10:46

(35) скажи как умный товарищ, зачем без формы пересчитывать то, что живёт только на форме? (у автора так же?)

   cw014

37 — 25.07.13 — 10:47

(36) Понятия не имею. Я весь код не вижу, да и задача до конца мне не ясна. Она так то в течение 5 минут решается

   Капитан О

38 — 25.07.13 — 10:49

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

   gmax007

39 — 25.07.13 — 10:49

Данные = Элементы.ТаможенныеРасходы.ТекущиеДанные; уже тип Неопределено

   gmax007

40 — 25.07.13 — 10:50

я ж пробовал так сто раз текущиеданные, текущаястрока толку нет

   Капитан О

41 — 25.07.13 — 10:50

(39) зачем тебе элементы? зачем тебе текущая строка?

   cw014

42 — 25.07.13 — 10:50

(39) Логично, строка то не выбрана

Делай так:

Для Каждого СтрокаТЧ ИЗ Объект.ТвояТЧ Цикл

    МойОбщийМодуль.ПересчитатьПоКурсуДляСебестоимости (СтрокаТЧ, Курс, ЗакРубСумма); // Идем в общий модуль вместе со строкой и курсом

КонецЦикла;

   gmax007

43 — 25.07.13 — 10:51

(38)

именно как у Радченко, только там строка становиться текущий, потому что пльзователь на ней стоит и меняет цену (вроде) , а у меня при изменении даты, которая в шапке а не ТЧ

   Капитан О

44 — 25.07.13 — 10:51

(43) поэтому тебе надо переработать всю таблицу

   cw014

45 — 25.07.13 — 10:52

(43) см (42)

   Капитан О

46 — 25.07.13 — 10:52

а я за цикл в ОМ

   gmax007

47 — 25.07.13 — 10:53

(44) вот я и прошу, чтоб ткнули что нужно в таком случае вместо текущейстроки передавать, чтоб тип был у данных и посчитать

   gmax007

48 — 25.07.13 — 10:56

(42) тоже самое все там передается СтрокаТЧ (которую как раз я и не знаю как получить), вопрос не вцикле и в аргументах, а в том какую строку (как получить) (или же поле) передать для подсчета

   gmax007

49 — 25.07.13 — 10:56

(42) Напиши что есть СтрокаТЧ из приведенного примера

   cw014

50 — 25.07.13 — 10:56

(48) Тебе готовое решение твоей проблемы написали

   cw014

51 — 25.07.13 — 10:57

(49) СтрокаТЧ из приведенного примера — это ДанныеФормыЭлементКоллекции

   gmax007

52 — 25.07.13 — 11:00

(51) (8)

   cw014

53 — 25.07.13 — 11:02

(25) > (20)

   cw014

54 — 25.07.13 — 11:02

(52) Либо данная колонка не связана с реквизитом

   Капитан О

55 — 25.07.13 — 11:03

(54) я вообще понял, что у него всё на форме живёт

   gmax007

56 — 25.07.13 — 11:13

(55) может я что-то непонимаю про житье на форме ну я писал что реквизиты заполняются/считаются еще при создании этого документа на основании другого

вот реквизиты, связаны они, я табличную часть наформу перетаскивал реквизитом

http://s020.radikal.ru/i703/1307/ab/1ad6cb5c6fa2.jpg

   gmax007

57 — 25.07.13 — 11:15

Через Объект. можно обратиться к ТЧ

   gmax007

58 — 25.07.13 — 11:21

То есть я могу обратиться Объект.ИмяТЧ, но не могу Объект.ИмяТЧ.Реквизит, так должно или не должно быть?

   Капитан О

59 — 25.07.13 — 11:23

(58) какая из трёхсот строк имеется в виду во втором случае?

   gmax007

60 — 25.07.13 — 11:25

(59) О = Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб

Прогнал через отладчик — поле объекта не обнаружено, может заново весь док и форму построить

   Капитан О

61 — 25.07.13 — 11:26

(60) а на вопрос ответь

   gmax007

62 — 25.07.13 — 11:27

говорю же Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб не работает а Объект.ТаможенныеРасходы. Эти случаи имеешь виду?

   cw014

63 — 25.07.13 — 11:27

Я пасс, я уже не знаю как объяснять. Уже на пальцах разжевали и в рот положили, он все равно свое гнет

   gmax007

64 — 25.07.13 — 11:28

(63)не гнул бы если работало

   Капитан О

65 — 25.07.13 — 11:28

(62) какая строка?

   Капитан О

66 — 25.07.13 — 11:28

(64) пока будешь гнуть, не заработает

   gmax007

67 — 25.07.13 — 11:29

(65) писал же сто раз Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб

   Капитан О

68 — 25.07.13 — 11:31

(67) в ТЧ тысяча строк. закупочную цену какой ты сейчас показал?

   gmax007

69 — 25.07.13 — 11:32

Ладно, буду заново форму строить или весь документ

   gmax007

70 — 25.07.13 — 15:01

Короче все по другому сделал. Теперь пользователь у меня не будет менять дату курса, а будет ее указывать в окне обработки (а также записываться в константу), которая создает документ и передает управление обработке заполнения на основании, которое также будет указано в окне обработки, так даже лучше потому что не будет дефолтного заполнения , которое будет не на нужную дату, а сразу. А те расчеты чот у меня не получились также считаются в заполнении но у же с нужным курсом на дату(из константы)

   Капитан О

71 — 25.07.13 — 15:59

спорим, константа тут на фих не нужна?

   gmax007

72 — 25.07.13 — 16:12

(71)

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

   Капитан О

73 — 25.07.13 — 16:19

(72) оптимизация — это о другом. в твоём случае делать правильно нужно

   gmax007

74 — 25.07.13 — 16:23

(73) Да я хочу побыстрей доделать документ, регистры евошние потом ну и отчеты, показать экономистам что себестоимость так как им нужно считается)) торопют целыми днями. А вообще у меня получается что из обработки после ОткрытьФорму выполняется обработка заполнения, я не знаю как передать основание и дату курса (указанные в окне обработки) в нее из ОткрытьФорму, а вот додумался через константы. примитив конечно же, зато доволен что считается

   Капитан О

75 — 25.07.13 — 16:33

(74) спешка нужна лишь при ловле блох

  

gmax007

76 — 26.07.13 — 11:28

странно

&НаСервере

Процедура ПересчетПоКурсу(Курс)

ЗакРубСумма = 0;

//ТаможенныеРасходы — имя ТЧ

Для Каждого стр из Объект.ТаможенныеРасходы Цикл

  Стр.ЗакупочнаяЦенаРуб = Стр.ЗакупочнаяЦенаДол*Курс;

  КонецЦикла

Здесь не записывалось в Стр.ЗакупочнаяЦенаРуб

Позже делал подобную вещь только распределение себестимости

там было

Для Каждого стр из Объект.ТаможенныеРасходы Цикл

  Стр.Расходы = Стр.ЗакупочнаяЦенаРуб ну и формула расчета;

  КонецЦикла

и все в Стр.Расходы записалось

Казалось бы, простая задача – изменить данные в определённой строке табличной части документа или справочника.

Получаем объект, табличную часть которого надо изменить. Используем метод ПолучитьОбъект().

Итак, у нас есть табличная часть и есть метод Найти(), который возвращает строку табличной части. Однако при попытке присвоить полю найденной строки какого-либо значения, система выдаёт ошибку.

Выход: изменять строки табличной части в цикле.

Допустим, табличная часть называется «Товары». Она имеет две колонки: «Номенклатура» и «Артикул».

Обходим строки табличной части в цикле и изменяем то, что нам нужно.

Для Каждого СтрокаТабличнойЧасти Из Товары Цикл

	Если СтрокаТабличнойЧасти.Артикул = "0001" Тогда
	
		СтрокаТабличнойЧасти.Артикул = "0123";
		
	КонецЕсли;
	
КонецЦикла; 
Информация о материале
Категория: Программирование 1С

Опубликовано: 20 апреля 2016

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 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

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

Автор filomonko, 14 мар 2022, 17:51

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте! Новичок в 1С! Конфигурация самописанная. Управляемое приложение.
Есть документ «Оказание услуг», в нем реквизит в шапке «Категория» (СправочникСсылка.КатегорииНомеров).
В табличной части есть «Услуга» из справочника «Услуги» (Объект.ПереченьУслуг.Услуга).
Необходимо в обработчике события ПриИзменении у элемента «Категория» сделать так, чтобы автоматически добавлялась строка с услугой «Проживание», которая находится в предопределенных элементах справочника «Услуги». Так же необходимо сделать с единицей измерения (Объект.ПереченьУслуг.ЕдиницаИзмерения) «сутки», которая хранится в перечислении «ЕдиницыИзмерения».
Ещё интересует вариант с командой «Добавить» по кнопке.
Запуталась во всём этом   <_<
Буду благодарна любому совету. Спасибо!  :) 


Вы хотите при любом изменении реквизита «Категория» добавлять в табличную часть новую строку с услугой Проживание?

НоваяСтрока = Объект.Услуги.Добавить();
НоваяСтрока.Услуга = Справочники.Услуги.Проживание;
НоваяСтрока.Количество = 1;
...
По поводу варианта с командой «Добавить» не понятно чем он вас так заинтересовал. Нужна конкретика что не понятно и что хотите получить по итогу.

  • 1 пользователь сказал спасибо!


Должно быть, чтобы при добавлении какой-либо категории добавлялась в новую строку услуга проживания. Если она уже добавлена, больше добавлять нельзя. А вариант действия по команде тоже интересен. Чтобы можно было реализовать добавление цены по той самой категории из регистра сведений «ЦеныКатегорий». И как проще это реализовать?


Может вынести в реквизиты все связанное с проживанием (уже на форме есть и дата заселения и выезда). Табличная часть с услугами будет представлять из себя перечень дополнительных услуг. Документ можно назвать не оказание услуг, а например бронирование номера. Лучше больше времени уделить продумыванию что где хранить и в чем. Кроме цен наверное где то нужно хранить забронированные номера (какой и на сколько).
Если все же есть желание не отказываться от хранения проживания в табличной части, тогда нужно гораздо больше кодить. При изменении категории все будет просто.

ПараметрыОтбора = Новый Структура("Услуга",Справочники.Услуги.Проживание);
НайденыеСтроки = Объект.Услуги.НайтиСтроки(ПараметрыОтбора);
Если НайденыеСтроки.Количество() = 0 Тогда
НоваяСтрока = Объект.Услуги.Добавить();
НоваяСтрока.Услуга = Справочники.Услуги.Проживание;
НоваяСтрока.Количество = 1;
КонецЕсли;

  • 1 пользователь сказал спасибо!



Как вариант можно вот так (в обработчике ОбработкаВыбора реквизита Услуга табличной части).

&НаКлиенте
Процедура УслугиУслугаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = РазрешитьДобавитьУслугу(ВыбранноеЗначение);
Если СтандартнаяОбработка = Ложь Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В документе должна быть всего одна услуга Проживание";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция РазрешитьДобавитьУслугу(ВыбранноеЗначение)
Результат = Истина;
УслугаПроживание = Справочники.Услуги.Проживание;
Если ВыбранноеЗначение = УслугаПроживание Тогда
ПараметрыОтбора = Новый Структура("Услуга", УслугаПроживание);
НайденныеСтроки = Объект.Услуги.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
Результат = Ложь;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Заполнение табличной части документа при изменении реквизита шапки документа

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

5 / 4 / 1

Регистрация: 24.08.2017

Сообщений: 112

1

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

08.11.2018, 11:39. Показов 6485. Ответов 4


Доброго времени суток! Форумчане, подскажите пожалуйста, ситуация следующая, есть 3 перечисления и есть 3 разные табличные части, например перечисления 1, 2, 3 и табличные части А, Б, В. Необходимо чтоб при выборе перечисления в поле менялась табличная часть, т.е. например перечислению 1 соответствовала тч А и т.д.
Как это можно реализовать? И аналогично можно было показывать или скрывать некоторые реквизиты документа. Мыслей просто никаких нет, не так давно изучаю 1С



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.11.2018, 11:39

4

1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,161

Записей в блоге: 1

08.11.2018, 12:14

2

Рисуешь 3 ТЧ
при открытии — перечисление = 1, тч1.видимость = истина. остальные ложь
при изменении перечисления — если перечисление = 2, то тч1 и тч3 .видимость = ложь, 2 — истина
аналогично для других



1



ДядяВаня

5 / 4 / 1

Регистрация: 24.08.2017

Сообщений: 112

08.11.2018, 13:04

 [ТС]

3

Yulunga, я вот тоже об этом подумал, большое спасибо!

Добавлено через 35 минут
Yulunga, а можете привести пример кода для проверки на конкретное значение в поле? 1С 8.3

1C
1
2
3
4
5
6
7
8
&НаКлиенте
Процедура ПриИзменении(_Вид_Заказа)
    
    Если Элементы._Вид_Заказа = _Вид_Заказа._Заказ_на_мебель Тогда
        Элементы._Заказ_На_Фасады.Доступность = Ложь;
        Элементы._Индивидуальный_заказ.Доступность = Ложь;
    КонецЕсли;
КонецПроцедуры

По моему я написал какую-то дичь. И необходимо чтоб ТЧ сразу становились недоступны. Это реально реализовать?



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

08.11.2018, 14:07

4

Лучший ответ Сообщение было отмечено GreenkA как решение

Решение

ДядяВаня, при сравнении значений используйте данные Объекта, а видимостью управляйте — через Элементы. Предопределенные значения, как справочников, так и перечислений, получаются на сервере, но есть клиентский метод — ПредопределенноеЗначение():

1C
1
2
3
4
5
6
7
8
9
&НаКлиенте
Процедура ПриИзменении(_Вид_Заказа)    
    Если Объект._Вид_Заказа = ПредопределенноеЗначение("Перечисление._Вид_Заказа._Заказ_на_мебель") Тогда //укажите верно имя перечисления
        Элементы._Заказ_На_Фасады.Доступность = Ложь;
        Элементы._Индивидуальный_заказ.Доступность = Ложь;
    ИначеЕсли ... Тогда
   ////
    КонецЕсли;
КонецПроцедуры



1



ДядяВаня

5 / 4 / 1

Регистрация: 24.08.2017

Сообщений: 112

08.11.2018, 14:41

 [ТС]

5

Решилтаким кодом, спасибо за помощь!

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаКлиенте
Процедура _ВидЗаказаПриИзменении(Элемент)
    Если Объект._ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ЗаказНаМебель") Тогда 
        ЭтаФорма.Элементы.Группа_Заказ_На_Мебель.Видимость = Истина;
        ЭтаФорма.Элементы.Группа_Заказ_На_Фасады.Видимость = Ложь;
        ЭтаФорма.Элементы.Группа_Индивидуальный_Заказ.Видимость = Ложь;
        
    ИначеЕсли Объект._ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ЗаказНаФасады") Тогда 
        ЭтаФорма.Элементы.Группа_Заказ_На_Мебель.Видимость = Ложь;
        ЭтаФорма.Элементы.Группа_Заказ_На_Фасады.Видимость = Истина;
        ЭтаФорма.Элементы.Группа_Индивидуальный_Заказ.Видимость = Ложь;
        
    ИначеЕсли Объект._ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ИндивидуальныйЗаказ") Тогда 
        ЭтаФорма.Элементы.Группа_Заказ_На_Мебель.Видимость = Ложь;
        ЭтаФорма.Элементы.Группа_Заказ_На_Фасады.Видимость = Ложь;
        ЭтаФорма.Элементы.Группа_Индивидуальный_Заказ.Видимость = Истина;
    КонецЕсли;
 
КонецПроцедуры



2



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

08.11.2018, 14:41

Помогаю со студенческими работами здесь

Присвоение значения реквизита к табличной части
Здравствуйте!
Помогите пожалуйста с присвоением. Такая вот проблема, есть документ &quot;Приказ на ввод…

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

Получение значения реквизита табличной части. 1С:Предприятие 8.3
Здравствуйте! Подскажите, пожалуйста, как получить значение реквизита табличной части (в…

Ограничить выбор реквизита (документа) в табличной части
Добрый день.

Платформа 8,3
Бухгалтерия 3.0, внешняя обработка.

Есть табличная часть, в…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

5

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

А если быть точней то изменить дату у записей в табличной части, но по аналогии можно изменить все что угодно.

Как изменить дату в ТЧ у всех записей

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

Изменение ТЧ

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

Как изменить данные в табличной части документа в 1С

В открывшемся модуле пишем следующий код.

&НаКлиенте
Процедура ИзменитьДату(Команда)
УстановкаДаты = "";
Результат = ВвестиДату(УстановкаДаты, "Введите дату", ЧастиДаты.Дата);   
Для Каждого ДанныеСтроки Из Объект.Работы Цикл
    ДанныеСтроки.Дата =  УстановкаДаты;
КонецЦикла;
КонецПроцедуры

УстановкаДаты = «»; — задаем пустое значение для переменной в которой будет храниться дата.

Результат = ВвестиДату(УстановкаДаты, «Введите дату», ЧастиДаты.Дата); — открываем форму ввода даты и сохраняем её в переменную УстановкаДаты.

И в цикле перебираем строки и записываем дату.

Как изменить дату в ТЧ у всех записей

Сохраняем и запускаем программу. Открываем документ в который вносили изменения, теперь на форме появилась кнопка «Изменить дату», которая открывает окно в котором можно выбрать дату.

Как изменить дату в табличной части

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

1С 8.3 Как изменить данные в табличной части документа

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

Если возникли трудности то пишите в комментариях обязательно помогу.

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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