Имя: Пароль:
1C
1С v8
Не срабатывает СтрЗаменить(...) - туплю..?
0 Злопчинский
 
05.08.16
05:43
Спр.Номенклатура
нужно: в наименовании и полном наименовании - слеши в обралении пробелами справа и/или слева заменить на " | "

- не заменяется в Наименовании...?

http://content.screencast.com/users/Che66/folders/Jing/media/2a3637e3-7aaf-4134-b998-0e03ebbd609b/2016-08-05_0539.png

[code]
    СпрН = СоздатьОбъект("Справочник.Номенклатура");
    СпрН.ИспользоватьРодителя(ВыбГруппа);
    СпрН.ПорядокКодов();
    СпрН.ВыбратьЭлементы(1);
    Пока СпрН.ПолучитьЭлемент()=1 Цикл
        поз = Найти(СпрН.Наименование,"\")+Найти(СпрН.ПолнНаименование,"\")+Найти(СпрН.Наименование,"/")+Найти(СпрН.ПолнНаименование,"/")+Найти(СпрН.Наименование,"  ")+Найти(СпрН.ПолнНаименование,"  ");
        Если поз = 0 Тогда Продолжить; КонецЕсли;
        Сообщить("-----------------------------------------------------");
        Сообщить(СпрН.Наименование);
        Сообщить(СпрН.ПолнНаименование);
        
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование," / ","/");
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование," \ ","/");
        
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование," /","/");
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование," \","/");
        
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование,"/ ","/");
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование,"\ ","/");
        
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," / ","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \ ","/");
        
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ ","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"\ ","/");

        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," /","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \","/");
        
        СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование,"/"," | ");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ "," | ");
        СпрН.Записать();
        
        Сообщить(СимволТабуляции+СпрН.Наименование,"i");
        Сообщить(СимволТабуляции+СпрН.ПолнНаименование,"i");
    КонецЦикла;

[/code]
1 Злопчинский
 
05.08.16
05:49
чуть попроще вариант, не работает

Процедура Сформировать()  
    
    СпрН = СоздатьОбъект("Справочник.Номенклатура");
    СпрН.ИспользоватьРодителя(ВыбГруппа);
    СпрН.ПорядокКодов();
    СпрН.ВыбратьЭлементы(1);
    
    Пока СпрН.ПолучитьЭлемент()=1 Цикл
        поз = Найти(СпрН.Наименование,"\")+Найти(СпрН.Наименование,"/");
        Если поз = 0 Тогда Продолжить; КонецЕсли;

        Сообщить("-----------------------------------------------------");
        Сообщить(СпрН.Наименование);
        
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," / ","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \ ","/");
        
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ ","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"\ ","/");

        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," /","/");
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \","/");
        
        СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ "," | ");
        СпрН.Записать();
        
        Сообщить(СимволТабуляции+СпрН.Наименование,"i");
        
    КонецЦикла;
    
КонецПроцедуры
2 Злопчинский
 
05.08.16
05:53
тьфу, тупняк. не замеил пробела.. глазки слиплись
3 Злопчинский
 
05.08.16
05:53
Модератор, убей ветку
4 Heckfy
 
05.08.16
08:55
Зачем столько много итераций... Можно шестью строками обойтись.
5 aleks_default
 
05.08.16
09:06
(3)А какже пообсирать?
6 Горогуля
 
05.08.16
09:07
(5) с вменяемыми людьми не получается ;) тупят иногда все, да
7 Это_mike
 
05.08.16
09:09
(6) вопрос - нафига такому человеку работать в такое время???
8 aleks_default
 
05.08.16
09:14
(7)Так он может не в Москве?
9 Горогуля
 
05.08.16
09:16
(7) может, это хобби. я вот в пять утра блины, бывало, готовил
//прикройте уже ветку ;)
10 DrZombi
 
гуру
05.08.16
09:19
(0) У тебя ошибка

СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ "," | ");

нужно

СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/"," | ");

Тогда будет 100% совпадение с

СпрН.ПолнНаименование = СтрЗаменить(СпрН.ПолнНаименование,"/"," | ");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ "," | ");
11 Злопчинский
 
