Почему программно созданный документ 1С не заполняется данными из CSV-файла?

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

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

Причина проблемы: неверные типы данных

Основная причина кроется в том, что все данные, прочитанные из текстового файла или CSV, изначально считываются как тип Строка. Однако реквизиты документа, такие как Сотрудник, Подразделение или Должность, ожидают не текстовое наименование, а ссылку на соответствующий объект справочника.

Когда вы пытаетесь присвоить строковое значение из файла в реквизит, имеющий тип СправочникСсылка, 1С не понимает, что вы хотите сделать. В результате реквизит остается незаполненным. Кроме того, даты, прочитанные из текста, также требуют приведения к типу Дата, иначе они не будут корректно записаны.

Шаг 1: Приведение типов данных

Чтобы данные попали в документ, их необходимо преобразовать. Для строк-дат используйте функцию Дата(). Для справочников — методы поиска, которые вернут ссылку на существующий элемент.

Рассмотрим пример того, как правильно обработать данные перед записью в документ:


// Пример правильного заполнения реквизитов
НовыйСотрудник = ДокПрием.Сотрудники.Добавить();

// Поиск ссылки по наименованию
НовыйСотрудник.Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию(Строка_CSV.Наименование);

// Приведение даты к типу Дата
НовыйСотрудник.Период = Дата(Строка_CSV.ДатаПриема);

// Поиск ссылки для подразделения и должности
НовыйСотрудник.СтруктурнаяЕдиница = Справочники.Подразделения.НайтиПоНаименованию(Строка_CSV.Подразделение);
НовыйСотрудник.Должность = Справочники.Должности.НайтиПоНаименованию(Строка_CSV.Должность);

Шаг 2: Создание элементов, если они не найдены

Иногда данных в системе еще нет. Если метод НайтиПоНаименованию() возвращает пустую ссылку (т.е. объект не найден), вы можете создать новый элемент справочника прямо во время загрузки. Это позволит автоматизировать наполнение базы данных «на лету».


// Пример логики создания элемента при отсутствии
НайденныйСотрудник = Справочники.Сотрудники.НайтиПоНаименованию(Строка_CSV.Наименование);

Если НайденныйСотрудник.Пустая() Тогда
    НовыйЭлемент = Справочники.Сотрудники.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Строка_CSV.Наименование;
    НовыйЭлемент.Записать();
    НайденныйСотрудник = НовыйЭлемент.Ссылка;
КонецЕсли;

НовыйСотрудник.Сотрудник = НайденныйСотрудник;

Рекомендации для надежной загрузки

Для создания качественных инструментов импорта, следуйте этим правилам:

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

Теперь, когда вы понимаете, что в 1С важно оперировать не просто текстом, а ссылками на объекты, ваша задача по загрузке сотрудников станет гораздо проще. Не забывайте проверять типы данных и корректность поиска элементов в справочниках — это залог успешной работы любого алгоритма импорта данных.

← На главную