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

Программист 1C:Бухгалтерия Бухгалтерский учет
← На главную

При работе с документом «Операция (бухгалтерский и налоговый учет)» в среде 1С:Предприятие часто возникает задача массовой корректировки или добавления строк в движениях. Стандартная обработка ЗагрузкаДанныхИзТабличногоДокумента на управляемых формах отлично справляется с созданием новых объектов, однако при попытке редактирования существующей «Операции» пользователи сталкиваются с проблемой: старые движения удаляются, а на их место записываются только новые строки из файла. Проанализируем, почему так происходит, и разберем, как модифицировать процесс для корректной работы.

Почему стандартная загрузка очищает существующие записи?

Разберем внутренний механизм работы системы. Документ «Операция» сам по себе не содержит табличной части с проводками. Все, что мы видим в его форме, — это записи регистра бухгалтерии Хозрасчетный, отобранные по регистратору. Когда обработка загрузки обращается к документу для записи данных, она использует объект НаборЗаписей.

По умолчанию в 1С метод НаборЗаписей.Записать() работает в режиме замещения. Это означает, что если мы сформировали набор, добавили в него 5 строк из Excel и вызвали метод записи, система сначала удалит все старые проводки этого документа в регистре, а затем запишет наши 5 строк. Если в документе изначально было 50 проводок, 45 из них бесследно исчезнут. Выясним, как этого избежать и заставить форму отображать текущие данные перед загрузкой.

Решение 1: Программная модификация обработки (Добавление чтения движений)

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

Шаг 1. Создание команды «Прочитать текущие движения»

В интерфейсе обработки необходимо добавить кнопку, которая будет считывать данные из регистра. Проанализируем код, который должен выполняться на сервере при нажатии этой кнопки:


&НаСервере
Процедура ПрочитатьДвиженияДокументаНаСервере(СсылкаНаДокумент)
    // Очищаем текущую таблицу на форме (ДанныеФормыКоллекция)
    Объект.ТабличнаяЧастьЗагрузки.Очистить();
    
    // Создаем набор записей для чтения
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
    НаборЗаписей.Прочитать();
    
    // Переносим данные из регистра в таблицу формы
    Для Каждого Запись Из НаборЗаписей Цикл
        НоваяСтрока = Объект.ТабличнаяЧастьЗагрузки.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Запись);
        // Дополнительно можно заполнить Субконто, если это предусмотрено структурой
    КонецЦикла;
КонецПроцедуры

Шаг 2. Связывание данных с формой

Важный нюанс управляемых форм: чтобы данные отобразились, таблица на форме должна быть связана с реквизитом типа ДанныеФормыКоллекция. После выполнения кода выше пользователь увидит все 50 существующих строк прямо в окне обработки.

Решение 2: Реализация механизма «Дозаписи»

Чтобы при загрузке новых 5 строк не терялись остальные 45, мы должны изменить логику записи набора. Вместо стандартной перезаписи мы будем использовать метод сопоставления или простое добавление. Посмотрим на пример кода, который позволяет сохранить старые записи:


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

// Читаем текущие записи, чтобы они «загрузились» в память объекта
НаборЗаписей.Прочитать();

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

// Записываем набор. Теперь он содержит и старые, и новые строки
НаборЗаписей.Записать(Истина); 

Обратите внимание: параметр Истина в методе Записать по-прежнему означает замещение, но так как мы предварительно выполнили Прочитать(), наш набор уже содержит все старые данные, и мы просто дополняем его в памяти перед отправкой в БД.

Решение 3: Универсальный «ручной» способ (без программирования)

Если у вас нет возможности править код обработки ЗагрузкаДанныхИзТабличногоДокументаВОперацию_УФ, воспользуемся логическим обходом, предложенным экспертами. Рассмотрим его пошагово:

  1. Выгрузка данных: Используйте стандартный отчет «Оборотно-сальдовая ведомость по счету» или «Карточка счета» с отбором по конкретному документу «Операция». Выгрузите результат в Excel. Еще лучше воспользоваться консолью запросов, чтобы получить плоскую таблицу с колонками: СчетДт, СубконтоДт, СчетКт, СубконтоКт, Сумма.
  2. Редактирование: Откройте полученный файл Excel. Теперь у вас есть все 50 строк. Найдите нужные 5 строк, отредактируйте их, а остальные 45 оставьте без изменений.
  3. Полная загрузка: Запустите обработку загрузки и укажите этот файл целиком (все 50 строк).

Поскольку обработка работает по принципу «удалить всё — записать новое», она удалит старые 50 строк и запишет «новые» 50 строк из файла. В итоге в базе окажутся те же данные, но с вашими правками в 5 строках. Это самый безопасный метод для пользователя, не владеющего навыками программирования 1С.

Важные рекомендации при работе с движениями

Проанализируем несколько критических моментов, которые часто упускают при разработке подобных загрузчиков:

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

← На главную