Как правильно загрузить начальные остатки номенклатуры из Excel в 1С:Управление торговлей 11?

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

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

В данной статье мы подробно разберем, как правильно перенести остатки товаров из файлов Excel (XLS/XLSX). Мы изучим типовой интерактивный метод, не требующий написания кода, детально проанализируем пример программного импорта, разберем критические ошибки в коде и выясним, какими отчетами верифицировать полученный результат.

Способ 1. Загрузка остатков из Excel стандартными средствами (без программирования)

Многие разработчики и аналитики сразу начинают писать собственные обработки импорта, забывая о том, что в УТ 11 встроен мощный универсальный механизм загрузки табличных частей из внешних файлов. Этот инструмент позволяет быстро сопоставить данные, создать недостающие карточки номенклатуры и заполнить документы без единой строчки кода.

Выполним этот процесс по шагам:

  1. Перейдем в раздел НСИ и администрирование, выберем пункт Начальное заполнение, а затем перейдем по ссылке Документы ввода начальных остатков.
  2. В открывшейся форме выберем нужный раздел учета. Для товаров на складах выделим пункт Остатки собственных товаров в группе "Склад" и нажмем кнопку Создать.
  3. В созданном документе заполним обязательные реквизиты шапки: Организация, Склад, Подразделение. Обратите внимание на дату документа (об этом мы подробно поговорим ниже).
  4. Перейдем к табличной части "Товары". На панели инструментов найдем кнопку Загрузить из файла (иконка в виде таблицы со стрелкой).
  5. В открывшемся окне мы можем просто скопировать строки из нашего файла Excel (колонки: "Номенклатура", "Количество", "Цена") и вставить их в поле ввода через буфер обмена (комбинацией клавиш Ctrl + V), либо выбрать файл на диске.
  6. Программа предложит сопоставить колонки нашего файла с реквизитами табличной части 1С. Выберем для поиска номенклатуры наиболее точный идентификатор (например, Артикул, Штрихкод или Код).
  7. Нажмем кнопку Далее. Система автоматически выполнит сопоставление. Если некоторые позиции номенклатуры не будут найдены в базе, программа выделит их цветом и позволит создать новые карточки прямо из этого диалогового окна.
  8. После подтверждения данные перенесутся в табличную часть документа Ввод начальных остатков. Нам останется лишь провести документ.

Способ 2. Программное создание документа "Ввод начальных остатков"

Если перед вами стоит задача автоматизировать регулярный или сложный составной перенос данных, может потребоваться написание программного кода. Ниже приведен пример реализации загрузки данных из XLS-файла в документ Ввод начальных остатков.

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

Вариант кода с типичными ошибками:


// ВНИМАНИЕ: Данный код содержит методологические ошибки!
&НаСервере
Процедура ЗагрузитьНаСервере()
    МассивНайденных = НайтиФайлы(КаталогДляФайлов, "*.xls"); 
    Для Каждого Файл из МассивНайденных Цикл 
        ТзСXLS = СоздатьТЗсXLSЛистов(Файл.ПолноеИмя);    
        
        ДокументВНО = Документы.ВводОстатков.СоздатьДокумент();
        ДокументВНО.Дата = ТекущаяДата(); // Ошибка №1
        ДокументВНО.ТипОперации = Перечисления.ТипыОперацийВводаОстатков.ОстаткиСобственныхТоваров;
        ДокументВНО.Организация = Организация;
        ДокументВНО.Склад = Склад;
        ДокументВНО.Валюта = Валюта;
        ДокументВНО.Подразделение = Подразделение;
        
        Для каждого СтрТзXLS из ТзСXLS Цикл
            Если СтрТзXLS.Наименование = Неопределено Тогда
                Продолжить;
            КонецЕсли;
            
            НоменклатураВДок = ПолучитьНоменклатуру(СтрТзXLS);
            НоваяСтрока = ДокументВНО.Товары.Добавить();
            НоваяСтрока.Номенклатура = НоменклатураВДок;    
            НоваяСтрока.Количество = Число(СтрТзXLS.Количество);
            НоваяСтрока.КоличествоУпаковок = Число(СтрТзXLS.Количество);
            НоваяСтрока.Цена = Число(СтрТзXLS.Стоимость);
            НоваяСтрока.Сумма = Число(СтрТзXLS.Сумма);
            
            // Ошибка №2: Создание упаковок "на лету" без учета настроек номенклатуры
            НоваяСтрока.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(СтрТзXLS.Единица, 1);
            
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            
            // Ошибка №3: Ручное заполнение Видов запасов
            НайденныйВЗ = Справочники.ВидыЗапасов.НайтиПоНаименованию("Собственный товар", 1);
            НоваяСтрока.ВидЗапасов = НайденныйВЗ;
        КонецЦикла;
        
        ДокументВНО.Записать(РежимЗаписиДокумента.Проведение);
    КонецЦикла;
КонецПроцедуры

Анализ критических ошибок в коде

Разберем детально, почему приведенный выше алгоритм приведет к сбоям в учете УТ 11:

Ошибка №1: Запись остатков текущей датой.
Использование функции ТекущаяДата() для ввода остатков — грубейшее нарушение методологии 1С. Остатки должны вноситься строго на дату, предшествующую первому дню ведения учета в программе. Если работа в системе начинается с 1 января, документы остатков должны быть записаны датой 31 декабря (желательно временем 23:59:59). Если ввести остатки текущей датой, вы не сможете провести документы отгрузки или перемещения за предыдущие часы или дни этого месяца, так как программа выдаст ошибку отсутствия товара на складе.

