Имя: Пароль:
1C
1С v8
Как осуществить проверку на наименование товара в 1С8
0 pnamik
 
20.02.15
09:54
Добрый день. Подскажите, пожалуйста, как можно осуществить проверку заполнения наименования товара? Удается проверить в целом заполнения ячейки наименование с помощью

Если СокрЛП(Наименование) = "" Тогда
        Предупреждение("На заполнено наименование!");
        Отказ = Истина;
        Возврат;
    КонецЕсли;    

Необходимо, чтобы проверка осуществлялась по другому: Если наименование состоит не меньше трех слов (например, куртка женская EIFEL или ботинки мужские б/тм), то можно записать элемент, а если меньше трех (например, куртка женская, или ботинки) чтобы выдал предупреждение "не правильно заполнено наименование'. Спасибо заранее за подсказки
1 РеализоВано
 
20.02.15
09:57
ЗначениеЗаполнено()
2 polosov
 
20.02.15
09:57
(0) Разбей предложение на слова, посчитай их, несколько Если Тогда Иначе
3 shuhard
 
20.02.15
09:57
(0) что-то мешает разбить строку по пробелам и сосчитать число слогов ?
4 MSOliver
 
20.02.15
09:59
(3)Три   слова?
5 polosov
 
20.02.15
09:59
+(2)  Задача на уровне школьников, тренирующихся на языке Рапира.
6 evorle145
 
20.02.15
09:59
(0) , Практически во всех типовых конфигурациях (обычно в общем модуле "ОбщегоНазначения") есть функция РазложитьСтрокуВМассивПодстрок()
7 MSOliver
 
20.02.15
10:00
(0) иногда конфигурации бывают типовые, в очень редких случаях данный механизм в них уже реализован... Эх, вот если бы знать...
8 MSOliver
 
20.02.15
10:01
СтрЗаменить(РазбираемаяСтрока," ",Симолы.ПС);
9 pnamik
 
20.02.15
10:01
конфигурация самописная, 1С 8.0.18.2
варианты СокрЛП(Наименование) = "" + ""  Тогда
не подходит
10 pnamik
 
20.02.15
10:02
(5) если можешь предлагай, пожалуйста, варианты для школьника.
11 evorle145
 
20.02.15
10:02
Функция обРазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
    
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока 1=1 Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
    
КонецФункции // обРазложитьСтрокуВМассивПодстрок
12 anatoly
 
20.02.15
10:03
(11) это есть в ОбщегоНазначения, если типовая
а потом проверить количество в массиве.
профит.
13 kosts
 
20.02.15
10:04
Удалить лишние пробелы, посчитать оставшееся количество пробелов.
14 pnamik
 
20.02.15
10:05
(11) не думаю, что такие сложности там потребуется. кажется одной строкой можно обойтись. Надеюсь (5) подскажет варианты для школьника
15 MSOliver
 
20.02.15
10:06
(14) Зачем (5)? См. (8)!
16 evorle145
 
20.02.15
10:10
Если обРазложитьСтрокуВМассивПодстрок(Наименование, " ").Количество<3 Тогда
Отказ = истина;
КонецЕсли;

Чего сложного-то?
17 evorle145
 
20.02.15
10:10
Если обРазложитьСтрокуВМассивПодстрок(Наименование, " ").Количество()<3 Тогда
Отказ = истина;
КонецЕсли;
18 MSOliver
 
20.02.15
10:11
Отказ = СтрЧислоВхождений(Наименование," ")=>3;
19 MSOliver
 
20.02.15
10:11
Отказ = НЕ СтрЧислоВхождений(Наименование," ")=>3;
20 MSOliver
 
20.02.15
10:12
(17) в трёх словах, два пробела!)
21 anatoly
 
20.02.15
10:13
(17) а вдруг пробелы по краям? или в середине по два-три?
22 kosts
 
20.02.15
10:15
(17) Правильно. (19) Не правильно
23 pnamik
 
