В типовых конфигурациях платформы 1С:Предприятие 8 (таких как «Управление торговлей», «ERP Управление предприятием», «Комплексная автоматизация» или «Управление нашей фирмой») поле Код заполняется автоматически при создании нового элемента справочника Номенклатура. Однако для поля Артикул стандартного механизма автогенерации «из коробки» не предусмотрено. Обычно предполагается, что артикул — это код товара, присвоенный производителем, который вводится вручную.
Тем не менее на практике компании часто нуждаются в собственной системе артикулирования для уникальной идентификации товаров, работы с маркетплейсами (Wildberries, Ozon, Яндекс Маркет) или при производстве индивидуальной продукции. В этой статье мы подробно разберем, как реализовать автоматическое заполнение артикула различными способами: от программирования подписок на события до настройки штатными групповыми обработками.
Рассмотрим детально каждый из доступных вариантов решения этой задачи.
Использование механизма подписок на события — это классический и наиболее надежный способ внедрения бизнес-логики без изменения типовых объектов конфигурации. Мы перехватим запись элемента номенклатуры и программно заполним артикул, если пользователь оставил его пустым.
Выясним причину, почему для этой задачи лучше использовать событие ПередЗаписью, а не ПриЗаписи. Дело в том, что в событии ПередЗаписью объект еще не сохранен в базу данных, и мы можем напрямую изменить его реквизиты без повторного вызова метода Записать(), что исключает риск возникновения бесконечной рекурсии записи.
Разберем по шагам процесс создания подписки:
ЗаполнитьАртикулНоменклатурыПередЗаписью.СправочникОбъект.Номенклатура.ПередЗаписью.РаботаСНоменклатуройСобытия, установив для него свойства «Сервер» и «Вызов сервера»).Теперь проанализируем ситуацию и напишем программный код обработчика в созданном общем модуле:
Процедура ЗаполнитьАртикулНоменклатурыПередЗаписьюПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Если идет загрузка данных (например, обмен), пропускаем обработку
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем, заполнено ли уже поле Артикул
Если ПустаяСтрока(Источник.Артикул) Тогда
// Вариант 1: Копируем значение из Кода номенклатуры
// Обратите внимание: у новой позиции Код может быть еще не сформирован.
// В таком случае мы можем сгенерировать временный или последовательный номер.
Если ПустаяСтрока(Источник.Код) Тогда
// Установим временный артикул на основе уникального идентификатора или счетчика
Источник.Артикул = "АРТ-" + СокрЛП(Новый УникальныйИдентификатор());
Иначе
Источник.Артикул = "АРТ-" + СокрЛП(Источник.Код);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот код проверяет наличие заполненного артикула и, если поле пустое, подставляет префикс "АРТ-" совместно с кодом номенклатуры. Вы можете адаптировать этот алгоритм под любые правила вашей компании (например, использовать генерацию по кодам категорий или видам номенклатуры).
Если ваша база находится на поддержке и вы не хотите вносить изменения в основную конфигурацию, лучшим решением будет использование расширений. Это позволит безболезненно обновлять систему в будущем.
Посмотрим на пример реализации логики генерации артикула с использованием аннотации &Перед для процедуры записи в модуле объекта справочника Номенклатура:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
Если ПустаяСтрока(ЭтотОбъект.Артикул) Тогда
// Реализуем генерацию уникального артикула по внутреннему счетчику
ПоследнийАртикул = ПолучитьПоследнийАртикулИзБазы();
НовыйНомер = ПоследнийАртикул + 1;
ЭтотОбъект.Артикул = "SKU-" + Формат(НовыйНомер, "ЧГ=0");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПоследнийАртикулИзБазы()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО ""SKU-%""
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Артикул УБЫВ";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат 10000; // Начальное значение счетчика
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Очищаем префикс и преобразуем в число
ЧисловаяЧасть = Сред(Выборка.Aртикул, 5);
Возврат Число(ЧисловаяЧасть);
EndЕсли;
КонецФункции
Используя этот подход, программа автоматически анализирует базу данных, находит последний присвоенный артикул формата SKU-ХХХХХ, увеличивает числовое значение на единицу и присваивает уникальный номер новому товару.
Рассмотрим подробнее ситуацию, когда программиста нет рядом, но вам необходимо срочно заполнить пустые артикулы у сотен или тысяч уже созданных товаров. Для этого воспользуемся штатным инструментом 1С — Групповое изменение реквизитов.
Разберем этот процесс по шагам:
Номенклатура.Артикул Не заполнен.
Для Каждого СтрокаНоменклатуры Из Объекты Цикл
ОбъектНоменклатуры = СтрокаНоменклатуры.ПолучитьОбъект();
ОбъектНоменклатуры.Артикул = "ART-" + СокрЛП(ОбъектНоменклатуры.Код);
ОбъектНоменклатуры.Записать();
КонецЦикла;
Этот простой и эффективный способ позволяет моментально навести порядок в справочнике номенклатуры без внесения необратимых изменений в программный код конфигурации.
Отдельно разберем специфику работы в программе 1С:УНФ. Часто пользователи спрашивают: можно ли динамически менять артикул позиции при передаче под индивидуальный заказ на производство? Согласно архитектурной логике систем 1С, постоянное изменение артикула в карточке номенклатуры — это ошибочный путь, который приведет к путанице в складских остатках и аналитических отчетах.
Правильное решение этой задачи заключается в использовании механизма Характеристик номенклатуры. В 1С:УНФ для одной номенклатурной позиции (например, «Шкаф индивидуальный») можно создавать неограниченное количество характеристик (например, «Заказ №15», «Заказ №16»).
Каждой отдельной характеристике в системе можно сопоставить собственный уникальный артикул. Это позволяет вести точный учет на производстве под конкретного клиента, сохраняя при этом чистоту основного справочника номенклатуры.