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