05.08.16
20:55
Спасибо я все уже утром починил.
12 Garykom
 
гуру
05.08.16
21:20
О будущий возможный клиента
13 youalex
 
05.08.16
21:51
(1) глядя на код, можно подумать что это графический редактор времен Спектрума (но там вроде можно было напрямую в видеопамять пикать, без псевдо-графики)
14 Garykom
 
гуру
05.08.16
22:05
(13) У спектрума без псевдографики никак было (( видеопамяти тупо мало поэтому:

"При этом, хотя графическое разрешение составляло 256?192 точек, цветовые атрибуты задавались по знакоместам.
Каждое знакоместо размером 8?8 пикселей могло иметь только два приписанных ему цвета (называемые цветами «чернил» и «бумаги» в Sinclair BASIC) и по одному атрибуту яркости и мерцания."
15 Злопчинский
 
05.08.16
23:00
Чем вам всем, стервятники хреновы, код не нравится? ;-)
16 youalex
 
05.08.16
23:03
(14) ну, да. Если правильно помню, там видеопамять была - это собственно экран, причем пикселя были очень крупные, прямоугольники такие, восьми-цветные)) С мерцанием, ага, точно))

Жуткий оффтоп, конечно. Но пятница же. Помнится, была у меня игра всех времен и народов, сиречь Элита, а у меня на ТВ (Горизонт) умер красный цвет (вместо него был черный, неразличимый на фоне космоса). В упор не помню как, но я влез в этот код, и сделал красный цвет - синим - то есть различимым. И заверте...
17 Garykom
 
гуру
05.08.16
23:04
(15) Вместо этого:

СпрН.Наименование = СтрЗаменить(СпрН.Наименование," / ","/");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \ ","/");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"/ ","/");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование,"\ ","/");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование," /","/");
СпрН.Наименование = СтрЗаменить(СпрН.Наименование," \","/");

иврата.

Можно было использовать циклу куда передаем список замен.
18 Garykom
 
гуру
05.08.16
23:05
(16) Блин про Элиту!!! У меня однажды при загрузке с кассеты что то глюкануло и стали бесконечные бабки и топливо!!!
Во я оторвался то! но потом sav'ка не прочиталась ((
19 youalex
 
05.08.16
23:05
(15) нет, ну так то вполне даже нормальный код. Если распечатать, наверное, можно кафель по нему ложить в ванной. Например))
20 Garykom
 
гуру
05.08.16
23:06
(18) *бабки = креды, конечно же
21 Garykom
 
гуру
05.08.16
23:11
(17)+ Т.е. функция ВыполнитьЗамены(СпрН.Наименование, СписокЗамен).
Где СписокЗамен это СписокЗамен.Добавить(" / ","/");

Или даже из одной строки распарсить замены, но некий разделитель придется придумать которого в заменах не должно быть или формат.
СтрокаЗамен = "{ / }>{/};{ \ }>{/};..."
22 youalex
 
05.08.16
23:11
(18) Загрузка с кассеты - это да. Я помню у меня на одной кассете был Робокоп (или Бэтмэн, уже не суть, но интересная игруха), но запись была битая. И опять же не помню как, но как-то у меня получалось на слух? - пропускать битый участок на ленте, и догружать уже валидный. Ну вот - самому сейчас кажется что бред, но реально было такое.
23 youalex
 
05.08.16
23:17
(22) + а Элита, да, гениальная вещь. На 48 килобайтах так развернуться...
24 Garykom
 
гуру
05.08.16
23:18
(23) Там скелетная 3D графика была "честная" )) Посадка на станцию это иногда в кошмарах снилось ))
25 youalex
 
05.08.16
23:29
(24) кнопка C (стыковочный компьютер) решал проблему попадания во вращающуюся щель. А еще там была энергетическая бомба - натуральный чит. И еще, смутно помню, какой то mayday возле планеты возникал, на миссию что ли пытались зарядить, я так и не врубился, чистый прозрачный космос был мне ближе этих человеческих дрязг))
26 youalex
 
