gifts2017

Замена любых символов в любом справочнике

Опубликовал Алексей Новоселов (a-novoselov) в раздел Обработки - Обработка справочников

Бывают огромные справочники с названиями, в которых есть по два, а то и больше пробелов подряд, табуляции, кавычки ненужные... Особенно это неприятно, когда справочник в 100 000 наименований загружался из другой программы учета. Обработка позволяет в любом справочнике заменить любые символы по любому из реквизитов типа "Строка".

Выбираем справочник, реквизит, заполняем набор символов поиска и символов замены, и нажимаем "Выполнить". Все символы из набора в реквизите по всему справочнику заменяются. У бухгалтера глаз радуется, документы красивей стали, в общем всем хорошо)

И, народ, если качаем, не забываем плюсовать (минусовать). Все-таки дебют.

Скачать файлы

Наименование Файл Версия Размер
Замена лишних символов.epf 405
.epf 9,54Kb
11.09.14
405
.epf 9,54Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. Александр (dobraleks) 25.12.09 22:11
а для 77 есть что-то похожее??
2. Сергей (Che) Коцюра (CheBurator) 26.12.09 01:23
(1) по уму д.б. настраиваемя обработка для удаления из любых строковых реквизитов определенного настраиваемого набора "символов", как-то : табцляции, переводов строк и прочего - что напрочь ломает выгрузку/загрузку в XML и прчие неприятности делает...
Designer1C; a-novoselov; dobraleks; +3 Ответить 2
3. Артур Аюханов (artbear) 26.12.09 08:23
Есть претензии к реализации :(
1. Нафига нужна переменная Отказ?
представь, что у тебя глюк/отказ на первом же элементе?
у тебя в транзакции сначала обработаются все элементы, а потом все равно будет отмена этой транзакции.
После Отказ = Истина сделай Прервать
2. не видно, по какой причине элемент может быть не записан, т.е. по какой причине выдано исключение :(
3. у тебя будут обрабатываться/изменяться все элементы, независимо от наличия у них нужного сочетания пробелов.
Совсем не гуд.
Ведь в запросе можно сразу выбрать только те элементы, у которых в выбранном поле есть более 2-х пробелов.

В общем, до исправления вышеперечисленного минусую.
a-novoselov; +1 Ответить 1
4. Алексей Новоселов (a-novoselov) 26.12.09 08:25
(1) Для 77 реализовать такой алгоритм не получится, т.к. в ней нет оператора Выполнить()

(2) Если осуществлялся переход с другой системы учета, которая уже не используется, то обмен не нужен. При распределенной базе данных, поменяв данные на главном узле, изменения расползутся по всем базам.
5. Артур Аюханов (artbear) 26.12.09 08:28
(3+) 4. Нафига нужен код
Ссылка = Справочники[Справочник].НайтиПоКоду(1);
он все равно подходит не для всех справочников :(
юзай
Ссылка = Справочники[Справочник].ПустаяСсылка();
Designer1C; a-novoselov; +2 Ответить 1
6. Артур Аюханов (artbear) 26.12.09 08:29
(4) "Для 77 реализовать такой алгоритм не получится, т.к. в ней нет оператора Выполнить()"
вот с чего ты это взял? там есть штатный метод Шаблон, + в ВК 1С++ есть мощнейшний объект ВыполняемыйМодуль.
7. Артур Аюханов (artbear) 26.12.09 08:34
(3+) 5. Также я посоветовал бы код
СписокВыбора.Добавить(МетаСправочник.Имя, МетаСправочник.Синоним);

исправить на следующий
СписокВыбора.Добавить(МетаСправочник.Имя, СокрЛП(МетаСправочник.Синоним) +"( "+МетаСправочник.Имя+" )");

Т.к. в некоторых конфигурациях синоним не всегда "совпадает" с именем, и это далеко не редкость :(
Будет чуть удобнее :)
8. Алексей Новоселов (a-novoselov) 26.12.09 08:37
(3) (5) (7) Спасибо большое! все поправил :)

(6) я имел ввиду именно такой алгоритм. А вообще, я всех тонкостей 77 не знаю, т.к. 1С начинал изучать сразу с 8.1
Поручик; artbear; +2 Ответить 2
9. Артур Аюханов (artbear) 26.12.09 08:49
(8) зря ты исправил порядок замены пробелов.
Раньше, когда сначала 3 пробела менялись на один, а потом 2, было правильно.
А сейчас наоборот и это неверно.
Например, стоит 3 пробела, у тебя сначала заменятся 2 пробела, и останется также 2 пробела, которые уже не будут заменены :(
10. Артур Аюханов (artbear) 26.12.09 08:54
(8) 1. Я бы код
	|Объект = Выборка.Ссылка.ПолучитьОбъект();
|Объект.[Реквизит] = СтрЗаменить(Объект.[Реквизит], ""  "", "" "");
|Объект.[Реквизит] = СтрЗаменить(Объект.[Реквизит], ""  "", "" ""); // Если есть тройные или четверные пробелы	
|Сообщить(""Заменили ""+Объект.[Реквизит]);
...Показать Скрыть

заменил бы на немного другой, без обращения к реквизиту через объект, а через спец.переменную значениеРеквизита, которая заполняется из Выборка.Реквизит, а перед записью
Объект.[Реквизит] = значениеРеквизита;

2. сообщение о замене совсем не актуально и наверняка не очень нужно.
ИМХО удобнее просто вывести количество заменяемых элементов :)
11. Артур Аюханов (artbear) 26.12.09 08:59
В (9) был неправ :)
забыл, что ты исправляешь пробелы от 2 до 4 включительно, большее количество пробелов не будет исправлено, хотя такое их количество большая редкость, конечно.
наверное, это также не гуд :)
12. Роман Ершов (MRAK) 26.12.09 10:40
На ИТС есть Универсальный поиск и обработка объектов. в ней в режиме 1С-Предприятие прикручиваешь свой код, который пишется за 5 минут (СтрЗаменить) - и вуаля!!!
Щасте!!!!
13. Алексей Константинов (alexk-is) 26.12.09 20:15
(12) Да, все правильно. Только не все могут написать код. И на портале не только программисты...
dobraleks; +1 Ответить
14. Артур Аюханов (artbear) 28.12.09 08:06
15. Алексей Новоселов (a-novoselov) 28.12.09 08:11
16. Артур Аюханов (artbear) 29.12.09 19:25
17. werter ;l (werter) 30.12.09 04:21
Таб=СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Номенклатура","Справочник.Номенклатура");
Таб.НоваяКолонка("НовоеНазвание",2,200);
Тов=СоздатьОбъект("Справочник.Номенклатура");
Тов.ВыбратьЭлементы();
Пока Тов.ПолучитьЭлемент()=1 Цикл
Нашли=0;
Название=Тов.Наименование;
Пока Найти(Название," ")>0 Цикл
Нашли=1;
Название=СтрЗаменить(Название," "," ");
КонецЦикла;
Если Нашли=1 Тогда
Таб.НоваяСтрока();
Таб.Номенклатура=Тов.ТекущийЭлемент();
Таб.НовоеНазвание=Название;
КонецЕсли;
КонецЦикла;
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
Тов.НайтиЭлемент(Таб.Номенклатура);
Тов.Наименование=Таб.НовоеНазвание;
Тов.Записать();
КонецЦикла;
18. Алексей Новоселов (a-novoselov) 30.12.09 06:38
(17) Да, ты прав, так все будет работать. А вот как сделать, если мы не знаем ни названия справочника, ни названия реквизита на этапе кодинга?
19. alteregogiga (alteregoatg) 30.12.09 13:18
Скачал... работает, но не совсем корректно... пробовал для справочника Номенклатура... во-первых, может обрабатывать только Полное наименование, а Наименование почему-то нет... во-вторых, как я понял, убирать заданное количество пробелов, т.е. если есть 5 пробелов, то за один прогон обработка уберет 2 или 3 пробела, следовательно, обработку надо запускать несколько раз...
a-novoselov; +1 Ответить 1
20. vladal (Vladal) 30.12.09 13:35
(0) Предлагаю дополнить функционал - убивать лидирующие пробелы.
a-novoselov; +1 Ответить 1
21. Алексей (alexqc) 30.12.09 13:47
(18) В смысле - как в 77 по символьному имени обращаться?

