В розничной торговле, особенно в сегментах типа "секонд-хенд" или при продаже уникальных антикварных изделий, владельцы бизнеса часто сталкиваются с проблемой огромного оборота уникальных товаров. Создавать 15 000 или более карточек номенклатуры каждый месяц, которые никогда не повторятся, — задача трудоемкая, замедляющая работу базы и усложняющая поиск. Рассмотрим эффективное решение: кодирование всей информации о товаре (название, бренд, цвет, размер, цена) прямо в штрихкоде формата EAN-13 и его последующую расшифровку в Рабочем месте кассира (РМК) "на лету".
Проанализируем ситуацию: нам необходимо, чтобы при сканировании штрихкода 1С не искала товар в справочнике Номенклатура, а разбирала полученную цифровую последовательность. Возьмем за основу пример штрихкода: 2101021105007. Разберем его структуру по позициям, как это предложил автор темы:
Наша цель — заставить РМК превратить этот набор цифр в строку "Женская Рубашка H&M красная" с ценой 500 руб. и добавить её в чек.
Для того чтобы программа понимала, что код 01 — это "Рубашка", нам не обязательно создавать элементы номенклатуры, но нам нужны "словари". Выясним, как их лучше хранить. Мы можем использовать:
Проанализируем программный код, который будет отвечать за "разрезку" штрихкода. Нам понадобятся стандартные строковые функции 1С: Лев(), Сред() и Прав(). Рассмотрим пример функции, которая будет возвращать структуру с данными товара:
Функция РазобратьШтрихкодСекондХенд(Штрихкод) Экспорт
Результат = Новый Структура("Наименование, Цена, Успех", "", 0, Ложь);
Если СтрДлина(Штрихкод) <> 13 Тогда
Возврат Результат;
КонецЕсли;
// Проверяем префикс весового или внутреннего товара
Если Лев(Штрихкод, 1) <> "2" Тогда
Возврат Результат;
КонецЕсли;
// Извлекаем индексы из строки
ИндексПол = Сред(Штрихкод, 2, 1);
ИндексТип = Сред(Штрихкод, 3, 2);
ИндексБренд = Сред(Штрихкод, 5, 2);
ИндексЦвет = Сред(Штрихкод, 7, 2);
ЦенаСтрокой = Сред(Штрихкод, 9, 4);
// Получаем текстовые значения (функции получения имен из словарей)
ТекстПол = ПолучитьЗначениеИзСловаря("Пол", ИндексПол);
ТекстТип = ПолучитьЗначениеИзСловаря("Тип", ИндексТип);
ТекстБренд = ПолучитьЗначениеИзСловаря("Бренд", ИндексБренд);
ТекстЦвет = ПолучитьЗначениеИзСловаря("Цвет", ИндексЦвет);
Результат.Наименование = СтрШаблон("%1 %2 %3 %4", ТекстПол, ТекстТип, ТекстБренд, ТекстЦвет);
Результат.Цена = Число(ЦенаСтрокой);
Результат.Успех = Истина;
Возврат Результат;
КонецФункции
Теперь самое важное: нам нужно внедрить этот вызов в процесс сканирования. В типовой конфигурации 1С:Розница за это отвечает процедура обработки внешнего события от сканера штрихкодов. Обычно она находится в модуле формы РМК или в общем модуле МенеджерОборудованияКлиент.
Разберем логику изменений:
1. Программа получает событие от сканера.
2. Система ищет штрихкод в регистре ШтрихкодыНоменклатуры.
3. Если штрихкод не найден, вместо вывода ошибки "Товар не найден", мы вызываем наш парсер.
4. Если парсер подтверждает, что код соответствует нашей маске (начинается на "2"), мы создаем строку в таблице товаров РМК.
Важный нюанс: Чтобы 1С корректно работала с чеком ККМ и соблюдала требования ФЗ-54, в табличной части всё равно должен быть выбран объект типа СправочникСсылка.Номенклатура. Рекомендуем создать одну-единственную карточку-пустышку с названием "Товар Секонд-Хенд".
Рассмотрим, как подставить расшифрованное имя в чек. В 1С:Розница при печати чека наименование берется либо из карточки номенклатуры, либо из поля Содержание. Нам нужно при добавлении строки программно заполнить это поле:
// Фрагмент кода в обработке сканирования РМК
ДанныеКода = РазобратьШтрихкодСекондХенд(СчитанныйШтрихкод);
Если ДанныеКода.Успех Тогда
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар Секонд-Хенд");
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = ДанныеКода.Цена;
НоваяСтрока.Сумма = ДанныеКода.Цена;
// Ключевой момент: подменяем наименование для чека
НоваяСтрока.Содержание = ДанныеКода.Наименование;
КонецЕсли;
Выясним, почему это работает. Согласно требованиям 54-ФЗ, в кассовом чеке должно быть четкое наименование товара. Если мы передаем в ККТ заполненное поле Содержание, драйвер кассы приоритетно берет текст из него, и покупатель видит в чеке "Женская Рубашка H&M красная", хотя в базе 1С списалась одна единица абстрактного товара.
Проанализируем последствия такого решения для учета:
Таким образом, доработка РМК под нужды специфического учета позволяет существенно сэкономить ресурсы сервера и время персонала. Подобная модификация занимает у опытного программиста от 2 до 4 часов, что гораздо выгоднее постоянного ручного ввода данных.