05.08.16
23:38
(20) Креды тоже поднимал( сознательно, но тоже хоть убей не помню как) Без артмани точно.
27 Злопчинский
 
05.08.16
23:40
(21) угу,я не возражаю. даже регекспы можно юзать.
но сабж представляет собой яркий пример когда копи-паст несет прямой вред ;-)

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

;-)
28 Злопчинский
 
05.08.16
23:41
Ибэдэдэ, тэдэдэ, скрам. эджайл. итд по пэдэдэ... бэтээр на кэпэпэ...
29 Garykom
 
гуру
05.08.16
23:45
(27) Моя регэкспы даже в трезвом уме и на бодрую голову нифуя не понимать.
Точнее прекрасно понимаю что это и зачем и как оно работает: конечный автомат чертов блин.

Но написать нечто сложное мне проще запросом )) Хотя не люблю запросы когда можно аналогично сделать кодом, легко/быстро потом исправимым/допиливаемым.
Т.е. мне чем выучить и освоить весь функционал регэкспов проще "свои регекспы" наваять со своим движком и фичами.

Примерно тоже самое было с КД, когда уже наваяна "своя КД" на XML тоже кстати и 2-й вариант на JSON так было напряжно типовую КД изучать с их типовыми правилами. Но изучил конечно ибо пришлось для заказа и даже понял в чем преимущества.
30 youalex
 
05.08.16
23:47
(27) копипаст - реальное зло. Реальное - то есть с рогами и копытами. Надысь столкнулся - восемь хранимок с абсолютно одинаковыми выражениями в результате. Но в одной из восьми - другое имя поля результата (as). В итоге приложение на андрюшке встает колом. Благо тестер грамотный, сразу поймал.
31 Смотрящий
 
05.08.16
23:47
Пока Найти(Стр, "/") > 0 Цикл
Стр = СтрЗаменить(Стр, "/", "");
Стр = СтрЗаменить(Стр, "  ", " ");
КонецЦикла
Стр = СокрЛП(стр);

и фтыкаешь ....
32 youalex
 
05.08.16
23:49
(31) а если оно всередини?
33 youalex
 
06.08.16
00:04
(32) А, оно может быть и в середине.. То есть СокрП не поможет..
Я бы запросом получил через Условие((Найти(Спр.Наименование, "/") >0) ИЛИ (..\..)

А перед этим - СЗ с искомыми значениями.
Это если в лоб решать.
34 Garykom
 
гуру
06.08.16
00:08
(31) Боюсь плохо въехали что нуна ТС, ему не нуна убрать "\" или "/" совсем.
Ему нуна убрать неправильные лишние пробелы, возможные вокруг слешей. Типа " \" меняем на "\" и т.д.

Т.е. привести наименования (номенклатуры) необходимо к некому стандартному регламентированному чем то виду.
35 Garykom
 
гуру
06.08.16
00:09
(34)+ "1 /2" - это ошибка, как и "1 / 2" и "1/ 2"

Должно быть везде "1/2"!
36 youalex
 
06.08.16
00:11
(35) точнее 1|2, если исходить из (0)
37 youalex
 
06.08.16
00:16
(0) извини(те) за вопрос. А зачем? Это ведь сто процентов не вопрос задачи, а вопрос метода её решения. Изначальная задача (проблема) в чём заключается?
38 Garykom
 
гуру
06.08.16
00:16
(36) Это уже маловажные детали )) лень было перечитывать что там конкретно нужно какой разделитель в этом спагетти-коде ))
39 Aleksey
 
06.08.16
00:59
Вставлю и я свои 5 копеек

