Работа с внешними данными, особенно с прайс-листами в формате CSV, — одна из самых частых задач в «1С:Управление торговлей 8.3». Зачастую данные приходят в «сыром» виде: с лишними запятыми, без артикулов или с ненужными колонками. В этой статье мы разберем, как программно трансформировать таблицу значений, очистить её от мусора и привести к нужному виду для дальнейшей загрузки в базу.
Прежде чем изменять таблицу, её нужно правильно прочитать. Мы не рекомендуем использовать обычное чтение текстового файла, так как это заставит вас вручную обрабатывать кавычки и разделители внутри строк. Начиная с платформы 8.3.9, для этого существует специализированный объект ЧтениеCSV. Рассмотрим пример, как прочитать файл и сразу начать обработку данных.
Проанализируем код, который позволяет открыть файл с указанием разделителя (например, запятой) и кодировки:
ТекстЧтения = Новый ЧтениеCSV;
ТекстЧтения.ОткрытьФайл(ПутьКФайлу, "UTF-8", ",");
// Создадим таблицу значений для хранения данных
ТаблицаРезультат = Новый ТаблицаЗначений;
// Допустим, мы заранее знаем структуру
ТаблицаРезультат.Колонки.Добавить("Артикул");
ТаблицаРезультат.Колонки.Добавить("Наименование");
ТаблицаРезультат.Колонки.Добавить("Цена");
Пока ТекстЧтения.Прочитать() Цикл
МассивКолонок = ТекстЧтения.ПолучитьЗначение();
// МассивКолонок содержит данные одной строки файла
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.Артикул = МассивКолонок[0];
НоваяСтрока.Наименование = МассивКолонок[1];
НоваяСтрока.Цена = МассивКолонок[2];
КонецЦикла;
ТекстЧтения.Закрыть();
Часто после загрузки требуется изменить структуру ТаблицаЗначений. Например, удалить технические колонки или добавить новые для вычислений. Выясним, как это сделать правильно.
Удаление лишних колонок. Если в вашей таблице есть колонки, которые не нужны для импорта, используем метод Удалить коллекции колонок:
// Удаляем колонку по имени
Если ТаблицаРезультат.Колонки.Найти("НенужнаяКолонка") <> Неопределено Тогда
ТаблицаРезультат.Колонки.Удалить("НенужнаяКолонка");
КонецЕсли;
Добавление и типизация колонок. При добавлении новых колонок (например, для пересчета цены) важно указывать ОписаниеТипов, чтобы в дальнейшем избежать ошибок при записи в справочники:
// Добавляем колонку для очищенной цены с типом Число
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
ОписаниеТипаЧисло = Новый ОписаниеТипов(МассивТипов, , , Новый КвалификаторыЧисла(15, 2));
ТаблицаРезультат.Колонки.Добавить("ЦенаОчищенная", ОписаниеТипаЧисло);
Одной из задач было удаление запятых из строк. Для этого мы воспользуемся функцией СтрЗаменить. Пройдемся циклом по всей таблице и обработаем каждое значение.
Рассмотрим пример комплексной очистки данных:
Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
// Удаляем запятые из артикула, если они там случайно оказались
СтрокаТЗ.Артикул = СтрЗаменить(СтрокаТЗ.Aртикул, ",", "");
// Удаляем лишние пробелы в начале и конце
СтрокаТЗ.Артикул = СокрЛП(СтрокаТЗ.Артикул);
// Преобразуем строку цены в число, предварительно убрав лишние символы
СтрокаЦены = СтрЗаменить(СтрокаТЗ.Цена, " ", ""); // убираем неразрывные пробелы
СтрокаЦены = СтрЗаменить(СтрокаЦены, ",", "."); // меняем запятую на точку для преобразования
СтрокаТЗ.ЦенаОчищенная = Число(СтрокаЦены);
КонецЦикла;
Важный нюанс: если мы хотим удалить строки в процессе обхода таблицы, нужно делать это правильно. Если удалять строки в обычном цикле Для Каждого, индексы «поплывут», и часть строк будет пропущена. Мы разберем, как сделать это безопасно, обходя таблицу с конца.
КоличествоСтрок = ТаблицаРезультат.Количество();
// Начинаем с последней строки и идем к первой (индекс 0)
Для ОбратныйИндекс = 1 По КоличествоСтрок Цикл
ТекущийИндекс = КоличествоСтрок - ОбратныйИндекс;
СтрокаТЗ = ТаблицаРезультат[ТекущийИндекс];
// Проверяем, заполнен ли артикул
Если ПустаяСтрока(СтрокаТЗ.Артикул) Тогда
ТаблицаРезультат.Удалить(ТекущийИндекс);
КонецЕсли;
КонецЦикла;
Если вы работаете в современной конфигурации «Управление торговлей 11», не обязательно писать код с нуля. В программе уже реализован мощный механизм. Рассмотрим, как его найти и использовать:
Номенклатура или ЦеныНоменклатуры.Этот способ хорош тем, что 1С автоматически выполнит проверку на корректность данных и позволит исправить ошибки в интерактивном режиме перед записью в базу.
Если в вашем файле более 50 000 строк, простая обработка в цикле может занять много времени или привести к зависанию интерфейса. Посмотрим, какие приемы помогут ускорить процесс:
НачатьТранзакцию() и ЗафиксироватьТранзакцию().Таким образом, мы проанализировали основные способы работы с CSV-таблицами. Выбор между программным кодом и встроенными обработками зависит от сложности бизнес-логики: если нужно просто загрузить товары — используйте встроенный механизм; если требуется сложная «математика» и очистка — пишите свою обработку, опираясь на примеры выше.