|
Проверка заполненности поля табличной части | ☑ | ||
---|---|---|---|---|
0
BlackRouZ
21.03.18
✎
12:19
|
Доброго времени суток.
Прошу помощи. Конфигурация Розница 2.1 Есть потребность, чтобы в режиме РМК, кассиры не могли произвести продажу без указания продавца. Как проверить поле в шапке я разобрался. Не могу понять как сделать проверку в табличной части. Сразу извиняюсь, за возможно не правильную терминологию и формулировку. В 1С, я совсем новичок. В шапке есть объект Объект.Продавец, его я вычислил без труда и всё работает. Но в табличной части, если я правильно понял ссылка Объект.Товары.Продавец , но если я указываю именно так, то просто выдаётся ошибка, что поле "Продавец" не существует. |
|||
1
BlackRouZ
21.03.18
✎
12:21
|
||||
2
hhhh
21.03.18
✎
12:24
|
(1) циклы кури
|
|||
3
lodger
21.03.18
✎
12:24
|
(0) Объект.Товары это таблица.
сперва надо получить строку таблицы. если надо проверить поле в каждой строке таблицы, тогда надо организовать обход строк таблицы. Для Каждого СтрокаТаб из Объект.Товары Цикл тогда в СтрокаТаб поочередно попадут все строчки. в каждой строке получаешь Продавец и проверяешь(а еще, можно заполнить продавцом из шапки). |
|||
4
BlackRouZ
21.03.18
✎
12:35
|
Да вот как раз и сижу пытаюсь разобрать как написать цикл)
Условием ниже проверяется шапка. &НаКлиенте Процедура КомандаЧО05Наличные(Команда) Если ЗначениеЗаполнено (Объект.Продавец) Тогда ОплатитьТовары("ФормаПростойОплаты"); ИначеЕсли Не ЗначениеЗаполнено (Объект.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); КонецЕсли; КонецПроцедуры Если с условием немного разбираюсь, с циклами пока что сложности. |
|||
5
lodger
21.03.18
✎
12:41
|
(4) ну так бери и пиши
Для Каждого СтрокаТаб из Объект.Товары Цикл КонецЦикла после Если ЗначениеЗаполнено (Объект.Продавец) Тогда в ИначеЕсли Не ЗначениеЗаполнено (Объект.Продавец) Тогда можно писать просто Иначе |
|||
6
BlackRouZ
21.03.18
✎
16:41
|
Спасибо за наводку. Вроде бы уловил мысль. Попытался вывести через если, нашёл нужный объект. С 1м товаром прокатывает, если больше позиций, то уже требуется цикл.
Но не могу понять в какой коллекции искать элемент продавец. Т.е. смотрите в каком случае мой код работает корректно(По поводу замены ИначеЕсли на Иначе - понял, просто пока не переделывал). &НаКлиенте Процедура КомандаЧО06ПлатежнаяКарта(Команда) Если ЗначениеЗаполнено (Элементы.Товары.ТекущиеДанные.Продавец) Тогда ОплатитьТовары("ФормаПростойОплаты"); ИначеЕсли Не ЗначениеЗаполнено (Элементы.Товары.ТекущиеДанные.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); КонецЕсли; КонецПроцедуры Теперь хочу сверху добавить цикл, но не понимаю, что и где искать. Как определить в какой коллекции находится нужная мне строчка табличной части? Код выше рабочий, но выполняется только для 1 позиции в таблице, на последующие уже не реагирует, поэтому хочу, чтобы перебиралась каждая позиция. |
|||
7
BlackRouZ
21.03.18
✎
17:16
|
К сожалению не тот элемент нашёл. Столкнулся с новой проблемой. С циклом разобрался откуда брать. Но появилась новая проблема.
Для Каждого Продавец ИЗ Объект.Товары Цикл Если ЗначениеЗаполнено (Элементы.Товары.ТекущиеДанные.Продавец) Тогда ОплатитьТовары("ФормаПростойОплаты"); ИначеЕсли Не ЗначениеЗаполнено (Элементы.Товары.ТекущиеДанные.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); КонецЕсли; КонецЦикла; КонецПроцедуры В данном случае "Оповещение" появляется только в случае, если курсор стоит на строке где нет продавца. А если у нас 4 позиции, в 1й из них указан продавец, а в 3х других продавец не указан, то тут всё зависит от того на какой строчке стоит курсор. Если на строчке - где продавец указан, то продажа проходит. А если переключить на строчку где продавец не указан, то только в этом случае показывает "Оповещение". |
|||
8
lodger
21.03.18
✎
18:17
|
(7) похоже вы вообще не читаете что вам пишут. прочитайте тред заново.
|
|||
9
BlackRouZ
22.03.18
✎
11:18
|
Я всё внимательно читал.
Вы имеете ввиду, что должен быть такой код: Для Каждого СтрокаТаб из Объект.Товары Цикл КонецЦикла; Если ЗначениеЗаполнено (Объект.Продавец) Тогда ОплатитьТовары("ФормаПростойОплаты"); Иначе Не ЗначениеЗаполнено (Объект.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); КонецЕсли; КонецПроцедуры Если так, то в данном случае у меня получается только с "ИначеЕсли", при использовании "Иначе" выдаётся ошибка при проверке кода. И код срабатывает только при отсутствии/наличии продавца в шапке(Под стрелкой 2 на скриншоте), а на отсутствие/наличиие продавца в табличной части не срабатывает(под стрелкой 1 на скриншоте). http://ipev.ru/image/OtU Поправьте пожалуйста, если я не правильно понял. То, что вы предложили я проверил в первые 2 минуты и у меня получилось то, что получилось. |
|||
10
igorPetrov
22.03.18
✎
11:22
|
(9) Может книжки по программированию чуть почитать сначала?
|
|||
11
BlackRouZ
22.03.18
✎
11:25
|
"Может книжки по программированию чуть почитать сначала?" Я как раз ждал таких ценных советов. Учусь на курсах уже. Жаль что ни кто не написал "Погугли", а то так подобных советов не хватает.
|
|||
12
igorPetrov
22.03.18
✎
11:26
|
(11) Погугли.
|
|||
13
igorPetrov
22.03.18
✎
11:26
|
(11) Плохо учишься. Учись внимательнее и не беги вперед паровоза.
|
|||
14
BlackRouZ
22.03.18
✎
11:31
|
А Вы видимо хорошо учились. Много ума нужна написать "Книжки почитай" и "Погугли. А чтобы реально помочь, то тут уже возникают трудности.
|
|||
15
hhhh
22.03.18
✎
11:33
|
(14) ну вот это смотрите
Для Каждого Продавец ИЗ Объект.Товары Цикл Если ЗначениеЗаполнено (Элементы.Товары.ТекущиеДанные.Продавец) текущая строка у нас "Продавец", правильно? |
|||
16
igorPetrov
22.03.18
✎
11:33
|
(14) Ты сам просил написать "Погугли". Ты просишь не помощь, а готовый код.
|
|||
17
BlackRouZ
22.03.18
✎
11:45
|
"текущая строка у нас "Продавец", правильно?"
Да, всё верно. Но в данном случае реакция происходит именно на ту строчку, где стоит курсор. Если я курсор поставлю на строчку с выбранным продавцом, то будет считать что и остальные строчки тоже заполнены. А если выбираю строчку с пустым продавцом, то даже там, где продавец указан, будет считаться, что продавец ни где не указан. Чисто ради примера воспользовался кодом: Сообщить(Элементы.Товары.ТекущиеДанные.Продавец); Пробовал нечто похожее делать через цикл, результат тот же. http://ipev.ru/image/Ot8 http://ipev.ru/image/Otf |
|||
18
hhhh
22.03.18
✎
11:51
|
(17) почему вы тогда пишете не "Продавец", а вот этот нереальный бред? Элементы.Товары.ТекущиеДанные.Продавец? Откуда вы эту хрень откопали? Где-то увидели? Понравилось четырехэтажное слово?
|
|||
19
BlackRouZ
22.03.18
✎
11:55
|
"почему вы тогда пишете не "Продавец", а вот этот нереальный бред? Элементы.Товары.ТекущиеДанные.Продавец? Откуда вы эту хрень откопали? Где-то увидели? Понравилось четырехэтажное слово?"
Случайным образом наткнулся. Если указать просто продавец, то как писал выше, он проверяет исключительно шапку. http://ipev.ru/image/Otb |
|||
20
igorPetrov
22.03.18
✎
11:56
|
(19) "Случайным образом наткнулся" -Ппц.
|
|||
21
BlackRouZ
22.03.18
✎
12:04
|
""Случайным образом наткнулся" -Ппц."
Хорошо умный человек, может расскажешь как мне определить точное ссылку на эту поле? |
|||
22
lodger
22.03.18
✎
16:46
|
(17) я тебе в переборе советовал ставить слово "Продавец"? нет? вот и не ставь. у тебя эта переменная зарезервирована в реквизитах объекта.
|
|||
23
lodger
22.03.18
✎
16:46
|
(21) читай все с начала.
|
|||
24
BlackRouZ
22.03.18
✎
17:41
|
Спасибо добрый человек! Я наконец-то догнал!
Для Каждого СтрокаТаб из Объект.Товары Цикл КонецЦикла; Если ЗначениеЗаполнено (СтрокаТаб.Продавец) Тогда ОплатитьТовары("ФормаПростойОплаты"); //2 ИначеЕсли Не ЗначениеЗаполнено (СтрокаТаб.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); КонецЕсли; КонецПроцедуры Спасибо большое. |
|||
25
lodger
22.03.18
✎
18:55
|
ух.ё.
код вроде перевели на русский. а один х. "КонецЦикла;" - на мысли не наводит... |
|||
26
xxTANATORxx
22.03.18
✎
18:57
|
(0)а почему у реквизита не поставить "Проверку заполнения"???
|
|||
27
xxTANATORxx
22.03.18
✎
18:58
|
(26)+ в Обработке проверки заполнения его можно докурить
|
|||
28
BlackRouZ
22.03.18
✎
22:46
|
"а почему у реквизита не поставить "Проверку заполнения"???"
Пробовал. Реакции 0 |
|||
29
BlackRouZ
23.03.18
✎
14:23
|
lodger
"ух.ё. код вроде перевели на русский. а один х. "КонецЦикла;" - на мысли не наводит..." Видимо это был сарказм, что всё таки код отработает не должным образом). Ещё 1 моментик заметил). При текущем коде вроде всё хорошо. Но как я выяснил выполняется проверка только последней строчки, если у нас 10 позиций и вбить продавца только в последней строчке, а во всех верхних строчках продавец будет отсутствовать, то оплата пройдёт. Где я накосячил?) |
|||
30
BlackRouZ
23.03.18
✎
15:25
|
TheBest
Для Каждого СтрокаТаб из Объект.Товары Цикл Если Не ЗначениеЗаполнено (СтрокаТаб.Продавец) Тогда ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца!'"); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); Прервать; Иначе ОплатитьТовары("ФормаПростойОплаты"); КонецЕсли КонецЦикла; =) |
|||
31
BlackRouZ
23.03.18
✎
15:49
|
Издевательство какое-то. В данном варианте, если заполнить из 3х позиций первую и последнюю, то продажа проводится, а не должна.
|
|||
32
Kondarat
23.03.18
✎
15:54
|
СтрокиТЧ = "";
Для Каждого СтрокаТаб из Объект.Товары Цикл Если Не ЗначениеЗаполнено (СтрокаТаб.Продавец) Тогда СтрокиТЧ = СтрокиТЧ + Строка(СтрокаТаб.НомерСТроки) + ", "; КонецЕсли; КонецЦикла; Если НЕ ПустаяСтрока(СтрокиТЧ) ТОгда СтрокиТЧ = ЛЕВ(СтрокиТЧ,СтрДлина(СтрокиТЧ)-2); ЗаголовокИнформации = НСтр("ru = 'Выберите продавца!'"); ТекстИнформации = НСтр("ru = 'Перед пробитием чека необходимо указать продавца в строках:'" + СтрокиТЧ); ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстИнформации); Иначе ОплатитьТовары("ФормаПростойОплаты"); КонецЦикла; |
|||
33
BlackRouZ
23.03.18
✎
16:00
|
Kondarat Спасибо спаситель!
Всё работает). Теперь попробую разобраться что означают добавленные строки. |
|||
34
BlackRouZ
23.03.18
✎
16:13
|
Kondarat, если не сложно, не могли бы подсказать, для запоминания, что происходит в строчках:
СтрокиТЧ = СтрокиТЧ + Строка(СтрокаТаб.НомерСТроки) + ", "; И СтрокиТЧ = ЛЕВ(СтрокиТЧ,СтрДлина(СтрокиТЧ)-2); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |