При работе с кассовым программным обеспечением Frontol 6 часто возникает необходимость получить актуальный список товаров непосредственно из кассовой базы. Это требуется в случаях, когда данные на кассе разошлись с товароучетной системой, или когда нужно быстро проверить цены и штрихкоды без доступа к бэк-офису. Стандартный отчет report.txt часто не содержит полной информации (например, наименований), поэтому рассмотрим более глубокие и эффективные способы решения этой задачи.
Прежде чем приступать к написанию скриптов, разберем самый простой штатный метод, доступный пользователю. Во Frontol 6 предусмотрен механизм ручного экспорта данных.
Наименование, Код, Штрихкод и Цена.Этот метод хорош своей простотой, однако он требует ручных действий и последующей правки данных (здесь поможет набор инструментов Коррекция 1С для Excel), и не подходит для автоматизации процесса «в один клик».
База данных Frontol 6 работает на СУБД Firebird (обычно файл MAIN.GDB). Мы можем выполнить прямой SQL-запрос для получения всех необходимых данных. Рассмотрим структуру таблиц: основные данные хранятся в SPRT (справочник), штрихкоды в BARCODE, а цены в связке таблиц REMAIN и PRICEDATA.
Проанализируем пример сложного запроса, который объединяет все эти данные в одну таблицу. Мы создадим представление (VIEW), которое удобно использовать для последующих выгрузок:
CREATE VIEW MyWares AS
SELECT
sprt.id,
sprt.code,
sprt.name,
sprt.isware,
REMAIN.ID as remainid,
barcode.BARCODE
FROM SPRT
LEFT JOIN BARCODE ON SPRT.ID = BARCODE.WAREID
LEFT JOIN REMAIN ON SPRT.ID = REMAIN.WAREID;
SELECT
mw.code,
mw.name,
mw.barcode,
pd.PRICE
FROM MyWares mw
LEFT JOIN PRICEDATA pd ON mw.remainid = pd.REMAINID
WHERE mw.isware = 1;
В этом запросе мы используем LEFT JOIN, чтобы не потерять товары, у которых, например, временно отсутствует штрихкод или цена. Условие isware = 1 позволяет отфильтровать только товары, исключая группы (папки).
Для реализации решения «в один клик» для конечного пользователя, нам понадобится утилита isql.exe, которая входит в комплект Firebird. Мы подготовим скрипт, который будет выгружать таблицы в текстовые файлы, а затем их можно будет обработать.
Создадим текстовый файл export_script.sql со следующим содержанием:
CONNECT "localhost:C:\ProgramData\Atol\Frontol6\database\MAIN.GDB" USER "SYSDBA" PASSWORD "masterkey";
SET HEADING OFF;
OUTPUT C:\export\goods_names.txt;
SELECT ID, ';', CODE, ';', NAME FROM "SPRT" WHERE ISWARE = 1;
OUTPUT C:\export\barcodes.txt;
SELECT WAREID, ';', BARCODE FROM "BARCODE";
OUTPUT C:\export\prices.txt;
SELECT r.WAREID, ';', p.PRICE FROM "REMAIN" r JOIN "PRICEDATA" p ON r.ID = p.REMAINID;
QUIT;
Запуск этого скрипта осуществляется командой: isql.exe -i export_script.sql. Это позволит мгновенно получить «сырые» данные для дальнейшей обработки.
Если нам нужно представить данные в красивом виде (например, в формате HTML для открытия в браузере или Excel), удобно использовать OneScript. Рассмотрим алгоритм, который читает выгруженные текстовые файлы и собирает их в единый отчет.
Проанализируем пример кода на OneScript, который формирует HTML-таблицу:
ПутьКДанным = "C:\export\";
ФайлHTML = "C:\export\report.html";
ТекстHTML = Новый ТекстовыйДокумент;
// Читаем цены в соответствие (Ключ - ИД товара, Значение - Цена)
Цены = Новый Соответствие;
ТекстЦены = Новый ТекстовыйДокумент;
ТекстЦены.Прочитать(ПутьКДанным + "prices.txt");
Для НомерСтроки = 1 По ТекстЦены.КоличествоСтрок() Цикл
Стр = СтрРазделить(ТекстЦены.ПолучитьСтроку(НомерСтроки), ";");
Если Стр.Количество() > 1 Тогда
Цены.Вставить(СокрЛП(Стр[0]), СокрЛП(Стр[1]));
КонецЕсли;
КонецЦикла;
// Формируем шапку HTML
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("<table border='1'><tr><th>Код</th><th>Наименование</th><th>Цена</th></tr>");
// Читаем справочник и сопоставляем с ценами
ТекстТовары = Новый ТекстовыйДокумент;
ТекстТовары.Прочитать(ПутьКДанным + "goods_names.txt");
Для НомерСтроки = 1 По ТекстТовары.КоличествоСтрок() Цикл
Стр = СтрРазделить(ТекстТовары.ПолучитьСтроку(НомерСтроки), ";");
Если Стр.Количество() > 2 Тогда
ИД = СокрЛП(Стр[0]);
Код = СокрЛП(Стр[1]);
Имя = СокрЛП(Стр[2]);
ЦенаТовара = Цены.Получить(ИД);
МассивСтрок.Добавить("<tr><td>" + Код + "</td><td>" + Имя + "</td><td>" + ЦенаТовара + "</td></tr>");
КонецЕсли;
КонецЦикла;
МассивСтрок.Добавить("</table>");
ТекстHTML.УстановитьТекст(СтрСоединить(МассивСтрок, Символы.ПС));
ТекстHTML.Записать(ФайлHTML);
ЗапуститьПриложение(ФайлHTML);
Этот скрипт выполняет роль «соединителя» данных. Мы используем объект Соответствие для быстрого поиска цены по идентификатору товара, что критично при больших объемах справочника (десятки тысяч позиций).
Разберем еще несколько важных моментов при работе с выгрузкой из Frontol 6:
SPRT есть поле DELETED. Обязательно добавляйте в SQL-запросы фильтр WHERE DELETED = 0, чтобы не выгружать товары, которые были ранее удалены из ассортимента, но физически остались в базе.JOIN, в итоговой таблице товар продублируется столько раз, сколько у него штрихкодов. Для обхода этой ситуации можно использовать функцию LIST(BARCODE, ', ') в SQL, которая соберет все штрихкоды в одну строку через запятую.MAIN.GDB доступен для чтения пользователю, от имени которого запускается скрипт.request.txt с командой $$$EXPTALL. Frontol сам сформирует текстовый файл в стандартном формате обмена АТОЛ, который содержит все поля товара. Это зачастую проще, чем писать прямые SQL-запросы, так как формат обмена официально документирован производителем.Рассмотренные методы позволяют гибко настроить получение данных из Frontol 6 — от простых ручных операций до полностью автоматизированных отчетов, которые пользователь может открывать одним нажатием ярлыка на рабочем столе.