Как корректно импортировать поле «Владелец» из Excel в 1С?

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

При импорте данных из Excel в базу 1С часто возникает ситуация, когда необходимо заполнить ссылочные поля, такие как «Владелец», «Контрагент», «Номенклатура» и другие. Обычная попытка напрямую присвоить текстовое значение из Excel такому полю приводит к ошибке «Несоответствие типов». В этом материале мы подробно разберем, почему возникает эта ошибка и как правильно доработать код импорта для корректного заполнения поля «Владелец».

Анализируем причину ошибки: несовпадение типов

Основная причина ошибки, с которой мы сталкиваемся, заключается в несовместимости типов данных. Рассмотрим ситуацию подробнее:

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

Система 1С не позволяет напрямую присвоить строковое значение полю типа СправочникСсылка. Это аналогично попытке присвоить текст «Привет» числовой переменной – возникнет ошибка несовпадения типов.

Механизмы поиска и получения ссылки на владельца

Для корректного заполнения ссылочного поля «Владелец» нам необходимо выполнить следующие шаги:

  1. Прочитать строковое значение (например, наименование или уникальный идентификатор) из Excel.
  2. Используя это строковое значение, найти соответствующий элемент справочника-владельца в базе 1С.
  3. Получить ссылку на найденный элемент и присвоить ее полю «Владелец».

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

Важность обработки ситуации, когда владелец не найден

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

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

В наших примерах кода мы используем проверку Если СпрОрганизация.Пустая() Тогда или Если СпрОрганизация = Неопределено Тогда и оператор Продолжить, который позволяет нам пропустить текущую итерацию цикла и перейти к следующей, тем самым предотвращая запись неполных данных или возникновение ошибок.

Обязательность поля "Владелец" для подчиненных справочников

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

  1. Поле «Владелец» вообще не заполнено (равно пустой ссылке).
  2. В поле «Владелец» указана ссылка на элемент, который не существует в базе данных 1С (т.е., это «битая» ссылка).

В нашей задаче, если справочник «Сотрудники» подчинен справочнику «Организации», без корректно найденного и установленного владельца запись сотрудника будет невозможна.

Дорабатываем исходный код для импорта

Теперь, когда мы понимаем принципы работы с ссылочными полями, давайте интегрируем это в ваш первоначальный код. Мы сосредоточимся на процедуре ЗаписатьСпрНаСервере, так как именно там происходит непосредственная запись данных. Для примера, мы будем использовать поиск по наименованию, предполагая, что в Excel есть колонка с наименованием организации-владельца.

Ваша процедура ЗаписатьСпрНаСервере будет выглядеть следующим образом:


&НаСервереБезКонтекста
Процедура ЗаписатьСпрНаСервере(тзТаб)
    Для Каждого стзТаблицаЗначений из тзТаб Цикл
        // Предположим, что в таблице Excel есть колонка "НаименованиеВладельца",
        // которая содержит наименование организации-владельца для сотрудника.
        
        // 1. Получаем наименование владельца из текущей строки Excel
        // **ВАЖНО**: Замените "НаименованиеВладельца" на реальное имя колонки в вашей таблице Excel,
        // которое содержит наименование организации.
        ИмяВладельцаИзExcel = стзТаблицаЗначений.НаименованиеВладельца; 

        // 2. Ищем организацию-владельца по наименованию в справочнике "Организации"
        СпрОрганизация = Справочники.Организации.НайтиПоНаименованию(ИмяВладельцаИзExcel);

        // 3. Проверяем, была ли найдена организация.
        // Если организация не найдена, сообщаем об этом и пропускаем текущего сотрудника.
        Если СпрОрганизация = Неопределено Тогда 
            Сообщить("Ошибка: Владелец '" + ИмяВладельцаИзExcel + "' не найден в справочнике 'Организации'. 
                      |Сотрудник из строки Excel будет пропущен. (Строка: " + стзТаблицаЗначений.НомерСтроки + ")");
            Продолжить; // Переходим к следующей строке Excel
        КонецЕсли;

        // 4. Создаем новый элемент справочника "Сотрудники"
        спроСотрудники = Справочники.Сотрудники.СоздатьЭлемент();

        // 5. Заполняем остальные свойства сотрудника из текущей строки Excel.
        // Метод ЗаполнитьЗначенияСвойств сопоставит имена колонок Excel с именами реквизитов справочника.
        // Убедитесь, что имена колонок в Excel (кроме владельца) соответствуют именам реквизитов "Сотрудников".
        ЗаполнитьЗначенияСвойств(спроСотрудники, стзТаблицаЗначений);

        // 6. Присваиваем найденную ссылку организации полю "Владелец" элемента "Сотрудники"
        спроСотрудники.Владелец = СпрОрганизация;

        // 7. Пытаемся записать элемент. Используем блок Попытка...Исключение для обработки возможных ошибок записи.
        Попытка
            спроСотрудники.Записать();
            Сообщить("Сотрудник '" + спроСотрудники.Наименование + "' успешно записан.");
        Исключение
            Сообщить("Ошибка записи сотрудника '" + стзТаблицаЗначений.Наименование + "': " + ОписаниеОшибки());
        КонецПопытки;

    КонецЦикла;
КонецПроцедуры

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

Дополнительные рекомендации по импорту данных

Для повышения эффективности и надежности процесса импорта данных из Excel в 1С рекомендуем придерживаться следующих практических советов:

  1. Подготовка данных в Excel:

    Перед началом импорта всегда тщательно проверяйте и очищайте данные в Excel. Убедитесь, что нет лишних пробелов, опечаток, неверного регистра в наименованиях, особенно для тех полей, которые будут использоваться для поиска в 1С. Стандартизируйте форматы данных, например, даты или числа.

  2. Использование УИД для ссылочных полей:

    Если это возможно, старайтесь использовать Уникальные Идентификаторы (УИД/GUID) для ссылочных полей, таких как «Владелец», «Контрагент», «Номенклатура». УИД является гарантированно уникальным и не меняется, в отличие от наименований, которые могут дублироваться или изменяться со временем. Это обеспечивает максимальную надежность сопоставления данных.

  3. Типовые обработки загрузки:

    В большинстве типовых конфигураций 1С (таких как «Бухгалтерия предприятия», «Управление торговлей», «ERP Управление предприятием») существуют универсальные обработки для загрузки данных из табличных документов (Excel, OpenDocument Spreadsheet). Эти обработки часто предоставляют удобный интерфейс для сопоставления колонок Excel с реквизитами справочников и документов 1С. Они также могут автоматически выполнять поиск по связанным полям (например, по владельцам) по заданным критериям (наименование, код, артикул). Используйте такие типовые решения, если они доступны в вашей конфигурации, так как они могут значительно упростить процесс импорта и снизить количество ошибок.

  4. Отладка и тестирование:

    При разработке собственного кода для импорта данных обязательно используйте режим отладки. Это позволит вам пошагово отследить выполнение кода, проверить значения переменных (например, что читается из Excel, что возвращает метод НайтиПоНаименованию() или ПолучитьСсылку()) и выявить ошибки на ранних стадиях. Тщательно тестируйте импорт на небольшом объеме тестовых данных, прежде чем запускать его на реальной рабочей базе с большим объемом информации.

  5. Ведение логов:

    Рекомендуем добавить в код ведение подробного лога импорта, записывая информацию о каждой обработанной строке Excel: успешность записи, причины пропуска, найденные или ненайденные элементы-владельцы. Это поможет в дальнейшем анализе и исправлении ошибок.

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

← На главную