Как добавить артикул в печатную форму товарной накладной (ТТН) в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

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

Шаг 1: Редактирование макета печатной формы (.mxl)

Прежде чем изменять код, нужно подготовить "место" в макете, куда будут выводиться данные. Макет — это визуальный шаблон печатной формы.

  1. Откройте конфигуратор и найдите нужный документ. В нашем случае это Документ.ПеремещениеНоменклатурыИзОбщепитаВРозницу.
  2. Перейдите на вкладку «Макеты» и найдите макет, отвечающий за печатную форму ТТН. Например, он может называться «Макет».
  3. В табличной части макета, где выводятся строки с товарами, выберите ячейку, в которой должен отображаться артикул (например, в колонке «Примечание» или в новой, специально созданной колонке).
  4. Нажмите на ячейку правой кнопкой мыши и выберите «Свойства».
  5. В палитре свойств найдите свойство «Заполнение» и установите его значение в «Параметр».
  6. Ниже появится свойство «Параметр». Введите в него имя, по которому мы будем обращаться к этой ячейке из кода. Назовем его Артикул. Очень важно запомнить это имя — оно должно в точности совпадать с псевдонимом поля в SQL-запросе, который мы будем править на следующем шаге.

Теперь макет готов принимать данные в новый параметр.

Шаг 2: Изменение кода в модуле документа

Данные для печатной формы обычно готовятся в модуле объекта документа. В нашем примере это процедура ТоварнаяНакладная. Проанализируем ее код и внесем необходимые изменения.

Основная задача — получить артикул из справочника «Номенклатура». Самый простой способ сделать это — дополнить существующий SQL-запрос, который получает данные для табличной части.

Найдем в процедуре ТоварнаяНакладная фрагмент, где формируется запрос по номенклатуре документа. Исходный код запроса выглядит так:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.Номенклатура КАК Номенклатура,
|    ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.Количество КАК Количество,
|    ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.ЦенаСНаценкой КАК Цена,
|    ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.СуммаСНаценкой КАК Сумма
|ИЗ
|    Документ.ПеремещениеНоменклатурыИзОбщепитаВРозницу.Номенклатура КАК ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура
|ГДЕ
|    ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.Ссылка В(&МассивОбъектов)";

Чтобы получить артикул, нам нужно обратиться к реквизиту Артикул через поле Номенклатура, которое является ссылкой на справочник. Добавим в секцию ВЫБРАТЬ новую строку:

| ПеремещениеНоменклатурыИзОбщепитаВРозницуНоменклатура.Номенклатура.Артикул КАК Артикул,

Обратите внимание на синтаксис:

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

Полный код процедуры с изменениями

Ниже приведен полный текст процедуры ТоварнаяНакладная с уже внесенными правками в запрос. Вы можете использовать его как готовый пример.


Процедура ТоварнаяНакладная(ТабличныйДокумент,Ссылка) Экспорт

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

    // ... (код инициализации переменных)

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ | ..."; // Первый запрос для шапки документа

    // ... (код заполнения шапки)

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

    Запрос.УстановитьПараметр("МассивОбъектов", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаНоменклатуры = РезультатЗапроса.Выбрать();

    Пока ВыборкаНоменклатуры.Следующий() Цикл
        КоличествоИтого = КоличествоИтого + ВыборкаНоменклатуры.Количество;
        СтоимостьИтого = СтоимостьИтого + ВыборкаНоменклатуры.Сумма;

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

        ТабличныйДокумент.Вывести(ОбластьСтрока);
        КоличествоОтпечатаноНаСтранице = КоличествоОтпечатаноНаСтранице + 1;
    КонецЦикла;

    // ... (дальнейший код вывода итогов и подвала)

КонецПроцедуры

Важные рекомендации: Внешние печатные формы

Стоит отметить, что прямое редактирование кода внутри конфигурации — это плохая практика. Основная причина — при обновлении конфигурации все ваши изменения будут затерты, и их придется вносить заново.

Правильный и безопасный способ доработки — создание внешней печатной формы (файл с расширением .epf). Для этого:

  1. Скопируйте существующую печатную форму (макет и код процедуры) во внешнюю обработку.
  2. Внесите все описанные выше изменения уже во внешнем файле.
  3. Подключите эту обработку к базе данных через меню «Сервис» -> «Дополнительные отчеты и обработки» -> «Печатные формы».

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

Что делать, если артикул не появился?

Если вы все сделали по инструкции, но артикул в печатной форме так и не появился (ячейка пустая), проверьте следующие моменты:

← На главную