При ведении нормативно-справочной информации в 1С часто возникает необходимость массово отредактировать наименования элементов: исправить опечатки, удалить лишние знаки или заменить один тип скобок на другой (например, квадратные скобки [ и ] на круглые ( и )). Рассмотрим, как реализовать эту задачу программно с помощью встроенного языка 1С.
Для решения задачи разберем по шагам стандартный алгоритм групповой обработки элементов справочника Справочники.Номенклатура:
Выбрать().ПолучитьОбъект().СтрЗаменить() для последовательной подстановки нужных символов.Записать().Посмотрим на пример базового кода для замены квадратных скобок на круглые:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем объект номенклатуры для изменения
НоменклатураОбъект = Выборка.ПолучитьОбъект();
// Преобразуем строку: сначала левую, затем правую скобку
НовоеНаименование = СтрЗаменить(НоменклатураОбъект.Наименование, "[", "(");
НовоеНаименование = СтрЗаменить(НовоеНаименование, "]", ")");
// Перезаписываем элемент только если произошло изменение
Если НоменклатураОбъект.Наименование <> НовоеНаименование Тогда
НоменклатураОбъект.Наименование = НовоеНаименование;
НоменклатураОбъект.Записать();
КонецЕсли;
КонецЦикла;
При работе в конфигурации 1С:ERP Управление предприятием следует учитывать несколько важных особенностей:
1. Название переменной объекта. Если код выполняется во внешней обработке, не рекомендуем использовать имя переменной Объект, так как это ключевое слово может ссылаться на контекст самой обработки. Используйте более конкретные имена, например НоменклатураОбъект или ВыборкаЭлемент.
2. Рабочее и полное наименование. В ERP у номенклатуры есть два текстовых поля: Наименование (краткое рабочее) и НаименованиеПолное (используется в печатных формах документов). Если требуется обновить представлении товара и в документах, аналогичную замену следует выполнить и для поля НаименованиеПолное.
3. Ускорение записи. Метод Записать() в ERP вызовaет множество проверок бизнес-логики. Чтобы обработка тысяч позиций не занимала много времени, перед записью можно устанавливать свойство ОбменДанными.Загрузка = Истина. Это отключит лишние обработчики событий.
Проанализируем итоговый вариант кода с учетом всех оптимизаций:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Пропускаем группы (папки) номенклатуры
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
НоменклатураОбъект = Выборка.ПолучитьОбъект();
НовоеНаименование = СтрЗаменить(НоменклатураОбъект.Наименование, "[", "(");
НовоеНаименование = СтрЗаменить(НовоеНаименование, "]", ")");
НовоеНаименованиеПолное = СтрЗаменить(НоменклатураОбъект.НаименованиеПолное, "[", "(");
НовоеНаименованиеПолное = СтрЗаменить(НовоеНаименованиеПолное, "]", ")");
Если НоменклатураОбъект.Наименование <> НовоеНаименование
Или НоменклатураОбъект.НаименованиеПолное <> НовоеНаименованиеПолное Тогда
НоменклатураОбъект.Наименование = НовоеНаименование;
НоменклатураОбъект.НаименованиеПолное = НовоеНаименованиеПолное;
// Отключаем проверки при записи для ускорения работы
НоменклатураОбъект.ОбменДанными.Загрузка = Истина;
НоменклатураОбъект.Записать();
КонецЕсли;
КонецЦикла;