Ошибка №2: Программное создание и привязка видов запасов.
Справочник ВидыЗапасов является служебным элементом Расширенной аналитики учета затрат (РАУЗ). В УТ 11 виды запасов должны формироваться исключительно автоматически при проведении документов. Если создавать их кодом или подставлять "угаданные" значения вручную в табличную часть, при закрытии месяца себестоимость товаров рассчитается некорректно, а регистры партионного учета разойдутся с оперативным регистром свободных остатков.

Ошибка №3: Некорректное назначение единиц измерения и упаковок.
В УТ 11 реквизит Упаковка может принимать значения базовых единиц хранения из карточки номенклатуры либо индивидуальных/общих наборов упаковок. Создание новых элементов справочника УпаковкиЕдиницыИзмерения без привязки к настройкам использования упаковок конкретной номенклатуры сделает эти элементы нечитаемыми для системы при оформлении последующих отгрузок.

Исправленный и оптимизированный вариант программного кода

Рассмотрим, как должен выглядеть правильный программный код для создания документа ввода остатков. В нем мы исключаем заполнение вида запасов (предоставляя это системе при проведении), корректно устанавливаем ретроспективную дату и заполняем все обязательные реквизиты.


&НаСервере
Процедура ЗагрузитьНаСервереУТ11()
    
    // Определяем дату ввода остатков — последний день перед началом ведения учета
    ДатаВводаОстатков = КонецДня(ДобавитьМесяц(НачалоМесяца(ТекущаяДата()), -1)); 
    
    МассивФайлов = НайтиФайлы(КаталогДляФайлов, "*.xls"); 
    Для Каждого Файл из МассивФайлов Цикл 
        
        ТаблицаДанных = СоздатьТЗсXLSЛистов(Файл.ПолноеИмя);    
        
        // Создаем документ ввода остатков
        ДокументВНО = Документы.ВводОстатков.СоздатьДокумент();
        ДокументВНО.Дата = ДатаВводаОстатков;
        
        // Устанавливаем тип операции и служебные флаги проведения
        ДокументВНО.ТипОперации = Перечисления.ТипыОперацийВводаОстатков.ОстаткиСобственныхТоваров;
        ДокументВНО.ОтражатьВОперативномУчете = Истина;
        ДокументВНО.ОтражатьСебестоимость     = Истина;
        ДокументВНО.ВидЦенностиНДС            = Перечисления.ВидыЦенностей.Товары;
        ДокументВНО.ВидДеятельностиНДС        = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
        
        // Заполняем основные аналитики из реквизитов формы или настроек по умолчанию
        ДокументВНО.Организация  = Организация;
        ДокументВНО.Склад        = Склад;
        ДокументВНО.Валюта       = Валюта;
        ДокументВНО.Подразделение = Подразделение;
        
        Для каждого СтрокаXLS из ТаблицаДанных Цикл
            
            Если ПустаяСтрока(СтрокаXLS.Наименование) Тогда
                Продолжить;
            КонецЕсли;
            
            НоменклатураСсылка = ПолучитьНоменклатуру(СтрокаXLS);
            Если НоменклатураСсылка.Пустая() Тогда
                Сообщить("Номенклатура не найдена: " + СтрокаXLS.Наименование);
                Продолжить;
            КонецЕсли;
            
            НоваяСтрока = ДокументВНО.Товары.Добавить();
            НоваяСтрока.Номенклатура = НоменклатураСсылка;
            
            // Заполнение количественных характеристик
            КоличествоТовара = Число(СтрокаXLS.Количество);
            НоваяСтрока.Количество = КоличествоТовара;
            НоваяСтрока.КоличествоУпаковок = КоличествоТовара;
            
            // Важно: в качестве упаковки указываем базовую единицу хранения номенклатуры
            НоваяСтрока.Упаковка = НоменклатураСсылка.ЕдиницаИзмерения;
            
            // Финансовые показатели
            ЦенаТовара = Число(СтрокаXLS.Стоимость);
            СуммаТовара = Число(СтрокаXLS.Сумма);
            
            НоваяСтрока.Цена = ЦенаТовара;
            НоваяСтрока.Сумма = СуммаТовара;
            НоваяСтрока.СуммаБезНДС = СуммаТовара;
            НоваяСтрока.СуммаСНДС = СуммаТовара;
            НоваяСтрока.СуммаРегл = СуммаТовара;
            
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            
            // Обратите внимание: НоваяСтрока.ВидЗапасов НЕ заполняем! 
            // Система сформирует его автоматически при вызове метода Записать(РежимЗаписиДокумента.Проведение).
            
        КонецЦикла;
        
        Попытка
            // Запись документа с проведением
            ДокументВНО.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить("Документ ввода остатков успешно создан и проведен: " + ДокументВНО.Ссылка);
        Исключение
            Сообщить("Ошибка проведения документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
        
    КонецЦикла;
КонецПроцедуры

Как проверить, что номенклатура встала на остатки?

После проведения документов ввода начальных остатков (как интерактивным, так и программным способом) нам необходимо убедиться, что товары физически появились на складах и корректно отражены в финансовом учете. Разберем основные отчеты, используемые для верификации:

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

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

← На главную