Как программно сформировать и вывести штрихкод в макете 1С, используя данные из табличной части документа?

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе с системой 1С часто возникает необходимость выводить в печатных формах различные данные, включая штрихкоды, которые формируются на основе реквизитов документа. Рассмотрим подробнее, как реализовать формирование штрихкода по артикулу для каждой строки табличной части документа в макете печати.

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

Пошаговое решение проблемы формирования штрихкода

Для успешного формирования и вывода штрихкода нам потребуется выполнить несколько ключевых шагов. Разберем их последовательно.

Шаг 1: Доступ к элементу штрихкода на макете

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

Если элемент штрихкода находится внутри определенной области макета (например, области Товары, как в нашем случае), то правильнее будет обращаться к нему через эту область. Допустим, ваш элемент штрихкода на макете назван КартинкаШтрихкода.

Мы получаем ссылку на область, а затем из этой области получаем доступ к коллекции рисунков и находим наш элемент штрихкода:


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

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

Шаг 2: Установка свойств штрихкода

Сам элемент штрихкода на макете является контейнером. Для управления его поведением и содержимым используется свойство Объект. Именно через это свойство мы будем устанавливать тип штрихкода и сообщение (данные), которое необходимо закодировать.

Рассмотрим распространенные ошибки и правильный подход:

  1. Неправильная попытка присвоения напрямую:

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

    
    ТабДок.Рисунки.Штрихкод = Выборка.Артикул; // Некорректно
    Картинка = ВыборкаТовары.Артикул; // Тоже некорректно, приведет к ошибке
    

    Такой подход приведет к ошибке "Поле объекта недоступно для записи", потому что вы пытаетесь присвоить строковое значение (артикул) объекту типа Рисунок, а не его внутреннему свойству, отвечающему за данные штрихкода.

  2. Корректное присвоение значений:

    Для правильной работы нам необходимо обратиться к свойству Объект нашего элемента штрихкода и установить два ключевых параметра:

    • Объект.Сообщение: Сюда мы передаем строку, которая должна быть закодирована в штрихкод. В нашем случае это будет Артикул текущей строки табличной части.
    • Объект.ТипКода: Это свойство определяет, какой тип штрихкода будет использоваться (например, EAN13, Code128, QR-код и т.д.). Значение для типа кода можно задать числом (например, 4 для EAN13) или с помощью предопределенных значений перечисления, если они доступны в вашей конфигурации (например, Перечисления.ТипыШтрихкодов.EAN13).

    Применим это к нашему коду:

    
    // ... внутри цикла по строкам табличной части
    Картинка = ОбластьТовары.Рисунки.КартинкаШтрихкода;
    Картинка.Объект.ТипКода = 4; // Пример: EAN13. Уточните необходимый тип кода.
    Картинка.Объект.Сообщение = СтрокаТовара.Артикул; // Передаем артикул из текущей строки
    // ...
    

    Здесь СтрокаТовара — это переменная, которая в цикле получает текущую строку из выборки табличной части (например, ВыборкаТовары из сообщения 7 и 9). Важно убедиться, что СтрокаТовара.Артикул содержит данные, пригодные для кодирования выбранным типом штрихкода (например, длина артикула для EAN13 должна быть 12 или 13 цифр).

Шаг 3: Вывод области в табличный документ

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


// ... код до цикла по табличной части ...
Макет = ПолучитьМакет("Печать");
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
// ...
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    ДокументСсылка.Товары.Артикул
|ИЗ
|    Документ.ИмяВашегоДокумента.Товары КАК ДокументСсылка_Товары
|ГДЕ
|    ДокументСсылка_Товары.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент); // Предполагается, что у вас есть ссылка на документ
ВыборкаТовары = Запрос.Выполнить().Выбрать();

ТабДок = Новый ТабличныйДокумент;

Пока ВыборкаТовары.Следующий() Цикл
    // Получаем ссылку на элемент штрихкода в текущей области
    Картинка = ОбластьТовары.Рисунки.КартинкаШтрихкода;

    // Устанавливаем тип штрихкода (например, EAN13)
    Картинка.Объект.ТипКода = 4; // Или Перечисления.ТипыШтрихкодов.EAN13

    // Устанавливаем сообщение (артикул) для кодирования
    Картинка.Объект.Сообщение = ВыборкаТовары.Артикул;

    // Также заполняем другие поля области, если они есть
    ОбластьТовары.Параметры.Заполнить(ВыборкаТовары); 

    // Выводим заполненную область в табличный документ
    ТабДок.Вывести(ОбластьТовары);
КонецЦикла;

// ... дальнейший код для предпросмотра или печати ТабДок ...
ТабДок.Показать();

В этом примере ОбластьТовары.Параметры.Заполнить(ВыборкаТовары) используется для автоматического заполнения параметров макета, имена которых совпадают с именами полей в выборке. Если у вас есть другие параметры в области, помимо штрихкода, их также можно заполнять таким образом.

Важные аспекты и отладка

Если после выполнения этих шагов штрихкод все еще не формируется или выводится пустым, необходимо провести отладку и проверить следующие моменты:

  1. Проверка значения Артикул: Используйте отладчик, чтобы убедиться, что ВыборкаТовары.Артикул содержит ожидаемые данные и эти данные не пусты. Возможно, в табличной части артикул не заполнен или имеет некорректный формат.

  2. Доступность свойства Объект: Убедитесь, что переменная Картинка действительно указывает на элемент штрихкода и что у этого элемента существует свойство Объект с под-свойствами Сообщение и ТипКода. В режиме отладки вы можете посмотреть состав объекта Картинка.

  3. Корректность ТипКода: Проверьте, что выбранный ТипКода (например, 4 для EAN13) соответствует тому, что вы хотите получить, и что он совместим с форматом вашего артикула.

  4. Установка компонента печати штрихкодов: Удостоверьтесь, что в системе установлен необходимый компонент для печати штрихкодов. В большинстве современных конфигураций 1С этот функционал встроен, но иногда требуется установить дополнительный ActiveX-компонент или библиотеку.

  5. Порядок операций: Важно, чтобы установка свойств Картинка.Объект.ТипКода и Картинка.Объект.Сообщение происходила перед вызовом ТабДок.Вывести(ОбластьТовары) для каждой строки. В противном случае штрихкод будет сформирован с данными из предыдущей итерации или с пустыми значениями.

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

← На главную