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