Как настроить обмен между 1С:Управление торговлей 11 и Frontol и исправить типовые ошибки?

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

При интеграции 1С:Управление торговлей 11 (УТ 11) с кассовым программным обеспечением Frontol от компании АТОЛ пользователи и разработчики часто сталкиваются с рядом технических сложностей. К наиболее распространенным проблемам относятся: загрузка недельных продаж в один день (без разделения по датам), аварийное завершение загрузки с ошибкой несоответствия типов, а также расхождение итоговых сумм в 1С с бумажными Z-отчетами.

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

---

Проблема №1: Загрузка продаж за неделю в один день (группировка по датам)

Рассмотрим стандартную ситуацию. Кассиры на торговой точке работают всю неделю, а бухгалтер или менеджер выполняет загрузку отчетов о продажах в 1С только раз в неделю. Во Frontol настроена выгрузка транзакций, содержащая полную информацию о дате, времени и номере смены для каждого чека. Однако при загрузке этого файла в 1С:Управление торговлей система создает один-единственный документ ОтчетОРозничныхПродажах на текущую дату загрузки, игнорируя реальные даты совершения операций.

Почему так происходит?

Типовой механизм ККМ-Offline в 1С изначально проектировался под сценарий «один день — одна кассовая смена — один отчет». При импорте файла транзакций обработка считывает весь массив данных и формирует сводный документ на дату загрузки. Разделение по дням в стандартном функционале без дополнительных настроек не предусмотрено.

Выясним, какими способами можно решить эту задачу:

Способ A: Организационный (ежедневная выгрузка)

Самое простое решение, не требующее изменения программного кода. Необходимо настроить автоматическое закрытие смены и выгрузку данных на кассе Frontol ежедневно в конце рабочего дня. В этом случае кассир ежедневно отправляет отчет, а в 1С загружается ровно один день. Если обмен производится раз в неделю, можно настроить Frontol так, чтобы он формировал отдельные файлы за каждый день, и загружать их последовательно.

Способ Б: Доработка механизма разбора транзакций в 1С

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

Во Frontol структура файла выгрузки содержит строки транзакций, разделенные точкой с запятой. Например:

42752;12.04.2014;10:54:45;11;1;4917;2;104616;;25;1;25;0;29;25;25;0;b017;2000000006383;25;0;0;1;0;;1/29/4917;1;0;;;;;;;0;

В этой строке:

Давайте модифицируем алгоритм загрузки. Нам необходимо разобрать входящий файл, сгруппировать продажи по датам и для каждой уникальной даты создать свой документ ОтчетОРозничныхПродажах.

Посмотрим на пример кода, реализующего группировку транзакций по датам перед созданием документов:


// Функция разбирает файл транзакций и группирует данные по датам
Функция СгруппироватьТранзакцииПоДатам(ПутьКФайлу) Экспорт

    ТаблицаГруппировки = Новый ТаблицаЗначений;
    ТаблицаГруппировки.Колонки.Добавить("ДатаПродажи", Новый ОписаниеТипов("Дата"));
    ТаблицаГруппировки.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ТаблицаГруппировки.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", 15, 3));
    ТаблицаГруппировки.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", 15, 2));

    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);

    Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
        СтрокаДанных = Текст.ПолучитьСтроку(НомерСтроки);
        Если ПустаяСтрока(СтрокаДанных) Тогда
            Продолжить;
        КонецЕсли;

        // Разделяем строку по символу ";"
        МассивПараметров = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаДанных, ";");
        
        // Проверяем минимально необходимый размер массива
        Если МассивПараметров.Количество() < 4 Тогда
            Продолжить;
        КонецЕсли;

        ТипТранзакции = МассивПараметров[3]; // Код транзакции (поле 4)
        
        // Нас интересуют транзакции продаж (11) и возвратов (12)
        Если ТипТранзакции = "11" Или ТипТранзакции = "12" Тогда
            СтрокаДаты = МассивПараметров[1]; // Дата транзакции (поле 2)
            ТекущаяДата = Дата(Сред(СтрокаДаты, 7, 4) + Сред(СтрокаДаты, 4, 2) + Лев(СтрокаДаты, 2));
            
            SKUКод = МассивПараметров[7]; // SKU товара
            ТоварСсылка = НайтиНоменклатуруПоSKU(SKUКод);
            
            Количество = Число(МассивПараметров[9]);
            Сумма = Число(МассивПараметров[11]);
            
            Если ТипТранзакции = "12" Тогда // Возврат
                Количество = -Количество;
                Сумма = -Сумма;
            КонецЕсли;

            // Заполняем таблицу группировки
            НоваяСтрока = ТаблицаГруппировки.Добавить();
            НоваяСтрока.ДатаПродажи = НачалоДня(ТекущаяДата);
            НоваяСтрока.Товар = ТоварСсылка;
            НоваяСтрока.Количество = Количество;
            НоваяСтрока.Сумма = Сумма;
        КонецЕсли;
    КонецЦикла;

    Возврат ТаблицаГруппировки;