Спр=СоздатьОбъект("Справочник." + имяСправочника);

ЗНРекв=Спр.ПолучитьАтрибут(имяРеквизита);

Спр.УстановитьАтрибут(имяРеквизита,ЗНРекв);

Для ТЗ - ПолучитьЗначение/УстановитьЗначение. Подробнее см. синтакс-помошник.


22. Алексей Новоселов (a-novoselov) 30.12.09 16:58
(2) (19) (20) Реализовал все (или почти все) ваши предложения. Спасибо.
23. Алексей Константинов (alexk-is) 30.12.09 17:36
(22) Ну, если все так, то обрати еще внимание на оформление. Где картинка для анонса? Проверь, обработка точно будет под 8.0 и 8.2. Как это заявлено?

Вот примеры публикаций с неплохим оформлением
http://infostart.ru/public/62722/
http://infostart.ru/public/16630/
24. Сергей (Che) Коцюра (CheBurator) 30.12.09 18:25
(18) в 8-ке не знаю, а 7.7 методами рвстроенного языка можно получать перечень всех справочников, документов, их реквизитов, типов и длин реквизитов и т.д.
Метаданные.Справчочник(счетчик1).Реквизит(счетчик2).Тип или .Длина
25. Алексей Константинов (alexk-is) 30.12.09 20:29
26. Алексей Новоселов (a-novoselov) 03.01.10 07:18
(23) Да какраз после н.г. оформить хотел... на 8.0 работает, 8.2 дистрибутива пока нет, но должна работать. Насколько я понял в 1С работа с метаданными со времен 7.7 почти не изменилась.
27. Алексей Константинов (alexk-is) 04.01.10 17:10
28. aga_aga (Збянтэжаны Саўка) 11.01.10 11:51
(4) "Для 77 реализовать такой алгоритм не получится, т.к. в ней нет оператора Выполнить()"
А зачем через Выполнить()?
Можно выбросить присвоение ТекстКода и писать сразу код.

