Перенос данных из устаревших систем, таких как 1С:Предприятие 7.7, в современные конфигурации на платформе 8.3 — задача классическая, но полная «подводных камней». Одной из наиболее частых проблем является нарушение структуры текстового файла (обычно формата CSV) при выгрузке справочника «Номенклатура». Пользователи часто сталкиваются с тем, что строки «разрезаются», а количество полей в разных записях не совпадает, из-за чего загрузка в целевую базу сбивается.
В этой статье мы подробно проанализируем причины этой проблемы и разберем по шагам, как модифицировать код выгрузки и загрузки для достижения стопроцентной надежности данных.
Разберем ситуацию: при выгрузке используется стандартный метод ВСтрокуСРазделителями(). Этот метод превращает список значений в строку, где элементы разделены запятыми и заключены в кавычки. Однако в справочнике номенклатуры есть поля «Наименование» и «Полное наименование», которые часто заполняются вручную. Выясним основные причины сбоев:
Круглая алюм (0,53кг), то парсер при загрузке может воспринять запятую внутри скобок как разделитель нового поля.Проанализируем предложенные экспертами решения и составим оптимальный алгоритм действий.
Прежде чем добавлять значение в СписокЗначений для последующей выгрузки, необходимо программно удалить из него все «опасные» символы. Рассмотрим код, который следует внедрить в процедуру ВыгрузитьНоменклатуру() на стороне 7.7:
// Функция для очистки строки от спецсимволов
Функция ОчиститьСтроку(Знач ВхТекст)
// Удаляем переводы строк и возвраты каретки
Текст = СтрЗаменить(ВхТекст, Симв(10), " ");
Текст = СтрЗаменить(Текст, Симв(13), " ");
// Если используем запятую как разделитель, лучше заменить запятые в тексте на точки
// Текст = СтрЗаменить(Текст, ",", ".");
// Удаляем или экранируем кавычки
Текст = СтрЗаменить(Текст, """", ""); // Просто удаляем для упрощения
Возврат СокрЛП(Текст);
КонецФункции
Использование такой функции гарантирует, что каждая запись в файле будет занимать ровно одну строку и не будет содержать лишних разделителей.
Как показывает практика, запятая — самый неудачный выбор для обмена данными в СНГ. Разберем альтернативы. Рассмотрим использование символа табуляции Симв(9) или вертикальной черты |. Эти символы крайне редко встречаются в наименованиях товаров.
Если же вы решили придерживаться формата с кавычками и запятыми, воспользуемся советом опытных разработчиков: при загрузке в 1С 8.3 искать не просто запятую, а комбинацию кавычка-запятая-кавычка. Посмотрим, как это выглядит в коде загрузки:
// Пример логики в 1С 8.3
Разделитель = ""","""; // Строка из трех символов: " , "
// Теперь при разложении строки мы будем уверены, что запятая внутри наименования
// не будет принята за разделитель полей.
В сообщении темы приведена функция РазложитьСтрокуВМассивПодстрок. Она работает корректно для простых строк, но пасует перед сложными CSV-структурами. Проанализируем более совершенный подход для 1С 8.3. Рассмотрим использование встроенного объекта ЧтениеCSV, который появился в платформе специально для таких задач.
Если же вы используете самописный парсер, разберем, как правильно обрабатывать строку с учетом кавычек:
Функция РазобратьСтрокуCSV(Знач Стр) Экспорт
МассивРезультат = Новый Массив;
// Очищаем строку от начальной и конечной кавычки, если они есть
Если Лев(Стр, 1) = """" Тогда
Стр = Сред(Стр, 2);
КонецЕсли;
Если Прав(Стр, 1) = """" Тогда
Стр = Лев(Стр, СтрДлина(Стр) - 1);
КонецЕсли;
// Используем сложный разделитель
МассивРезультат = СтрРазделить(Стр, """,""", Ложь);
Возврат МассивРезультат;
КонецФункции
Выясним, есть ли способы избежать «текстовой боли» вовсе. Рассмотрим два профессиональных подхода, упомянутых в обсуждении:
v7plus.dll. Данные упаковываются в теги, и никакие запятые внутри текста не могут нарушить структуру документа.
// В базе 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.
Проанализировав проблему, мы пришли к следующим выводам:
Симв(10) и Симв(13) в исходной базе.; или |, чтобы минимизировать риск случайных совпадений..xls, откройте в Excel и пересохраните для загрузки. Это позволит визуально проконтролировать целостность колонок.Выполняя эти рекомендации, вы обеспечите надежность переноса данных и сэкономите время на ручной корректировке справочников после неудачных загрузок.