При работе с конфигурацией 1С:Бухгалтерия предприятия 3.0 (релиз 3.0.130.22) многие пользователи столкнулись с неприятной особенностью стандартного механизма загрузки данных из файлов Excel. Суть проблемы заключается в том, что на этапе предварительного просмотра и сопоставления номенклатуры всё выглядит корректно: система находит соответствия или позволяет выбрать их вручную. Однако после нажатия кнопки «Загрузить» в созданный документ Поступление (акт, накладная, УПД) часть позиций переносится с пустым полем Номенклатура.
В этой статье мы подробно разберем причины возникновения данной ошибки и рассмотрим несколько способов её решения — от исправления настроек данных до написания собственной обработки загрузки.
Проанализируем ситуацию: почему визуальное сопоставление в окне загрузки не гарантирует заполнение документа? Основная причина кроется в особенностях работы общего модуля, отвечающего за парсинг и сопоставление данных в релизах ветки 3.0.130. Рассмотрим основные технические факторы:
Номенклатура артикул записан как строка (например, с ведущими нулями), прямое сопоставление может давать сбой на этапе записи в документ.Выясним причину через анализ данных сопоставления. Штатный механизм загрузки тесно связан со справочником (или регистром, в зависимости от версии) Номенклатура поставщиков. Если сопоставление в документе не отрабатывает, попробуем выполнить следующие действия:
Перейдем в раздел Справочники — Номенклатура поставщиков (или через карточку контрагента). Найдем записи по проблемному поставщику. Часто там скапливаются дублирующие записи для одного и того же наименования из файла, но с разными ссылками на объекты нашей базы. Рекомендуется полностью очистить записи по данному контрагенту и попробовать загрузку заново. Это заставит систему «с чистого листа» создать новые, корректные связи.
Разберем, как формат исходных данных влияет на результат. 1С крайне чувствительна к невидимым символам и типам ячеек. Проделаем следующие шаги в Excel перед загрузкой:
123 и в Excel 123 идентичны (отсутствие ведущих нулей или префиксов).Также проанализируем ситуацию с единицами измерения. Если в файле указано шт, а в 1С единица называется шт. (с точкой), система может найти номенклатуру, но «споткнуться» на заполнении единицы измерения, из-за чего очистит всю строку. Убедитесь в полном соответствии строковых значений единиц измерения.
Если штатный механизм в вашем релизе продолжает давать сбои, рассмотрим более надежный вариант. Вместо встроенного помощника «Загрузить из файла», воспользуемся обработкой «Загрузка данных из табличного документа». Она работает более прямолинейно:
Эта обработка не использует промежуточный механизм сопоставления «Номенклатуры поставщиков», а напрямую сопоставляет колонку файла с реквизитом справочника или документа по заданному полю (например, по Наименованию или Артикулу). Это исключает программные ошибки типовых модулей БП 3.0.130.22. Для обхода стандартного механизма можно использовать обработку для импорта данных из Excel в документы поступления.
Если вы решили автоматизировать процесс и избавиться от багов типового решения, проанализируем пример кода для создания собственной примитивной загрузки. Основная идея — прочитать данные в ТаблицаЗначений, программно найти ссылки на объекты и заполнить документ.
Рассмотрим пример функции для поиска номенклатуры:
Функция НайтиНоменклатуруПоДаннымФайла(ЗначениеИзФайла, Поставщик)
// Сначала ищем в справочнике НоменклатураПоставщиков
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураПоставщиков.Номенклатура КАК Ссылка
|ИЗ
| Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
|ГДЕ
| НоменклатураПоставщиков.Наименование = &Наименование
| И НоменклатураПоставщиков.Владелец = &Поставщик";
Запрос.УстановитьПараметр("Наименование", ЗначениеИзФайла);
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
// Если не нашли, ищем по наименованию в основном справочнике
Возврат Справочники.Номенклатура.НайтиПоНаименованию(ЗначениеИзФайла);
КонецФункции
После того как мы получили таблицу данных из Excel, проанализируем процесс заполнения документа ПоступлениеТоваровУслуг. Важно использовать метод ЗаполнитьСчетаУчета() после подстановки номенклатуры, чтобы избежать пустых полей в бухгалтерских проводках:
// Пример заполнения строки документа
НоваяСтрока = ОбъектДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = НайтиНоменклатуруПоДаннымФайла(СтрокаТЗ.Наименование, ОбъектДокумент.Контрагент);
НоваяСтрока.Количество = СтрокаТЗ.Количество;
НоваяСтрока.Цена = СтрокаТЗ.Цена;
НоваяСтрока.Сумма = СтрокаТЗ.Сумма;
// Критически важный вызов для типовых конфигураций
СчетаУчетаВДокументах.ЗаполнитьСтрокуТовары(ОбъектДокумент, НоваяСтрока, Истина, Истина);
Поскольку проблема в релизе 3.0.130.22 признана массовой, проанализируем ситуацию с обновлениями. В более поздних версиях (3.0.131.х и выше) разработчики 1С внесли исправления в общий модуль ЗагрузкаДанныхИзВнешнихФайлов. Если у вас есть возможность, обновление конфигурации до актуального релиза является самым правильным и долгосрочным решением проблемы.
Резюме: Если номенклатура не переносится в документ, в первую очередь проверьте формат данных в Excel (текстовый) и отсутствие дублей в Номенклатуре поставщиков. Если это не помогает — используйте альтернативные обработки загрузки, так как вы столкнулись с программным багом релиза, который игнорирует ручное сопоставление. Для такой задачи подойдет внешняя обработка для загрузки документов из Excel в 1С:Бухгалтерия.