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