При интеграции кассового ПО Frontol 5 с конфигурацией 1С:Розница 2.2 (или аналогичными версиями) системные администраторы и программисты часто сталкиваются с критической ошибкой при попытке загрузить отчет о закрытии смены (Z-отчет). В процессе обмена 1С внезапно прерывает работу с сообщением: «Поле объекта не обнаружено (Тип)». В этой статье мы подробно разберем, почему возникает эта проблема, как ее диагностировать с помощью отладчика и какие существуют способы решения — от простых настроек операционной системы до внесения правок в программный код.
Проанализируем ситуацию: ошибка возникает в общем модуле, отвечающем за работу с подключаемым оборудованием (обычно это ПодключаемоеОборудованиеАтолККМOfflineКлиент). Программа пытается обработать файл выгрузки sales.txt, который формирует кассовая программа Frontol. В момент разбора строки транзакции 1С ожидает получить структуру, содержащую поле Тип, но вместо этого происходит сбой.
Если мы заглянем в отладчик, то увидим, что функция ЗаполнитьТранзакцию пытается извлечь данные из текстовой строки, разделенной символами точки с запятой (;). Проблема заключается в том, что 1С «спотыкается» на полях даты и времени. Если формат этих полей не соответствует ожиданиям парсера 1С, последующие поля (включая тип транзакции) либо сдвигаются, либо вовсе не попадают в результирующую структуру Транзакция.
Выясним главную причину такого поведения. Frontol при формировании файла выгрузки использует системные настройки даты и времени операционной системы, на которой он запущен. Если на кассовом компьютере в Панели управления установлены региональные стандарты «Английский (США)», то дата в файле sales.txt будет записана через слэш (4/11/2018), а время — с суффиксами AM/PM (например, 5:12:10 PM).
Стандартная обработка 1С жестко ориентирована на российский стандарт: ДД.ММ.ГГГГ и ЧЧ:ММ:СС. Встретив символ / или пробел перед PM, алгоритм обработки строк выдает ошибку преобразования типа Число, прерывает заполнение структуры, и поле Тип остается неопределенным. Это и приводит к ошибке «Поле объекта не обнаружено (Тип)» при обращении к Транзакция.Тип.
Решение: Самый простой и правильный способ — зайти в настройки Windows на кассовом узле и установить формат «Русский (Россия)». После этого Frontol начнет выгружать даты в понятном для 1С виде, и правка кода не потребуется.
Рассмотрим еще один важный момент. Frontol 5 постоянно обновляется, и в новых версиях (например, выше 5.20) могут добавляться новые поля в структуру транзакции. Если в настройках оборудования в 1С выбран старый формат обмена, индексы колонок могут не совпадать. Проверьте, чтобы в Frontol в разделе «Настройки обмена» стояла версия формата, совместимая с вашей версией 1С (обычно это 4.0 или 5.0).
Если изменить региональные настройки на кассе по каким-то причинам невозможно, мы можем программно адаптировать 1С под входящий формат данных. Для этого нам потребуется изменить функцию ЗаполнитьТранзакцию в общем модуле ПодключаемоеОборудованиеАтолККМOfflineКлиент (или аналогичном в вашей версии).
Разберем пример кода, который корректно обрабатывает дату со слэшами и время в формате AM/PM, переводя его в 24-часовой формат. Рассмотрим фрагмент кода, который нужно внедрить:
// Извлекаем сырые данные даты и времени из соответствующих колонок строки
ДатаТр = СтрПолучитьСтроку(Строка, 2);
ВремяТр = СтрПолучитьСтроку(Строка, 3);
// Обработка даты: заменяем слэши на переносы строк для дальнейшего разбора или на точки
Если СтрНайти(ДатаТр, "/") > 0 Тогда
ДатаТранзакции = СтрЗаменить(ДатаТр, "/", Символы.ПС);
ИначеЕсли СтрНайти(ДатаТр, ".") > 0 Тогда
ДатаТранзакции = СтрЗаменить(ДатаТр, ".", Символы.ПС);
КонецЕсли;
// Обработка времени с учетом AM/PM
ПервРазд = СтрНайти(ВремяТр, ":");
Если СтрНайти(ВремяТр, " PM") > 0 Тогда
// Если PM, добавляем 12 часов к первому сегменту времени
Часы = Число(Лев(ВремяТр, ПервРазд - 1));
Если Часы < 12 Тогда
Часы = Часы + 12;
КонецЕсли;
ВремяТр = Строка(Часы) + Прав(ВремяТр, СтрДлина(ВремяТр) - ПервРазд + 1);
ВремяТр = СтрЗаменить(ВремяТр, " PM", "");
ИначеЕсли СтрНайти(ВремяТр, " AM") > 0 Тогда
ВремяТр = СтрЗаменить(ВремяТр, " AM", "");
КонецЕсли;
// Теперь 1С сможет корректно прочитать время, разделенное двоеточиями
ВремяТранзакции = СтрЗаменить(ВремяТр, ":", Символы.ПС);
Этот код позволяет «нормализовать» данные до того, как система попытается преобразовать их в объекты типа Дата. После нормализации заполнение структуры Транзакция продолжится успешно, и поле Тип будет обнаружено.
Проанализируем сопутствующую проблему: иногда после исправления ошибки парсинга пользователи замечают, что один и тот же отчет загружается дважды, создавая дубли документов «Отчет о розничных продажах». Это происходит по следующим причинам:
64 означает «Вход пользователя». Типовая 1С часто не умеет их обрабатывать. Если ваша доработка кода «спотыкается» на сервисных транзакциях, 1С может считать сеанс обмена незавершенным.Backup после загрузки, она загрузит его снова.Для стабильной работы связки Frontol 5 + 1С:Розница рекомендуем придерживаться следующих правил:
Таким образом, мы рассмотрели комплексный подход к решению ошибки. Помните, что прежде чем править код конфигурации, всегда стоит проверить настройки окружения (Windows), так как в 90% случаев проблема кроется именно в «нестандартном» формате текстового файла sales.txt.