Имя: Пароль:
1C
1С v8
Проверка заполненности поля табличной части
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);
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.