Почему при выгрузке в ККМ Offline из 1С:УТ 11.4 формируется пустой файл и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с торговым оборудованием в 1С:Управление торговлей (редакция 11.4) пользователи часто сталкиваются с ситуацией, когда процесс обмена с ККМ Offline (например, под управлением Frontol 5/6) завершается без ошибок, но итоговый файл загрузки оказывается пустым. В нем присутствуют только служебные заголовки формата АТОЛ, такие как ##@@&& и $$$REPLACEQUANTITY, но строки с самой номенклатурой отсутствуют. Рассмотрим подробно, почему это происходит, проанализируем программный код и выясним, в каких настройках конфигурации может крыться причина.

Анализ программного механизма выгрузки

Прежде всего, разберем путь, который проходят данные от нажатия кнопки в интерфейсе до записи текстового файла на диск. В конфигурации УТ 11.4 за обмен с офлайн-оборудованием отвечает специализированный менеджер. Проанализируем цепочку вызовов в модулях.

Все начинается с команды КассыТоварыВыгрузить в обработке выгрузки. Здесь система определяет текущую кассу и запускает процесс через клиентский менеджер оборудования. Посмотрим на пример кода:


&НаКлиенте
Процедура КассыТоварыВыгрузить(Команда)
    
    ТекущиеДанные = Элементы.КассыККМ.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.ПравилоОбмена) Тогда
        ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыполненияОбмена", ЭтотОбъект);
        МенеджерОфлайнОборудованияКлиент.НачатьВыгрузкуДанныхНаККМ(ТекущиеДанные.ПодключаемоеОборудование, УникальныйИдентификатор, ОписаниеОповещения);
    Иначе
        ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Команда не может быть выполнена для указанного объекта'"));
    КонецЕсли;
    
КонецПроцедуры

Затем управление передается в процедуру НачатьВыполнениеКоманды. Здесь важно обратить внимание на ветвление логики. В зависимости от контекста вызова, система может идти по пути ВыгрузитьТовары или ВыгрузитьДанные. Проанализируем этот участок:


// В процедуре НачатьВыполнениеКоманды
Если Команда = "ВыгрузитьТовары" Тогда
    Товары = ВходныеПараметры[0];
    ЧастичнаяВыгрузка = ВходныеПараметры[1];
    РасширеннаяВыгрузка = ВходныеПараметры[2];
    НачатьВыгрузкуТоваров(ОповещениеПриЗавершении, Параметры, Товары, ЧастичнаяВыгрузка, ВыходныеПараметры, РасширеннаяВыгрузка);
    
ИначеЕсли Команда = "ВыгрузитьДанные" Тогда
    // Обратите внимание: данные берутся из структуры ДанныеДляВыгрузки
    Товары = ВходныеПараметры.ДанныеДляВыгрузки.ПрайсЛист;
    ЧастичнаяВыгрузка = НЕ ВходныеПараметры.ДанныеДляВыгрузки.ПрайсЛист.ПолнаяВыгрузка;
    РасширеннаяВыгрузка = Истина;
    НачатьВыгрузкуТоваров(ОповещениеПриЗавершении, Параметры, Товары, ЧастичнаяВыгрузка, ВыходныеПараметры, РасширеннаяВыгрузка);
КонецЕсли;

Если при отладке мы видим, что файл создается, но он пустой, это означает, что объект Товары (коллекция данных) уже на этом этапе не содержит строк. Выясним, почему это происходит в процедуре формирования текстового документа.

Разбор функции СформироватьФайлТоваров

Данная функция отвечает за непосредственную запись строк в объект ТекстовыйДокумент. Если цикл по товарам не выполняется, файл останется с одними заголовками. Рассмотрим реализацию:


