При формировании печатной формы документа Счет на оплату клиенту в конфигурации 1С:Управление торговлей 11 по умолчанию колонка с товаром заполняется из реквизита НаименованиеПолное справочника номенклатуры. Нередко в торговой деятельности требуется, чтобы клиент прямо в счете видел сведения о производителе или торговой марке товара. Рассмотрим подробно, как доработать вывод данных, какие особенности языка запросов 1С при этом необходимо учитывать и как избежать типичных синтаксических ошибок.
В типовых конфигурациях линейки УТ 11, КА 2 и ERP логика подготовки данных для печати вынесена в модуль менеджера соответствующего документа. Разберем по шагам, где именно находится нужный код:
Документ.СчетНаОплатуКлиенту.ДанныеДляПечатныхФормСчетаНаОплатуИзвещения(ПараметрыПечати, МассивОбъектов). Именно здесь подготавливаются данные для последующего вывода в табличный документ.В этой функции используется пакетный запрос, состоящий из множества временных таблиц. Важно обратить внимание: если мы изменим поле только в первом пакете запроса, данные могут не дойти до макета, так как печатная форма заполняется результатами из завершающего пакета выборки.
Попытка простого сложения строк в запросе часто приводит к распространенным ошибкам. Проанализируем технические нюансы, с которыми сталкиваются разработчики:
"" (""). Использование одинарных кавычек или пропуск экранирования приводит к синтаксическим ошибкам модуля вроде «Ожидается символ ';'» или «Неопознанный оператор».Производитель у номенклатуры является ссылкой на справочник, а не строкой. Платформа 1С в языке запросов не позволяет напрямую сложить ссылку со строкой или выполнить ВЫРАЗИТЬ(Производитель КАК СТРОКА). Для получения строки необходимо обращаться к реквизиту наименования через точку: Товары.Номенклатура.Производитель.Наименование.NULL. При сложении любой строки со значением NULL результат всей операции становится NULL, из-за чего в печатной форме наименование товара окажется полностью пустым. Чтобы этого не произошло, необходимо использовать конструкцию ЕСТЬNULL или блок ВЫБОР КОГДА.Рассмотрим рабочее решение, в котором вывод производителя осуществляется только тогда, когда он фактически задан в карточке номенклатуры. Для этого в соответствующей таблице запроса заменяем выбор поля НаименованиеПолное на следующее выражение:
ВЫБОР
КОГДА Товары.Номенклатура.Производитель = ЗНАЧЕНИЕ(Справочник.Производители.ПустаяСсылка)
ТОГДА Товары.Номенклатура.НаименованиеПолное
ИНАЧЕ Товары.Номенклатура.НаименованиеПолное + "" ("" + (ВЫРАЗИТЬ(Товары.Номенклатура.Производитель.Наименование КАК СТРОКА(100))) + "")""
КОНЕЦ КАК НаименованиеПолное,
В этом примере мы проверяем поле на пустую ссылку. Если производитель задан, к наименованию в скобках дописывается его название. Приведение через ВЫРАЗИТЬ(... КАК СТРОКА(100)) гарантирует, что длина строки будет зафиксирована, что предотвращает ошибки СУБД при сложении строк неограниченной длины.
Если требуется добавить одновременно и производителя, и бренд (марку), удобно воспользоваться функцией ЕСТЬNULL. Посмотрим на пример выражения для итогового пакета выборки товаров:
Товары.Номенклатура.НаименованиеПолное
+ "", Производитель: "" + ЕСТЬNULL(Товары.Номенклатура.Производитель.Наименование, ""отсутствует"")
+ "", Бренд: "" + ЕСТЬNULL(Товары.Номенклатура.Марка.Наименование, ""отсутствует"")
КАК НаименованиеПолное,
В данном варианте, даже если реквизиты производителя или марки не заполнены, запрос не вернет пустое значение, а подставит безопасную заглушку, сохранив исходное наименование товара в печатной форме.
Сложная конкатенация строк в запросе имеет ограничение платформы: результирующая длина объединяемых строк не может превышать 1000 символов. Если полные наименования товаров в вашей базе длинные, надежнее выбирать наименование производителя отдельным полем в запросе, а саму строку собирать непосредственно перед выводом макета в коде обхода выборки.
В тексте запроса выбираем реквизит отдельно:
Товары.Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
Товары.Номенклатура.Производитель.Наименование КАК ПроизводительНаименование,
Затем в алгоритме заполнения параметров области строки таблицы табличного документа добавляем проверку:
ПредставлениеТовара = ВыборкаСтрок.НаименованиеПолное;
Если ЗначениеЗаполнено(ВыборкаСтрок.ПроизводительНаименование) Тогда
ПредставлениеТовара = ПредставлениеТовара + " (" + СокрЛП(ВыборкаСтрок.ПроизводительНаименование) + ")";
КонецЕсли;
ОбластьСтрока.Параметры.Товар = ПредставлениеТовара;
Такой подход полностью исключает проблемы с экранированием кавычек в запросах, снимает ограничения СУБД на конкатенацию строк и делает код легко читаемым для сопровождения.
Чтобы типовая конфигурация оставалась на полной поддержке поставщика, не рекомендуется вносить изменения напрямую в модуль менеджера типового документа. Оптимальными архитектурными решениями являются:
&Вместо или &ИзменениеИКонтроль в расширении. Это позволит безопасно обновлять информационную базу стандартными обновлениями 1С без риска потерять доработки счета на оплату.