20.02.15
10:15
(16) и (17) выдает ошибку при добавлениии в процедуру Передзаписью


{Справочник.Номенклатура.Форма.ФормаЭлемента(23,7)}: Процедура или функция с указанным именем не определена (обРазложитьСтрокуВМассивПодстрок)
    Если <<?>>обРазложитьСтрокуВМассивПодстрок(Наименование, " ").Количество<3 Тогда
24 kosts
 
20.02.15
10:17
(23) Ну так скопируй (11)
25 pnamik
 
20.02.15
10:21
скопировал функцию (11), также (16) ставил в процедуру ПередЗасписью (Отказ) при записи элемента выдал ошибку

{Справочник.Номенклатура.Форма.ФормаЭлемента(52)}: Поле объекта не обнаружено (Количество)
    Если обРазложитьСтрокуВМассивПодстрок(Наименование, " ").Количество<3 Тогда
26 ИС-2
 
naïve
20.02.15
10:23
обРазложитьСтрокуВМассивПодстрок замени на Общегоназначения.РазложитьСтрокуВМассивПодстрок
27 evorle145
 
20.02.15
10:23
(25) , после количество нужны "()", я тебе об этом в (17) написал. Но советую тебе читать ошибки и пытаться вникать в них. Но вместе с тем, я не понимаю, почему тебе лень понять смысл ошибки, а мне не лень тебе это объяснять.
28 kosts
 
20.02.15
10:24
Так попробуй
m = обРазложитьСтрокуВМассивПодстрок(Наименование, " ");
Если m.Количество<3 Тогда
29 evorle145
 
20.02.15
10:24
(26) см (9)
30 MSOliver
 
20.02.15
10:25
Ваще-то надо как в (14)
31 MSOliver
 
20.02.15
10:26
(22) Вы правы
32 pnamik
 
20.02.15
10:28
(27) спасибо тебе огромное, похоже, получилось, проверю в разных вариациях сейчас. Ты большой умница
33 MSOliver
 
20.02.15
10:28
Отказ = СтрЧислоВхождений(СокрЛП("1 2 3")," ")>2;
34 1976vas
 
20.02.15
10:28
(17) Только надо еще и убрать пробелы сначала справа и слева, могут же быть...
35 kosts
 
20.02.15
10:29
(30) Ну если так

Найти(СтрЗаменить(СтрЗаменить(СтрЗаменить(с, "    ", " "), "   ", " "), "  ", " ")) > 2
36 kosts
 
20.02.15
10:29
(35) Сокр еще забыл
37 MSOliver
 
20.02.15
10:30
Я думаю Победа!
38 Maniac
 
20.02.15
10:31
Вот дауны то пошли....
39 pnamik
 
20.02.15
10:31
спешил, выдает предупреждение о том, что не правильно заполнена наименование, но записывает товар, а нужно, чтобы пока не правилам не давал записывать
40 polosov
 
20.02.15
10:31
Функция РазбитьСтрокуНаСлова(СтрокаДляРазбития)
    МассивСлов = Новый Массив;    
    СтрокаСлов = СтрЗаменить(СтрокаДляРазбития," ",Символы.ПС+Символы.ВК);
    Для Индекс = 1 ПО СтрЧислоСтрок(СтрокаСлов) Цикл
        МассивСлов.Добавить(СтрПолучитьСтроку, Индекс);
    КонецЦикла;
    Возврат МассивСлов;

КонецФункции
41 Maniac
 
20.02.15
10:31
Правильно не Количество а Количество()
42 kosts
 
20.02.15
10:32
(41) Да кто ж его запомнит как правильно. Давеча в C# вроде свойством видел
43 polosov
 
20.02.15
10:32
+(40) Вот правильно


