Как массово приравнять наименование номенклатуры к ее полному наименованию в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переносе данных или некорректной загрузке каталога номенклатуры часто возникают ситуации, когда краткое рабочее поле Наименование затирается или заполняется неподходящими данными (например, наименованиями родительских папок). В то же время реквизит НаименованиеПолное (или ИмяПриПечати) содержит корректное и полное описание товара. Разберем по шагам, как исправить эту ситуацию и массово приравнять рабочее наименование к полному.

Анализ проблемы и технические особенности

Попытка выполнить эту операцию «в лоб» через динамическую выборку вида Справочники.Номенклатура.Выбрать() часто приводит к ошибкам. Разберем причину: динамический выбор элементов справочника упорядочивает записи по их наименованию. Когда мы меняем Наименование элемента прямо внутри цикла и записываем объект, платформа сбивает курсор выборки, из-за чего часть элементов пропускается или обработка входит в бесконечный цикл.

Также важно учесть ограничения платформы 1С:

  1. Длина строки: Поле Наименование ограничено строкой определенной длины (обычно от 25 до 150 символов), в то время как НаименованиеПолное имеет тип неограниченной длины. При записи платформа автоматически урезает длинный текст под лимит реквизита Наименование.
  2. Контекст выполнения: Все работы со справочниками на запись должны выполняться строго на сервере (директива &НаСервере).
  3. Проверки и подписки: При массовой перезаписи элементов целесообразно использовать флаг ОбменДанными.Загрузка = Истина, чтобы отключить лишние проверки заполнения реквизитов и ускорить процесс.

Способ 1. Программная обработка с использованием Запроса

Для безошибочного обхода всех карточек сначала сформируем список ссылок с помощью объекта Запрос. Это гарантирует, что изменение наименований не повлияет на состав выборки.

Проанализируем пример кода с дополнительной фильтрацией (исключаем группы и элементы, у которых наименования уже совпадают):


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	НЕ Номенклатура.ЭтоГруппа
    |	И Номенклатура.Наименование <> Номенклатура.НаименованиеПолное";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ТекОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    // Отключаем лишние подписки и проверки для ускорения
    ТекОбъект.ОбменДанными.Загрузка = Истина; 
    
    ТекОбъект.Наименование = ТекОбъект.НаименованиеПолное;
    
    Попытка
        ТекОбъект.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаИзмененияНаименования",
            УровеньЖурналаРегистрации.Ошибка,,,
            ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Совет по оптимизации: Если в вашей базе десятки тысяч наименований номенклатуры, запись каждого объекта по отдельности может занять много времени. В таких случаях рекомендуем группировать вызовы записи в транзакции по 500–1000 элементов с помощью методов НачатьТранзакцию() и ЗафиксироватьТранзакцию().

Способ 2. Использование штатной обработки «Групповое изменение реквизитов»

Если нет возможности написать внешнюю обработку, проанализируем вариант решения без программирования через штатную Библиотеку Стандартных Подсистем (БСП).

  1. Перейдем в раздел Администрирование → Обслуживание → Корректировка данных (или открываем обработку Групповое изменение реквизитов через меню «Все функции» / «Функции для администратора»).
  2. В поле «Изменять» выбираем справочник Номенклатура.
  3. Нажмем кнопку Дополнительные параметры. В появившемся окне включим отображение служебных реквизитов и режим разработчика (чтобы разрешить запись в режиме загрузки).
  4. В списке доступных реквизитов найдем Наименование. В качестве источника или значения укажем формулу/реквизит НаименованиеПолное.
  5. Выполним массовую изменение объектов.

Обязательные действия после изменения данных

После успешной записи новых наименований рекомендуем выполнить следующие шаги:

  1. Создание резервной копии: Любые массовые операции над справочниками необратимы. Обязательно создавайте архивную копию базы данных (файл .dt или бекап СУБД) перед запуском кода или обработки.
  2. Обновление индекса полнотекстового поиска: Так как текстовые поля номенклатуры изменились, поиск элементов в документах и подборе может работать со старыми данными до переиндексации. Запустите полное или оперативное обновление индекса полнотекстового поиска в разделе администрирования.
← На главную