При автоматизации торговых точек на базе 1С:Розница или других конфигураций часто возникает необходимость динамически изменять данные в памяти фискального регистратора. Одной из самых частых задач является актуализация списка кассиров в Таблице №2 (Пароли кассиров и администраторов) устройства «Штрих-М». Это нужно для того, чтобы в чеке печаталась фамилия реального сотрудника, работающего в текущей смене.
Однако при попытке выполнить запись стандартными средствами 1С программисты часто сталкиваются с ошибками доступа к свойствам объекта или некорректными параметрами команды. В этой статье мы подробно разберем, как правильно организовать взаимодействие с драйвером, какие компоненты использовать и как избежать типичных ошибок.
Рассмотрим ситуацию, когда при попытке обращения к свойству Password возникает ошибка «Поле объекта не обнаружено». Проанализируем причину: автор исходного вопроса использовал внешнюю компоненту AddIn.SMDrvFR1C22. Данная библиотека является специализированной «оберткой», созданной по стандарту 1С для работы через библиотеку подключаемого оборудования (БПО).
Важный момент: компоненты, созданные по стандарту 1С для БПО, имеют строго ограниченный набор методов и свойств, необходимых только для типовых операций (печать чека, открытие смены, X-отчет). Прямой доступ к низкоуровневым таблицам настроек ККТ в таких компонентах зачастую закрыт или реализован иначе. Для полноценного управления внутренними параметрами устройства нам необходимо использовать «родную» ActiveX-компоненту драйвера — AddIn.DrvFR.
Выясним, чем отличаются способы создания объекта драйвера. Вместо создания объекта через стандартную компоненту 1С, мы будем использовать прямое обращение к COM-серверу драйвера «Штрих-М». Рассмотрим пошагово, как инициализировать соединение:
DrvFR.dll в системе, если это не было сделано автоматически.COMОбъект или подключение нативной компоненты.Посмотрим на пример кода для инициализации объекта драйвера:
// Вместо AddIn.SMDrvFR1C22 используем нативный драйвер
Попытка
ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
ФР = Новый ("AddIn.DrvFR");
Исключение
Сообщить("Не удалось загрузить компоненту DrvFR. Проверьте установку драйвера.");
Возврат;
КонецПопытки;
Теперь разберем внутреннее устройство памяти «Штрих-М». Все настройки кассы хранятся в пронумерованных таблицах. Список кассиров — это всегда Таблица №2. Проанализируем структуру этой таблицы:
Одной из ошибок в исходном коде была установка FieldNumber = 30. Это приводило к ошибке 51 (Некорректные параметры в команде), так как в таблице №2 нет поля с таким индексом. Для изменения фамилии мы должны всегда использовать FieldNumber = 2.
Рассмотрим правильную последовательность действий для записи ФИО кассира. Крайне важно не просто установить параметры, но и установить физическую связь с устройством перед выполнением команды записи.
Разберем процесс по шагам:
Connect().Password). По умолчанию для администрирования таблиц в Штрих-М используется пароль 30.ValueOfFieldString.WriteTable().Ниже приведен исправленный и проверенный программный код, который решает задачу записи ФИО кассира во вторую строку таблицы кассиров:
Процедура ЗаписатьКассираВККМ(ИмяКассира, НомерПорта)
// Создаем объект драйвера
Попытка
ФР = Новый COMОбъект("AddIn.DrvFR");
Исключение
Сообщить("Ошибка создания COM-объекта DrvFR");
Возврат;
КонецПопытки;
// Настраиваем параметры связи (если не используются настройки по умолчанию)
ФР.ComNumber = НомерПорта;
ФР.BaudRate = 6; // Скорость 115200 (индексы зависят от версии драйвера)
// Пытаемся установить связь
ФР.Connect();
Если ФР.ResultCode <> 0 Тогда
Сообщить("Ошибка связи с ККТ: " + ФР.ResultCodeDescription);
Возврат;
КонецЕсли;
// Устанавливаем системный пароль администратора (по умолчанию 30)
ФР.Password = 30;
// Настраиваем адрес ячейки в памяти ККТ
ФР.TableNumber = 2; // Таблица кассиров
ФР.RowNumber = 2; // Номер кассира (строка)
ФР.FieldNumber = 2; // Поле "Имя кассира"
// Ограничиваем длину строки (старые модели Штрих-М не принимают более 30 символов)
ФР.ValueOfFieldString = Лев(СокрЛП(ИмяКассира), 30);
// Выполняем запись
ФР.WriteTable();
Если ФР.ResultCode = 0 Тогда
Сообщить("Данные кассира успешно обновлены!");
Иначе
Сообщить("Ошибка записи в таблицу: " + ФР.ResultCodeDescription);
КонецЕсли;
// Разрываем соединение
ФР.Disconnect();
КонецПроцедуры
Выясним причины возникновения некоторых специфических ошибок, которые могут встретиться в процессе работы. Рассмотрим ситуацию с методом GetFieldStruct(). Этот метод используется для получения структуры поля (длины, типа), но он не является обязательным для выполнения простой записи. Если вы вызываете его и получаете ошибку 51, это верный признак того, что вы указали несуществующий TableNumber или FieldNumber.
Важные рекомендации при работе с драйвером:
30 для свойства Password не подойдет. В этом случае необходимо уточнить пароль системного администратора ККТ.Таким образом, мы проанализировали основные причины неудач при записи в таблицы Штрих-М и выработали надежный алгоритм решения задачи. Использование прямого COM-интерфейса вместо БПО-обертки дает программисту полный контроль над аппаратной частью устройства и позволяет реализовывать нестандартные задачи по настройке оборудования.