Как правильно загрузить данные из Excel в документ Комплектация номенклатуры и создать номенклатуру в 1С:КА 1.1?

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

Загрузка данных из внешних файлов Excel — одна из самых частых задач, с которой сталкивается программист 1С. Однако при работе с устаревшими, но все еще популярными конфигурациями, такими как «Комплексная автоматизация 1.1» (КА 1.1) или «Управление производственным предприятием 1.3» (УПП), возникает ряд специфических трудностей. Основные проблемы связаны с иерархией единиц измерения и необходимостью ручного заполнения реквизитов, которые в обычном интерфейсе заполняются автоматически.

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

Анализ проблемы: Единицы измерения и Классификатор

Разберем типичную ситуацию, с которой столкнулся автор темы. При попытке программно присвоить значение единицы измерения из классификатора в документ, система выдает ошибку или оставляет поле пустым. Проанализируем причину. В КА 1.1 реализована двухзвенная система учета единиц:

  1. Справочник «Классификатор единиц измерения»: Содержит общие мировые стандарты (шт, кг, м). Именно его мы видим в поле БазоваяЕдиницаИзмерения в карточке номенклатуры.
  2. Справочник «Единицы измерения»: Это подчиненный справочник. Для каждого товара создается свой набор элементов, которые ссылаются на классификатор. В документах (в табличных частях) тип данных реквизита ЕдиницаИзмерения — это ссылка именно на этот подчиненный справочник, а не на классификатор.

Следовательно, код типа НСтрк.ЕдиницаИзмерения = НоменклатураСсылка.БазоваяЕдиницаИзмерения; будет работать некорректно, так как типы данных не совпадают. Необходимо искать единицу в подчиненном справочнике.

Шаг 1. Программное создание номенклатуры с подчиненными единицами

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


// 1. Создаем и записываем саму номенклатуру
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Системный блок Intel";
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
НовыйОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС18; // или актуальная ставка
// Базовая единица - ссылка на Классификатор (шт)
НовыйОбъект.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
НовыйОбъект.Записать();

// 2. Создаем подчиненную единицу измерения (владелец - наша номенклатура)
НоваяЕд = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НоваяЕд.Владелец = НовыйОбъект.Ссылка;
НоваяЕд.ЕдиницаПоКлассификатору = НовыйОбъект.БазоваяЕдиницаИзмерения;
НоваяЕд.Наименование = НовыйОбъект.БазоваяЕдиницаИзмерения.Наименование;
НоваяЕд.Коэффициент = 1;
НоваяЕд.Записать();

// 3. Обновляем основную карточку номенклатуры, проставляя ссылки на созданную единицу
ОбъектНом = НовыйОбъект.Ссылка.ПолучитьОбъект();
ОбъектНом.ЕдиницаХраненияОстатков = НоваяЕд.Ссылка;
ОбъектНом.ЕдиницаДляОтчетов = НоваяЕд.Ссылка;
ОбъектНом.Записать();

Только после выполнения этой последовательности карточка товара будет считаться полностью заполненной и готовой к использованию в документах комплектации.

Шаг 2. Загрузка данных из Excel через COM-соединение

Для работы с файлами Excel обычно используется COMОбъект("Excel.Application"). Рассмотрим, как прочитать данные и заполнить документ КомплектацияНоменклатуры. Обратите внимание на важность использования метода СократитьЛП() для строковых данных, чтобы избежать проблем с лишними пробелами из Excel.


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.WorkBooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1);
Исключение
    Сообщить("Ошибка запуска Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Определяем количество строк
КоличествоСтрок = Лист.Cells.SpecialCells(11).Row;

Для СтрокаЦ = 2 По КоличествоСтрок Цикл
    // Читаем наименование из колонки 2
    ТекстНоменклатуры = СократитьЛП(Лист.Cells(СтрокаЦ, 2).Text);
    
    // Ищем номенклатуру в базе
    СсылкаНом = Справочники.Номенклатура.НайтиПоНаименованию(ТекстНоменклатуры, Истина);
    
    Если СсылкаНом.Пустая() Тогда
        // Здесь можно вызвать процедуру создания из Шага 1
        Продолжить;
    КонецЕсли;

    // Создаем документ или находим существующий в структуре
    НовыйДокумент = Документы.КомплектацияНоменклатуры.СоздатьДокумент();
    НовыйДокумент.Дата = ТекущаяДата();
    НовыйДокумент.Номенклатура = СсылкаНом;
    НовыйДокумент.Количество = 1;
    
    // ВАЖНО: Присваиваем Единицу из подчиненного справочника
    НовыйДокумент.ЕдиницаИзмерения = СсылкаНом.ЕдиницаХраненияОстатков;
    НовыйДокумент.Коэффициент = НовыйДокумент.ЕдиницаИзмерения.Коэффициент;
    
    // Заполняем счета учета (лучше использовать типовые механизмы КА 1.1)
    НовыйДокумент.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
    
    // Заполнение табличной части "Комплектующие"
    // Предположим, комплектующие указаны в других строках или файлах
    НоваяСтрока = НовыйДокумент.Комплектующие.Добавить();
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Лист.Cells(СтрокаЦ, 5).Text);
    НоваяСтрока.Количество = 1;
    НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.ЕдиницаХраненияОстатков;
    НоваяСтрока.Коэффициент = НоваяСтрока.ЕдиницаИзмерения.Коэффициент;
    НоваяСтрока.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
КонецЦикла;

Excel.Quit();

Шаг 3. Нюансы автоматического заполнения счетов

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

Оптимизация работы с Excel

Выясним причину медленной работы загрузки. COM-объект заставляет систему обращаться к каждой ячейке файла по отдельности, что при 10 000 строк может занять часы. Если вы работаете с большими объемами данных, проанализируем альтернативные способы:

  1. Чтение через ТабличныйДокумент: Используйте метод ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение). 1С прочитает файл Excel в свою внутреннюю таблицу гораздо быстрее, чем через COM.
  2. Загрузка в ТЗ: Сначала считайте все данные из Excel в обычную ТаблицаЗначений в памяти, закройте Excel, а затем работайте уже с таблицей 1С. Это сэкономит оперативную память сервера.

В завершение разберем вопрос с коэффициентом. В КА 1.1 коэффициент в документах всегда привязан к выбранной единице измерения. Если вы выбрали "шт" и это базовая единица, коэффициент всегда будет равен 1. Если же вы загружаете "коробки", то коэффициент должен подтянуться из справочника ЕдиницыИзмерения, где для коробки может быть указано, например, 10 (штук). Всегда проверяйте, чтобы НСтрк.Коэффициент = НСтрк.ЕдиницаИзмерения.Коэффициент; был прописан в коде явно, так как при программном заполнении обработчики формы не срабатывают.

← На главную