Как добавить производителя к наименованию товара в счете на оплату в 1С:Управление торговлей 11?

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

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

Где формируются данные печатной формы

В типовых конфигурациях линейки УТ 11, КА 2 и ERP логика подготовки данных для печати вынесена в модуль менеджера соответствующего документа. Разберем по шагам, где именно находится нужный код:

  1. Открываем конфигуратор и находим объект метаданных Документ.СчетНаОплатуКлиенту.
  2. Переходим в модуль менеджера документа.
  3. Находим экспортную функцию ДанныеДляПечатныхФормСчетаНаОплатуИзвещения(ПараметрыПечати, МассивОбъектов). Именно здесь подготавливаются данные для последующего вывода в табличный документ.

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

Особенности конкатенации строк в тексте запроса

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

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

Способ 1. Изменение запроса с помощью конструкции ВЫБОР

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


ВЫБОР
	КОГДА Товары.Номенклатура.Производитель = ЗНАЧЕНИЕ(Справочник.Производители.ПустаяСсылка)
		ТОГДА Товары.Номенклатура.НаименованиеПолное
	ИНАЧЕ Товары.Номенклатура.НаименованиеПолное + "" ("" + (ВЫРАЗИТЬ(Товары.Номенклатура.Производитель.Наименование КАК СТРОКА(100))) + "")""
КОНЕЦ КАК НаименованиеПолное,

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

Способ 2. Использование функции ЕСТЬNULL при комплексной модификации

Если требуется добавить одновременно и производителя, и бренд (марку), удобно воспользоваться функцией ЕСТЬNULL. Посмотрим на пример выражения для итогового пакета выборки товаров:


Товары.Номенклатура.НаименованиеПолное 
	+ "", Производитель: "" + ЕСТЬNULL(Товары.Номенклатура.Производитель.Наименование, ""отсутствует"") 
	+ "", Бренд: "" + ЕСТЬNULL(Товары.Номенклатура.Марка.Наименование, ""отсутствует"") 
	КАК НаименованиеПолное,

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

Способ 3. Формирование наименования во встроенном языке 1С

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

В тексте запроса выбираем реквизит отдельно:


Товары.Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
Товары.Номенклатура.Производитель.Наименование КАК ПроизводительНаименование,

Затем в алгоритме заполнения параметров области строки таблицы табличного документа добавляем проверку:


ПредставлениеТовара = ВыборкаСтрок.НаименованиеПолное;
Если ЗначениеЗаполнено(ВыборкаСтрок.ПроизводительНаименование) Тогда
	ПредставлениеТовара = ПредставлениеТовара + " (" + СокрЛП(ВыборкаСтрок.ПроизводительНаименование) + ")";
КонецЕсли;

ОбластьСтрока.Параметры.Товар = ПредставлениеТовара;

Такой подход полностью исключает проблемы с экранированием кавычек в запросах, снимает ограничения СУБД на конкатенацию строк и делает код легко читаемым для сопровождения.

Рекомендация по обновлению и поддержке

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

  1. Внешняя печатная форма (ВПФ): выгрузить макет и алгоритм формирования счета во внешнюю обработку через механизм дополнительных отчетов и обработок БСП.
  2. Расширение конфигурации: перехватить процедуру формирования печатной формы с помощью директивы &Вместо или &ИзменениеИКонтроль в расширении. Это позволит безопасно обновлять информационную базу стандартными обновлениями 1С без риска потерять доработки счета на оплату.
← На главную