Как программно создать контрагентов и выгрузить список новых записей в Excel

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

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

Подготовка структуры для хранения данных

Прежде чем приступать к циклу обработки данных, необходимо подготовить временное хранилище, куда мы будем записывать сведения о каждом успешно созданном контрагенте. Оптимальным объектом для этого в 1С является ТаблицаЗначений. Важно понимать архитектурную особенность: инициализация таблицы и добавление колонок должны происходить до начала цикла обработки данных. Если объявить таблицу внутри цикла, она будет очищаться при каждой итерации.

Рассмотрим пример подготовки структуры:


НовыеКонтрагенты = Новый ТаблицаЗначений;
НовыеКонтрагенты.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("Строка"));
НовыеКонтрагенты.Колонки.Добавить("ИНН", Новый ОписаниеТипов("Строка"));
НовыеКонтрагенты.Колонки.Добавить("КПП", Новый ОписаниеТипов("Строка"));
НовыеКонтрагенты.Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка"));

Здесь мы создали таблицу НовыеКонтрагенты и добавили в нее колонки для хранения основных реквизитов. Обратите внимание на использование ОписаниеТипов — это хороший тон программирования, который помогает избежать ошибок при типизации данных.

Алгоритм программного создания контрагента

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

Разберем логику внутри цикла:

  1. Проверяем наличие контрагента в базе по ИНН/КПП.
  2. Если не найден — создаем новый объект через Справочники.Контрагенты.СоздатьЭлемент().
  3. Заполняем реквизиты.
  4. Вызываем метод Записать().
  5. Добавляем данные в нашу отчетную таблицу.

Пример реализации кода:


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

КонецЦикла;

Важные нюансы работы с контактной информацией

Выясним причину, по которой адрес может не попадать в таблицу или не сохраняться. В современных конфигурациях (БП 3.0, УТ 11, ERP) контактная информация хранится не в обычных реквизитах, а в табличных частях или регистрах сведений. Если вы просто присвоите значение переменной Представление, это может не сработать. Рекомендуется использовать встроенные механизмы БСП (Библиотеки Стандартных Подсистем) для программного заполнения адресов и телефонов, чтобы данные корректно отображались в карточке контрагента.

Выгрузка результата в файл Excel

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

Проанализируем наиболее эффективный метод выгрузки:


ТабДок = Новый ТабличныйДокумент;

// Используем ПостроительОтчета для быстрой генерации печатной формы из ТЗ
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(НовыеКонтрагенты);
Построитель.Вывести(ТабДок);

// Сохраняем результат на диск
ПутьКФайлу = "D:\Обмен\СозданныеКонтрагенты.xlsx";

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

Важный момент: если вы не укажете второй параметр ТипФайлаТабличногоДокумента.XLSX в методе Записать(), система может сохранить файл в формате 1С (.mxl), но с расширением .xlsx. В этом случае Excel не сможет открыть такой файл, выдав ошибку о поврежденном формате. Всегда явно указывайте тип файла.

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

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

  1. Проверка на дубли: Перед вызовом СоздатьЭлемент() обязательно выполните запрос к базе. Поиск по ИНН — самый надежный способ. Это предотвратит создание нескольких карточек на одного и того же контрагента.
  2. Транзакции: Если вы создаете большое количество объектов (более 100), рассмотрите возможность использования механизма транзакций. Однако помните, что при ошибке внутри транзакции откатятся все изменения. Иногда лучше записывать объекты порциями.
  3. Фоновое выполнение: Если загрузка файла и создание контрагентов занимают много времени, лучше вынести эту логику в фоновое задание. Это позволит пользователю не ждать завершения процесса с "зависшим" окном программы.
  4. Оформление Excel: При выводе в ТабличныйДокумент вы можете программно оформить шапку (сделать жирный шрифт, установить границы) и зафиксировать области. Это сделает итоговый отчет более читаемым для бизнес-пользователей.

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

← На главную