Как перенести документы Операция (бухгалтерский и налоговый учет) в УПП 1.3 без ошибок

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

Перенос документов Операция (бухгалтерский и налоговый учет) (часто называемых "ручными операциями") в конфигурации «1С:Управление производственным предприятием 1.3» является одной из самых нетривиальных задач при использовании «1С:Конвертация данных 2.0» (КД 2.0). Основная сложность заключается в том, что этот документ не содержит данных в привычных табличных частях. Вся значимая информация — проводки и субконто — хранится непосредственно в регистрах бухгалтерии (Хозрасчетный и Налоговый). Разберем по шагам, почему возникает ошибка ЗаписатьКонецЭлемента и как правильно настроить обмен для сохранения всех данных субконто.

Анализируем причину ошибки ЗаписатьКонецЭлемента

При выгрузке нескольких документов ОперацияБух часто возникает критическая ошибка: «Значение не является значением объектного типа (ЗаписатьКонецЭлемента)». Проанализируем ситуацию: эта ошибка свидетельствует о нарушении структуры XML-файла. В типовой обработке ОбменДаннымиXML (модуль объекта, строка 1109 и соседние) происходит попытка закрыть тег объекта, который либо не был открыт, либо дерево узлов XML было повреждено в процессе итерации по движениям документа.

Выясним причину: документ Операция в УПП 1.3 выступает лишь "регистратором". Когда мы настраиваем Правило Конвертации Объекта (ПКО) для этого документа и включаем флаг «Выгружать движения», движок конвертации пытается обработать набор записей регистра. Если в правилах ПКС (Правила конвертации свойств) для субконто допущена ошибка или отсутствует подходящее ПКО для типа данных, входящего в составное значение субконто, итератор сбивается, и запись XML-узла завершается аварийно.

Метод 1: Использование универсальной обработки выгрузки

Если задача разовая и базы идентичны (одинаковые релизы УПП), рассмотрим наиболее простой способ. Вместо настройки сложных правил в КД 2.0 воспользуемся обработкой ВыгрузкаЗагрузкаДанныхXML.epf.

  1. Откроем обработку в базе-источнике.
  2. В дереве объектов найдем документ Операция (бухгалтерский и налоговый учет).
  3. Важный момент: обязательно установим флаг «Выгружать с документом его движения».
  4. Проведем выгрузку в файл и последующую загрузку в приемник.

Этот метод хорош тем, что он переносит ГУИДы (уникальные идентификаторы) объектов и движений "как есть", что гарантирует идентичность данных без необходимости прописывать логику сопоставления субконто.

Метод 2: Настройка правил в Конвертации данных 2.0

Если нам необходим регулярный автоматизированный обмен, проанализируем настройку правил ПКО. Для корректного переноса ручных операций выполним следующие действия:

  1. Создадим ПКО для документа ОперацияБух.
  2. В ПКО на закладке «Настройки» снимем галочку «Генерировать номер при записи» (если номера должны совпадать).
  3. Создадим ПВД (Правило выгрузки данных) для этого документа.
  4. Для каждого регистра (Хозрасчетный, Налоговый), по которым делает движения документ, создадим отдельные ПКО.

Рассмотрим подробнее работу с движениями. Чтобы избежать ошибки ЗаписатьКонецЭлемента, рекомендуется в ПКО документа ОперацияБух в обработчике ПередВыгрузкой или в ПВД использовать явную выгрузку набора записей. Посмотрим на пример кода в ПВД (произвольный алгоритм):


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

Метод 3: Исправление программной ошибки в обработке обмена

Если вы столкнулись с тем, что один документ выгружается корректно, а пакет — нет, проблема может крыться в самой обработке ОбменДаннымиXML. Разберем ситуацию с технической точки зрения: при выгрузке объектов с движениями, но без табличных частей, стек узлов XML в памяти может очищаться некорректно.

Чтобы решить эту проблему без радикальной переделки правил, попробуйте следующее:

  1. Обновите обработку Универсальный обмен данными XML до версии 2.1.8 или выше. В свежих версиях от 1С эта ошибка при работе с регистрами бухгалтерии была исправлена.
  2. Если обновление невозможно, внесем правку в код модуля обработки вручную. Перед вызовом метода ЗаписатьКонецЭлемента() добавим проверку на соответствие имени текущего узла.

Особенности переноса субконто в УПП 1.3

Субконто в УПП имеют составной тип данных. Это означает, что Субконто1 может быть справочником Контрагенты, ДоговорыКонтрагентов или даже другим документом. Чтобы перенос прошел успешно, проанализируем настройки ПКС для регистра:

Посмотрим на пример настройки сопоставления счетов. В УПП 1.3 планы счетов в разных базах могут немного отличаться составом субконто. Чтобы избежать ошибок, в ПКО для ПланСчетовСсылка.Хозрасчетный в обработчике ПриЗагрузке можно добавить проверку:


// Проверяем наличие счета в приемнике по коду
НайденныйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Объект.Код);
Если НайденныйСчет.Пустая() Тогда
    Сообщить("Счет с кодом " + Объект.Код + " не найден в базе-приемнике!");
    Отказ = Истина;
КонецЕсли;

Важные рекомендации при загрузке

При загрузке данных в базу-приемник крайне важно, чтобы записи регистра записывались корректно. Убедитесь, что в ПКО регистра в обработчике ПередЗаписью установлены следующие параметры:


// Устанавливаем признак загрузки, чтобы не срабатывали типовые подписки и проверки
Объект.ОбменДанными.Загрузка = Истина;

// Для регистров бухгалтерии важно управлять удалением старых записей
Объект.Записывать = Истина;

Это гарантирует, что старые движения документа в базе-приемнике будут полностью замещены новыми из файла обмена, что исключает дублирование проводок. Помните: если вы переносите только документ без набора записей, в приемнике он создастся пустым (без проводок), так как автоматическое проведение ручных операций в 1С не предусмотрено — их данные не вычисляются, а просто хранятся в регистрах.

← На главную