Многие пользователи и начинающие разработчики сталкиваются с задачей массового переноса данных из внешних файлов (Excel, CSV), будь то загрузка поступлений услуг или заполнение документа ОперацияБух (Операция (бухгалтерский и налоговый учет)). Для этой задачи есть универсальная загрузка данных из Excel в 1С. Однако стандартная попытка использовать встроенную обработку «Загрузка данных из табличного документа» часто заканчивается ошибкой: «Задано неправильное имя атрибута структуры». В этой статье мы подробно разберем, почему это происходит, как устроена архитектура этого документа и какими способами можно реализовать загрузку данных эффективно.
Проанализируем ситуацию: в большинстве документов 1С (например, поступление товаров или реализация товаров и услуг) есть так называемые табличные части (Товары, Услуги и т.д.). Стандартная обработка загрузки ищет именно эти метаданные, чтобы сопоставить колонки из Excel с реквизитами табличной части.
Рассмотрим специфику документа ОперацияБух. Если мы откроем его в конфигураторе, то увидим, что у него практически нет табличных частей, которые отвечали бы за проводки. То, что мы видим в пользовательском интерфейсе как список строк с Дебетом, Кредитом и Суммой, на самом деле является движениями регистра бухгалтерии Хозрасчетный.
Выясним причину ошибки: когда вы указываете имена реквизитов (например, «СчетДт», «Сумма»), обработка пытается найти их в самом документе или его табличной части. Поскольку их там нет (они принадлежат регистру), система выдает сообщение о неправильном имени атрибута. Таким образом, типовая загрузка из файла в «Операцию» напрямую невозможна, так как она не умеет работать с наборами записей регистров в контексте создания документа.
Разберем подробнее, как хранятся данные в 1С. Документ «Операция» служит лишь «регистратором» (оболочкой). Все проводки записываются в РегистрБухгалтерииНаборЗаписей.Хозрасчетный. При этом:
Регистратор.Посмотрим на доступные методы решения проблемы, начиная от самых простых и заканчивая программными методами.
Если ваша задача — загружать однотипные операции, можно воспользоваться встроенным справочником ТиповыеОперации. Рассмотрим этот алгоритм:
Операция на основании данных из нашего промежуточного объекта.Этот путь длинный, но он позволяет избежать написания сложного кода для работы с регистрами. Похожим образом может быть реализован ввод начальных остатков из Excel.
Если мы хотим решить задачу профессионально, нам потребуется написать внешнюю обработку. Разберем по шагам логику, которую должен реализовать программный код. Для этих целей есть автоматическое формирование проводок в документе Операция.
Сначала мы должны создать сам объект документа:
НовыйДокумент = Документы.ОперацияБух.СоздатьДокумент();
НовыйДокумент.Дата = ДатаЗагрузки;
НовыйДокумент.Организация = ВыбраннаяОрганизация;
НовыйДокумент.Содержание = "Загрузка из Excel от " + ТекущаяДата();
НовыйДокумент.Записать();
После того как документ записан и получил уникальную ссылку в базе данных, мы можем приступить к формированию проводок. Для этого нам нужно обратиться к движениям документа по регистру Хозрасчетный:
ДвиженияХозрасчетный = НовыйДокумент.Движения.Хозрасчетный;
// Предположим, мы обходим строки из прочитанного Excel-файла
Для Каждого СтрокаДанных Из ТаблицаИзExcel Цикл
НоваяПроводка = ДвиженияХозрасчетный.Добавить();
НоваяПроводка.Регистратор = НовыйДокумент.Ссылка;
НоваяПроводка.Период = НовыйДокумент.Дата;
НоваяПроводка.Организация = НовыйДокумент.Организация;
// Заполняем счета
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СтрокаДанных.КодСчетаДт);
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СтрокаДанных.КодСчетаКт);
// Заполняем сумму
НоваяПроводка.Сумма = СтрокаДанных.Сумма;
// Важный момент: работа с субконто (аналитикой)
// Мы рассмотрим это подробнее в следующем разделе
КонецЦикла;
// Критически важно установить флаг записи!
ДвиженияХозрасчетный.Записывать = Истина;
ДвиженияХозрасчетный.Записать();
Проанализируем самую сложную часть загрузки в «Операцию» — заполнение аналитики (субконто). В 1С субконто на счетах хранятся как коллекция (ключ-значение). У каждого счета может быть разное количество видов субконто (от 0 до 3 в типовых конфигурациях).
Рассмотрим пример, как правильно заполнить субконто программно. Нельзя просто присвоить значение, нужно обращаться к коллекции СубконтоДт или СубконтоКт по типу или по индексу:
// Пример заполнения первого субконто на счете Дебета
ВидСубконто = НоваяПроводка.СчетДт.ВидыСубконто[0].ВидСубконто;
// Например, это вид субконто "Контрагенты"
НоваяПроводка.СубконтоДт[ВидСубконто] = Справочники.Контрагенты.НайтиПоНаименованию(СтрокаДанных.КонтрагентИмя);
Важный совет: при загрузке из Excel всегда проверяйте, существует ли объект в базе перед его записью в проводку. Если НайтиПоНаименованию вернет пустую ссылку, проводка будет создана с «битой» аналитикой.
Для небольших объемов данных (до 100 строк) можно попробовать полуавтоматический метод. В последних версиях платформы 8.3 реализована работа с буфером обмена.
Разберем алгоритм:
Insert).Ctrl+V.Важное ограничение: этот метод сработает только в том случае, если текстовое представление объекта в Excel (например, "ООО Ромашка") полностью совпадает с наименованием в 1С. Если будет хотя бы один лишний пробел, 1С не сможет распознать объект и поле останется пустым.
Подведем итог нашему анализу и определим оптимальный путь:
НаборЗаписей — единственный надежный вариант. Он позволяет реализовать сложные алгоритмы поиска объектов (по ИНН, по артикулу, по коду), что исключает ошибки дублирования данных.Помните: документ «Операция» — это мощный, но опасный инструмент, так как он позволяет вносить любые правки в учет в обход типовых алгоритмов. Перед каждой массовой загрузкой данных обязательно делайте резервную копию информационной базы!
Мы рассмотрели все основные аспекты проблемы: от ограничений платформы до конкретных примеров кода. Теперь вы понимаете, что ошибка «имени атрибута» — это лишь сигнал о том, что данные нужно направлять не в документ, а в его регистры.