Функция РазбитьСтрокуНаСлова(СтрокаДляРазбития)
    МассивСлов = Новый Массив;    
    СтрокаСлов = СтрЗаменить(СтрокаДляРазбития," ",Символы.ПС+Символы.ВК);
    Для Индекс = 1 ПО СтрЧислоСтрок(СтрокаСлов) Цикл
        МассивСлов.Добавить(СокрЛП(СтрПолучитьСтроку(СтрокаСлов)), Индекс);
    КонецЦикла;
    Возврат МассивСлов;

КонецФункции
44 Maniac
 
20.02.15
10:33
Вообще правильный ответ был еще в 11. Но почему то чувак ее переименовал - это полностью типовая стандартнавя процедура.
От 1С.

Вызываем.

И делаем проверку на Количество()
Все нах.
45 Maniac
 
20.02.15
10:33
(42) в 1С все методы со скобками.
46 MSOliver
 
20.02.15
10:34
(35) Ожидается символ ,
47 pnamik
 
20.02.15
10:34
(43) а в процедуру ПередЗаписью что добавить?
48 kosts
 
20.02.15
10:34
(45) В языках которые я знаю, аналогично
49 MSOliver
 
20.02.15
10:34
(44) Читаем внимательно, конфа самописка
50 polosov
 
20.02.15
10:36
(47) Если РазбитьСтрокуНаСлова(Наименование).Количество < 3 Тогда
Отказ = Истина;
КонецЕсли;
51 MSOliver
 
20.02.15
10:36
Кароче жесть, тут на час работы!
52 banco
 
20.02.15
10:37
переходите на 8.3.6 ))

Если СтрРазделить(Наименование, " ").Количество()<3 Тогда
   Отказ = Истина;
КонецЕсли;
53 Maniac
 
20.02.15
10:39
Пипец. Уволил бы всех по списку.
54 pnamik
 
20.02.15
10:41
(11) срабатывает в части предупреждение, после нажатия ок (согласия с предупреждением), записывает элемент, а нужно, чтобы не записывал, пока не по правилам наименование

спасибо (11)помогло пока. Возврат забыл. Спасибо за терпение
55 polosov
 
20.02.15
10:41
(53) Да ктоб к тебе пошел...
Нудятину терпеть блин.
56 pnamik
 
20.02.15
10:42
сейчас проверю (43) и (50). очень добры и терпеливы
57 pnamik
 
20.02.15
10:50
(50) выдал ошибку
добавил , после запятой что не понимаю

{Справочник.Номенклатура.Форма.ФормаЭлемента(49,64)}: Ожидается символ ','
        МассивСлов.Добавить(СокрЛП(СтрПолучитьСтроку(СтрокаСлов<<?>>)), Индекс);
{Справочник.Номенклатура.Форма.ФормаЭлемента(49,65)}: Неопознанный оператор
        МассивСлов.Добавить(СокрЛП(СтрПолучитьСтроку(СтрокаСлов)<<?>>), Индекс);
{Справочник.Номенклатура.Форма.ФормаЭлемента(50,5)}: Ожидается ключевое слово 'КонецФункции' ('EndFunction')
    <<?>>КонецЦикла;
58 polosov
 
20.02.15
10:56
МассивСлов.Добавить(СокрЛП(СтрПолучитьСтроку(СтрокаСлов,Индекс));
59 polosov
 
20.02.15
11:00
(57) Возможно еще потребуется проверка на пустую строку, если были несколько пробелов подряд
60 pnamik
 
20.02.15
11:02
МассивСлов.Добавить(СокрЛП(СтрПолучитьСтроку(СтрокаСлов,Индекс));  добавил в конце еще одно )

и еще и в (50) после количество добавил (), сработало. Молодцы. проверю сейчас с пробелами
61 pnamik
 
20.02.15
11:05
на пустую строку проверка уже есть в (0). не пускает с пробелами.

(58) и (11) спасибо и здоровья Вам. также всем тем, кто участвовал в обсужден
ии
62 evorle145
 
20.02.15
11:06
(61) главное чтоб на пользу пошло)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.