При формировании печатных форм и этикеток в конфигурациях 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С:Предприятие 8.СтрНайти(): расширенный аналог (доступен в современных версиях платформы), позволяющий указывать направление поиска (с начала или с конца) и номер вхождения.ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(), а на платформе 8.3.6 и выше — функция СтрРазделить().Посмотрим на пример разделения строки артикула по разделителю:
// Пример поиска позиции разделителя
ПозицияДефиса = Найти(СтрокаИзСписка.Номенклатура.Артикул, "-");
Если ПозицияДефиса > 0 Тогда
ПрефиксАртикула = Лев(СтрокаИзСписка.Номенклатура.Артикул, ПозицияДефиса - 1);
РазмернаяЧасть = Сред(СтрокаИзСписка.Номенклатура.Артикул, ПозицияДефиса + 1);
КонецЕсли;
Часто в наименование номенклатуры зашивают служебные коды, а чистое название модели хранится в наименовании группы (папки), в которой расположен товар. Чтобы вывести на этикетку название модели, необходимо обратиться к реквизиту Родитель.
Проанализируем иерархию справочника «Номенклатура»:
НоменклатураСсылка.Родитель — ссылка на непосредственную группу верхнего уровня.НоменклатураСсылка.Родитель.Родитель — ссылка на группу второго уровня иерархии.Родитель равно Справочники.Номенклатура.ПустаяСсылка().Перед выводом наименования группы обязательно проверим заполненность родителя, чтобы избежать вывода пустых или некорректных значений в макет:
ОбластьНоменклатура = ЭтикеткаОбласть.Области.Номенклатура;
Если ЗначениеЗаполнено(СтрокаИзСписка.Номенклатура.Родитель) Тогда
НаименованиеМодели = СтрокаИзСписка.Номенклатура.Родитель.Наименование;
Иначе
НаименованиеМодели = СтрокаИзСписка.Номенклатура.Наименование;
КонецЕсли;
ОбластьНоменклатура.Текст = СокрЛП(НаименованиеМодели);
Рассмотрим важные архитектурные особенности при доработке печати этикеток:
Текст: В свойствах ячейки табличного документа рекомендуется установить тип заполнения Параметр (например, указать имя параметра РазмерГОСТ или Модель). В коде передача значения выполняется через свойство ОбластьМакета.Параметры.Модель = НаименованиеМодели;. Это разделяет разметку макета и логику формирования.Строка.Номенклатура.Родитель.Наименование при массовой печати десятков или сотен этикеток создают множество неявных SQL-запросов к СУБД. Оптимальный подход — получить все данные (артикул, наименование номенклатуры, наименование родителя) одним запросом в коде обработки перед выводом макета.