Как изменить шаблон ценника, чтобы убрать страну происхождения из наименования?

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

При настройке шаблонов ценников и этикеток в современных конфигурациях 1С (таких как УТ 11, ERP 2, КА 2 или Розница) часто возникает ситуация, когда стандартный параметр [Номенклатура.НаименованиеПолное] выводит избыточную информацию. Например, если в полное наименование включена страна происхождения, а требования маркетинга или ТЗ предписывают её скрыть, простое написание формул в визуальном редакторе шаблона не поможет. Проанализируем ситуацию и разберем по шагам, почему это происходит и как правильно решить задачу.

Почему СтрЗаменить не работает в визуальном редакторе шаблона?

Рассмотрим причину, по которой попытка написать код СтрЗаменить(Номенклатура.НаименованиеПолное, Номенклатура.СтранаПроисхождения, "") прямо в ячейке шаблона терпит неудачу. Визуальный конструктор шаблонов 1С предназначен для простого вывода данных. Текст в квадратных скобках воспринимается системой исключительно как ссылка на имя поля в Системе компоновки данных (СКД). Редактор шаблонов не является интерпретатором программного кода 1С, поэтому функции преобразования строк там не выполняются. Выясним, какие существуют способы обойти это ограничение.

Способ 1. Использование вычисляемых полей в СКД (рекомендуемый)

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

  1. Откроем обработку ПечатьЭтикетокИЦенников (в расширении или через конфигуратор).
  2. Найдем схему компоновки данных, отвечающую за выборку полей для печати.
  3. Перейдем на закладку Вычисляемые поля.
  4. Добавим новое поле, например, с именем НаименованиеБезСтраны.
  5. В колонке «Выражение» пропишем логику замены. Разберем пример кода для этого поля:

СтрЗаменить(НоменклатураНаименованиеПолное, Строка(НоменклатураСтранаПроисхождения), "")

Важный нюанс: при использовании СтрЗаменить может остаться лишняя пунктуация (например, запятая в конце строки: «Лопата штыковая, »). Чтобы этого избежать, проанализируем более сложную конструкцию, которую также можно поместить в вычисляемое поле:


СокрП(СтрЗаменить(НоменклатураНаименованиеПолное, ", " + Строка(НоменклатураСтранаПроисхождения), ""))

После сохранения схемы в конструкторе шаблона появится новое доступное поле НаименованиеБезСтраны, которое можно просто перетащить в нужную ячейку макета.

Способ 2. Использование дополнительных реквизитов

Если внесение изменений в код или СКД по каким-то причинам невозможно (например, нет прав доступа к конфигуратору), воспользуемся функционалом Дополнительных реквизитов. Это решение позволяет хранить в базе данных готовую строку для печати.

Разберем алгоритм действий:

  1. В разделе «Администрирование» — «Общие настройки» создадим для справочника Номенклатура дополнительный реквизит с типом «Строка» и названием НаименованиеДляЦенника.
  2. Для автоматизации заполнения этого поля (чтобы не переписывать тысячи позиций вручную) используем обработку «Групповое изменение реквизитов».
  3. В обработке укажем правило: НаименованиеДляЦенника заполняется на основании НаименованиеПолное с применением функции обрезки.
  4. В шаблоне ценника выберем это новое поле из списка доступных дополнительных реквизитов.

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

Способ 3. Программная модификация через расширение

Если вы хотите, чтобы данные менялись динамически непосредственно в момент формирования таблицы для печати, наиболее эффективным будет создание Расширения. Мы можем перехватить процедуру, которая заполняет таблицу товаров для печати ценников.

Проанализируем ситуацию программно: в модуле менеджера или модуле обработки печати найдем процедуру (обычно она называется СформироватьПечатныеФормы или ПодготовитьДанныеДляПечати) и применим метод &После или &Вместо.

Пример кода в расширении для обработки коллекции данных:


&После("ЗаполнитьДанныеДляПечати")
Процедура Расш_ЗаполнитьДанныеДляПечати(ТаблицаДанных)
    Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
        Наименование = СтрокаТЗ.НоменклатураНаименованиеПолное;
        Страна = Строка(СтрокаТЗ.НоменклатураСтранаПроисхождения);
        
        Если ЗначениеЗаполнено(Страна) Тогда
            СтрокаТЗ.НоменклатураНаименованиеПолное = СтрЗаменить(Наименование, Страна, "");
            // Дополнительная очистка от лишних запятых и пробелов
            СтрокаТЗ.НоменклатураНаименованиеПолное = СокрП(СтрЗаменить(СтрокаТЗ.НоменклатураНаименованиеПолное, ", ,", ","));
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Рекомендации по удалению «хвостов»

При программной замене текста часто возникают проблемы с форматированием. Рассмотрим, как сделать наименование на ценнике эстетичным. Если исходная строка выглядит как «Товар, Описание, Китай», то после простого удаления слова «Китай» останется висеть запятая. Проанализируем способ очистки:

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

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

← На главную