Функция ПричесатьНаименование(Имя)
Имя = СтрЗаменить(Имя,"/",РазделительСтрок);
Имя = СтрЗаменить(Имя ,"\",РазделительСтрок);
Результат = СокрЛП(СтрПолучитьСтроку(Текст,1));
Для Номер=2 По СтрКоличествоСтрок(Имя) Цикл
  Результат = Результат+" | "+СокрЛП(СтрПолучитьСтроку(Текст,Номер));
КонецЦикла;
Возврат Результат;
КонецФункции

СпрН.Наименование = ПричесатьНаименование(СпрН.Наименование);
СпрН.ПолнНаименование = ПричесатьНаименование(СпрН.ПолнНаименование );
40 Aleksey
 
06.08.16
00:59
* Результат = СокрЛП(СтрПолучитьСтроку(Имя,1));
41 Garykom
 
гуру
06.08.16
01:11
(39) это не очень красиво

Результат = СокрЛП(СтрПолучитьСтроку(Текст,1));
Для Номер=2 По СтрКоличествоСтрок(Имя) Цикл
  Результат = Результат+" | "+СокрЛП(СтрПолучитьСтроку(Текст,Номер));
КонецЦикла;


лучше

Результат = "";
Для Номер=1 По СтрКоличествоСтрок(Имя) Цикл
  Результат = Результат + ?(Результат = ""; ""; " | ") + СокрЛП(СтрПолучитьСтроку(Текст,Номер));
КонецЦикла;
42 Garykom
 
гуру
06.08.16
01:13
(41)+ хотя разницы по длине кода никакой, а твое шустрее ((

но блин эстетическое чувство напрягается ))
43 Aleksey
 
06.08.16
02:16
Ну тут еще вопрос что делать если наименование начинается с / (\)?
44 Злопчинский
 
06.08.16
02:53
Пока вы тут решали какой код эффективнее, у ужо сто раз все решил. и жру икру с икрой
45 Злопчинский
 
06.08.16
03:05
например, сейчас стоит аналогичная задача...
торг12. для начала есть типовой печформ
что требуется:
обеспечить для разных клиентов разные фенечки и плюшки, например:
- разные правила формирования наименования товара: для кого-то просто наименование, для кого-то наш артикул+наименование+шрихкод
- для кого-то дополнительная графа в ТЧ с перечнем ГТД;
- для кого-то дополнительная графа "внутренний код" в которую пишется покупательский артикул для наших товаров, для этого же клиента - еще одна дополнительная графа, в которую пишется внутренний покупательский шк нашего товара, для этого же клиента - в графе "код" еще один покупательский код нашего товара не совпадающий с покупательским "внутренним кодом"
- в подвале - некоторым сводка по сумма по разным ставкам НДС
- для некоторых - не указывать банковские реквизиты в графе "грузополучатель"
- для некоторых - указывать номер магазина над ТЧ
- для некоторых - номер заявки покупателя и номер поставщика
.. ну пока хватит...
считаем что всякие нужные объекты метаданных с нужной информацией - есть и здесь проблемы нет.

вопрос: какие подходы/архитектурные решения чтобы при печати получился нужный торг12 - ???
46 Garykom
 
гуру
06.08.16
03:07
(45) ТЗ+$ самый лучший подход
47 Garykom
 
гуру
06.08.16
03:08
(46)+ Кста я не издеваюсь но за подобные профконсультации мне на прежних работах ЗП платили нехилую, когда головой/голосом работаешь больше чем код пишешь.
48 Злопчинский
 
06.08.16
03:09
(46) могу посоветовать катер
49 Злопчинский
 
06.08.16
03:09
(47) я не бедствую, если вы об этом...
50 Garykom
 
гуру
06.08.16
03:09
(49) Тогда СКД самый лучший подход ))
51 Злопчинский
 
06.08.16
03:10
(46) мну не особо интересно доскональное решение. мну интересно - кто что предложит идейно.
52 Garykom
 
гуру
06.08.16
03:15
(51) Если бы это было на 1С8 то на СКД пишется внешний отчет с кучей настроечных параметров, там это быстро и просто (относительно).
Далее все эти параметры в сохраняемые настройки и форма-редактор этих настроек.

Итого пользователь печатает как обычно а ему выводится с его присвоенными настройками, причем может выбрать другие если нуна.
53 Garykom
 
гуру
06.08.16
03:16
(52)+ Для 77 есть решения по типу "Универсальный отчет" по документам/регистрам глянь их.
54 Garykom
 
гуру
06.08.16
03:31
(45) Самое идеально это изобрести свой или заюзать готовый (возможности СКД рулят) "язык" описания требуемых полей/колонок и их содержимого по принципу "шаблонов".