КонецФункции

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

---

Проблема №2: Ошибка «Несоответствие типов (параметр номер '1')» при удалении позиций

При закрытии кассовой смены во Frontol и загрузке отчета в 1С вы можете столкнуться с критической ошибкой платформы:

{ОбщийМодуль.ПодключаемоеОборудованиеАтолККМOffline.Модуль(515)}: Ошибка при вызове метода контекста (Удалить) Позиции.Удалить(Врем); по причине: Несоответствие типов (параметр номер '1')

Анализ причины ошибки:

Данная ошибка представляет собой классическую опечатку разработчиков в типовых конфигурациях 1С (УТ 11, Розница, Комплексная автоматизация). Переменная Позиции в данном общем модуле представляет собой объект типа Массив.

Согласно синтакс-помощнику 1С, метод Массив.Удалить() имеет следующий синтаксис:

Массив.Удалить(Индекс), где в качестве параметра должен передаваться числовой индекс элемента, который требуется удалить из массива.

Однако в коде ошибочно передается сама переменная Врем (которая содержит структуру или строку данных, а не число-индекс). Из-за этого платформа сообщает о несоответствии типов.

Способ исправления ошибки:

Для исправления необходимо внести изменения в общий модуль ПодключаемоеОборудованиеАтолККМOffline. Мы должны сначала найти индекс элемента в массиве с помощью метода Найти(), а затем удалить его по найденному индексу.

Заменим некорректный участок кода следующим образом:


// БЫЛО:
// Позиции.Удалить(Врем);

// СТАЛО:
ИндексЭлемента = Позиции.Найти(Врем);
Если ИндексЭлемента <> Неопределено Тогда
    Позиции.Удалить(ИндексЭлемента);
КонецЕсли;

Данное исправление можно внести напрямую в конфигурацию (предварительно сняв модуль с поддержки) либо создать небольшое расширение конфигурации, переопределяющее поведение этой процедуры.

---

Проблема №3: Не сходятся данные в 1С и в Z-отчете (теряется товар)

Бывают случаи, когда итоговая сумма продаж по отчету в 1С оказывается меньше, чем сумма в физическом Z-отчете, распечатанном на ККМ. При этом часть позиций номенклатуры просто исчезает из документа при загрузке.

Разберем основные причины этого поведения и способы их устранения:

1. Несоответствие SKU-кодов (кодов товаров)

В процессе загрузки транзакций 1С сопоставляет строки из файла Frontol со справочником номенклатуры в базе данных по уникальному идентификатору — коду SKU. Если в файле выгрузки присутствует код SKU, которого нет в текущей базе 1С, загрузчик может проигнорировать эту строку (или выдать предупреждение, которое пользователь пропускает).

Решение: Перед началом смены обязательно убедитесь, что из 1С на кассу была выполнена полная выгрузка всей актуальной номенклатуры. Настоятельно рекомендуется заблокировать во Frontol права кассиров на ручное добавление или редактирование карточек товаров, чтобы избежать создания «незарегистрированных» позиций.

2. Некорректная обработка транзакций аннулирования и отмены чеков

Frontol пишет в лог абсолютно все действия кассира. Если кассир сначала добавил товар в чек, а затем сделал сторнирование (отмену) позиции или аннулировал весь чек, Frontol зафиксирует это специальными транзакциями (например, код 45 — аннулирование чека).

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

Решение: Убедитесь, что парсер 1С корректно распознает логику чеков. Продажи должны фиксироваться только по закрытым и полностью оплаченным чекам (транзакции закрытия чека типа 40, 41, 43), а аннулированные позиции не должны попадать в финальную таблицу продаж.

Регулярно проводите профилактическую очистку базы транзакций во Frontol после успешного импорта в 1С, чтобы избежать повторного считывания старых данных и снизить нагрузку на кассовый компьютер.

← На главную