В конфигурации 1С:Управление торговлей 11 (релизы 11.4 и 11.5) работа со штрихкодами реализована через независимый регистр сведений ШтрихкодыНоменклатуры. Часто разработчики сталкиваются с задачей очистки или корректировки этих данных. Сложность заключается в структуре регистра: основным измерением является сам Штрихкод (строка), а Номенклатура выступает в роли ресурса или дополнительного реквизита. Это означает, что мы не можем просто установить отбор по номенклатуре в менеджере записи или наборе записей напрямую, так как платформа требует указывать значения всех измерений для получения конкретной записи.
В этой статье мы подробно разберем, как обойти это ограничение, программно найти нужные записи и корректно их удалить, не нарушая целостность базы данных.
Рассмотрим самый надежный программный метод. Поскольку мы не знаем заранее, какие именно штрихкоды присвоены товару, нам необходимо сначала «выцепить» их из базы данных с помощью запроса, а затем выполнить удаление. Проанализируем этот процесс по шагам.
Шаг 1. Получение списка штрихкодов. Создадим запрос к виртуальной таблице или основной таблице регистра сведений. Нам нужно отобрать все записи, где поле Номенклатура соответствует нашему объекту.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъектНоменклатура);
РезультатЗапроса = Запрос.Выполнить();
Шаг 2. Удаление записей через набор. После того как мы получили список строк-штрихкодов, мы можем итерироваться по результату. Для каждой строки мы создаем РегистрСведенийНаборЗаписей, устанавливаем жесткий отбор по измерению Штрихкод и записываем пустой набор. Это действие эффективно удаляет запись из базы.
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(Выборка.Штрихкод);
// Записываем пустой набор, что приводит к удалению записи с этим ШК
НаборЗаписей.Записать();
КонецЦикла;
Выясним причину, по которой используется НаборЗаписей, а не МенеджерЗаписи. Хотя технически менеджер записи существует, работа с набором считается более стандартной для платформы 1С 8.3 при массовых операциях, так как она позволяет избежать лишних блокировок и более прозрачно управляет транзакциями.
Если в вашей базе накопились тысячи «битых» или неправильных штрихкодов, выполнение метода Записать() в цикле может существенно замедлить систему. Проанализируем ситуацию: каждое обращение к методу Записать() открывает отдельную транзакцию и обновляет индексы таблицы.
Чтобы ускорить процесс, рекомендуется собрать все штрихкоды в массив и выполнять удаление порциями, либо обернуть цикл в одну общую транзакцию. Также важно помнить об особенностях УТ 11: штрихкоды могут быть привязаны не только к номенклатуре, но и к Характеристике или Упаковке. Если ваша задача — удалить штрихкоды только для конкретной упаковки, обязательно добавьте это условие в запрос.
Для администраторов и опытных пользователей существует способ решить задачу без написания кода. В составе БСП (Библиотеки стандартных подсистем), на которой базируется УТ 11, есть мощный инструмент — Групповое изменение реквизитов.
Номенклатура, Характеристика или даже Тип штрихкода.Важный момент: использование этого инструмента требует осторожности, так как он работает напрямую с данными регистра. Перед выполнением операции обязательно убедитесь в правильности настроенного фильтра.
При работе со штрихкодами в УТ 11.5 стоит обратить внимание на следующие аспекты:
Штрихкоды упаковок и СУЗ. Удаление из основного регистра при сохранении записей в системе маркировки может привести к ошибкам при сканировании в РМК.НСИ и администрирование — Настройки штрихкодирования. Возможно, неверно задан префикс внутреннего штрихкода (обычно используется диапазон 20-29).Разберем типичную ошибку: попытку использовать Записать(Истина) без предварительного вызова Прочитать(). В случае с очисткой это допустимо (так как мы хотим получить пустой набор), но если ваша цель — изменить данные в записи, обязательно используйте метод Прочитать(), модифицируйте нужные поля в коллекции НаборЗаписей и только потом сохраняйте.
Таким образом, мы выяснили, что наиболее гибким инструментом для программиста остается сочетание точного запроса к регистру и последующей итерации по наборам записей с отбором по уникальному измерению Штрихкод.