Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем крайне популярную и практичную задачу, с которой часто сталкиваются как начинающие разработчики, так и администраторы баз данных в конфигурации 1С:Управление торговлей, редакция 10.3. Речь пойдет о настройке и доработке стандартной обработки «Печать прайс-листа».
По умолчанию в прайс-лист выводится краткое наименование номенклатуры (реквизит Наименование). Однако для внешних клиентов, коммерческих предложений и официальных прайс-листов гораздо презентабельный вид имеет полное наименование (реквизит НаименованиеПолное), где отражены все технические характеристики, ГОСТы, артикулы и подробные описания товара. Выясним, как заменить краткое наименование на полное без ущерба для отображения структуры папок (иерархии) номенклатуры.
Мы проанализируем ситуацию с двух сторон: сначала разберем штатный альтернативный вариант, который позволяет обойтись вообще без программирования, а затем по шагам реализуем надежное программное решение с внесением изменений в код конфигурации.
Прежде чем приступать к изменению конфигурации и написанию кода, давайте рассмотрим стандартный инструмент, заложенный разработчиками фирмы «1С». Поскольку обработка «Печать прайс-листа» в УТ 10.3 построена на базе мощного универсального механизма — Построителя отчета — мы можем вывести необходимые поля через пользовательские настройки.
Выполним настройку по шагам:
Номенклатура, нажав на знак «плюс» рядом с ней.Наименование полное. Дважды щелкнем по нему или воспользуемся кнопкой со стрелкой, чтобы перенести его в правое окно — «Выбранные поля».Преимущества этого способа: конфигурация остается полностью типовой. При последующих обновлениях «1С:Управление торговлей» вам не придется вручную объединять измененные объекты, а база данных без проблем обновится в автоматическом режиме.
Бывают ситуации, когда стандартных настроек недостаточно. Например, руководство компании требует жестко зафиксировать форму прайс-листа, чтобы менеджеры не могли случайно сбросить настройки, или необходимо, чтобы полное наименование выводилось по умолчанию сразу при открытии обработки. В таком случае нам потребуется внести изменения в код.
Для реализации этого способа нам понадобится открыть базу в режиме «Конфигуратор». Разберем весь процесс по шагам и выясним причины возможных ошибок.
Первым делом нам необходимо скорректировать запрос, который собирает данные для прайс-листа. Нам нужно найти место, где формируется представление номенклатуры, и заменить его на полное наименование.
Проанализируем структуру конфигурации и выполним следующие действия:
Обработки и выберем обработку ПечатьПрайсЛиста.ЗаполнитьПостроительОтчетаПоЦенамНоменклатуры().
| ЗапросПрайс.Номенклатура.Представление КАК НоменклатураПредставление,
ВЫРАЗИТЬ, чтобы ограничить длину строки. Это критически важно для корректной работы СУБД с неограниченными текстовыми полями:
| ВЫРАЗИТЬ(ЗапросПрайс.Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) КАК НоменклатураПредставление,
Казалось бы, задача решена. Однако, если мы сохраним изменения и запустим отчет, то увидим неприятную проблему: у групп номенклатуры (папок в иерархии) полностью пропали названия. На месте папок отображаются пустые строки.
Выясним причину этой ошибки. Построитель отчета при формировании иерархических группировок обращается к детальным полям выборки. Поскольку у групп (папок) номенклатуры реквизит НаименованиеПолное физически отсутствует (он не заполняется в интерфейсе для папок), база данных для этих строк возвращает значение NULL. Из-за этого Построитель не может вывести название группы.
Попытки решить эту проблему через конструкцию ВЫБОР КОГДА непосредственно в запросе не увенчаются успехом, так как при построении иерархических итогов СУБД все равно будет оперировать значениями детальных записей. Правильным решением будет доработка алгоритма вывода строк в модуле обработки.
Посмотрим на процедуру вывода строк. Найдем в модуле объекта обработку ВывестиСтрокуПрайса(). В ней присутствует логика определения представления группировки:
Если КолонкиРезультата.Найти(НазваниеГруппировки + "Представление") = Неопределено Тогда
ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
ПредставлениеГруппировки = Выборка[НазваниеГруппировки + "Представление"];
КонецЕсли;
Нам необходимо модернизировать этот участок кода. Если система выводит строку группы (папки), представление для которой вернуло NULL, мы должны принудительно подставить стандартное краткое наименование папки. Изменим это условие следующим образом:
Если КолонкиРезультата.Найти(НазваниеГруппировки + "Представление") = Неопределено Тогда
ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
Если Выборка[НазваниеГруппировки + "Представление"] = NULL Тогда
ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
ПредставлениеГруппировки = Выборка[НазваниеГруппировки + "Представление"];
КонецЕсли;
КонецЕсли;
Этот код проверяет: если для текущей группировки представление оказалось не заполнено (вернуло значение NULL), то программа берет стандартное системное представление объекта Выборка[НазваниеГруппировки], которое для папок всегда содержит их обычное наименование. Если же значение заполнено (для элементов номенклатуры), то выводится наше модифицированное полное наименование.
После сохранения измененного кода в конфигураторе нам нужно зайти в режим «1С:Предприятие» и сделать последнюю важную настройку:
Номенклатура, замените его на НоменклатураПредставление.Теперь прайс-лист будет формироваться быстро, красиво, с полными наименованиями товаров и корректной иерархической структурой папок.
Рассмотрим несколько важных нюансов, которые помогут сделать ваше решение еще более надежным и производительным.
1. Защита от пустых наименований. На практике в рабочих базах часто встречаются карточки товаров, у которых поле «Полное наименование» не заполнено (забыли внести при создании, сбой импорта данных и т.д.). В таком случае в прайс-листе у этого товара будет пустота.
Чтобы застраховаться от этого, мы рекомендуем немного улучшить конструкцию запроса из Шага 2.1, добавив проверку на пустое значение:
| ВЫБОР
| КОГДА ЗапросПрайс.Номенклатура.НаименованиеПолное ЕСТЬ NULL
| ИЛИ ЗапросПрайс.Номенклатура.НаименованиеПолное = ""
| ТОГДА ЗапросПрайс.Номенклатура.Наименование
| ИНАЧЕ ВЫРАЗИТЬ(ЗапросПрайс.Номенклатура.НаименованиеПолное КАК СТРОКА(1000))
| КОНЕЦ КАК НоменклатураПредставление,
Благодаря этому условию, если полное наименование не заполнено, система автоматически подставит обычное краткое наименование, и товар не останется «безымянным».
2. Проблемы с производительностью больших баз. Конструкция ВЫРАЗИТЬ(... КАК СТРОКА(1000)) заставляет СУБД обрабатывать длинные строковые поля. На базах данных с десятками тысяч позиций сортировка и группировка по строке длиной 1000 символов может привести к заметному замедлению формирования отчета.
Если ваши полные наименования гарантированно умещаются в меньший лимит, мы рекомендуем ограничить строку до разумного минимума, например, СТРОКА(250) или СТРОКА(150). Это существенно снизит нагрузку на сервер баз данных.
3. Учет характеристик номенклатуры. Обратите внимание, что если в вашей базе ведется детальный учет по характеристикам (цвета, размеры, объемы), замена стандартного системного представления на полное наименование в запросе может привести к тому, что характеристики перестанут правильно выводиться рядом с товаром. Если вы активно используете характеристики, мы настоятельно рекомендуем использовать Способ №1 (через стандартные настройки дополнительных полей построителя отчета), так как он сохраняет все механизмы компоновки характеристик встроенными средствами платформы 1С.