И еще надо проверять на модифицированность объекта чтобы не делать лишних телодвижений:

СтароеЗначениеРеквизита = Выборка[Реквизит]; //+
ЗначениеРеквизита = Выборка[Реквизит];
...

Объект[Реквизит] = ЗначениеРеквизита;
Если Объект.Модифицированность() Тогда //+
Счетчик = Счетчик + 1;
Попытка
Объект.Записать();
// Показать что именно изменили
Сообщить(Объект.Код + ": Изменен реквизит " + Реквизит + " с <" + СтароеЗначениеРеквизита + "> на <" + ЗначениеРеквизита + ">");
Исключение
Сообщить("Не могу записать элемент " + Объект.Код + " по причине: " + ОписаниеОшибки());
Счетчик = Счетчик - 1;
КонецПопытки;
КонецЕсли;

И еще в процедуре СправочникПриИзменении
маленькое удобство добавить, сразу же и присвоить первый элемент реквизиту, на одно движение меньше:
...
ЭлементыФормы.Реквизит.СписокВыбора = СписокВыбора;
ЭлементыФормы.Реквизит.Значение = СписокВыбора[0]; //+


Designer1C; a-novoselov; +2 Ответить 1
29. Андрей Вахрин (dolter) 11.01.10 12:14
(4) у 7.7 нет Выполнить(), но есть Шаблон() :-)
30. Алексей Новоселов (a-novoselov) 13.01.10 07:21
31. laspii 21.02.11 12:11
Не обрабатывает двойные кавычки, например 3,5" поменять на 3.5".
Доработал:
в функции Выборка, где встречается СтрокаСимволов.Символ
СтрокаПоиска = СТрЗаменить(СтрокаСимволов.Символ,"""","""""");
32. Gineich (gineich) 21.09.11 10:54
33. serg85 (serg85) 13.10.11 18:33
Спасибо за обработку, тема актуальна...
34. Юрий (YuryKr) 22.11.11 00:16
Действительно стоящая обработка - любят у нас придумывать новую номенклатуру особенно через пробелы. Все исправляется и меняется
35. Deniz200 14.02.12 17:53
Обработка полезна, но пока скачать и посмотреть не могу. Чем она отличается от поиска и замены значений?
36. Алексей Новоселов (a-novoselov) 16.02.12 10:00
(35) Отличается тем, что ей может пользоваться простой пользователь, не программист, для конкретной задачи. Дописывать ничего не придется.
37. SeRG SeRG (sdh) 13.03.12 10:47
прочитал по диагонали отзывы, бросилась в глаза дискуссия по убиранию пробелов, двойных, тройных и т.п..
я не знаю, как в 1с, возможно ли, но я такой алгоритм писал на SQL. все делается за один цикл. убирается/меняется двойной пробел " " на одинарный " " в цикле, пока находится двойной пробел. что то типа такого:
WHILE POS (str, " ") > 0 BEGIN
REPLACE(str, " ", " ")
END

при таком алгоритме гарантированно все лишние пробелы убираются и сокращаются до разрешенного одного. пробелы в начале и конце строки обрабатываются обрезанием (если нужно)
Designer1C; +1 Ответить 1
38. Алексей Новоселов (a-novoselov) 15.03.12 11:57
(37) Да, алгоритм тут до боли простой. Но эта разработка была моим дебютом на Инфостарте))
39. Ardl 333 (Ardl) 21.05.12 14:42
Обработка действительно полезная!Пожалуйста, рассмотрите возможность фильтрации (отбора) внутри справочника. т.е. изменить какое-либо значение в справочнике при отборе по конкретному: коментарию, НДС, другим полям как номенклатурной катрочки, так и других справочников. Надеюсь идею смог донести!
40. Алексей Новоселов (a-novoselov) 21.05.12 15:28
(39) Да, идею донести смогли, но пока времени нет заниматься этим, если будет свободное время - сделаю. Или можете сами (если есть желание) доработать / выложить со ссылкой на исходник.
41. Ardl 333 (Ardl) 21.05.12 17:43
Желание есть, но знаний не хватает! Буду смиренно ждать вашего релиза, в любом случае спасибо за оперативный ответ и обработку!
42. Матвей Петров (motya-98@list.ru) 02.02.15 16:51
Добрый вечер.
Не найдется ли файл RENUMBER.ERT для 7
Благодарю.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа