Как загрузить данные из Excel в 1С, создать номенклатуру и сформировать бухгалтерские операции?

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

Загрузка данных из внешних источников, таких как Excel, — одна из самых частых задач в практике программиста 1С. Часто процесс не ограничивается простым импортом: необходимо программно создать элементы справочника, получить их системные коды для дальнейшей идентификации и сформировать записи в регистрах или документы. В этой статье мы подробно рассмотрим, как реализовать этот алгоритм, разберем методы получения кода только что созданного элемента и автоматизируем создание документа Операция, введенная вручную.

Этап 1: Чтение данных из файла Excel

Для начала нам необходимо прочитать файл. В среде 1С 8.3 наиболее универсальным способом является использование объекта ТабличныйДокумент. Этот метод позволяет работать с файлами .xlsx и .xls без использования COM-объектов, что критически важно, если база работает на сервере под управлением Linux.

Рассмотрим код для чтения файла и первичного заполнения временной таблицы в обработке:


ТабДок = Новый ТабличныйДокумент;
Попытка
    ТабДок.Прочитать(Объект.ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не удалось прочитать файл: " + ОписаниеОшибки();
    Сообщение.Сообщить();
    Возврат;
КонецПопытки;

КоличествоСтрок = ТабДок.ВысотаТаблицы;
// Начинаем со второй строки, предполагая наличие заголовка
Для НомерСтроки = 2 По КоличествоСтрок Цикл
    НоваяСтрока = Объект.ТаблицаДляЗагрузки.Добавить();
    НоваяСтрока.НаименованиеОС = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C1").ТекущаяОбласть.Текст;
    НоваяСтрока.ИнвНомер = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C2").ТекущаяОбласть.Текст;
    // ... заполнение остальных колонок (МОЛ, Местонахождение, Сумма)
КонецЦикла;

Важный нюанс: при чтении числовых данных (например, суммы) обязательно проверяйте наличие лишних символов (неразрывных пробелов), которые Excel часто добавляет для красоты. Используйте СтрЗаменить(Текст, Символы.НПП, "") для очистки данных перед преобразованием в число.

Этап 2: Создание элементов справочника и получение кода

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

Вариант 1: Получение ссылки заранее. Мы можем сгенерировать ссылку для нового объекта еще до того, как он будет записан в базу данных. Это позволяет нам сразу оперировать кодом, который будет присвоен.


Для Каждого СтрокаДанных Из Объект.ТаблицаДляЗагрузки Цикл
    // Генерируем ссылку заранее
    НоваяСсылка = Справочники.ОсновныеСредства.ПолучитьСсылку();
    
    НовыйЭлемент = Справочники.ОсновныеСредства.СоздатьЭлемент();
    НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
    
    // Заполняем реквизиты
    НовыйЭлемент.Наименование = СтрокаДанных.НаименованиеОС;
    НовыйЭлемент.Родитель = Справочники.ОсновныеСредства.НайтиПоНаименованию("Арендованные ОС");
    
    // Устанавливаем код, если это необходимо вручную, или даем системе сделать это автоматически
    НовыйЭлемент.УстановитьНовыйКод(); 
    
    НовыйЭлемент.Записать();
    
    // Теперь мы можем использовать код
    Если ПустаяСтрока(СтрокаДанных.ИнвНомер) Тогда
        СтрокаДанных.ИнвНомер = НовыйЭлемент.Код;
    КонецЕсли;
КонецЦикла;

Вариант 2: Использование существующего кода. Проанализируем ситуацию, когда элементы уже могут существовать в базе. В этом случае перед созданием необходимо выполнить поиск, чтобы не плодить дубликаты.


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

Если СсылкаНаОС.Пустая() Тогда
    // Код создания нового элемента (см. выше)
Иначе
    // Если нашли существующий, используем его код
    Если ПустаяСтрока(СтрокаДанных.ИнвНомер) Тогда
        СтрокаДанных.ИнвНомер = СсылкаНаОС.Код;
    КонецЕсли;
КонецЕсли;

Этап 3: Создание документа «Операция» и бухгалтерских проводок

После того как все элементы созданы и коды получены, нам нужно отразить поступление этих ОС в бухгалтерском учете (например, на забалансовый счет 001). Проанализируем, как программно создать документ ОперацияБух и заполнить его регистр Хозрасчетный.

Рассмотрим пошаговый алгоритм:

  1. Создаем объект документа и записываем его для получения ссылки.
  2. Создаем набор записей регистра бухгалтерии с фильтром по нашему регистратору.
  3. В цикле добавляем записи в набор.
  4. Записываем набор в базу данных.

// Создаем шапку документа
ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокОперация.Дата = ТекущаяДата();
ДокОперация.Организация = Объект.Организация;
ДокОперация.Содержание = "Принятие к учету арендованных ОС из файла Excel";
ДокОперация.Записать();

// Работаем с проводками
РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегХозрасчетный.Отбор.Регистратор.Установить(ДокОперация.Ссылка);

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

РегХозрасчетный.Записать();

Рекомендации по оптимизации и безопасности

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

Выясним причину возможных проблем при записи проводок: если документ ОперацияБух создается, но проводки не видны в отчетах, проверьте реквизит СуммаОперации в самом документе. В некоторых конфигурациях его нужно заполнять общей суммой всех проводок для корректного отображения в списках.

Таким образом, мы разобрали полный цикл автоматизации: от чтения файла до формирования бухгалтерских записей. Используя методы УстановитьСсылкуНового и программное управление набором записей регистра Хозрасчетный, вы сможете реализовать загрузку любой сложности.

← На главную