При автоматизации розничных магазинов и супермаркетов с большим ассортиментом (от 20 000 SKU и выше) ИТ-специалисты часто сталкиваются с аппаратными ограничениями старого, но крайне надежного оборудования. Легендарный терминал сбора данных CipherLab 8001 верой и правдой служит во многих торговых точках, однако его базовая память жестко ограничивает объем загружаемого справочника номенклатуры. Ситуация усложняется, если учет ведется в специализированных отраслевых конфигурациях, таких как «1С-Рарус: Торговый Комплекс Продовольственные Товары» (ТКПТ), которые имеют свои архитектурные особенности, проблемы с блокировками и партионным учетом в РИБ.
В этой статье мы подробно разберем, как обойти лимит памяти ТСД CipherLab 8001, как правильно организовать процесс инвентаризации большого объема товаров и какие изменения необходимо внести в конфигурацию 1С для стабильной работы всей системы.
Многие системные администраторы считают, что лимит памяти CipherLab 8001 составляет ровно 18 000 позиций. На самом деле этот объем рассчитывается исходя из стандартной задачи (прошивки), где на каждую позицию выделяется фиксированная длина под штрихкод, наименование, артикул, цену и остаток. Если стандартная база ТСД хранит длинные текстовые наименования (например, по 30–40 символов), память устройства мгновенно переполняется.
Проанализируем, как можно оптимизировать структуру базы данных ТСД с помощью штатной утилиты «Генератор приложений» (Application Generator):
Если мы не хотим или не можем менять структуру прошивки ТСД, рассмотрим эффективные организационные сценарии, которые позволяют успешно закрыть инвентаризацию на 20 000+ SKU.
Сценарий А: Выгрузка данных в ТСД по группам номенклатуры (разделение труда)
Этот подход основывается на разделении торгового зала или склада на зоны ответственности. В 1С настраивается выгрузка справочника в ТСД с фильтрацией по конкретным группам номенклатуры или категориям товаров (например, «Бытовая химия», «Посуда», «Одежда»). Каждому оператору выдается терминал, в который загружена только его группа товаров (объемом не более 5 000–10 000 позиций). При сканировании «чужого» товара ТСД выдаст предупреждающий звуковой сигнал, что минимизирует пересортицу и путаницу между отделами.
Сценарий Б: Схема сбора штрихкодов «без каталога»
В данном случае ТСД используется исключительно как автономный накопитель штрихкодов и количеств. В терминал загружается абсолютно пустая задача. Оператор последовательно считывает штрихкоды товаров и указывает их количество. ТСД не проверяет наличие штрихкода в своей локальной базе и не выводит наименование товара.
После завершения сканирования данные выгружаются из ТСД в текстовый файл формата TXT или CSV, где каждая строка имеет вид Штрихкод;Количество. Импорт этого файла и сопоставление штрихкодов с реальной номенклатурой производятся уже непосредственно на стороне мощного сервера 1С.
Рассмотрим пример кода обработки в 1С для загрузки данных из такого текстового файла:
Процедура ЗагрузитьДанныеИзТСД(ПутьКФайлу, ДокументСсылка) Экспорт
ФайлДанных = Новый ТекстовыйДокумент;
Попытка
ФайлДанных.Прочитать(ПутьКФайлу, КодировкаТекста.ANSI);
Исключение
Предупреждение("Не удалось прочитать файл данных ТСД!");
Возврат;
КонецПопытки;
ОбъектДокумента = ДокументСсылка.ПолучитьОбъект();
ТабличнаяЧасть = ОбъектДокумента.Товары;
ТабличнаяЧасть.Очистить();
Для НомерСтроки = 1 По ФайлДанных.КоличествоСтрок() Цикл
СтрокаТекста = ФайлДанных.ПолучитьСтроку(НомерСтроки);
Если ПустаяСтрока(СтрокаТекста) Тогда
Продолжить;
КонецЕсли;
// Разделяем строку по разделителю ";"
МассивЧастей = СтрРазделить(СтрокаТекста, ";");
Если МассивЧастей.Количество() < 2 Тогда
Продолжить; // Некорректная строка
КонецЕсли;
ТекущийШтрихкод = СокрЛП(МассивЧастей[0]);
ТекущееКоличество = Число(МассивЧастей[1]);
// Поиск номенклатуры по штрихкоду в базе 1С
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Владелец КАК Номенклатура,
| Штрихкоды.ХарактеристикаНоменклатуры КАК Характеристика
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", ТекущийШтрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
НоваяСтрока = ТабличнаяЧасть.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Характеристика = Выборка.Характеристика;
НоваяСтрока.Количество = ТекущееКоличество;
Иначе
// Если штрихкод не найден, фиксируем ошибку для последующего разбора
ЗаписьЖурналаРегистрации("Импорт ТСД", УровеньЖурналаРегистрации.Предупреждение, , ,
"Штрихкод не найден в базе: " + ТекущийШтрихкод);
EndЕсли;
КонецЦикла;
ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Загрузка данных из ТСД успешно завершена!");
КонецПроцедуры
Использование COM-портовых текстовых терминалов постепенно уходит в прошлое. Для работы с базами объемом более 20 000 наименований оптимальным решением является переход на современные ТСД под управлением ОС Android (например, терминалы брендов Honeywell, Urovo, АТОЛ или ChipherLab новых серий) в связке со специализированным программным обеспечением (Клеверенс, DataMobile) или мобильной платформой 1С.
Разберем основные преимущества Android-терминалов при инвентаризации крупных баз данных:
Конфигурация «1С-Рарус: Торговый Комплекс Продовольственные Товары» (ТКПТ) имеет свою специфику, которую необходимо учитывать при проведении масштабных инвентаризаций и оперативной работы большого количества пользователей.
Конфигурация ТКПТ изначально проектировалась под автоматический режим блокировок СУБД. При проведении документов установки цен или перемещения товаров система накладывает избыточные блокировки на таблицы общих регистров сведений и регистров накопления. Если в базе одновременно работают более 10 операторов в разных магазинах (филиалах) единой сети, это неизбежно приводит к возникновению взаимных блокировок (Deadlocks) и остановке работы пользователей.
Выясним причину этого поведения и устраним её. Нам необходимо перевести конфигурацию ТКПТ на управляемый режим блокировок. Для этого в свойствах конфигурации необходимо установить параметр «Режим управления блокировкой данных» в значение «Управляемый». После этого для критически важных транзакций проведения документов потребуется явно прописать наложение управляемых блокировок в коде:
// Пример установки управляемой блокировки перед записью движений
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.УстановитьПараметр("Склад", ЭтотОбъект.Склад);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
При использовании распределенных информационных баз (РИБ) в ТКПТ часто возникает проблема: документы перемещения товаров в базе филиала содержат битые ссылки (надпись <Объект не найден...>) в движениях по партиям. Это происходит из-за того, что в целях оптимизации трафика документы поступления товаров от поставщиков, оформленные в центральном офисе, физически не мигрируют в периферийные базы магазинов. Партионный учет (ФИФО) при этом пытается сослаться на GUID отсутствующего в филиале документа.
Для исправления этой ситуации применим один из двух вариантов решения: