Как правильно загрузить данные из DBF-файла в справочник 1С, избегая создания лишних элементов?

Программист 1С v8.3 (Управляемые формы) Промышленность, строительство и АПК
← На главную

Часто при переносе данных из внешних файлов формата DBF в справочники 1С начинающие разработчики сталкиваются с типичной архитектурной ошибкой. Проблема заключается в том, что в процессе перебора столбцов файла программа по ошибке создает новый элемент справочника для каждой колонки, вместо того чтобы собрать данные в один объект и записать его единожды. Давайте разберем, как исправить эту ситуацию и организовать код правильно.

Анализ проблемы и принципиальная ошибка

Основная ошибка заключается в размещении метода СоздатьЭлемент() непосредственно внутри цикла, который перебирает поля текущей строки DBF-файла. Платформа 1С выполняет код последовательно: на каждом шаге цикла она видит команду на создание нового элемента и исполняет её. В результате вместо одного заполненного станка или оборудования мы получаем десятки пустых или частично заполненных элементов справочника.

Решение: использование структур и правильная логика цикла

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

Рассмотрим пошаговое решение:

  1. Открываем файл XBase на клиенте.
  2. В цикле Пока переходим по строкам файла.
  3. Внутри цикла создаем пустую структуру, куда записываем значения полей.
  4. Передаем сформированную структуру на сервер.
  5. На сервере создаем один элемент справочника, заполняем его реквизиты данными из структуры и записываем.

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


&НаКлиенте
Процедура ИмпортДанных(Команда)
    ПутьКФайлу = "C:\МойПроект\Data.DBF";
    ФайлDBF = Новый XBase;
    ФайлDBF.ОткрытьФайл(ПутьКФайлу,, Истина);
    
    Если ФайлDBF.Открыта Тогда
        ФайлDBF.Первая();
        Пока Не ФайлDBF.ВКонце() Цикл
            ДанныеСтроки = Новый Структура;
            Для Каждого Поле Из ФайлDBF.Поля Цикл
                ДанныеСтроки.Вставить(Поле.Имя, ФайлDBF.ПолучитьЗначениеПоля(Поле.Имя));
            КонецЦикла;
            
            // Вызываем серверный метод один раз на строку
            ЗаписатьОборудованиеНаСервере(ДанныеСтроки);
            
            ФайлDBF.Следующая();
        КонецЦикла;
        ФайлDBF.ЗакрытьФайл();
    КонецЕсли;
КонецПроцедуры

Теперь рассмотрим реализацию серверной части, которая отвечает за корректную запись элемента:


&НаСервере
Процедура ЗаписатьОборудованиеНаСервере(ДанныеСтроки)
    // Словарь соответствия полей DBF и реквизитов справочника
    СоответствиеРеквизитов = Новый Структура("SYSNO, NAME", "Сис_N", "Наименование_");
    
    НовыйЭлемент = Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
    
    Для Каждого КлючИЗначение Из ДанныеСтроки Цикл
        Если СоответствиеРеквизитов.Свойство(КлючИЗначение.Ключ) Тогда
            ИмяРеквизита = СоответствиеРеквизитов[КлючИЗначение.Ключ];
            НовыйЭлемент[ИмяРеквизита] = КлючИЗначение.Значение;
        КонецЕсли;
    КонецЦикла;
    
    Попытка
        НовыйЭлемент.Записать();
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Важные рекомендации для оптимизации

Когда вы разберетесь с базовой структурой, обратите внимание на следующие моменты для профессиональной разработки:

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

← На главную