Как вывести полное наименование номенклатуры вместо краткого в прайс-листе УТ 10.3?

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

Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем крайне популярную и практичную задачу, с которой часто сталкиваются как начинающие разработчики, так и администраторы баз данных в конфигурации 1С:Управление торговлей, редакция 10.3. Речь пойдет о настройке и доработке стандартной обработки «Печать прайс-листа».

По умолчанию в прайс-лист выводится краткое наименование номенклатуры (реквизит Наименование). Однако для внешних клиентов, коммерческих предложений и официальных прайс-листов гораздо презентабельный вид имеет полное наименование (реквизит НаименованиеПолное), где отражены все технические характеристики, ГОСТы, артикулы и подробные описания товара. Выясним, как заменить краткое наименование на полное без ущерба для отображения структуры папок (иерархии) номенклатуры.

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

Способ №1. Вывод полного наименования без изменения кода (через стандартные настройки)

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

Выполним настройку по шагам:

  1. Откроем обработку «Печать прайс-листа» в режиме «1С:Предприятие».
  2. В верхней панели формы нажмем кнопку «Настройка...». Перед нами откроется окно настройки параметров построителя.
  3. Перейдем на вкладку «Поля».
  4. В левом окне «Доступные поля» найдем и раскроем ветку Номенклатура, нажав на знак «плюс» рядом с ней.
  5. В раскрывшемся списке найдем поле Наименование полное. Дважды щелкнем по нему или воспользуемся кнопкой со стрелкой, чтобы перенести его в правое окно — «Выбранные поля».
  6. Теперь перейдем на вкладку «Общие».
  7. Обратим внимание на настройку «Выводить дополнительные поля». У нас есть два варианта отображения:
    • «В отдельной колонке» — в этом случае в прайс-листе появится новая колонка, в которой будет отображаться полное описание, а старая колонка с кратким наименованием останется на месте.
    • «В одной колонке с системными полями» — полное наименование будет выводиться непосредственно в ячейке с номенклатурой (в скобках или новой строкой), что часто является самым элегантным и аккуратным решением.
  8. Нажмем кнопку «ОК» и сформируем прайс-лист заново.

Преимущества этого способа: конфигурация остается полностью типовой. При последующих обновлениях «1С:Управление торговлей» вам не придется вручную объединять измененные объекты, а база данных без проблем обновится в автоматическом режиме.

Способ №2. Программное изменение кода обработки

Бывают ситуации, когда стандартных настроек недостаточно. Например, руководство компании требует жестко зафиксировать форму прайс-листа, чтобы менеджеры не могли случайно сбросить настройки, или необходимо, чтобы полное наименование выводилось по умолчанию сразу при открытии обработки. В таком случае нам потребуется внести изменения в код.

Для реализации этого способа нам понадобится открыть базу в режиме «Конфигуратор». Разберем весь процесс по шагам и выясним причины возможных ошибок.

Шаг 2.1. Изменение текста запроса в построителе отчета

Первым делом нам необходимо скорректировать запрос, который собирает данные для прайс-листа. Нам нужно найти место, где формируется представление номенклатуры, и заменить его на полное наименование.

Проанализируем структуру конфигурации и выполним следующие действия:

  1. Откроем конфигуратор, найдем в дереве метаданных ветку Обработки и выберем обработку ПечатьПрайсЛиста.
  2. Откроем модуль объекта этой обработки.
  3. Найдем процедуру ЗаполнитьПостроительОтчетаПоЦенамНоменклатуры().
  4. Внутри этой процедуры найдем текст запроса к базе данных. Нам нужна строка, отвечающая за представление номенклатуры. Обычно она выглядит так: | ЗапросПрайс.Номенклатура.Представление КАК НоменклатураПредставление,
  5. Заменим эту строку на обращение к реквизиту полного наименования. При этом обязательно используем функцию ВЫРАЗИТЬ, чтобы ограничить длину строки. Это критически важно для корректной работы СУБД с неограниченными текстовыми полями:
    
    |    ВЫРАЗИТЬ(ЗапросПрайс.Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) КАК НоменклатураПредставление,
    

Казалось бы, задача решена. Однако, если мы сохраним изменения и запустим отчет, то увидим неприятную проблему: у групп номенклатуры (папок в иерархии) полностью пропали названия. На месте папок отображаются пустые строки.

Выясним причину этой ошибки. Построитель отчета при формировании иерархических группировок обращается к детальным полям выборки. Поскольку у групп (папок) номенклатуры реквизит НаименованиеПолное физически отсутствует (он не заполняется в интерфейсе для папок), база данных для этих строк возвращает значение NULL. Из-за этого Построитель не может вывести название группы.

