Изменение данных поля строки табличной части |
Я |
24.07.13 — 15:56
8.2 Управляемые формы. Как изменить данные определенного поля во всех строках (в цикле) в уже открытой форме при нажатии на кнопку, новые данные рассчитываются умножением данных из других полей. В отладчике все считается, ошибок нет, а на форме ничего не меняется. Помогите
1 — 24.07.13 — 16:04
Беги на сервер и там меняй…
Если это ТЧ объекта, то через Объект.ТЧ, Иначе РеквизитФормыВЗначение(«ТЧ»); ЗначениеВРеквизитФормы(); КОнецЕсли;
2 — 24.07.13 — 16:04
Ошибка в 4-й строке. Однозначно.
3 — 24.07.13 — 16:20
(1) а как на сервере к полю ТЧ обратиться чтобы его перезаписать как раз. Объект.ТЧ — сама ТЧ, а его поле
4 — 24.07.13 — 16:23
(3) Каком кверху
Для Каждого стр из Объект.Тч Цикл
Стр.Реквизит3 = стр1.Реквизит1 + стр.Реквизит2;
КонецЦикла;
5 — 24.07.13 — 16:25
(1) можно и на клиенте
6 — 24.07.13 — 16:32
(5) +1
&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
РаботаСДокументамиНаКлиенте.РасчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
7 — 24.07.13 — 16:32
+ 6 поудалял лишнее
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
8 — 24.07.13 — 16:36
(4) + 6
Да все это я пробовал, в отладчике все считается например
Для Каждого стр из Объект.Тч Цикл
Сообщить(Стр.Реквизит3);
КонецЦикла;
честно сообщает, а вот
Для Каждого стр из Объект.Тч Цикл
Стр.Реквизит3 = стр1.Реквизит1 + стр.Реквизит2;
КонецЦикла;
ну считается реквизит3 а вот на форме не меняется
9 — 24.07.13 — 16:38
то же и на клиенте происходит
10 — 24.07.13 — 16:43
&НаСервере
Процедура ПересчетПоКурсу(Курс)
ЗакРубСумма = 0;
//ТаможенныеРасходы — имя ТЧ
Для Каждого стр из Объект.ТаможенныеРасходы Цикл
Стр.ЗакупочнаяЦенаРуб = Стр.ЗакупочнаяЦенаДол*Курс;
ЗакРубСумма = ЗакРубСумма + Стр.ЗакупочнаяЦенаРуб;
КонецЦикла
вот конкретный пример
11 — 24.07.13 — 16:57
все работает:
// в форме документа:
&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
РаботаСДокументамиНаКлиенте.РасчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
// общий модуль, в свойствах флаг — только на «Клиент(упр.прил)
Процедура РасчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;
КонецПроцедуры
12 — 24.07.13 — 17:00
Попробую, отпишусь, щас вспоминаю раньше тоже что-то подобное через общий модуль пришлось делать
А вот здесь
&НаСервере
Процедура ПересчетПоКурсу(Курс)
ЗакРубСумма = 0;
//ТаможенныеРасходы — имя ТЧ
Для Каждого стр из Объект.ТаможенныеРасходы Цикл
Стр.ЗакупочнаяЦенаРуб = Стр.ЗакупочнаяЦенаДол*Курс;
ЗакРубСумма = ЗакРубСумма + Стр.ЗакупочнаяЦенаРуб;
КонецЦикла
Реквизиты readonly штоль? почему он выводит (Сообщить), а не пишет? Так уж интересно просто
13 — 25.07.13 — 09:12
{ОбщийМодуль.МойОбщийМодуль.Модуль(3)}: Значение не является значением объектного типа (ЗакупочнаяЦенаРуб)
СтрокаТабличнойЧасти.ЗакупочнаяЦенаРуб = СтрокаТабличнойЧасти.ЗакупочнаяЦенаДол*Курс;
В чем может быть дело?
14 — 25.07.13 — 09:14
(13) в СтрокаТабличнойЧасти
15 — 25.07.13 — 09:19
Ну это я понял, а как мне посчитать то ее в общем модуле?
16 — 25.07.13 — 09:21
(15) присвоить туда строку ТЧ, а не всякую хню
17 — 25.07.13 — 09:23
(11)
А собственно почему СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
текущие данные это же вроде когда пользователь выделяет строку в ТЧ, а у меня должен просто дату курса доллара менять и вся ТЧ тутже пересчитываться
18 — 25.07.13 — 09:25
кажется, начинает работать мозг
19 — 25.07.13 — 10:00
Помогите, как мне данные из поля строки передать в общий модуль и там их перезаписать
20 — 25.07.13 — 10:02
Я подозреваю, что на форме таблица никак не связана с ТЧ
21 — 25.07.13 — 10:06
(19) передавай данные из данных
22 — 25.07.13 — 10:06
Все связано, она у меня заполняется из документа-основания, дефолтными данными которые я ей даю при обработке заполнения,там из документа-основания дата переходит в дату курса доллара и прям обработке заполнения все считается, а вот надо чтобы еще пользователь мог эту дату изменить вручную, и при изменении пересчиталось
23 — 25.07.13 — 10:08
(22) Ну не знаю. Если увижу картинку — отвечу, иначе вариантов мильон
24 — 25.07.13 — 10:09
(21) Можно попроще я не профессионал, данные из данных это что конкретно вот например мне нужно передать в общий модуль данные строки
Я передаю стр = ЭтаФорма.Элементы.ИмяТЧ.(а здесь что только не пробовал)
Я понимаю что я не сами данные а форму передаю
Приведите пожалуйста пример что за данные из данных
25 — 25.07.13 — 10:10
(24) пример: РассчитатьТЧ(ТЧ)
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]
27 — 25.07.13 — 10:20
28 — 25.07.13 — 10:21
Код в студию
29 — 25.07.13 — 10:28
Модуль формы
&НаКлиенте
Процедура ПолучитьКурс(ДатаКурса)
Курс = 0;
ПолучениеКурса(ДатаКурса, Курс);
КонецПроцедуры
&НаСервере
Процедура ПолучениеКурса(ДатаКурса, Курс)
Обработка = РеквизитФормыВЗначение(«Объект»);
Курс = Обработка.ПересчетДолларовВРублиНаУказДату(ДатаКурса);
ЗначениеВРеквизитФормы(Обработка, «Объект»);
КонецПроцедуры
&НаКлиенте
Процедура ДатаОплатыПоступленияПриИзменении(Элемент)
ДатаКурса = Объект.ДатаОплатыПоступления; //новая дата курса
Курс = 0;
ПолучениеКурса(ДатаКурса, Курс);// Курс прилетает на нужную ДатаКурса
Строка = ЭтаФорма.Элементы.ТаможенныеРасходы; //СтрокаТабличнойЧасти = ЭтаФорма.Элементы.ТаможенныеРасходыЗакупочнаяЦенаРуб; // здесь незнаю что нужно получить для передачи в общий модуль
ЗакРубСумма = 0;
МойОбщийМодуль.ПересчитатьПоКурсуДляСебестоимости (Строка, Курс, ЗакРубСумма); // Идем в общий модуль вместе со строкой и курсом
КонецПроцедуры
Общий модуль (должно считаться типа того и переписать данные ТЧ)
Для каждого цикл
строка.ценаРуб = строка.ценаДол*Курс
конеццикла
30 — 25.07.13 — 10:30
(29) ПересчетДолларовВРублиНаУказДату — вот тут пиши верный код
31 — 25.07.13 — 10:33
Курс = Обработка.ПересчетДолларовВРублиНаУказДату(ДатаКурса);
В Курс записывается правильный курс из регистра, а ПересчетДолларовВРублиНаУказДату(ДатаКурса) в модуле объекта у меня, тут нормально я получаю курс, который можно передать в общий модуль, а если не оптимизировано, то это потом буду смотреть
32 — 25.07.13 — 10:41
Строка = ЭтаФорма.Элементы.ТаможенныеРасходы; //СтрокаТабличнойЧасти = ЭтаФорма.Элементы.ТаможенныеРасходыЗакупочнаяЦенаРуб; // здесь незнаю что нужно получить для передачи в общий модуль
Убирай этот фееричный бред
33 — 25.07.13 — 10:43
(32) что мне передать вместо моего бреда в общий модуль чтоб можно было пересчитать ТЧ
34 — 25.07.13 — 10:44
(33) дату, если она не является реквизитом
35 — 25.07.13 — 10:44
Элементы.ТвояТЧ.ТекущиеДанные
36 — 25.07.13 — 10:46
(35) скажи как умный товарищ, зачем без формы пересчитывать то, что живёт только на форме? (у автора так же?)
37 — 25.07.13 — 10:47
(36) Понятия не имею. Я весь код не вижу, да и задача до конца мне не ясна. Она так то в течение 5 минут решается
38 — 25.07.13 — 10:49
(37) задача — пересчёт ТЧ. как в букваре радченко при изменении цены пересчитывается сумма. только у радченко вынесение кода в ОМ оправдано (данные пересчитываются без формы), а зачем автор захотел использовать модуль обработки — ещё вопрос
39 — 25.07.13 — 10:49
Данные = Элементы.ТаможенныеРасходы.ТекущиеДанные; уже тип Неопределено
40 — 25.07.13 — 10:50
я ж пробовал так сто раз текущиеданные, текущаястрока толку нет
41 — 25.07.13 — 10:50
(39) зачем тебе элементы? зачем тебе текущая строка?
42 — 25.07.13 — 10:50
(39) Логично, строка то не выбрана
Делай так:
Для Каждого СтрокаТЧ ИЗ Объект.ТвояТЧ Цикл
МойОбщийМодуль.ПересчитатьПоКурсуДляСебестоимости (СтрокаТЧ, Курс, ЗакРубСумма); // Идем в общий модуль вместе со строкой и курсом
КонецЦикла;
43 — 25.07.13 — 10:51
(38)
именно как у Радченко, только там строка становиться текущий, потому что пльзователь на ней стоит и меняет цену (вроде) , а у меня при изменении даты, которая в шапке а не ТЧ
44 — 25.07.13 — 10:51
(43) поэтому тебе надо переработать всю таблицу
45 — 25.07.13 — 10:52
(43) см (42)
46 — 25.07.13 — 10:52
а я за цикл в ОМ
47 — 25.07.13 — 10:53
(44) вот я и прошу, чтоб ткнули что нужно в таком случае вместо текущейстроки передавать, чтоб тип был у данных и посчитать
48 — 25.07.13 — 10:56
(42) тоже самое все там передается СтрокаТЧ (которую как раз я и не знаю как получить), вопрос не вцикле и в аргументах, а в том какую строку (как получить) (или же поле) передать для подсчета
49 — 25.07.13 — 10:56
(42) Напиши что есть СтрокаТЧ из приведенного примера
50 — 25.07.13 — 10:56
(48) Тебе готовое решение твоей проблемы написали
51 — 25.07.13 — 10:57
(49) СтрокаТЧ из приведенного примера — это ДанныеФормыЭлементКоллекции
52 — 25.07.13 — 11:00
(51) (8)
53 — 25.07.13 — 11:02
(25) > (20)
54 — 25.07.13 — 11:02
(52) Либо данная колонка не связана с реквизитом
55 — 25.07.13 — 11:03
(54) я вообще понял, что у него всё на форме живёт
56 — 25.07.13 — 11:13
(55) может я что-то непонимаю про житье на форме ну я писал что реквизиты заполняются/считаются еще при создании этого документа на основании другого
вот реквизиты, связаны они, я табличную часть наформу перетаскивал реквизитом
http://s020.radikal.ru/i703/1307/ab/1ad6cb5c6fa2.jpg
57 — 25.07.13 — 11:15
Через Объект. можно обратиться к ТЧ
58 — 25.07.13 — 11:21
То есть я могу обратиться Объект.ИмяТЧ, но не могу Объект.ИмяТЧ.Реквизит, так должно или не должно быть?
59 — 25.07.13 — 11:23
(58) какая из трёхсот строк имеется в виду во втором случае?
60 — 25.07.13 — 11:25
(59) О = Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб
Прогнал через отладчик — поле объекта не обнаружено, может заново весь док и форму построить
61 — 25.07.13 — 11:26
(60) а на вопрос ответь
62 — 25.07.13 — 11:27
говорю же Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб не работает а Объект.ТаможенныеРасходы. Эти случаи имеешь виду?
63 — 25.07.13 — 11:27
Я пасс, я уже не знаю как объяснять. Уже на пальцах разжевали и в рот положили, он все равно свое гнет
64 — 25.07.13 — 11:28
(63)не гнул бы если работало
65 — 25.07.13 — 11:28
(62) какая строка?
66 — 25.07.13 — 11:28
(64) пока будешь гнуть, не заработает
67 — 25.07.13 — 11:29
(65) писал же сто раз Объект.ТаможенныеРасходы.ЗакупочнаяЦенаРуб
68 — 25.07.13 — 11:31
(67) в ТЧ тысяча строк. закупочную цену какой ты сейчас показал?
69 — 25.07.13 — 11:32
Ладно, буду заново форму строить или весь документ
70 — 25.07.13 — 15:01
Короче все по другому сделал. Теперь пользователь у меня не будет менять дату курса, а будет ее указывать в окне обработки (а также записываться в константу), которая создает документ и передает управление обработке заполнения на основании, которое также будет указано в окне обработки, так даже лучше потому что не будет дефолтного заполнения , которое будет не на нужную дату, а сразу. А те расчеты чот у меня не получились также считаются в заполнении но у же с нужным курсом на дату(из константы)
71 — 25.07.13 — 15:59
спорим, константа тут на фих не нужна?
72 — 25.07.13 — 16:12
(71)
Возможно не нужна. Не знал как проще данные из общего модуля передать в модуль объекта моего документа, ну работает эта часть пока, оптимизировать потом мож буду
73 — 25.07.13 — 16:19
(72) оптимизация — это о другом. в твоём случае делать правильно нужно
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С 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 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 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)
Поиск
5 / 4 / 1 Регистрация: 24.08.2017 Сообщений: 112 |
|
1 |
|
Изменение табличной части в зависимости от выбранного реквизита08.11.2018, 11:39. Показов 6485. Ответов 4
Доброго времени суток! Форумчане, подскажите пожалуйста, ситуация следующая, есть 3 перечисления и есть 3 разные табличные части, например перечисления 1, 2, 3 и табличные части А, Б, В. Необходимо чтоб при выборе перечисления в поле менялась табличная часть, т.е. например перечислению 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 |
ДядяВаня 5 / 4 / 1 Регистрация: 24.08.2017 Сообщений: 112 |
||||
08.11.2018, 13:04 [ТС] |
3 |
|||
Yulunga, я вот тоже об этом подумал, большое спасибо! Добавлено через 35 минут
По моему я написал какую-то дичь. И необходимо чтоб ТЧ сразу становились недоступны. Это реально реализовать?
0 |
GreenkA 3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
||||
08.11.2018, 14:07 |
4 |
|||
Сообщение было отмечено GreenkA как решение РешениеДядяВаня, при сравнении значений используйте данные Объекта, а видимостью управляйте — через Элементы. Предопределенные значения, как справочников, так и перечислений, получаются на сервере, но есть клиентский метод — ПредопределенноеЗначение():
1 |
ДядяВаня 5 / 4 / 1 Регистрация: 24.08.2017 Сообщений: 112 |
||||
08.11.2018, 14:41 [ТС] |
5 |
|||
Решилтаким кодом, спасибо за помощь!
2 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
08.11.2018, 14:41 |
Помогаю со студенческими работами здесь Присвоение значения реквизита к табличной части Обращение к данным реквизита табличной части документа Получение значения реквизита табличной части. 1С:Предприятие 8.3 Ограничить выбор реквизита (документа) в табличной части Платформа 8,3 Есть табличная часть, в… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 5 |
Сегодня хочу рассказать о том как можно изменить табличную часть документа в 1С. Когда у меня не было опыта в программирования, и передо мной стояла подобная задача. Я обратился за помощью к интернету и очень сильно удивился, когда не нашел ответа на свой вопрос. В принципе было очень мало сайтов, на которых бы люди что-то рассказывали и объясняли. В основном это форумы, на которых новичку найти ответ очень сложно. Так как все отвечают очень кратко и в общих чертах. Остальная часть сайтов предлагала пройти курсы. Сегодня, хочу вам рассказать об одном способе, с помощью которого можно изменить табличную част документа.
А если быть точней то изменить дату у записей в табличной части, но по аналогии можно изменить все что угодно.
Как изменить дату в ТЧ у всех записей
И так допустим у на есть какой-то документ, у него есть табличная часть, в которой нужно что-то изменить, например, установить одну и туже дату, которую пользователь сам укажет.
Для этого нужно открываем конфиггуратор, найти документ, создать в нем команду «Изменить дату», открыть свойства данного элемента и перейти а Действие.
В открывшемся модуле пишем следующий код.
&НаКлиенте
Процедура ИзменитьДату(Команда)
УстановкаДаты = "";
Результат = ВвестиДату(УстановкаДаты, "Введите дату", ЧастиДаты.Дата);
Для Каждого ДанныеСтроки Из Объект.Работы Цикл
ДанныеСтроки.Дата = УстановкаДаты;
КонецЦикла;
КонецПроцедуры
УстановкаДаты = «»; — задаем пустое значение для переменной в которой будет храниться дата.
Результат = ВвестиДату(УстановкаДаты, «Введите дату», ЧастиДаты.Дата); — открываем форму ввода даты и сохраняем её в переменную УстановкаДаты.
И в цикле перебираем строки и записываем дату.
Сохраняем и запускаем программу. Открываем документ в который вносили изменения, теперь на форме появилась кнопка «Изменить дату», которая открывает окно в котором можно выбрать дату.
После выполнения данной команды, выбранная дата установиться для всех записей табличной части документа.
Если немного подправить данный код можно поменять любое значение в табличной части документа.
Если возникли трудности то пишите в комментариях обязательно помогу.
Табличные части существуют у многих объектов в 1С:
- Справочники
- Документы
- Отчеты и обработки
- Планы счетов
- Планы видов характеристик
- Планы видов расчета
- Бизнес-процессы и задачи
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить(Строка.РеквизитТабличнойЧасти);
КонецЦикла;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.
Для получения перечня выделенных строк используется следующий код:
ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;
Для того чтобы обойти выделенные строки используется цикл Для каждого:
ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;
Для каждого Строка из ВыделенныеСтроки Цикл
//содержимое цикла
КонецЦикла;
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();
Чтобы программно выделить все строки табличного поля:
Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;
Как очистить табличную часть
ТабличнаяЧасть.Очистить();
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;
Для управляемых форм:
Элементы.ИмяТабличногоПоля.ТекущиеДанные;
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока.Реквизит1=«Значение»;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле.
- НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры