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