Как правильно выгрузить номенклатуру из 1С 7.7 в текстовый файл, чтобы избежать проблем с запятыми и переносами строк?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Перенос данных из устаревших систем, таких как 1С:Предприятие 7.7, в современные конфигурации на платформе 8.3 — задача классическая, но полная «подводных камней». Одной из наиболее частых проблем является нарушение структуры текстового файла (обычно формата CSV) при выгрузке справочника «Номенклатура». Пользователи часто сталкиваются с тем, что строки «разрезаются», а количество полей в разных записях не совпадает, из-за чего загрузка в целевую базу сбивается.

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

Почему происходит «разрезание» строк и сбой нумерации полей?

Разберем ситуацию: при выгрузке используется стандартный метод ВСтрокуСРазделителями(). Этот метод превращает список значений в строку, где элементы разделены запятыми и заключены в кавычки. Однако в справочнике номенклатуры есть поля «Наименование» и «Полное наименование», которые часто заполняются вручную. Выясним основные причины сбоев:

  1. Запятые внутри текста. Если в названии товара указано, например, Круглая алюм (0,53кг), то парсер при загрузке может воспринять запятую внутри скобок как разделитель нового поля.
  2. Переносы строк (символы CR/LF). Если в полном наименовании нажат Enter, текстовый файл физически разрывается. Для системы загрузки это выглядит как начало новой, некорректной записи.
  3. Кавычки внутри текста. Двойные кавычки внутри строки (например, название бренда) конфликтуют с кавычками-ограничителями самого формата.

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

Шаг 1: Очистка текстовых данных перед выгрузкой в 7.7

Прежде чем добавлять значение в СписокЗначений для последующей выгрузки, необходимо программно удалить из него все «опасные» символы. Рассмотрим код, который следует внедрить в процедуру ВыгрузитьНоменклатуру() на стороне 7.7:


// Функция для очистки строки от спецсимволов
Функция ОчиститьСтроку(Знач ВхТекст)
    // Удаляем переводы строк и возвраты каретки
    Текст = СтрЗаменить(ВхТекст, Симв(10), " ");
    Текст = СтрЗаменить(Текст, Симв(13), " ");
    
    // Если используем запятую как разделитель, лучше заменить запятые в тексте на точки
    // Текст = СтрЗаменить(Текст, ",", "."); 
    
    // Удаляем или экранируем кавычки
    Текст = СтрЗаменить(Текст, """", ""); // Просто удаляем для упрощения
    Возврат СокрЛП(Текст);
КонецФункции

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

Шаг 2: Выбор надежного разделителя

Как показывает практика, запятая — самый неудачный выбор для обмена данными в СНГ. Разберем альтернативы. Рассмотрим использование символа табуляции Симв(9) или вертикальной черты |. Эти символы крайне редко встречаются в наименованиях товаров.

Если же вы решили придерживаться формата с кавычками и запятыми, воспользуемся советом опытных разработчиков: при загрузке в 1С 8.3 искать не просто запятую, а комбинацию кавычка-запятая-кавычка. Посмотрим, как это выглядит в коде загрузки:


// Пример логики в 1С 8.3
Разделитель = ""","""; // Строка из трех символов: " , "
// Теперь при разложении строки мы будем уверены, что запятая внутри наименования
// не будет принята за разделитель полей.

Шаг 3: Модернизация функции загрузки в 1С 8.3

В сообщении темы приведена функция РазложитьСтрокуВМассивПодстрок. Она работает корректно для простых строк, но пасует перед сложными CSV-структурами. Проанализируем более совершенный подход для 1С 8.3. Рассмотрим использование встроенного объекта ЧтениеCSV, который появился в платформе специально для таких задач.

Если же вы используете самописный парсер, разберем, как правильно обрабатывать строку с учетом кавычек:


Функция РазобратьСтрокуCSV(Знач Стр) Экспорт
    МассивРезультат = Новый Массив;
    // Очищаем строку от начальной и конечной кавычки, если они есть
    Если Лев(Стр, 1) = """" Тогда
        Стр = Сред(Стр, 2);
    КонецЕсли;
    Если Прав(Стр, 1) = """" Тогда
        Стр = Лев(Стр, СтрДлина(Стр) - 1);
    КонецЕсли;
    
    // Используем сложный разделитель
    МассивРезультат = СтрРазделить(Стр, """,""", Ложь);
    
    Возврат МассивРезультат;
КонецФункции

Альтернативные методы: XML и прямое подключение

Выясним, есть ли способы избежать «текстовой боли» вовсе. Рассмотрим два профессиональных подхода, упомянутых в обсуждении:

  1. Использование XML. Этот формат по определению защищен от проблем с разделителями. В 1С 7.7 для этого используется компонента v7plus.dll. Данные упаковываются в теги, и никакие запятые внутри текста не могут нарушить структуру документа.
  2. COM-соединение (Automation). Вместо выгрузки в файл, мы можем из базы 1С 8.3 напрямую подключиться к базе 7.7. Посмотрим на пример кода:

// В базе 1С 8.3
ПутьКБазе = "C:\Bases\Trade77\";
Пользователь = "Admin";
Пароль = "123";

V7 = Новый COMОбъект("V77.Application");
Открыта = V7.Initialize(V7.RMTrade, "/D""" + ПутьКБазе + """ /N" + Пользователь + " /P" + Пароль, "NO_SPLASH_SHOW");

Если Открыта Тогда
    СпрН = V7.CreateObject("Справочник.Номенклатура");
    СпрН.SelectItems();
    Пока СпрН.GetItem() = 1 Цикл
        // Здесь мы напрямую получаем данные без всяких разделителей
        ТекНаименование = СпрН.Description;
        ТекПолнНаименование = СпрН.FullName;
        // Создаем элемент в 8.3...
    КонецЦикла;
КонецЕсли;

Важный момент: Прямое подключение требует наличия установленной платформы 7.7 на том же компьютере (или сервере), где выполняется код 8.3, и работает только под Windows.

Подведем итоги

Проанализировав проблему, мы пришли к следующим выводам:

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

← На главную