Заметил что часы на онлайнККМ Атол далеки от идеальных и убегать/отставать в день на 20 секунд это практически норма и за месяц время на ККМ уже весьма значительно отличается от реального. На компьютере без проблем настроить синхронизацию времени с ntp и забыть про рассинхрон, но возникает вопрос как это же время установить на ККМ. В возможностях Розницы 2.2 я подобного не нашёл и среди методов NativeAPI от Атола, через которую идёт работа с ККТ, что бы устанавливать самому программно тоже не увидел.
Неужели единственный вариант установить время это только через тест драйвера ?
(1) Молодой человек, юзайте драйвер ККМ и курите мануал от него, там есть настройки.
Подключаетесь к ККМ через стандартный драйвер и нажимаете так же Синхронизировать время
Так же можете поизучать Апи драйвера ККМ, там, если не ошибаюсь, была такая функция, которая отвечает за установку времени
(2)
Тест драйвера у Атола и есть надстройка над драйвером ККМ и конечно настройки времени там есть. И вот именно туда продавцов пускать не то что не хочется а прямо категорически не рассматривается.Пара нажатий мимо нужной кнопки и продавец вместо торговли получает перекур на пару часов.
Вот про "Апи дравйвера" по сути и был вопрос. Но работает Розница через доп. прослойку между драйвером Атола и 1с - интеграционную компоненту NativeApi и там такой функционал я не нашёл, хотя возможно как раз что и плохо или не там искал.
По (4) да, ссылку эту и аналогичную для Атол ДрайвераККТ 9 изучил. но это из компоненты под NativeApi недоступно.
По (3) аналогично - читал и пробовал, тема очень старая и так не получается. на ДТО 9 ни один из типов AddIn.DrvFR, AddIn.FPrnM8, AddIn.FPrnM9 не определён. Подключается AddIn.ATOL_KKT_1C83_V9.ATOL_KKT_1C83_V9 но это как раз и есть компонента через NativeAPI - подключение настраиваю, тест проходит но вот время менять механизма не вижу.
Вообще я бы с радостью сработал напрямую с драйвером но даже на этапе загрузки ВК получаю ошибку
ЗагрузитьВнешнююКомпоненту("C:\Program Files\ATOL\Drivers9\KKT\bin\fptr.dll") то ли уже ДТО напрямую не собирается работать, что конечно вряд ли, то ли 1с желает работать только через компоненты NativeAPI. Если есть опыт подключения ДТО 9 к 1с УФ буду благодарен если поделишься.
(6) Когда еще не прогал, а только админил на позапрошлой работе, мы нанимали прогера. Он распиливал официальную обработку по работе с устройством и на основе ее дописывал функционал дополнительных настроек ккм.
(7)
Так не стоит так вопрос даже "писать или не писать". конечно готов писать. Но то что у ДТО 9 идёт для интеграции в 1с это компонента с NativeApi которвая подцепляется как AddIn.ATOL_KKT_1C83_V9 и на ИТСе есть список всех доступных от неё методов https://its.1c.ru/db/metod8dev#content:4829:hdoc . Там куча всего с печатью чеков, нефискализованых документов, открытий/закрытий смены но нет методов для изменения времени. Насколько я сейчас понимаю то через неё в принципе невозможно управлять временем на КММ. Поэтому и спрашиваю у сообщества может кто то подобную задачу решал и это я вупор не вижу нужного метода а он есть или есть какой-то другой вариант.
&НаКлиенте
Процедура Синхронизировать(Команда)
fptr = Новый COMОбъект("AddIn.Fptr10");
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_MODEL, Строка(fptr.LIBFPTR_MODEL_ATOL_22F));
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_PORT, Строка(fptr.LIBFPTR_PORT_COM));
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_COM_FILE, "COM12");
fptr.applySingleSettings();
Если fptr.open() < 0 Тогда
Сообщить("Ошибка соединения с ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
fptr.setParam(fptr.LIBFPTR_PARAM_DATA_TYPE, fptr.LIBFPTR_DT_SHIFT_STATE);
Если fptr.queryData() < 0 Тогда
Сообщить("Ошибка запроса состояния смены ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
СостояниеСмены = fptr.getParamInt(fptr.LIBFPTR_PARAM_SHIFT_STATE);
Сообщить("Cмена ККТ закрыта: " + ?(СостояниеСмены = fptr.LIBFPTR_SS_CLOSED, "Да", "Нет"));
fptr.setParam(fptr.LIBFPTR_PARAM_DATA_TYPE, fptr.LIBFPTR_DT_DATE_TIME);
Если fptr.queryData() < 0 Тогда
Сообщить("Ошибка запроса текущей даты и времени ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
ДатаВремяВККТ = Дата(fptr.getParamDateTime(fptr.LIBFPTR_PARAM_DATE_TIME));
Сообщить("Дата и время в ККТ: " + ДатаВремяВККТ);
ТекДата = ТекущаяДата();
Сообщить("Системные дата и время: " + ТекДата);
ОтклонениеВСекундах = МодульЧисла(ДатаВремяВККТ - ТекДата);
Сообщить("Отклонение от системного времени, сек: " + Формат(ДатаВремяВККТ - ТекДата, "ЧН="));
Если ОтклонениеВСекундах < 10 Тогда
Сообщить("Отклонение времени ККТ от системного не большое (менее 10 сек). Корректировка времени в ККТ не требуется");
ИначеЕсли ОтклонениеВСекундах > 300 Тогда
Сообщить("Отклонение времени ККТ от системного слишком большое (более 300 сек). Корректировка времени в ККТ должна быть выполнена вручную");
ИначеЕсли СостояниеСмены <> fptr.LIBFPTR_SS_CLOSED Тогда
Сообщить("Корректировка времени в ККТ не выполнена, т.к. смена не закрыта.");
Иначе
fptr.setParam(fptr.LIBFPTR_PARAM_DATE_TIME, ТекДата);
Если fptr.writeDateTime() < 0 Тогда
Сообщить("Ошибка установки даты и времени в ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
Сообщить("Системные дата и время записаны в ККТ");
КонецЕсли;
Если fptr.close() < 0 Тогда
Сообщить("Ошибка закрытия соединения с ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция МодульЧисла(ИсходноеЧисло)
Если ИсходноеЧисло < 0 Тогда
Возврат -ИсходноеЧисло
Иначе
Возврат ИсходноеЧисло
КонецЕсли;
КонецФункции
Показать
Документация по com объекту есть в составе атоловских драйверов.
(9) у меня вываливается сообщение об ошибке - "Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован"
зарегистрировал addin_fptr10_x86.dll - не помогло..
Не было ли подобного часом?
даже незнаю на что и подумать то..
(10) Для 9 версии примеров на 1с у меня нет. В комплекте с драйверами должна быть инструкция на com-объект. Посмотрите там. Думаю, что будет что то типа Новый COMОбъект("AddIn.Fptr9"). Но работать с ним надо по другому, не так как с 10 версией.
С 9 версией даже не смотрел, как там время подстраивать, т.к. её поддержку скоро прекратят, всё равно переходить на 10 версию надо будет.
Если СостояниеСмены <> fptr.LIBFPTR_SS_CLOSED Тогда
Сообщить("Корректировка времени в ККТ не выполнена, т.к. смена не закрыта.");
ИначеЕсли ОтклонениеВСекундах < 10 Тогда
Сообщить("Отклонение времени ККТ от системного не большое (менее 10 сек). Корректировка времени в ККТ не требуется");
ИначеЕсли ОтклонениеВСекундах > 300 Тогда
Сообщить("Отклонение времени ККТ от системного слишком большое (более 300 сек). Корректировка времени в ККТ должна быть выполнена вручную");
Иначе
fptr.setParam(fptr.LIBFPTR_PARAM_DATE_TIME, ТекДата);
Если fptr.writeDateTime() < 0 Тогда
Сообщить("Ошибка установки даты и времени в ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
Сообщить("Системные дата и время записаны в ККТ");
КонецЕсли;
(16) не подскажите как такое реализовать? Установил onescript на комп, где подключена касса. Подгрузил все стандартные библиотеки для скрипта, запустил от админа через powershell и ничего не происходит...
(18) нужно использовать ДТО10 32 разрядное, и нужен актуальный Net Framework, код немного модифицирован (т.к. бывает на ПЭВМ подключено несколько ККТ), запуск из бат-файла (TimeSync_Atol.cmd), утилита cmdtime3.exe синхронизирует время на ПК
Процедура Синхронизировать(ПортККТ)
fptr = Новый COMОбъект("AddIn.Fptr10");
Если ПортККТ="0" Тогда
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_PORT, Строка(fptr.LIBFPTR_PORT_USB));
Иначе
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_MODEL, Строка(fptr.LIBFPTR_MODEL_ATOL_AUTO));
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_PORT, Строка(fptr.LIBFPTR_PORT_COM));
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_COM_FILE, ПортККТ);
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_BAUDRATE, Строка(fptr.LIBFPTR_PORT_BR_115200));
КонецЕсли;
fptr.applySingleSettings();
Если fptr.open() < 0 Тогда
Сообщить("Ошибка соединения с ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
Иначе
Сообщить("Подключение ККТ Атол успешно");
КонецЕсли;
СостояниеСмены = fptr.getParamInt(fptr.LIBFPTR_PARAM_SHIFT_STATE);
Сообщить("Cмена ККТ закрыта: " + ?(СостояниеСмены = fptr.LIBFPTR_SS_CLOSED, "Да", "Нет"));
Если СостояниеСмены <> fptr.LIBFPTR_SS_CLOSED Тогда
Сообщить("Корректировка времени в ККТ не выполнена, т.к. смена не закрыта.");
Иначе
ТекДата = ТекущаяДата();
Сообщить("Текущая дата и время "+ТекДата);
fptr.setParam(fptr.LIBFPTR_PARAM_DATE_TIME, ТекДата);
Если fptr.writeDateTime() < 0 Тогда
Сообщить("Ошибка установки даты и времени в ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
КонецЕсли;
Сообщить("Системные дата и время записаны в ККТ");
КонецЕсли;
Если fptr.close() < 0 Тогда
Сообщить("Ошибка закрытия соединения с ККТ: " + fptr.errorCode() + " [" + fptr.errorDescription() + "]");
Возврат;
Иначе
Сообщить("Отключение ККТ Атол успешно");
КонецЕсли;
КонецПроцедуры
Функция МодульЧисла(ИсходноеЧисло)
Если ИсходноеЧисло < 0 Тогда
Возврат -ИсходноеЧисло
Иначе
Возврат ИсходноеЧисло
КонецЕсли;
КонецФункции
Синхронизировать("0");
//Синхронизировать("COM17");
(19) Библиотека зарегистрирована, но все равно получаю:
{Модуль C:\oscript\СинхронизацияВремениАтол.os / Ошибка в строке: 3 / Внешнее исключение (System.Runtime.InteropServices.COMException): Не удалось получить фабрику класса COM для компонента с CLSID {7C8D7847-F01D-4D80-8C50-12F82FF85854} из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).}