omega80 Опубликовано вчера в 18:36 Опубликовано вчера в 18:36 Потребовалось на новом проекте 1С:Комплексная Автоматизация создать расширение для автоматического добавления артикула для создаваемых новых и редактируемых старых товаров. Принцип добавления прост - инкрементный порядковый счетчик. Т.е. система смотрит на последний созданный артикул и для нового товара добавляет на один больше (+1). Сам код расширения: Процедура _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт // Проверяем, заполнено ли поле. Обрезаем пробелы. Если ЗначениеЗаполнено(СокрЛП(Источник.Артикул)) Тогда Возврат; КонецЕсли; // Блокировка для предотвращения генерации дублей при одновременной работе пользователей Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура"); Блокировка.Заблокировать(); // Запрос для поиска максимального текущего номера артикула по шаблону S% Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Номенклатура.Артикул КАК Артикул |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Артикул ПОДОБНО ""S________"" | |УПОРЯДОЧИТЬ ПО | Артикул УБЫВ"; РезультатЗапроса = Запрос.Выполнить(); Префикс = "S"; ДлинаНомера = 7; // Количество цифр после "S" НовыйПорядковыйНомер = 1; Если Не РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующая(); // Извлекаем цифровую часть (убираем первый символ "S") СтрокаЦифр = Сред(Выборка.Артикул, 2); // Преобразуем в число и увеличиваем на 1 Попытка НовыйПорядковыйНомер = Число(СтрокаЦифр) + 1; Исключение НовыйПорядковыйНомер = 1; // На случай, если в базе были некорректные данные КонецПопытки; КонецЕсли; // Форматируем число обратно в строку с ведущими нулями (например, "0000025") ФорматнаяСтрока = "ЧЦ=" + Формат(ДлинаНомера, "ЧГ=0") + "; ЧДЦ=0; ЧГ=0; ЧВН="; СтрокаНомера = Формат(НовыйПорядковыйНомер, ФорматнаяСтрока); // Собираем итоговый артикул и присваиваем карточке номенклатуры Источник.Артикул = Префикс + СтрокаНомера; КонецПроцедуры Заходим в Конфигуратор вашей 1С, выбираем "Конфигурация" - "Расширения конфигурации", нажимаем "Добавить" и указываем имя: "УправлениеАртикулами", в назначении выбираем "Адаптация". Теперь в созданном расширении добавляем новую подписку на событие: Имя: _ПередЗаписьюНоменклатурыДляАртикула Источник: СправочникОбъект.Номенклатура Событие: ПередЗаписью Далее создаём новый общий модуль в расширении с именем "_МодификацияОбъектовСервер", устанавливаем у него флажки "Сервер" и "Вызов сервера". Метод подписки называем: _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью
omega80 Опубликовано 9 часов назад Автор Опубликовано 9 часов назад Вторая версия обработчика - добавлена проверка на уникальность артикула, на случай если менеджер уже применил такой артикул: Процедура _ПередЗаписьюНоменклатурыДляАртикулаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт // Проверяем, заполнено ли поле. Обрезаем пробелы. Если ЗначениеЗаполнено(СокрЛП(Источник.Артикул)) Тогда Возврат; КонецЕсли; // Блокировка для предотвращения генерации дублей при одновременной работе пользователей Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура"); Блокировка.Заблокировать(); // Запрос для поиска максимального текущего номера артикула по шаблону S% Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Номенклатура.Артикул КАК Артикул |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Артикул ПОДОБНО ""S________"" | |УПОРЯДОЧИТЬ ПО | Артикул УБЫВ"; РезультатЗапроса = Запрос.Выполнить(); Префикс = "S"; ДлинаНомера = 7; // Количество цифр после "S" НовыйПорядковыйНомер = 1; Если Не РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующая(); СтрокаЦифр = Сред(Выборка.Артикул, 2); Попытка НовыйПорядковыйНомер = Число(СтрокаЦифр) + 1; Исключение НовыйПорядковыйНомер = 1; КонецПопытки; КонецЕсли; // --- НАЧАЛО БЛОКА ПРОВЕРКИ НА СВОБОДНОСТЬ АРТИКУЛА --- АртикулСвободен = Ложь; СгенерированныйАртикул = ""; ФорматнаяСтрока = "ЧЦ=" + Формат(ДлинаНомера, "ЧГ=0") + "; ЧДЦ=0; ЧГ=0; ЧВН="; // Готовим запрос проверки (переиспользуем для скорости) ЗапросПроверки = Новый Запрос; ЗапросПроверки.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ Справочник.Номенклатура КАК Номенклатура |ГДЕ Номенклатура.Артикул = &ПроверяемыйАртикул И Номенклатура.Ссылка <> &ТекущаяСсылка"; ЗапросПроверки.УстановитьПараметр("ТекущаяСсылка", Источник.Ссылка); Пока Не АртикулСвободен Цикл СтрокаНомера = Формат(НовыйПорядковыйНомер, ФорматнаяСтрока); СгенерированныйАртикул = Префикс + СтрокаНомера; // Проверяем, есть ли уже такой артикул в базе ЗапросПроверки.УстановитьПараметр("ПроверяемыйАртикул", СгенерированныйАртикул); Если ЗапросПроверки.Выполнить().Пустой() Тогда // Артикул никем не занят, можно использовать АртикулСвободен = Истина; Иначе // Артикул занят (например, кто-то ввел вручную), берем следующий НовыйПорядковыйНомер = НовыйПорядковыйНомер + 1; КонецЕсли; КонецЦикла; // --- КОНЕЦ БЛОКА ПРОВЕРКИ --- // Присваиваем гарантированно уникальный артикул Источник.Артикул = СгенерированныйАртикул; КонецПроцедуры
omega80 Опубликовано 8 часов назад Автор Опубликовано 8 часов назад Во время тестирования обнаружилась новая ошибка - невозможно создать новую группу номенклатуры - это и естественно, потому что обработчику не указали явно где смотреть артикул, а как известно - для группы нет артикулов. Поэтому дополняем наш код обработчика автоматического артикула, а именно: добавляем проверку "что именно записывается? Товар или папка, и если папка - код просто завершает работу". Вот дополненный код обработчика (вставлять в самом начале после названия процедуры): // Проверяем, не является ли элемент группой (папкой) номенклатуры Если Источник.ЭтоГруппа Тогда Возврат; КонецЕсли;
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти