======Общая таблица транзакций (ОТТ)======
Модуль предназначен для централизованного хранения транзакций кассира 5 и работы с ними.
**Требования к программам**: 1С:Предприятие версии 8.3.5 или новее, "Кассир 5" версии 5.1.7.6 или новее.\\
**Преимущества**: доступ к транзакциям всех ПОС, что позволяет подбирать чеки возврата, предоплаты, оплаты кредита и т.п. с других касс, разбитие доступности транзакций по группам ККМ.\\
**Недостатки**: перенос N-ого количества транзакций происходит раз в заданный период, нужен внешний источник данных в виде СУБД, например MSSQL или PostgreSQL.\\
=====Настройка=====
1. Перед настройкой Кассира, у вас уже должна быть готова база данных (БД), в которую будут переноситься транзакции. В ней должна быть схема "dbo" и поддержка кириллицы. \\
На момент написания данного руководства, работа была проверена с базами MSSQL и PostgreSQL.
Должен использовать модуль логики ОбщаяТаблицаТранзакций.epf (разархивировать ExtFiles\ОбщаяТаблицаТранзакций.zip или выбрать в мастере настроек).\\
2. Запустите Кассир в режиме предприятия, и авторизуйтесь под пользователем с правом захода в настройки.
3. В настройках перейдите на вкладку "Модули логики", затем, если у вас модулей несколько, на вкладку "ОТТ".
4. На вкладке нажмите на кнопку "Настроить параметры подключения".
5. На открывшейся форме нужно указать параметры подключения к вашей БД.
а) Для работы не через строку соединения, заполните:\\
1) "СУБД";
2) "Способ подключения";
3) "Имя сервера";
4) "Номер порта" (только для PostgreSQL);
5) "Имя базы".
6) "Логин";
7) "Пароль".
б) Для работы через строку соединения, установите флаг "Использовать строку соединения" и заполните:
1) "СУБД";
2) "Способ подключения";
3) "Логин";
4) "Пароль";
5) "Строка подключения".
Также, можно сгенерировать строку подключения на основе заполненных полей, нажав кнопку "Сгенерировать".\\
6. Нажмите на кнопку "Проверить соединение".
а) При успешной установке соединения, выведется одно из двух сообщений:
1) "Связь установлена";
2) "Ошибка запроса к БД. Проверьте наличие таблицы Transactions в БД".
б) Иначе, выведется сообщение:
1) "Не удалось установить связь: <Причина ошибки>".
Если вернулось сообщение "Ошибка запроса к БД. Проверьте наличие таблицы Transactions в БД" - нужно создать таблицы в БД.\\
Есть два 2 способа создания таблиц:\\
1. **Требуется установленный драйвер ODBC**: нажмите на кнопку "Создать таблицу" для создания необходимых для работы ОТТ таблиц в вашей БД.\\
2. **Вручную выполнить скрипт создания таблиц в СУБД**: {{ :кассир5:всевнешниемодули:kassir5_transactions_mssql.zip |скрипт для MSSQL}} (в первой строке заменить символы %ИмяБД% на имя существующей базы), {{ :кассир5:всевнешниемодули:kassir5_transactions_postgresql.zip |скрипт для PostgreSQL}}.
а) При успешном создании таблиц, выведется сообщение:
"Таблица в базе данных успешно создана.".
б) Иначе, выведется одно из трех сообщений:
1) "Скрипт для создания таблицы в СУБД <Имя СУБД> отсутствует.";
2) "Таблица transactions уже существует в БД. Выполните удаление таблицы средствами СУБД.";
3) "<Описание ошибки при создании таблицы>".
7. После, примените изменения и закройте форму настройки параметров подключения.
8. В форме настройки Кассира установите желаемое "Количество транзакций в запросе" (по умолчанию 1000) и "Период отправки запросов, с" (по умолчанию 60).
9. После, нажмите на кнопку "Перенести вручную" для первоначального заполнения таблицы транзакций в ОТТ.
10. На форме переноса транзакций можно переносить транзакции:
а) Начиная с самой первой;
б) Начиная с указанного кода;
в) Начиная с указанной даты;
г) Начиная с последней перенесенной.
Для способов а), б) и в), нужно выбрать способ отбора (все, начиная с кода или начиная с даты), заполнить поле (по необходимости) и нажать на кнопку "Начать перенос". \\
Рекомендуется переносить транзакции, начиная с самой первой (все).\\
Для способа г), нужно нажать на кнопку "Синхронизировать". Программа продолжит переносить транзакции, начиная с кода последней выгруженной транзакции.
11. После переноса транзакций, закройте форму. Общая настройка ОТТ завершена.
12. Если есть необходимость ограничить доступ к данным других ККМ для какой-либо операции (например, для возврата), \\
то нужно создать и указать группу ККМ.
Для этого на форме настройки кассира нажмите на кнопку "Настроить группы ККМ".\\
Стоит иметь ввиду, что группы ККМ могут настраиваться на любой ККМ, подключенной к БД, поскольку данные о них хранятся там же.
13. По умолчанию, списки ККМ пусты. Это значит, что все данные будут доступны на всех ККМ.
14. Для начала, добавьте в список ККМ новую строку. Укажите "Номер ПОС".
15. По окончании редактирования новой строки, в таблице "Операции" автоматически создадутся шесть операций:
1) "Возврат";
2) "Просмотр";
3) "Кредит";
4) "Предоплата";
5) "Tax free" (модуль Global Blue IC2);
6) "Подбор чека".
16. Каждой операции можно указать необходимую группу. \\
Группы работают следующим образом: если у ККМ 1 у операции "Возврат" стоит "Группа 1", и у ККМ 2 у той же операции стоит та же группа, \\
запросы к ОТТ будут производиться для номеров ПОС 1 и 2.
17. Есть две группы по умолчанию:
1) "Все ККМ" – запросы ведутся по всем ККМ, транзакции которых есть в ОТТ;
2) "Локально" – запросы ведутся в справочник транзакций данной ККМ. Запросы в ОТТ для данной операции не производятся.
18. Для добавления своих групп, нажмите на кнопку "Группы".
19. В открывшемся окне, добавьте новую строку в список групп. Укажите "Код группы" и "Наименование группы".
20. По завершении добавления необходимых групп, нажмите ОК. Теперь, для операций можно указать созданные группы.
21. По окончании работы с группами ККМ, примените изменения и закройте форму.
=====Удаление транзакций=====
Автоматической очистки транзакций нет. Очистку необходимо выполнять напрямую в СУБД.\\
Для этого необходимо создать хранимую процедуру в БД.\\
Это можно сделать в настройках Кассир 5 на вкладке ОТТ, если возникает ошибка, то это нужно сделать вручную в СУБД.\\
Для этого необходимо выполнить скрипт создания хранимой процедуры для удаления транзакций:
**для MSSQL**:\\
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE dbo.cleanup_transactions @older_than_days INTEGER, @trans_deleted bigint OUTPUT, @checks_deleted bigint OUTPUT, @error_message nvarchar(max) OUTPUT
AS
SET NOCOUNT ON;
DECLARE @border_code numeric(19, 0);
DECLARE @transrows_deleted bigint;
DECLARE @checkrows_deleted bigint;
IF @older_than_days >= 30
BEGIN
SET @border_code = (
SELECT MAX(t.code)
FROM dbo.transactions AS t
WHERE t.transactiondate <= DATEADD(day, -@older_than_days, CURRENT_TIMESTAMP));
IF @border_code > 0
BEGIN
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
SAVE TRANSACTION SavePoint;
ELSE
BEGIN TRANSACTION;
BEGIN TRY
DELETE FROM dbo.transactions
WHERE code <= @border_code;
SELECT @transrows_deleted = @@ROWCOUNT;
DELETE FROM dbo.receipts
WHERE startcode <= @border_code;
SELECT @checkrows_deleted = @@ROWCOUNT;
SET @trans_deleted = @transrows_deleted;
SET @checks_deleted = @checkrows_deleted;
IF @TranCounter = 0
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SET @error_message = ERROR_MESSAGE();
IF @TranCounter = 0
ROLLBACK TRANSACTION;
ELSE IF XACT_STATE() = -1
ROLLBACK TRANSACTION SavePoint;
END CATCH
END
END
ELSE
SET @error_message = 'Можно очищать только транзакции старше 30 дней (' + CAST(@older_than_days AS NVARCHAR(10)) + ' < 30)';
**для PostgreSQL**:\\
CREATE OR REPLACE PROCEDURE dbo.cleanup_transactions(IN older_than_days integer, INOUT trans_deleted bigint, INOUT checks_deleted bigint, INOUT error_message text)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE border_code numeric(19,0);
DECLARE transrows_deleted bigint;
DECLARE checkrows_deleted bigint;
BEGIN
IF older_than_days >= 30 THEN
SELECT MAX(t.code)
INTO border_code
FROM dbo.transactions AS t
WHERE t.transactiondate <= CURRENT_TIMESTAMP - make_interval(days => older_than_days);
IF border_code > 0 THEN
BEGIN
DELETE FROM dbo.transactions
WHERE code <= border_code;
GET DIAGNOSTICS transrows_deleted = ROW_COUNT;
DELETE FROM dbo.receipts
WHERE startcode <= border_code;
GET DIAGNOSTICS checkrows_deleted = ROW_COUNT;
trans_deleted = transrows_deleted;
checks_deleted = checkrows_deleted;
EXCEPTION WHEN OTHERS THEN
GET STACKED DIAGNOSTICS error_message = MESSAGE_TEXT;
END;
END IF;
ELSE
error_message = 'Можно очищать только транзакции старше 30 дней (' || CAST(older_than_days AS text) || ' < 30)';
END IF;
END$BODY$;