Загрузка данных из внешних источников, таких как Excel, — одна из самых частых задач в практике программиста 1С. Часто процесс не ограничивается простым импортом: необходимо программно создать элементы справочника, получить их системные коды для дальнейшей идентификации и сформировать записи в регистрах или документы. В этой статье мы подробно рассмотрим, как реализовать этот алгоритм, разберем методы получения кода только что созданного элемента и автоматизируем создание документа Операция, введенная вручную.
Для начала нам необходимо прочитать файл. В среде 1С 8.3 наиболее универсальным способом является использование объекта ТабличныйДокумент. Этот метод позволяет работать с файлами .xlsx и .xls без использования COM-объектов, что критически важно, если база работает на сервере под управлением Linux.
Рассмотрим код для чтения файла и первичного заполнения временной таблицы в обработке:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(Объект.ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось прочитать файл: " + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
КоличествоСтрок = ТабДок.ВысотаТаблицы;
// Начинаем со второй строки, предполагая наличие заголовка
Для НомерСтроки = 2 По КоличествоСтрок Цикл
НоваяСтрока = Объект.ТаблицаДляЗагрузки.Добавить();
НоваяСтрока.НаименованиеОС = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C1").ТекущаяОбласть.Текст;
НоваяСтрока.ИнвНомер = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C2").ТекущаяОбласть.Текст;
// ... заполнение остальных колонок (МОЛ, Местонахождение, Сумма)
КонецЦикла;
Важный нюанс: при чтении числовых данных (например, суммы) обязательно проверяйте наличие лишних символов (неразрывных пробелов), которые Excel часто добавляет для красоты. Используйте СтрЗаменить(Текст, Символы.НПП, "") для очистки данных перед преобразованием в число.
Основная сложность, с которой сталкиваются разработчики — как получить код элемента до его записи или сразу после. Если ваша бизнес-логика требует использовать код 1С в качестве инвентарного номера, мы можем пойти двумя путями.
Вариант 1: Получение ссылки заранее. Мы можем сгенерировать ссылку для нового объекта еще до того, как он будет записан в базу данных. Это позволяет нам сразу оперировать кодом, который будет присвоен.
Для Каждого СтрокаДанных Из Объект.ТаблицаДляЗагрузки Цикл
// Генерируем ссылку заранее
НоваяСсылка = Справочники.ОсновныеСредства.ПолучитьСсылку();
НовыйЭлемент = Справочники.ОсновныеСредства.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
// Заполняем реквизиты
НовыйЭлемент.Наименование = СтрокаДанных.НаименованиеОС;
НовыйЭлемент.Родитель = Справочники.ОсновныеСредства.НайтиПоНаименованию("Арендованные ОС");
// Устанавливаем код, если это необходимо вручную, или даем системе сделать это автоматически
НовыйЭлемент.УстановитьНовыйКод();
НовыйЭлемент.Записать();
// Теперь мы можем использовать код
Если ПустаяСтрока(СтрокаДанных.ИнвНомер) Тогда
СтрокаДанных.ИнвНомер = НовыйЭлемент.Код;
КонецЕсли;
КонецЦикла;
Вариант 2: Использование существующего кода. Проанализируем ситуацию, когда элементы уже могут существовать в базе. В этом случае перед созданием необходимо выполнить поиск, чтобы не плодить дубликаты.
СсылкаНаОС = Справочники.ОсновныеСредства.НайтиПоНаименованию(СтрокаДанных.НаименованиеОС);
Если СсылкаНаОС.Пустая() Тогда
// Код создания нового элемента (см. выше)
Иначе
// Если нашли существующий, используем его код
Если ПустаяСтрока(СтрокаДанных.ИнвНомер) Тогда
СтрокаДанных.ИнвНомер = СсылкаНаОС.Код;
КонецЕсли;
КонецЕсли;
После того как все элементы созданы и коды получены, нам нужно отразить поступление этих ОС в бухгалтерском учете (например, на забалансовый счет 001). Проанализируем, как программно создать документ ОперацияБух и заполнить его регистр Хозрасчетный.
Рассмотрим пошаговый алгоритм:
// Создаем шапку документа
ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокОперация.Дата = ТекущаяДата();
ДокОперация.Организация = Объект.Организация;
ДокОперация.Содержание = "Принятие к учету арендованных ОС из файла Excel";
ДокОперация.Записать();
// Работаем с проводками
РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегХозрасчетный.Отбор.Регистратор.Установить(ДокОперация.Ссылка);
Для Каждого Строка Из Объект.ТаблицаДляЗагрузки Цикл
Запись = РегХозрасчетный.Добавить();
Запись.Период = ДокОперация.Дата;
Запись.Регистратор = ДокОперация.Ссылка;
Запись.Организация = ДокОперация.Организация;
// Заполняем счет Дт (например, 001)
Запись.СчетДт = ПланыСчетов.Хозрасчетный.АрендованныеОсновныеСредства;
// Установка субконто через типовой механизм
БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, "Контрагенты", Объект.Контрагент);
БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, "ОсновныеСредства", Строка.СсылкаНаОС);
Запись.Сумма = Строка.Сумма;
КонецЦикла;
РегХозрасчетный.Записать();
Рассмотрим несколько важных моментов, которые помогут избежать ошибок при массовой загрузке данных:
НачатьТранзакцию() ... ЗафиксироватьТранзакцию(). Это значительно ускорит работу и гарантирует, что база не останется в "полузагруженном" состоянии при ошибке.УстановитьНовыйКод().Выясним причину возможных проблем при записи проводок: если документ ОперацияБух создается, но проводки не видны в отчетах, проверьте реквизит СуммаОперации в самом документе. В некоторых конфигурациях его нужно заполнять общей суммой всех проводок для корректного отображения в списках.
Таким образом, мы разобрали полный цикл автоматизации: от чтения файла до формирования бухгалтерских записей. Используя методы УстановитьСсылкуНового и программное управление набором записей регистра Хозрасчетный, вы сможете реализовать загрузку любой сложности.