Перейти к содержанию
Форум Радиодар

Автоматический артикул для 1С - пишем своё первое расширение для 1С:Комплексная Автоматизация


Рекомендуемые сообщения

Опубликовано

Потребовалось на новом проекте 1С:Комплексная Автоматизация создать расширение для автоматического добавления артикула для создаваемых новых и редактируемых старых товаров. Принцип добавления прост - инкрементный порядковый счетчик. Т.е. система смотрит на последний созданный артикул и для нового товара добавляет на один больше (+1).

7ed55a9d-1ee8-4d42-bf98-323b0b3c0c06.jpg

Сам код расширения: 

Процедура _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

	// Проверяем, заполнено ли поле. Обрезаем пробелы.
	Если ЗначениеЗаполнено(СокрЛП(Источник.Артикул)) Тогда
		Возврат;
	КонецЕсли;

	// Блокировка для предотвращения генерации дублей при одновременной работе пользователей
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
	Блокировка.Заблокировать();

	// Запрос для поиска максимального текущего номера артикула по шаблону S%
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Номенклатура.Артикул КАК Артикул
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.Артикул ПОДОБНО ""S________""
		|
		|УПОРЯДОЧИТЬ ПО
		|	Артикул УБЫВ";

	РезультатЗапроса = Запрос.Выполнить();
	
	Префикс = "S";
	ДлинаНомера = 7; // Количество цифр после "S"
	НовыйПорядковыйНомер = 1;

	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующая();
		
		// Извлекаем цифровую часть (убираем первый символ "S")
		СтрокаЦифр = Сред(Выборка.Артикул, 2);
		
		// Преобразуем в число и увеличиваем на 1
		Попытка
			НовыйПорядковыйНомер = Число(СтрокаЦифр) + 1;
		Исключение
			НовыйПорядковыйНомер = 1; // На случай, если в базе были некорректные данные
		КонецПопытки;
	КонецЕсли;

	// Форматируем число обратно в строку с ведущими нулями (например, "0000025")
	ФорматнаяСтрока = "ЧЦ=" + Формат(ДлинаНомера, "ЧГ=0") + "; ЧДЦ=0; ЧГ=0; ЧВН=";
	СтрокаНомера = Формат(НовыйПорядковыйНомер, ФорматнаяСтрока);

	// Собираем итоговый артикул и присваиваем карточке номенклатуры
	Источник.Артикул = Префикс + СтрокаНомера;

КонецПроцедуры

Заходим в Конфигуратор вашей 1С, выбираем "Конфигурация" - "Расширения конфигурации", нажимаем "Добавить" и указываем имя: "УправлениеАртикулами", в назначении выбираем "Адаптация".

Теперь в созданном расширении добавляем новую подписку на событие:

  • Имя: _ПередЗаписьюНоменклатурыДляАртикула
  • Источник: СправочникОбъект.Номенклатура
  • Событие: ПередЗаписью

Далее создаём новый общий модуль в расширении с именем "_МодификацияОбъектовСервер", устанавливаем у него флажки "Сервер" и "Вызов сервера".

Метод подписки называем: _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью

 

Опубликовано

Вторая версия обработчика - добавлена проверка на уникальность артикула, на случай если менеджер уже применил такой артикул:

Процедура _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

	// Проверяем, заполнено ли поле. Обрезаем пробелы.
	Если ЗначениеЗаполнено(СокрЛП(Источник.Артикул)) Тогда
		Возврат;
	КонецЕсли;

	// Блокировка для предотвращения генерации дублей при одновременной работе пользователей
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
	Блокировка.Заблокировать();

	// Запрос для поиска максимального текущего номера артикула по шаблону S%
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Номенклатура.Артикул КАК Артикул
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.Артикул ПОДОБНО ""S________""
		|
		|УПОРЯДОЧИТЬ ПО
		|	Артикул УБЫВ";

	РезультатЗапроса = Запрос.Выполнить();
	
	Префикс = "S";
	ДлинаНомера = 7; // Количество цифр после "S"
	НовыйПорядковыйНомер = 1;

	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующая();
		
		СтрокаЦифр = Сред(Выборка.Артикул, 2);
		
		Попытка
			НовыйПорядковыйНомер = Число(СтрокаЦифр) + 1;
		Исключение
			НовыйПорядковыйНомер = 1;
		КонецПопытки;
	КонецЕсли;

	// --- НАЧАЛО БЛОКА ПРОВЕРКИ НА СВОБОДНОСТЬ АРТИКУЛА ---
	АртикулСвободен = Ложь;
	СгенерированныйАртикул = "";
	
	ФорматнаяСтрока = "ЧЦ=" + Формат(ДлинаНомера, "ЧГ=0") + "; ЧДЦ=0; ЧГ=0; ЧВН=";
	
	// Готовим запрос проверки (переиспользуем для скорости)
	ЗапросПроверки = Новый Запрос;
	ЗапросПроверки.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ Справочник.Номенклатура КАК Номенклатура 
		|ГДЕ Номенклатура.Артикул = &ПроверяемыйАртикул И Номенклатура.Ссылка <> &ТекущаяСсылка";
	ЗапросПроверки.УстановитьПараметр("ТекущаяСсылка", Источник.Ссылка);

	Пока Не АртикулСвободен Цикл
		
		СтрокаНомера = Формат(НовыйПорядковыйНомер, ФорматнаяСтрока);
		СгенерированныйАртикул = Префикс + СтрокаНомера;
		
		// Проверяем, есть ли уже такой артикул в базе
		ЗапросПроверки.УстановитьПараметр("ПроверяемыйАртикул", СгенерированныйАртикул);
		
		Если ЗапросПроверки.Выполнить().Пустой() Тогда
			// Артикул никем не занят, можно использовать
			АртикулСвободен = Истина;
		Иначе
			// Артикул занят (например, кто-то ввел вручную), берем следующий
			НовыйПорядковыйНомер = НовыйПорядковыйНомер + 1;
		КонецЕсли;
		
	КонецЦикла;
	// --- КОНЕЦ БЛОКА ПРОВЕРКИ ---

	// Присваиваем гарантированно уникальный артикул
	Источник.Артикул = СгенерированныйАртикул;

КонецПроцедуры

 

Опубликовано

Во время тестирования обнаружилась новая ошибка - невозможно создать новую группу номенклатуры - это и естественно, потому что обработчику не указали явно где смотреть артикул, а как известно - для группы нет артикулов.

Поэтому дополняем наш код обработчика автоматического артикула, а именно: добавляем проверку "что именно записывается? Товар или папка, и если папка - код просто завершает работу". Вот дополненный код обработчика (вставлять в самом начале после названия процедуры):

	// Проверяем, не является ли элемент группой (папкой) номенклатуры
	Если Источник.ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;

 

  • omega80 изменил название на Автоматический артикул для 1С - пишем своё первое расширение для 1С:Комплексная Автоматизация

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Статистика пользователей

    554
    Пользователей
    681
    Максимум онлайн
    Baryy S.
    Новый пользователь
    Baryy S.
    Регистрация
×
×
  • Создать...