При переносе данных или некорректной загрузке каталога номенклатуры часто возникают ситуации, когда краткое рабочее поле Наименование затирается или заполняется неподходящими данными (например, наименованиями родительских папок). В то же время реквизит НаименованиеПолное (или ИмяПриПечати) содержит корректное и полное описание товара. Разберем по шагам, как исправить эту ситуацию и массово приравнять рабочее наименование к полному.
Попытка выполнить эту операцию «в лоб» через динамическую выборку вида Справочники.Номенклатура.Выбрать() часто приводит к ошибкам. Разберем причину: динамический выбор элементов справочника упорядочивает записи по их наименованию. Когда мы меняем Наименование элемента прямо внутри цикла и записываем объект, платформа сбивает курсор выборки, из-за чего часть элементов пропускается или обработка входит в бесконечный цикл.
Также важно учесть ограничения платформы 1С:
Наименование ограничено строкой определенной длины (обычно от 25 до 150 символов), в то время как НаименованиеПолное имеет тип неограниченной длины. При записи платформа автоматически урезает длинный текст под лимит реквизита Наименование.&НаСервере).ОбменДанными.Загрузка = Истина, чтобы отключить лишние проверки заполнения реквизитов и ускорить процесс.Для безошибочного обхода всех карточек сначала сформируем список ссылок с помощью объекта Запрос. Это гарантирует, что изменение наименований не повлияет на состав выборки.
Проанализируем пример кода с дополнительной фильтрацией (исключаем группы и элементы, у которых наименования уже совпадают):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И Номенклатура.Наименование <> Номенклатура.НаименованиеПолное";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ТекОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Отключаем лишние подписки и проверки для ускорения
ТекОбъект.ОбменДанными.Загрузка = Истина;
ТекОбъект.Наименование = ТекОбъект.НаименованиеПолное;
Попытка
ТекОбъект.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОшибкаИзмененияНаименования",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Совет по оптимизации: Если в вашей базе десятки тысяч наименований номенклатуры, запись каждого объекта по отдельности может занять много времени. В таких случаях рекомендуем группировать вызовы записи в транзакции по 500–1000 элементов с помощью методов НачатьТранзакцию() и ЗафиксироватьТранзакцию().
Если нет возможности написать внешнюю обработку, проанализируем вариант решения без программирования через штатную Библиотеку Стандартных Подсистем (БСП).
Групповое изменение реквизитов через меню «Все функции» / «Функции для администратора»).Номенклатура.Наименование. В качестве источника или значения укажем формулу/реквизит НаименованиеПолное.После успешной записи новых наименований рекомендуем выполнить следующие шаги:
.dt или бекап СУБД) перед запуском кода или обработки.