Как программно изменить и обработать таблицу, загруженную из CSV в 1С:Управление торговлей 8.3?

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

Работа с внешними данными, особенно с прайс-листами в формате CSV, — одна из самых частых задач в «1С:Управление торговлей 8.3». Зачастую данные приходят в «сыром» виде: с лишними запятыми, без артикулов или с ненужными колонками. В этой статье мы разберем, как программно трансформировать таблицу значений, очистить её от мусора и привести к нужному виду для дальнейшей загрузки в базу.

Метод 1: Эффективное чтение файла с помощью объекта ЧтениеCSV

Прежде чем изменять таблицу, её нужно правильно прочитать. Мы не рекомендуем использовать обычное чтение текстового файла, так как это заставит вас вручную обрабатывать кавычки и разделители внутри строк. Начиная с платформы 8.3.9, для этого существует специализированный объект ЧтениеCSV. Рассмотрим пример, как прочитать файл и сразу начать обработку данных.

Проанализируем код, который позволяет открыть файл с указанием разделителя (например, запятой) и кодировки:


ТекстЧтения = Новый ЧтениеCSV;
ТекстЧтения.ОткрытьФайл(ПутьКФайлу, "UTF-8", ",");

// Создадим таблицу значений для хранения данных
ТаблицаРезультат = Новый ТаблицаЗначений;
// Допустим, мы заранее знаем структуру
ТаблицаРезультат.Колонки.Добавить("Артикул");
ТаблицаРезультат.Колонки.Добавить("Наименование");
ТаблицаРезультат.Колонки.Добавить("Цена");

Пока ТекстЧтения.Прочитать() Цикл
    МассивКолонок = ТекстЧтения.ПолучитьЗначение();
    // МассивКолонок содержит данные одной строки файла
    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.Артикул = МассивКолонок[0];
    НоваяСтрока.Наименование = МассивКолонок[1];
    НоваяСтрока.Цена = МассивКолонок[2];
КонецЦикла;
ТекстЧтения.Закрыть();

Метод 2: Программное изменение структуры таблицы (Колонки)

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

Удаление лишних колонок. Если в вашей таблице есть колонки, которые не нужны для импорта, используем метод Удалить коллекции колонок:


// Удаляем колонку по имени
Если ТаблицаРезультат.Колонки.Найти("НенужнаяКолонка") <> Неопределено Тогда
    ТаблицаРезультат.Колонки.Удалить("НенужнаяКолонка");
КонецЕсли;

Добавление и типизация колонок. При добавлении новых колонок (например, для пересчета цены) важно указывать ОписаниеТипов, чтобы в дальнейшем избежать ошибок при записи в справочники:


// Добавляем колонку для очищенной цены с типом Число
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
ОписаниеТипаЧисло = Новый ОписаниеТипов(МассивТипов, , , Новый КвалификаторыЧисла(15, 2));

ТаблицаРезультат.Колонки.Добавить("ЦенаОчищенная", ОписаниеТипаЧисло);

Метод 3: Очистка данных и удаление символов

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

Рассмотрим пример комплексной очистки данных:


Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
    // Удаляем запятые из артикула, если они там случайно оказались
    СтрокаТЗ.Артикул = СтрЗаменить(СтрокаТЗ.Aртикул, ",", "");
    
    // Удаляем лишние пробелы в начале и конце
    СтрокаТЗ.Артикул = СокрЛП(СтрокаТЗ.Артикул);
    
    // Преобразуем строку цены в число, предварительно убрав лишние символы
    СтрокаЦены = СтрЗаменить(СтрокаТЗ.Цена, " ", ""); // убираем неразрывные пробелы
    СтрокаЦены = СтрЗаменить(СтрокаЦены, ",", "."); // меняем запятую на точку для преобразования
    СтрокаТЗ.ЦенаОчищенная = Число(СтрокаЦены);
КонецЦикла;

Метод 4: Удаление строк по условию (пустой артикул)

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


КоличествоСтрок = ТаблицаРезультат.Количество();
// Начинаем с последней строки и идем к первой (индекс 0)
Для ОбратныйИндекс = 1 По КоличествоСтрок Цикл
    ТекущийИндекс = КоличествоСтрок - ОбратныйИндекс;
    СтрокаТЗ = ТаблицаРезультат[ТекущийИндекс];
    
    // Проверяем, заполнен ли артикул
    Если ПустаяСтрока(СтрокаТЗ.Артикул) Тогда
        ТаблицаРезультат.Удалить(ТекущийИндекс);
    КонецЕсли;
КонецЦикла;

Метод 5: Использование встроенной подсистемы «Загрузка данных из файла»

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

  1. Перейдите в раздел НСИ и администрирование — Начальное заполнение — Загрузка данных из файла.
  2. Выберите справочник (например, «Номенклатура»).
  3. Вы сможете просто скопировать данные из вашего CSV или Excel файла прямо в форму.
  4. Система сама предложит сопоставить колонки вашего файла с реквизитами Номенклатура или ЦеныНоменклатуры.

Этот способ хорош тем, что 1С автоматически выполнит проверку на корректность данных и позволит исправить ошибки в интерактивном режиме перед записью в базу.

Оптимизация при работе с большими прайс-листами

Если в вашем файле более 50 000 строк, простая обработка в цикле может занять много времени или привести к зависанию интерфейса. Посмотрим, какие приемы помогут ускорить процесс:

Таким образом, мы проанализировали основные способы работы с CSV-таблицами. Выбор между программным кодом и встроенными обработками зависит от сложности бизнес-логики: если нужно просто загрузить товары — используйте встроенный механизм; если требуется сложная «математика» и очистка — пишите свою обработку, опираясь на примеры выше.

← На главную