Шаг 2.2. Корректировка вывода строк и обработка значений NULL

Попытки решить эту проблему через конструкцию ВЫБОР КОГДА непосредственно в запросе не увенчаются успехом, так как при построении иерархических итогов СУБД все равно будет оперировать значениями детальных записей. Правильным решением будет доработка алгоритма вывода строк в модуле обработки.

Посмотрим на процедуру вывода строк. Найдем в модуле объекта обработку ВывестиСтрокуПрайса(). В ней присутствует логика определения представления группировки:


Если КолонкиРезультата.Найти(НазваниеГруппировки + "Представление") = Неопределено Тогда
    ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
    ПредставлениеГруппировки = Выборка[НазваниеГруппировки + "Представление"];
КонецЕсли;

Нам необходимо модернизировать этот участок кода. Если система выводит строку группы (папки), представление для которой вернуло NULL, мы должны принудительно подставить стандартное краткое наименование папки. Изменим это условие следующим образом:


Если КолонкиРезультата.Найти(НазваниеГруппировки + "Представление") = Неопределено Тогда
    ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
    Если Выборка[НазваниеГруппировки + "Представление"] = NULL Тогда
        ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
    Иначе
        ПредставлениеГруппировки = Выборка[НазваниеГруппировки + "Представление"];
    КонецЕсли;
КонецЕсли;

Этот код проверяет: если для текущей группировки представление оказалось не заполнено (вернуло значение NULL), то программа берет стандартное системное представление объекта Выборка[НазваниеГруппировки], которое для папок всегда содержит их обычное наименование. Если же значение заполнено (для элементов номенклатуры), то выводится наше модифицированное полное наименование.

Шаг 2.3. Настройка сортировки в пользовательском режиме

После сохранения измененного кода в конфигураторе нам нужно зайти в режим «1С:Предприятие» и сделать последнюю важную настройку:

  1. Откроем прайс-лист и перейдем в «Настройка...».
  2. Перейдем на вкладку «Сортировка».
  3. Если в сортировке указано стандартное поле Номенклатура, замените его на НоменклатураПредставление.

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

Полезные советы и оптимизация решения

Рассмотрим несколько важных нюансов, которые помогут сделать ваше решение еще более надежным и производительным.

1. Защита от пустых наименований. На практике в рабочих базах часто встречаются карточки товаров, у которых поле «Полное наименование» не заполнено (забыли внести при создании, сбой импорта данных и т.д.). В таком случае в прайс-листе у этого товара будет пустота.

Чтобы застраховаться от этого, мы рекомендуем немного улучшить конструкцию запроса из Шага 2.1, добавив проверку на пустое значение:


|    ВЫБОР 
|        КОГДА ЗапросПрайс.Номенклатура.НаименованиеПолное ЕСТЬ NULL 
|              ИЛИ ЗапросПрайс.Номенклатура.НаименованиеПолное = "" 
|            ТОГДА ЗапросПрайс.Номенклатура.Наименование 
|        ИНАЧЕ ВЫРАЗИТЬ(ЗапросПрайс.Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) 
|    КОНЕЦ КАК НоменклатураПредставление,

Благодаря этому условию, если полное наименование не заполнено, система автоматически подставит обычное краткое наименование, и товар не останется «безымянным».

2. Проблемы с производительностью больших баз. Конструкция ВЫРАЗИТЬ(... КАК СТРОКА(1000)) заставляет СУБД обрабатывать длинные строковые поля. На базах данных с десятками тысяч позиций сортировка и группировка по строке длиной 1000 символов может привести к заметному замедлению формирования отчета.

Если ваши полные наименования гарантированно умещаются в меньший лимит, мы рекомендуем ограничить строку до разумного минимума, например, СТРОКА(250) или СТРОКА(150). Это существенно снизит нагрузку на сервер баз данных.

3. Учет характеристик номенклатуры. Обратите внимание, что если в вашей базе ведется детальный учет по характеристикам (цвета, размеры, объемы), замена стандартного системного представления на полное наименование в запросе может привести к тому, что характеристики перестанут правильно выводиться рядом с товаром. Если вы активно используете характеристики, мы настоятельно рекомендуем использовать Способ №1 (через стандартные настройки дополнительных полей построителя отчета), так как он сохраняет все механизмы компоновки характеристик встроенными средствами платформы 1С.

← На главную