В процессе интеграции 1С 7.7 с кассовым программным обеспечением Frontol (использующим стандартный текстовый формат обмена АТОЛ) часто возникает ситуация, когда стандартных полей (код, штрихкод, наименование, цена) становится недостаточно. Одной из наиболее распространенных задач является передача артикула товара. Рассмотрим подробно, почему простое добавление колонки в таблицу значений 1С не решает проблему и как правильно настроить выгрузку, чтобы данные корректно отобразились на кассе.
Проанализируем ситуацию, представленную в коде. Разработчик добавил новую колонку в объект ТаблицаЗначений и заполнил её данными из справочника номенклатуры:
СписокТоваров.НоваяКолонка("Код");
СписокТоваров.НоваяКолонка("Артикул");
СписокТоваров.НоваяКолонка("Штрихкод");
// ... заполнение
СписокТоваров.Артикул = СокрЛП(Товар.Артикул);
Однако при просмотре сформированного файла загрузки (сообщение №3) мы видим, что структура строк осталась прежней. Это происходит потому, что во Frontol данные передаются не в виде таблицы, а в виде строго структурированного текстового файла, где каждое поле отделено символом точки с запятой ;. Выясним причину: за формирование этой строки отвечает либо глобальный модуль, либо внешняя обработка обслуживания ККМ (например, atol_kkm.ert).
Если мы просто добавили колонку в таблицу, но не изменили алгоритм «сборки» строки из этой таблицы, функция формирования файла просто проигнорирует новые данные. Разберем по шагам, что нужно сделать для исправления ситуации.
Для начала рассмотрим структуру команды $$$ADDWARES или простого перечня товаров в формате АТОЛ. Каждое поле имеет свой строго определенный порядковый номер. Посмотрим на типичную строку из файла:
33532;4620006784146;Грунт-З Кокосовая смесь;...;00031;0;2;0;;;;;
Согласно документации «Интегратор» от компании АТОЛ, артикул товара обычно передается в 20-м поле. Это означает, что в текстовой строке перед артикулом должно стоять ровно 19 знаков разделителя (с учетом того, что некоторые поля могут быть пустыми).
Важный нюанс: Если мы сдвинем поля или добавим артикул не на свое место, Frontol либо выдаст ошибку при загрузке, либо запишет артикул в другое поле (например, в поле «Налог» или «Минимальный остаток»).
Перейдем к программному коду. Нам необходимо найти функцию, которая превращает наш СписокТоваров в текстовый файл. Чаще всего это происходит в процедуре глККМЗагрузитьТовары. Проанализируем, как строится цикл обхода таблицы:
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
// Здесь формируется строка для файла
ТекстСтр = СокрЛП(СписокТоваров.Код) + ";" + СокрЛП(СписокТоваров.Штрихкод) + ";" + СокрЛП(СписокТоваров.Наименование) + ";";
// ... далее идут другие поля
КонецЦикла;
Чтобы артикул попал в файл, нам нужно добавить его именно в этот цикл. Но нельзя просто приклеить его в конец. Нужно сосчитать количество разделителей ; и вставить СписокТоваров.Артикул на 20-ю позицию.
Рассмотрим пример правильной модификации алгоритма. Допустим, мы используем внешнюю обработку обслуживания. Нам нужно найти участок кода, отвечающий за сборку строки товара, и дополнить его. Выглядеть это должно примерно так:
// Пример формирования строки с учетом артикула (поле №20)
СтрОбмена = "";
СтрОбмена = СтрОбмена + СписокТоваров.Код + ";"; // 1. Код
СтрОбмена = СтрОбмена + СписокТоваров.Штрихкод + ";"; // 2. Штрихкод
СтрОбмена = СтрОбмена + СписокТоваров.Наименование + ";"; // 3. Наименование
// ... пропускаем поля с 4 по 19, вставляя просто ";"
Для НомерПоля = 4 По 19 Цикл
СтрОбмена = СтрОбмена + ";";
КонецЦикла;
СтрОбмена = СтрОбмена + СписокТоваров.Артикул + ";"; // 20. Артикул
Обратите внимание: Для групп товаров (директорий) артикул, как правило, не передается. Выясним это в коде, используя проверку ЭтоГруппа(). Если мы выгружаем иерархию, для группы поле артикула должно остаться пустым, но количество разделителей должно сохраниться, чтобы не нарушить структуру последующих полей.
Frontol чувствителен к спецсимволам внутри полей. Проанализируем содержимое артикула перед выгрузкой. Если артикул содержит кавычки или точки с запятой, это может «развалить» структуру файла. Рекомендуем всегда использовать функцию СокрЛП() и, при необходимости, функцию очистки строки от недопустимых символов.
ЧистыйАртикул = СтрЗаменить(СписокТоваров.Артикул, ";", " "); // Заменяем точки с запятой на пробелы
СтрОбмена = СтрОбмена + СокрЛП(ЧистыйАртикул) + ";";
Даже если файл сформирован верно, артикул может не появиться в интерфейсе кассира автоматически. Разберем, что нужно проверить в самой программе Frontol:
Подведем итог нашей совместной работы. Чтобы артикул начал передаваться:
СписокТоваров колонка «Артикул» заполняется корректно (используйте Товар.Артикул для элементов)..txt.Такой системный подход гарантирует, что данные попадут по назначению, а интеграция будет работать стабильно.