В практике автоматизации розничной торговли часто возникает ситуация, когда одна организация ведет учет разных категорий товаров (например, продукты питания и промышленные товары) в разных информационных базах. При этом на торговой точке установлена всего одна касса с программой Frontol 6 и один фискальный регистратор. Стандартная логика обмена 1С с Frontol предполагает, что касса полностью принадлежит одной базе: при каждой выгрузке справочник товаров на кассе очищается и заполняется заново. В этой статье мы разберем, как обойти это ограничение и настроить корректную работу одной кассы с двумя независимыми источниками данных.
Первое, с чем мы столкнемся — это коллизия кодов товаров (SKU). Во Frontol основным идентификатором товара является его внутренний код. Если в базе №1 (Продукты) есть хлеб с кодом "100", и в базе №2 (Промка) есть мыло с кодом "100", то при загрузке данные будут затирать друг друга. Чтобы этого избежать, проанализируем систему кодирования.
Разберем самый надежный способ — разделение диапазонов кодов или использование префиксов. Мы можем настроить 1С так, чтобы коды товаров в файле обмена формировались по определенному правилу:
Проанализируем ситуацию со штрихкодами: они также должны быть уникальными в рамках обеих баз. Если штрихкоды пересекаются, Frontol не сможет однозначно определить товар при сканировании. Проверим уникальность справочников перед запуском обмена.
Стандартная обработка 1С при выгрузке данных в формате АТОЛ (который является родным для Frontol) добавляет в начало файла управления команды полной очистки справочников. Рассмотрим эти команды:
$$$DELETEALLWARES — удалить все товары.$$$DELETEALLBARCODES — удалить все штрихкоды.$$$DELETEALLASPECTREMAINS — удалить все остатки.Если мы выгрузим данные из Базы №1, а затем из Базы №2, вторая выгрузка просто удалит всё, что прислала первая. Чтобы этого избежать, нам необходимо внести изменения в код 1С. Выясним, как это сделать правильно через механизм расширений, не снимая конфигурацию с поддержки.
Нам нужно найти общий модуль ОфлайнОборудованиеАтолККМВызовСервера (название может незначительно отличаться в зависимости от версии 1С:Розница или 1С:УТ) и модифицировать процедуру формирования файла. Рассмотрим пример кода, который нужно "заглушить":
// В расширении для общего модуля
&Вместо("ФайлОчисткиДанных")
Процедура Расш1_ФайлОчисткиДанных(Файл)
// Строки, которые приводят к удалению данных в Frontol, нужно закомментировать
// Файл.ДобавитьСтроку("$$$DELETEALLWARES");
// Файл.ДобавитьСтроку("$$$DELETEALLBARCODES");
// Файл.ДобавитьСтроку("$$$DELETEALLASPECTREMAINS");
// Вместо полной очистки можно использовать выборочное удаление или просто пропустить этот шаг
КонецПроцедуры
После такой модификации Frontol будет работать в режиме добавления/обновления: если товар с таким кодом уже есть, его данные обновятся, если нет — создастся новый. При этом товары из другой базы, которых нет в текущем файле загрузки, останутся нетронутыми.
Проанализируем механизм обмена. Frontol постоянно мониторит папку обмена на наличие файла-флага (обычно load.ok). Как только файл появляется, касса начинает загрузку текстового файла с данными. Если обе базы 1С попытаются записать файлы одновременно, возникнет "состояние гонки".
Рассмотрим алгоритм безопасного обмена:
/Obmen/Base1/ и /Obmen/Base2/)..bat скрипт или небольшую службу, которая будет проверять наличие файлов в этих папках.После закрытия смены или по запросу Frontol выгружает файл report.txt. В нем содержатся транзакции по товарам из обеих баз. При попытке загрузить этот файл в Базу №1, 1С начнет выдавать ошибки, так как не найдет в своем справочнике товары из Базы №2.
Выясним, как решить эту задачу. Нам потребуется доработка алгоритма загрузки отчета. В коде обработки обмена (обычно это метод ЗагрузитьДанныеИзФайлаЧеков) необходимо добавить условие проверки существования товара. Посмотрим на логическую схему:
// Пример логики при чтении строки файла отчета
Для Каждого СтрокаОтчета Из МассивСтрок Цикл
Товар = Справочники.Номенклатура.НайтиПоКоду(СтрокаОтчета.КодТовара);
Если Товар.Пустая() Тогда
// Если товар не найден в этой базе, просто игнорируем строку
// и переходим к следующей, не вызывая исключения.
Продолжить;
КонецЕсли;
// ... логика обработки продажи ...
КонецЦикла
Важный момент: ни одна из баз не должна удалять файл report.txt сразу после загрузки. Нужно настроить 1С так, чтобы она либо переименовывала файл (чтобы вторая база могла его найти), либо использовать скрипт-посредник, который будет копировать отчет в обе рабочие директории баз.
Хотя фискальный регистратор один, мы рекомендуем использовать механизм Групп печати во Frontol для удобства контроля. Мы можем назначить товарам из Базы №1 Группу печати "Продукты", а товарам из Базы №2 — Группу печати "Промтовары". Это позволит:
Подведем итог: реализация схемы "1 касса — 2 базы" вполне реальна. Основные усилия должны быть направлены на обеспечение уникальности кодов SKU и кастомизацию кода 1С в части удаления команд очистки справочника и игнорирования "чужих" товаров при загрузке продаж.