Как программно загрузить данные в «Операцию (бухгалтерскую)» из табличного документа сложной структуры?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Зачастую при работе в конфигурации Бухгалтерия государственного учреждения 1.0 возникает необходимость массовой загрузки проводок. Если данные хранятся в ТабличныйДокумент (например, выгружены из другого документа), где одна проводка занимает несколько строк или имеет сложную структуру, стандартные инструменты загрузки часто не справляются. Рассмотрим, как решить эту задачу программно.

Этап 1: Подготовка структуры данных

Так как структура табличного документа не является плоской (например, одна проводка занимает 4 строки), мы не можем использовать стандартные методы построителя отчета. Нам необходимо создать промежуточную ТаблицаЗначений, в которую мы «соберем» все данные, приведя их к формату, понятному для регистра бухгалтерии.

Сначала определим колонки нашей таблицы, которые будут соответствовать реквизитам проводок:


ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КФО");
ТЗ.Колонки.Добавить("ДтКПС");
ТЗ.Колонки.Добавить("ДтСчет");
// Добавьте остальные необходимые колонки...
ТЗ.Колонки.Добавить("Сумма");
ТЗ.Колонки.Добавить("Содержание");

Этап 2: Алгоритм обхода табличного документа

Поскольку одна логическая строка состоит из нескольких физических, мы должны организовать цикл с шагом, равным количеству строк одной проводки. Мы будем обращаться к ячейкам по координатам, используя метод Область(Строка, Колонка).

Давайте реализуем цикл, который преобразует «вертикальные» данные в одну строку ТаблицаЗначений:


// Предположим, что одна проводка занимает 4 строки
СписокКолонокСАналитикой = Новый Соответствие;
СписокКолонокСАналитикой.Вставить(2, 4); // Индекс колонки ТЗ и номер колонки ТабДока
// ... заполняем соответствие для субконто

Для Строка = 5 ПО ТабДок.ВысотаТаблицы Цикл 
    НСтр = ТЗ.Добавить();
    Для СтрокаСубконто = Строка ПО Строка + 3 Цикл 
        Для Каждого Элемент ИЗ СписокКолонокСАналитикой Цикл 
            НСтр[Элемент.Ключ + (СтрокаСубконто - Строка)] = ТабДок.Область(СтрокаСубконто, Элемент.Значение).Текст;
        КонецЦикла;
    КонецЦикла;
    Строка = Строка + 3; // Пропускаем обработанные строки
КонецЦикла;

Этап 3: Загрузка в регистр бухгалтерии

Когда данные собраны в ТаблицаЗначений, приступаем к записи проводок. Важно помнить, что проводки в 1С хранятся в РегистрБухгалтерии. Мы будем использовать НаборЗаписей, чтобы записать данные пачкой, что является наиболее эффективным и безопасным методом.

Рассмотрим процесс переноса:

  1. Создаем документ ОперацияБух, если он еще не создан, или находим существующий.
  2. Создаем НаборЗаписей нужного регистра.
  3. Устанавливаем отбор по регистратору (ссылке на наш документ), чтобы не затереть существующие данные при записи.
  4. В цикле по нашей ТаблицаЗначений добавляем записи в набор.

НЗ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НЗ.Отбор.Регистратор.Установить(ДокОперация.Ссылка);

Для Каждого Стр Из ТЗ Цикл
    НоваяЗапись = НЗ.Добавить();
    // Заполняем реквизиты проводки
    НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Стр.ДтСчет);
    НоваяЗапись.Сумма = Стр.Сумма;
    // Аналогично для всех полей
КонецЦикла;

НЗ.Записать();

Важные советы по реализации

Типизация данных: Помните, что из ТабличныйДокумент мы получаем строковые значения (текст). Чтобы загрузить их в базу, необходимо найти соответствующие ссылки в справочниках или планах счетов. Используйте методы НайтиПоКоду() или НайтиПоНаименованию(). Если поиск не находит объект, обязательно предусмотрите обработку ошибки, иначе запись в регистр не выполнится.

Отладка: Всегда используйте отладчик 1С (клавиша F9 для установки точки останова). Пошаговое выполнение кода позволит увидеть, правильно ли вы вычисляете координаты ячеек и верно ли заполняются поля в ТаблицаЗначений.

Альтернатива: Если формат файла слишком сложен для парсинга ячеек, попробуйте перенести данные из ТабличныйДокумент в Excel, а затем сохранить его как файл CSV. Парсить CSV через методы СтрРазделить() гораздо проще, так как данные там разделены стандартными символами разделителей (табуляцией или точкой с запятой).

Следуя этому алгоритму, вы сможете успешно автоматизировать перенос даже самых сложных данных, сохранив целостность бухгалтерского учета.

← На главную