Как извлечь размер из артикула и вывести наименование группы на печать этикетки в 1С

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

При формировании печатных форм и этикеток в конфигурациях 1С (в частности, в «Управление торговлей 10.3») нередко требуется преобразовать исходные данные номенклатуры: извлечь определенную часть артикула, произвести расчеты для отображения полного размерного ряда по ГОСТ или вывести наименование папки-родителя вместо полного наименования позиции. Рассмотрим, как решить эти задачи с помощью встроенного языка 1С, а также разберем методы оптимизации и безопасной обработки данных.

Извлечение подстроки и расчет размерной сетки из артикула

Проанализируем типовую ситуацию: в артикуле номенклатуры последние две цифры обозначают размер одежды (например, 42, 44, 46). Для этикетки требуется сформировать строку формата «Размер: Рост-ОбхватГруди-ОбхватБедер», где обхваты вычисляются на основе базового размера.

Для выделения подстроки с конца строки в платформе 1С применяется функция Прав() в комбинации с функцией удаления неразрывных пробелов СокрЛП().

Разберем базовый вариант получения последних двух знаков и вычисления параметров:


// Извлекаем последние 2 символа артикула
РазмерСтр = Прав(СокрЛП(СтрокаИзСписка.Номенклатура.Артикул), 2);
ОбластьРазмер.Текст = "Размер: 170-" + Число(РазмерСтр) * 2 + "-" + (Число(РазмерСтр) + 2) * 2;

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


Попытка
    ЧислоРазмера = Число(Прав(СокрЛП(СтрокаИзСписка.Номенклатура.Артикул), 2));
Исключение
    ЧислоРазмера = 0;
КонецПопытки;

Если ЧислоРазмера > 0 Тогда
    СтрокаГрудь = Формат(ЧислоРазмера * 2, "ЧЦ=3; ЧДЦ=0; ЧГ=0");
    СтрокаБедра = Формат((ЧислоРазмера + 2) * 2, "ЧЦ=3; ЧДЦ=0; ЧГ=0");
    ОбластьРазмер.Текст = "Размер: 170-" + СтрокаГрудь + "-" + СтрокаБедра;
Иначе
    ОбластьРазмер.Текст = "Размер: не указан";
КонецЕсли;

Поиск подстрок и разделение строк в 1С

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

  1. Функция Найти(): базовый метод, возвращающий позицию первого вхождения искомой подстроки в строке. Работает во всех версиях платформы 1С:Предприятие 8.
  2. Функция СтрНайти(): расширенный аналог (доступен в современных версиях платформы), позволяющий указывать направление поиска (с начала или с конца) и номер вхождения.
  3. Функции разложения строк: в типовых конфигурациях обычного приложения доступна процедура ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(), а на платформе 8.3.6 и выше — функция СтрРазделить().

Посмотрим на пример разделения строки артикула по разделителю:


// Пример поиска позиции разделителя
ПозицияДефиса = Найти(СтрокаИзСписка.Номенклатура.Артикул, "-");
Если ПозицияДефиса > 0 Тогда
    ПрефиксАртикула = Лев(СтрокаИзСписка.Номенклатура.Артикул, ПозицияДефиса - 1);
    РазмернаяЧасть = Сред(СтрокаИзСписка.Номенклатура.Артикул, ПозицияДефиса + 1);
КонецЕсли;

Вывод родительской группы номенклатуры на этикетку

Часто в наименование номенклатуры зашивают служебные коды, а чистое название модели хранится в наименовании группы (папки), в которой расположен товар. Чтобы вывести на этикетку название модели, необходимо обратиться к реквизиту Родитель.

Проанализируем иерархию справочника «Номенклатура»:

  1. НоменклатураСсылка.Родитель — ссылка на непосредственную группу верхнего уровня.
  2. НоменклатураСсылка.Родитель.Родитель — ссылка на группу второго уровня иерархии.
  3. Если элемент находится в корне справочника, значение реквизита Родитель равно Справочники.Номенклатура.ПустаяСсылка().

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


ОбластьНоменклатура = ЭтикеткаОбласть.Области.Номенклатура;

Если ЗначениеЗаполнено(СтрокаИзСписка.Номенклатура.Родитель) Тогда
    НаименованиеМодели = СтрокаИзСписка.Номенклатура.Родитель.Наименование;
Иначе
    НаименованиеМодели = СтрокаИзСписка.Номенклатура.Наименование;
КонецЕсли;

ОбластьНоменклатура.Текст = СокрЛП(НаименованиеМодели);

Рекомендации по заполнению макетов и оптимизации

Рассмотрим важные архитектурные особенности при доработке печати этикеток:

  1. Использование параметров макета вместо прямого свойства Текст: В свойствах ячейки табличного документа рекомендуется установить тип заполнения Параметр (например, указать имя параметра РазмерГОСТ или Модель). В коде передача значения выполняется через свойство ОбластьМакета.Параметры.Модель = НаименованиеМодели;. Это разделяет разметку макета и логику формирования.
  2. Отказ от обращений через точку в циклах: Конструкции вида Строка.Номенклатура.Родитель.Наименование при массовой печати десятков или сотен этикеток создают множество неявных SQL-запросов к СУБД. Оптимальный подход — получить все данные (артикул, наименование номенклатуры, наименование родителя) одним запросом в коде обработки перед выводом макета.
  3. Использование типовых механизмов: В типовой конфигурации «Управление торговлей 10.3» для разделения позиций по размерам и цветам правильнее использовать функционал Характеристик номенклатуры, либо дополнительные реквизиты (свойства объекта). Это позволяет формировать корректные штрихкоды и печатные формы без ручного разбора артикулов.
← На главную