При настройке типовой печатной формы ценников в конфигурации «Торговля и Склад 7.7» (обработка ПечатьЦенников / printcen.ert) разработчики часто сталкиваются с необходимостью отображения кода товара. Однако простая попытка добавить поле в макет и прописать обращение к реквизиту нередко приводит к ошибкам времени выполнения. Разберем по шагам, почему возникают эти ошибки и как правильно модифицировать код и макет.
Рассмотрим две наиболее распространенные ошибки, которые возникают при попытке вывести код позиции:
ТаблицаТоваров колонка Товар в типовой конфигурации содержит строковое наименование (тип Строка), а не ссылку на справочник Справочник.Номенклатура. У строки нет реквизита Код, поэтому вызов ТаблицаТоваров.Товар.Код вызывает исключение.Таб.ВывестиСекцию() или Таб.ПрисоединитьСекцию(). Если переменная ПечКод заполняется в основном цикле обработки, но вывод секции происходит внутри вспомогательной процедуры ДобавитьЦенник(), табличный документ не видит эту переменную в локальной области видимости.Разберем наиболее архитектурно правильный способ — передачу значения кода через параметры процедур формирования макета.
Выясним структуру колонок таблицы: если в таблице уже присутствует ссылка на элемент справочника (например, в колонке Номенклатура или ТМЦ), получаем код непосредственно из нее. Если же колонка содержит только строку, необходимо скорректировать заполнение таблицы значений либо получить ссылку на элемент справочника.
Посмотрим на пример модификации вызова процедуры в цикле обхода строк:
ТаблицаТоваров.ВыбратьСтроки();
Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл
ПечРозн = глФРМ(ТаблицаТоваров.Цена, ТаблицаТоваров.Валюта);
ПечНаименование = ТаблицаТоваров.Товар;
ПечКод = ТаблицаТоваров.Номенклатура.Код; // Получаем код из реквизита справочника
// Передаем переменную ПечКод в процедуру формирования
ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд, ПечКод);
глОживить(1);
КонецЦикла;
Далее изменим заголовок и тело процедуры ДобавитьЦенник, принимающей параметры для секции:
Процедура ДобавитьЦенник(Таб, Фирма, Товар, Единица, Цена, Столбик, Ряд, КодТовара)
// Значение становится доступным локально для выражений в ячейках секции макета
ПечКод = КодТовара;
// Вывод секции макета
Таб.ВывестиСекцию("Ценник");
КонецПроцедуры
В самом макете печатной формы в нужной ячейке указываем тип Выражение и вписываем имя переменной: ПечКод.
Рассмотрим альтернативный вариант, позволяющий избежать изменения сигнатуры процедуры ДобавитьЦенник. Для этого объявим переменную на уровне всего модуля формы.
В самом начале модуля обработки (до описания первой процедуры или функции) объявим переменную:
Перем ПечКод;
В этом случае переменная ПечКод будет доступна в любой процедуре данного модуля, включая ДобавитьЦенник(), и макет успешно прочитает ее значение при выводе секции.
Проанализируем вопрос сохранения доработок при установке релизов обновлений:
ПечатьЦенников непосредственно в дереве конфигурации (файл 1cv7.md), при следующем объединении конфигураций с новым релизом типовой конфигурации изменения могут быть затерты. Чтобы этого избежать, при обновлении в окне объединения необходимо вручную снимать флаг с обработки ПечатьЦенников.printcen.ert) в каталог внешних печатных форм базы данных (каталог ExtForms\PrnForms). При обновлении файла конфигурации внешние формы не перезаписываются.