Как вывести код номенклатуры в печатную форму УПД в 1С 7.7 (Торговля и Склад 9.2)?

Программист 1С v7.7 1С:Управление торговлей Бухгалтерский учет Торговля и дистрибуция
← На главную

В этой статье мы подробно разберем задачу по доработке печатной формы Универсального передаточного документа (УПД) в конфигурации «Торговля и Склад 9.2» на платформе 1С:Предприятие 7.7. Рассмотрим типичную ошибку начинающих программистов, из-за которой во всех строках печатается код одного и того же товара, и реализуем корректный алгоритм вывода данных.

Разбор причины ошибки: почему дублируется код?

Часто при попытке добавить новый реквизит (например, Код или Артикул) в макет печатной формы пользователи просто прописывают в ячейке выражение вида <Докум.Номенклатура.Код>. Однако при печати обнаруживается, что для всех позиций выводится код товара из первой строки документа.

Давайте выясним причину. В типовых конфигурациях 1С 7.7 (в частности, в «Торговле и Склад») механизм печати сложных документов, таких как Счет-фактура или УПД, устроен следующим образом:

  1. Система не перебирает строки документа напрямую в момент вывода на печать.
  2. Сначала создается и заполняется специальная Таблица Значений (в коде она часто называется переменной МнЧ — Множественная Часть). Это делается для того, чтобы сгруппировать одинаковые товары, распределить их по Грузовым таможенным декларациям (ГТД) или разбить одну строку документа на несколько строк в печатной форме.
  3. Цикл печати (вывод секций макета) идет именно по строкам этой таблицы МнЧ.

Суть ошибки: Когда вы пишете в макете Докум.Номенклатура.Код, вы обращаетесь к контексту самого документа. В процессе перебора таблицы МнЧ курсор в объекте документа не двигается (он стоит на первой строке или на той, где был оставлен последним вызовом). Поэтому система раз за разом берет данные из одной и той же строки документа.

Чтобы решить задачу правильно, необходимо добавить нужные данные (Код) в саму таблицу значений МнЧ на этапе ее формирования.

Этап 1: Доработка структуры таблицы значений

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

Нам нужно добавить новую колонку для хранения кода товара. Рассмотрим пример кода:


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

Этап 2: Заполнение данных (Подготовка МнЧ)

Теперь перейдем к процедурам заполнения таблицы. В конфигурации их может быть несколько для разных ситуаций (например, ПодготовитьМнЧоснУПД, ПодготовитьМнЧУПД и т.д.). Нам нужно найти места, где заполняется колонка Номенклатура, и рядом добавить заполнение нашей новой колонки НоменклатураКод.

Разберем логику заполнения. Данные берутся из ТаблицаОснования (которая содержит выгруженную табличную часть документа) или напрямую из движений регистров/строк документа.

Пример доработки процедуры подготовки данных:


// Внутри цикла перебора строк (Пока ТаблицаОснования.ПолучитьСтроку()=1 Цикл)

// ... существующий код заполнения
МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование; // Заполняем наименование

// --- НАШИ ИЗМЕНЕНИЯ ---
// Проверяем, является ли номенклатура справочником и есть ли у нее код
Если (ТипЗначенияСтр(ТаблицаОснования.Номенклатура) = "Справочник") Тогда
    If ТаблицаОснования.Номенклатура.Вид() = "Номенклатура" Тогда
         // Заполняем кодом
         МнЧ.НоменклатураКод = ТаблицаОснования.Номенклатура.Код;
    Иначе
         // Если это не товар (например, текст), ставим прочерк
         МнЧ.НоменклатураКод = "-";
    КонецЕсли;
Иначе
    МнЧ.НоменклатураКод = "-";
КонецЕсли;
// --- КОНЕЦ ИЗМЕНЕНИЙ ---

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

Если используется распределение по ГТД (когда одна строка товара разбивается на несколько), убедитесь, что при добавлении новых строк в МнЧ (метод МнЧ.НоваяСтрока()) вы также копируете значение кода из исходной строки.

Этап 3: Вывод данных на печать

После того как таблица МнЧ сформирована и заполнена, переходим к процедуре непосредственной печати (обычно она называется ПечатьУПД). В этой процедуре происходит перебор строк подготовленной таблицы и вывод их в секции макета.

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


// Цикл печати
Пока МнЧ.ПолучитьСтроку() = 1 Цикл
    
    НомерСтроки = НомерСтроки + 1;
    
    // Получаем данные для вывода в секцию
    Наименование = СокрЛП(МнЧ.Номенклатура);
    
    // --- НАШИ ИЗМЕНЕНИЯ ---
    // Получаем код из колонки ТЗ, которую мы добавили ранее
    ТекКод = СокрЛП(МнЧ.НоменклатураКод);
    
    // Если нужно убрать лидирующие нули (превратить "0000123" в "123")
    // Используем форматирование. Но будьте осторожны, если коды содержат буквы!
    // Вариант для числовых кодов:
    // ТекКод = Формат(МнЧ.НоменклатураКод, "Ч(0)10.0"); // Пример формата
    // --- КОНЕЦ ИЗМЕНЕНИЙ ---

    // Вывод секции
    Таб.ВывестиСекцию("Строка");
    
КонецЦикла;

Этап 4: Настройка макета таблицы (MXL)

Остался последний шаг — визуализация. Откройте макет печатной формы (Таблица) в конфигураторе.

  1. Выберите ячейку в столбце 1 (или А), где должен выводиться код. В стандартном УПД там обычно выводится номер по порядку (НомерСтроки). Если вы хотите заменить номер на код или добавить код к наименованию, выберите соответствующую ячейку.
  2. В свойствах ячейки укажите тип «Выражение».
  3. В поле текст/выражение пропишите имя переменной, которую мы определили в процедуре печати на Этапе 3. В нашем примере это ТекКод.

Если вы хотите вывести код в отдельной колонке, вам, возможно, придется изменить структуру самой печатной формы (раздвинуть или добавить столбцы), но помните, что форма УПД является регламентированной, и серьезные изменения её структуры могут вызвать вопросы у контролирующих органов. Безопаснее выводить код в графе наименования (например: "Код: " + ТекКод + " " + Наименование).

Итог

Мы проанализировали процесс доработки печати в 1С 7.7. Главный секрет успеха — работать не с документом напрямую в макете, а подготовить данные в промежуточной таблице значений. Это обеспечивает корректный вывод информации при любых группировках и разбиениях строк.

Краткий чек-лист решения:

  1. Добавить МнЧ.НоваяКолонка("НоменклатураКод").
  2. Заполнить МнЧ.НоменклатураКод при переборе строк документа.
  3. Присвоить переменной в цикле печати значение ТекКод = МнЧ.НоменклатураКод.
  4. Вывести переменную ТекКод в макете.
← На главную