При работе с торговым оборудованием в 1С:Управление торговлей (редакция 11.4) пользователи часто сталкиваются с ситуацией, когда процесс обмена с ККМ Offline (например, под управлением Frontol 5/6) завершается без ошибок, но итоговый файл загрузки оказывается пустым. В нем присутствуют только служебные заголовки формата АТОЛ, такие как ##@@&& и $$$REPLACEQUANTITY, но строки с самой номенклатурой отсутствуют. Рассмотрим подробно, почему это происходит, проанализируем программный код и выясним, в каких настройках конфигурации может крыться причина.
Прежде всего, разберем путь, который проходят данные от нажатия кнопки в интерфейсе до записи текстового файла на диск. В конфигурации УТ 11.4 за обмен с офлайн-оборудованием отвечает специализированный менеджер. Проанализируем цепочку вызовов в модулях.
Все начинается с команды КассыТоварыВыгрузить в обработке выгрузки. Здесь система определяет текущую кассу и запускает процесс через клиентский менеджер оборудования. Посмотрим на пример кода:
&НаКлиенте
Процедура КассыТоварыВыгрузить(Команда)
ТекущиеДанные = Элементы.КассыККМ.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.ПравилоОбмена) Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыполненияОбмена", ЭтотОбъект);
МенеджерОфлайнОборудованияКлиент.НачатьВыгрузкуДанныхНаККМ(ТекущиеДанные.ПодключаемоеОборудование, УникальныйИдентификатор, ОписаниеОповещения);
Иначе
ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Команда не может быть выполнена для указанного объекта'"));
КонецЕсли;
КонецПроцедуры
Затем управление передается в процедуру НачатьВыполнениеКоманды. Здесь важно обратить внимание на ветвление логики. В зависимости от контекста вызова, система может идти по пути ВыгрузитьТовары или ВыгрузитьДанные. Проанализируем этот участок:
// В процедуре НачатьВыполнениеКоманды
Если Команда = "ВыгрузитьТовары" Тогда
Товары = ВходныеПараметры[0];
ЧастичнаяВыгрузка = ВходныеПараметры[1];
РасширеннаяВыгрузка = ВходныеПараметры[2];
НачатьВыгрузкуТоваров(ОповещениеПриЗавершении, Параметры, Товары, ЧастичнаяВыгрузка, ВыходныеПараметры, РасширеннаяВыгрузка);
ИначеЕсли Команда = "ВыгрузитьДанные" Тогда
// Обратите внимание: данные берутся из структуры ДанныеДляВыгрузки
Товары = ВходныеПараметры.ДанныеДляВыгрузки.ПрайсЛист;
ЧастичнаяВыгрузка = НЕ ВходныеПараметры.ДанныеДляВыгрузки.ПрайсЛист.ПолнаяВыгрузка;
РасширеннаяВыгрузка = Истина;
НачатьВыгрузкуТоваров(ОповещениеПриЗавершении, Параметры, Товары, ЧастичнаяВыгрузка, ВыходныеПараметры, РасширеннаяВыгрузка);
КонецЕсли;
Если при отладке мы видим, что файл создается, но он пустой, это означает, что объект Товары (коллекция данных) уже на этом этапе не содержит строк. Выясним, почему это происходит в процедуре формирования текстового документа.
Данная функция отвечает за непосредственную запись строк в объект ТекстовыйДокумент. Если цикл по товарам не выполняется, файл останется с одними заголовками. Рассмотрим реализацию:
Функция СформироватьФайлТоваров(Файл, РасширеннаяВыгрузка, ЧастичнаяВыгрузка, ФорматОбмена, Разделитель, Товары, ВыходныеПараметры)
Результат = Истина;
Файл.ДобавитьСтроку("##@@&&");
Файл.ДобавитьСтроку("#");
Если РасширеннаяВыгрузка Тогда
Если ЧастичнаяВыгрузка Тогда
Файл.ДобавитьСтроку("$$$REPLACEQUANTITY");
Иначе
Файл.ДобавитьСтроку("$$$DELETEALLWARES");
// ... очистка штрихкодов и остатков
Файл.ДобавитьСтроку("$$$ADDQUANTITY");
КонецЕсли;
// Выгрузка групп
Для Каждого ТекГруппа Из Товары.ГруппыТоваров Цикл
// ... заполнение данных группы
ДобавитьСтрокуВФайл(Файл, Разделитель, ДанныеДляЗаполнения, ФорматОбмена, Истина);
КонецЦикла;
КонецЕсли;
// КРИТИЧЕСКИЙ МОМЕНТ: если Товары.Товары пустая, цикл ниже игнорируется
Для Каждого Товар Из Товары.Товары Цикл
// Формирование структуры Параметры и вызов ДополнитьФайл
ДополнитьФайл(Результат, Файл, ВыходныеПараметры, Параметры);
КонецЦикла;
Возврат Результат;
КонецФункции
Если при пошаговой отладке выясняется, что Товары.Товары.Количество() равно 0, нам необходимо вернуться к истокам формирования этих данных. В 1С:УТ 11 данные для ККМ Offline подготавливаются на сервере на основании Правил обмена.
Проанализируем основные функциональные причины, которые приводят к «исчезновению» товаров из выгрузки, даже если в предварительном просмотре в Правиле обмена они видны.
Выгружать только товары с остатками. Если на момент выгрузки по регистру Товары на складах остаток равен нулю (или он зарезервирован), товар не попадет в выборку. Проверьте остатки именно по тому складу, который указан в правиле.Установка цен номенклатуры или дата документа больше даты текущей выгрузки, такие позиции будут отфильтрованы. Убедитесь, что в правиле обмена выбран верный вид цены и цены по нему актуальны.Штрихкоды номенклатуры, система может исключить её из выгрузки, чтобы не передавать некорректные данные в кассовое ПО.Архив. Также убедитесь, что в правилах обмена верно указаны группы номенклатуры. Иногда фильтр по группам в коде отрабатывает жестче, чем в интерфейсе подбора.В современных релизах УТ 11.4 механизм обмена часто опирается на данные регистра сведений Товары Offline. Рассмотрим, как он функционирует:
Этот регистр служит промежуточным звеном. Когда в системе меняется цена или остаток, специальные триггеры должны обновлять записи в этом регистре для конкретной кассы. Если регламентное задание по обновлению данных для ККМ не отработало или произошел сбой в подписках на события, регистр будет пуст. Выгрузка, в свою очередь, берет данные именно оттуда.
Рекомендация: откройте через функции для технического специалиста регистр Товары Offline и проверьте наличие записей с фильтром по вашей кассе. Если записей нет — попробуйте выполнить полную выгрузку (команда «Очистить и выгрузить все»), это принудительно инициализирует заполнение данных.
В некоторых версиях конфигураций 11.4 наблюдались ошибки в процедуре ПодготовитьДанныеДляВыгрузки. Проанализируем ситуацию: при частичной выгрузке (обновлении) система ищет только измененные данные. Если алгоритм определения изменений дает сбой, массив товаров возвращается пустым. В таких случаях временным решением является использование только полной выгрузки до момента обновления конфигурации на исправленный патчем релиз.
Подводя итог, если вы столкнулись с пустым файлом:
во-первых, проверьте остатки и цены;
во-вторых, убедитесь в наличии штрихкодов;
в-третьих, используйте отладку в функции СформироватьФайлТоваров, чтобы убедиться, что проблема именно в отсутствии данных в коллекции, а не в ошибке записи самого текстового файла.