Перенос начальных данных в новую информационную базу — один из самых ответственных этапов при внедрении любой учетной системы. Ошибки, допущенные на этом шаге, могут долгое время искажать себестоимость, финансовый результат и мешать корректному закрытию месяца. В конфигурации 1С:Управление торговлей ред. 11 (УТ 11) для решения этой задачи предусмотрены как мощные стандартные интерактивные механизмы, так и возможность программного создания документов.
В данной статье мы подробно разберем, как правильно перенести остатки товаров из файлов Excel (XLS/XLSX). Мы изучим типовой интерактивный метод, не требующий написания кода, детально проанализируем пример программного импорта, разберем критические ошибки в коде и выясним, какими отчетами верифицировать полученный результат.
Многие разработчики и аналитики сразу начинают писать собственные обработки импорта, забывая о том, что в УТ 11 встроен мощный универсальный механизм загрузки табличных частей из внешних файлов. Этот инструмент позволяет быстро сопоставить данные, создать недостающие карточки номенклатуры и заполнить документы без единой строчки кода.
Выполним этот процесс по шагам:
Организация, Склад, Подразделение. Обратите внимание на дату документа (об этом мы подробно поговорим ниже).Ctrl + V), либо выбрать файл на диске.Артикул, Штрихкод или Код).Ввод начальных остатков. Нам останется лишь провести документ.Если перед вами стоит задача автоматизировать регулярный или сложный составной перенос данных, может потребоваться написание программного кода. Ниже приведен пример реализации загрузки данных из 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С:Управление торговлей 11, сохранив целостность регистров и точность расчета себестоимости.