Как найти и удалить штрихкоды определенной номенклатуры в 1С:УТ 11

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В конфигурации 1С:Управление торговлей 11 (релизы 11.4 и 11.5) работа со штрихкодами реализована через независимый регистр сведений ШтрихкодыНоменклатуры. Часто разработчики сталкиваются с задачей очистки или корректировки этих данных. Сложность заключается в структуре регистра: основным измерением является сам Штрихкод (строка), а Номенклатура выступает в роли ресурса или дополнительного реквизита. Это означает, что мы не можем просто установить отбор по номенклатуре в менеджере записи или наборе записей напрямую, так как платформа требует указывать значения всех измерений для получения конкретной записи.

В этой статье мы подробно разберем, как обойти это ограничение, программно найти нужные записи и корректно их удалить, не нарушая целостность базы данных.

Способ 1: Использование запроса и объекта РегистрСведенийНаборЗаписей

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

Шаг 1. Получение списка штрихкодов. Создадим запрос к виртуальной таблице или основной таблице регистра сведений. Нам нужно отобрать все записи, где поле Номенклатура соответствует нашему объекту.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
    |ИЗ
    |	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
    |ГДЕ
    |	ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъектНоменклатура);
РезультатЗапроса = Запрос.Выполнить();

Шаг 2. Удаление записей через набор. После того как мы получили список строк-штрихкодов, мы можем итерироваться по результату. Для каждой строки мы создаем РегистрСведенийНаборЗаписей, устанавливаем жесткий отбор по измерению Штрихкод и записываем пустой набор. Это действие эффективно удаляет запись из базы.


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

Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Штрихкод.Установить(Выборка.Штрихкод);
    
    // Записываем пустой набор, что приводит к удалению записи с этим ШК
    НаборЗаписей.Записать(); 
КонецЦикла;

Выясним причину, по которой используется НаборЗаписей, а не МенеджерЗаписи. Хотя технически менеджер записи существует, работа с набором считается более стандартной для платформы 1С 8.3 при массовых операциях, так как она позволяет избежать лишних блокировок и более прозрачно управляет транзакциями.

Способ 2: Оптимизированное удаление (транзакционность и производительность)

Если в вашей базе накопились тысячи «битых» или неправильных штрихкодов, выполнение метода Записать() в цикле может существенно замедлить систему. Проанализируем ситуацию: каждое обращение к методу Записать() открывает отдельную транзакцию и обновляет индексы таблицы.

Чтобы ускорить процесс, рекомендуется собрать все штрихкоды в массив и выполнять удаление порциями, либо обернуть цикл в одну общую транзакцию. Также важно помнить об особенностях УТ 11: штрихкоды могут быть привязаны не только к номенклатуре, но и к Характеристике или Упаковке. Если ваша задача — удалить штрихкоды только для конкретной упаковки, обязательно добавьте это условие в запрос.

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

Для администраторов и опытных пользователей существует способ решить задачу без написания кода. В составе БСП (Библиотеки стандартных подсистем), на которой базируется УТ 11, есть мощный инструмент — Групповое изменение реквизитов.

  1. Перейдем в раздел НСИ и администрирование — Обслуживание — Корректировка данных.
  2. Выберем в поле «Изменять» тип объекта: Штрихкоды номенклатуры.
  3. Нажмем ссылку «Все элементы» для настройки фильтра. Здесь мы можем выбрать поле Номенклатура, Характеристика или даже Тип штрихкода.
  4. После настройки отбора, в нижней части формы (в дополнительных параметрах или через кнопку «Служебные возможности», если они включены) можно выбрать команду Удалить записи.

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

Дополнительные нюансы и контроль целостности

При работе со штрихкодами в УТ 11.5 стоит обратить внимание на следующие аспекты:

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

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

← На главную