Как вывести строковый штрихкод из справочника Номенклатура в печатную форму Расходная накладная

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

В практике работы с 1С:Предприятие 8 часто возникает необходимость дополнить стандартные печатные формы новыми данными. Одной из самых востребованных задач является вывод штрихкода товара в накладную. Рассмотрим ситуацию, когда в справочнике Номенклатура уже создан текстовый реквизит Штрихкод, а в макете добавлена соответствующая колонка, но данные при печати остаются пустыми. Проанализируем, как правильно изменить программный код, чтобы данные из базы попали на бумагу.

Анализ механизма формирования печатной формы

Для начала разберем, почему простой вставки параметра в макет недостаточно. В конфигурациях на обычных формах (таких как Бухгалтерия для Казахстана 2.0) процесс печати состоит из трех этапов:

  1. Получение данных: Выполняется запрос к базе данных, который собирает информацию из документа и связанных справочников.
  2. Заполнение структуры: Результат запроса выгружается в таблицу значений или выборку.
  3. Вывод в макет: Программа перебирает строки данных и передает их в параметры областей макета.

Если вы добавили параметр в макет, но не изменили запрос, системе просто неоткуда взять информацию для заполнения этой ячейки.

Шаг 1: Модификация текста запроса

Рассмотрим структуру запроса в функции ПечатьНакладной. Нам необходимо извлечь созданный реквизит Штрихкод через точку от объекта Номенклатура. Важно помнить, что в типовых накладных часто используются объединения (ОБЪЕДИНИТЬ ВСЕ), поэтому вносить правки нужно во все части запроса.

Найдем в коде формирование текста запроса и добавим выбор нашего реквизита. Рассмотрим пример модификации первой части запроса (по товарам):


// В первой части запроса (выборка из ТЧ Товары)
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    Номенклатура,
|    ВЫРАЗИТЬ(Номенклатура.НаименованиеПолное КАК Строка(1000)) КАК Товар,
|    Номенклатура.Код КАК Код,
|    Номенклатура.Штрихкод КАК Штрихкод, // Добавляем наш реквизит
|    Количество,
// ... далее по тексту запроса

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


// Во второй части запроса (выборка из ТЧ Услуги)
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
|    РеализацияТоваровУслуг.Содержание,
|    РеализацияТоваровУслуг.Содержание,
|    Номенклатура.Код КАК Код,
|    NULL КАК Штрихкод, // Для услуг штрихкод обычно не нужен, но колонка должна быть
|    Количество,
// ...

Шаг 2: Исправление группировки данных

Проанализируем важный технический нюанс. В типовом запросе накладной часто используется вложенный запрос с конструкцией СГРУППИРОВАТЬ ПО. Если мы добавили Номенклатура.Штрихкод в список ВЫБРАТЬ, но не добавили его в группировку, программа выдаст ошибку.

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


|    ИЗ
|    (ВЫБРАТЬ
|        Номенклатура КАК Номенклатура,
|        Номенклатура.Штрихкод КАК Штрихкод, // Добавляем сюда
|        ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|        Цена КАК Цена,
|        СтавкаНДС КАК СтавкаНДС,
|        СУММА(Количество) КАК Количество,
// ...
|    СГРУППИРОВАТЬ ПО
|        Номенклатура,
|        Номенклатура.Штрихкод, // И ОБЯЗАТЕЛЬНО добавляем сюда
|        ЕдиницаИзмерения,
|        Цена,
|        СтавкаНДС
|    ) КАК ВложенныйЗапросПоТоварам

Важно: Без добавления поля в СГРУППИРОВАТЬ ПО запрос не сможет корректно свернуть строки с одинаковыми товарами и ценами.

Шаг 3: Передача данных в макет

После того как данные получены запросом, их нужно передать в область макета. В цикле обхода строк (Для каждого ВыборкаСтрокТовары из ЗапросТовары Цикл) обычно используется метод Заполнить(), который автоматически сопоставляет имена полей запроса с именами параметров в макете.

Проверим соответствие имен. Если в запросе мы написали Номенклатура.Штрихкод КАК Штрихкод, то в макете (в ячейке строки) у параметра должно быть имя Штрихкод, а тип заполнения установлен в значение Параметр.

Если автоматическое заполнение по каким-то причинам не срабатывает, пропишем передачу данных вручную:


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

Визуализация штрихкода (графическое отображение)

Если ваша задача — вывести не просто цифры, а сканируемое изображение ("зебру"), подход будет отличаться. Рассмотрим два варианта:

  1. Использование шрифтов: Можно установить шрифт (например, Code128 или EAN13) и назначить его ячейке макета. В этом случае в параметр Штрихкод нужно передавать строку, подготовленную специальным образом (с контрольными символами).
  2. Программная генерация картинки: Если в конфигурации есть библиотека подключаемого оборудования, можно использовать функции печати штрихкодов. Проанализируем пример кода для вывода картинки в область рисунка макета:

// Пример генерации картинки (требуется наличие компоненты 1С:Barcode)
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 40);
ПараметрыШтрихкода.Вставить("Высота", 10);
ПараметрыШтрихкода.Вставить("Штрихкод", ВыборкаСтрокТовары.Штрихкод);
ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN13

// Получаем рисунок из области макета
РисунокШтрихкод = ОбластьСтрока.Рисунки.Штрихкод; 
РисунокШтрихкод.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

Типичные ошибки при редактировании модуля

Разберем ситуацию, когда после внесения изменений 1С выдает ошибку: "Определения процедур и функций должны размещаться перед операторами тела модуля". Это критическая синтаксическая ошибка, которая означает следующее:

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

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

← На главную