Как вывести код номенклатуры на ценник в 1С:Торговля и Склад 7.7

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

При настройке типовой печатной формы ценников в конфигурации «Торговля и Склад 7.7» (обработка ПечатьЦенников / printcen.ert) разработчики часто сталкиваются с необходимостью отображения кода товара. Однако простая попытка добавить поле в макет и прописать обращение к реквизиту нередко приводит к ошибкам времени выполнения. Разберем по шагам, почему возникают эти ошибки и как правильно модифицировать код и макет.

Анализ типовых ошибок при доработке

Рассмотрим две наиболее распространенные ошибки, которые возникают при попытке вывести код позиции:

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

Способ 1. Передача кода номенклатуры через параметры процедуры

Разберем наиболее архитектурно правильный способ — передачу значения кода через параметры процедур формирования макета.

Выясним структуру колонок таблицы: если в таблице уже присутствует ссылка на элемент справочника (например, в колонке Номенклатура или ТМЦ), получаем код непосредственно из нее. Если же колонка содержит только строку, необходимо скорректировать заполнение таблицы значений либо получить ссылку на элемент справочника.

Посмотрим на пример модификации вызова процедуры в цикле обхода строк:


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

Далее изменим заголовок и тело процедуры ДобавитьЦенник, принимающей параметры для секции:


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

В самом макете печатной формы в нужной ячейке указываем тип Выражение и вписываем имя переменной: ПечКод.

Способ 2. Использование переменной уровня модуля

Рассмотрим альтернативный вариант, позволяющий избежать изменения сигнатуры процедуры ДобавитьЦенник. Для этого объявим переменную на уровне всего модуля формы.

В самом начале модуля обработки (до описания первой процедуры или функции) объявим переменную:

Перем ПечКод;

В этом случае переменная ПечКод будет доступна в любой процедуре данного модуля, включая ДобавитьЦенник(), и макет успешно прочитает ее значение при выводе секции.

Сохранение изменений при обновлении конфигурации

Проанализируем вопрос сохранения доработок при установке релизов обновлений:

  1. Изменение встроенной обработки в метаданных: Если редактировать обработку ПечатьЦенников непосредственно в дереве конфигурации (файл 1cv7.md), при следующем объединении конфигураций с новым релизом типовой конфигурации изменения могут быть затерты. Чтобы этого избежать, при обновлении в окне объединения необходимо вручную снимать флаг с обработки ПечатьЦенников.
  2. Использование внешней печатной формы: Чтобы полностью исключить влияние обновлений метаданных на печатную форму, рекомендуется вынести ее в виде внешнего файла (printcen.ert) в каталог внешних печатных форм базы данных (каталог ExtForms\PrnForms). При обновлении файла конфигурации внешние формы не перезаписываются.
← На главную