Функция СформироватьФайлТоваров(Файл, РасширеннаяВыгрузка, ЧастичнаяВыгрузка, ФорматОбмена, Разделитель, Товары, ВыходныеПараметры)
    
    Результат = Истина;
    Файл.ДобавитьСтроку("##@@&&");
    Файл.ДобавитьСтроку("#");
    
    Если РасширеннаяВыгрузка Тогда
        Если ЧастичнаяВыгрузка Тогда
            Файл.ДобавитьСтроку("$$$REPLACEQUANTITY");
        Иначе
            Файл.ДобавитьСтроку("$$$DELETEALLWARES");
            // ... очистка штрихкодов и остатков
            Файл.ДобавитьСтроку("$$$ADDQUANTITY");
        КонецЕсли;
        
        // Выгрузка групп
        Для Каждого ТекГруппа Из Товары.ГруппыТоваров Цикл
            // ... заполнение данных группы
            ДобавитьСтрокуВФайл(Файл, Разделитель, ДанныеДляЗаполнения, ФорматОбмена, Истина);
        КонецЦикла;
    КонецЕсли;

    // КРИТИЧЕСКИЙ МОМЕНТ: если Товары.Товары пустая, цикл ниже игнорируется
    Для Каждого Товар Из Товары.Товары Цикл
        // Формирование структуры Параметры и вызов ДополнитьФайл
        ДополнитьФайл(Результат, Файл, ВыходныеПараметры, Параметры);
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Если при пошаговой отладке выясняется, что Товары.Товары.Количество() равно 0, нам необходимо вернуться к истокам формирования этих данных. В 1С:УТ 11 данные для ККМ Offline подготавливаются на сервере на основании Правил обмена.

Почему таблица товаров может быть пустой: чек-лист проверок

Проанализируем основные функциональные причины, которые приводят к «исчезновению» товаров из выгрузки, даже если в предварительном просмотре в Правиле обмена они видны.

  1. Контроль остатков на складе. В настройках правила обмена часто устанавливается флаг Выгружать только товары с остатками. Если на момент выгрузки по регистру Товары на складах остаток равен нулю (или он зарезервирован), товар не попадет в выборку. Проверьте остатки именно по тому складу, который указан в правиле.
  2. Регистрация цен номенклатуры. Для офлайн-кассы обязательно должен быть задан Вид цены. Если цена на товар не установлена документом Установка цен номенклатуры или дата документа больше даты текущей выгрузки, такие позиции будут отфильтрованы. Убедитесь, что в правиле обмена выбран верный вид цены и цены по нему актуальны.
  3. Отсутствие штрихкодов. Формат Frontol (АТОЛ) требует наличия штрихкода для идентификации товара. Если у номенклатуры заполнены все параметры, но нет записи в регистре Штрихкоды номенклатуры, система может исключить её из выгрузки, чтобы не передавать некорректные данные в кассовое ПО.
  4. Статус номенклатуры и иерархия. Проверьте, не установлен ли у товаров статус Архив. Также убедитесь, что в правилах обмена верно указаны группы номенклатуры. Иногда фильтр по группам в коде отрабатывает жестче, чем в интерфейсе подбора.

Работа с регистром «Товары Offline»

В современных релизах УТ 11.4 механизм обмена часто опирается на данные регистра сведений Товары Offline. Рассмотрим, как он функционирует:

Этот регистр служит промежуточным звеном. Когда в системе меняется цена или остаток, специальные триггеры должны обновлять записи в этом регистре для конкретной кассы. Если регламентное задание по обновлению данных для ККМ не отработало или произошел сбой в подписках на события, регистр будет пуст. Выгрузка, в свою очередь, берет данные именно оттуда.

Рекомендация: откройте через функции для технического специалиста регистр Товары Offline и проверьте наличие записей с фильтром по вашей кассе. Если записей нет — попробуйте выполнить полную выгрузку (команда «Очистить и выгрузить все»), это принудительно инициализирует заполнение данных.

Ошибки конкретных релизов (например, 11.4.8.73)

В некоторых версиях конфигураций 11.4 наблюдались ошибки в процедуре ПодготовитьДанныеДляВыгрузки. Проанализируем ситуацию: при частичной выгрузке (обновлении) система ищет только измененные данные. Если алгоритм определения изменений дает сбой, массив товаров возвращается пустым. В таких случаях временным решением является использование только полной выгрузки до момента обновления конфигурации на исправленный патчем релиз.

Подводя итог, если вы столкнулись с пустым файлом: во-первых, проверьте остатки и цены; во-вторых, убедитесь в наличии штрихкодов; в-третьих, используйте отладку в функции СформироватьФайлТоваров, чтобы убедиться, что проблема именно в отсутствии данных в коллекции, а не в ошибке записи самого текстового файла.

← На главную