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