Т.е. в отчет всегда на вход подаются все абсолютно возможные детальные данные.
А внутри уже неким "конструктором" создаются конкретные практические DTD.

Перечисляются требуемые "колонки" в таблицу (Строка/XML/JSON "НомерПП, Товар.Наименование, Товар.Код, ЕдИзм, Кол-во, Цена, ...").
Затем для колонок прописывается шаблон заполнения Товар.Наименование = [Номенклатура.НаименованиеДляПечати] и т.д.
И самый бантик это "формулы" для отдельных полей со своими "функциями" СуммаНДС = ИТОГ(СуммаНДС).
55 Garykom
 
гуру
06.08.16
03:33
(54)+ Но самое "трудоемкое" это создать этот удобный "визуальный конструктор", чтобы не пришлось учить "дополнительный язык" тому кто настраивает конкретные шаблоны под пользователей.

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

По сути чем и является СКД ))
56 Злопчинский
 
06.08.16
03:35
(54) чем это лучше простого программирования: тупо сделать клон типовой формы, привязать ее к конкретному клиенту и для конкретного клиента вставить несколько операторов в типовую форму?
57 Злопчинский
 
06.08.16
03:37
(55) Опыт показывает, что количество пользователей (менеджеров?), могущих "напрограммировать" таким визуальным конструктом равно числу программистов в конторе...
58 Garykom
 
гуру
06.08.16
03:39
(56)
1. Быстрее
2. Проще/удобнее для оператора шаблонов
3. Не нужно знать 1С, обучение займет 1 день для грамотного менеджера знающего Ексель.
4. Безопаснее, т.к. не лезем в конфигуратор
59 Garykom
 
гуру
06.08.16
03:40
(57) Неверно, путаем понятие "могущих" и "желающих". Какой дятел будет делать "не свою работу"?
60 Garykom
 
гуру
06.08.16
03:50
(54)+ Кстати подобную ХРЕ уже делал, но для "шаблонов word".
Там в документ/шаблон ворда вставлялись специальные команды/метки в текст по которым обработка в 1С заполняла их нужными данными.

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

Т.е. если нужно вставить в документу список (например по сверке взаиморасчетов) платежек то так и писалось:

#Таблица(ИмяТаблицыИзСписка, "Фильтр"[[ПараметрФильтра1=Значение1],[ПараметрФильтра2=Значение2])

#Таблица([ПлатежныеПоручения],[[Контрагент=[ВыбранныйКонтрагент],ДатаНачала=[ДатаНачала],ДатаОкончания=[ДатаОкончания]])

пример сильно примерный, реально уже не помню синтаксис но делали его сильно простым
61 Garykom
 
гуру
06.08.16
03:53
(60)+ Где в примере "ВыбранныйКонтрагент", "ДатаНачала" и "ДатаОкончания" это реквизиты на форме обработки которая и формировала заполненный документ ворда для подписи и отправки контрагенту
62 Garykom
 
гуру
06.08.16
03:58
(61)+ Тьфу даже никаких фильтров не нужно было указывать (эту внутри при программировании их так настраивал прог а не юзеры).

Они уже были готовые настроены для "набора таблиц", только на форме реквизиты которые пользователь выбирает и все они все заполненные автоматом в таблицу.
Т.е. юзер просто в документ ворда писал где нуна #Таблица[ПлатежныеПоручения] или даже #Таблица[ДокументыДляСверки]
63 Garykom
 
гуру
06.08.16
04:05
(62)+ Это была обработка (легко гибко настраиваемая) для автоматического формирования пакета документов по должникам или другим клиентам (сразу куче) и распечатке готовых пакетов.
Иначе ручками это помереть можно и тексты сильно часто менялись вот и изобрели такое.
64 Garykom
 
гуру
06.08.16
04:06
(63)+ По сути умные проги свалили свою работу на юзеров )) типа сами делайте какие вам нуна пакеты доков для своих подотчетных клиентов.
Да дергали конечно постоянно по разным багам (обычно юзеры тупили) или доработкам (а можно еще вот это сделать?).