Перенос документов Операция (бухгалтерский и налоговый учет) (часто называемых "ручными операциями") в конфигурации «1С:Управление производственным предприятием 1.3» является одной из самых нетривиальных задач при использовании «1С:Конвертация данных 2.0» (КД 2.0). Основная сложность заключается в том, что этот документ не содержит данных в привычных табличных частях. Вся значимая информация — проводки и субконто — хранится непосредственно в регистрах бухгалтерии (Хозрасчетный и Налоговый). Разберем по шагам, почему возникает ошибка ЗаписатьКонецЭлемента и как правильно настроить обмен для сохранения всех данных субконто.
При выгрузке нескольких документов ОперацияБух часто возникает критическая ошибка: «Значение не является значением объектного типа (ЗаписатьКонецЭлемента)». Проанализируем ситуацию: эта ошибка свидетельствует о нарушении структуры XML-файла. В типовой обработке ОбменДаннымиXML (модуль объекта, строка 1109 и соседние) происходит попытка закрыть тег объекта, который либо не был открыт, либо дерево узлов XML было повреждено в процессе итерации по движениям документа.
Выясним причину: документ Операция в УПП 1.3 выступает лишь "регистратором". Когда мы настраиваем Правило Конвертации Объекта (ПКО) для этого документа и включаем флаг «Выгружать движения», движок конвертации пытается обработать набор записей регистра. Если в правилах ПКС (Правила конвертации свойств) для субконто допущена ошибка или отсутствует подходящее ПКО для типа данных, входящего в составное значение субконто, итератор сбивается, и запись XML-узла завершается аварийно.
Если задача разовая и базы идентичны (одинаковые релизы УПП), рассмотрим наиболее простой способ. Вместо настройки сложных правил в КД 2.0 воспользуемся обработкой ВыгрузкаЗагрузкаДанныхXML.epf.
Операция (бухгалтерский и налоговый учет).Этот метод хорош тем, что он переносит ГУИДы (уникальные идентификаторы) объектов и движений "как есть", что гарантирует идентичность данных без необходимости прописывать логику сопоставления субконто.
Если нам необходим регулярный автоматизированный обмен, проанализируем настройку правил ПКО. Для корректного переноса ручных операций выполним следующие действия:
ОперацияБух.Рассмотрим подробнее работу с движениями. Чтобы избежать ошибки ЗаписатьКонецЭлемента, рекомендуется в ПКО документа ОперацияБух в обработчике ПередВыгрузкой или в ПВД использовать явную выгрузку набора записей. Посмотрим на пример кода в ПВД (произвольный алгоритм):
Выборка = Документы.ОперацияБух.Выбрать(ДатаНачала, ДатаКонца);
Пока Выборка.Следующий() Цикл
// Выгружаем сам документ
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ОперацияБух");
// Явно выгружаем движения по регистру Хозрасчетный
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Ссылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
ВыгрузитьПоПравилу(Запись, , , , "Хозрасчетный");
КонецЦикла;
КонецЦикла;
Если вы столкнулись с тем, что один документ выгружается корректно, а пакет — нет, проблема может крыться в самой обработке ОбменДаннымиXML. Разберем ситуацию с технической точки зрения: при выгрузке объектов с движениями, но без табличных частей, стек узлов XML в памяти может очищаться некорректно.
Чтобы решить эту проблему без радикальной переделки правил, попробуйте следующее:
Универсальный обмен данными XML до версии 2.1.8 или выше. В свежих версиях от 1С эта ошибка при работе с регистрами бухгалтерии была исправлена.ЗаписатьКонецЭлемента() добавим проверку на соответствие имени текущего узла.Субконто в УПП имеют составной тип данных. Это означает, что Субконто1 может быть справочником Контрагенты, ДоговорыКонтрагентов или даже другим документом. Чтобы перенос прошел успешно, проанализируем настройки ПКС для регистра:
СтатьиЗатрат) отсутствует, выгрузка движений прервется именно в момент записи XML-структуры субконто.СубконтоДт1, СубконтоКт1 и т.д. установите флаг «Поиск по ГУИД», если базы идентичны. Если базы разные — настройте поиск по полям (например, по Коду и Наименованию), но это может замедлить процесс загрузки.Посмотрим на пример настройки сопоставления счетов. В УПП 1.3 планы счетов в разных базах могут немного отличаться составом субконто. Чтобы избежать ошибок, в ПКО для ПланСчетовСсылка.Хозрасчетный в обработчике ПриЗагрузке можно добавить проверку:
// Проверяем наличие счета в приемнике по коду
НайденныйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Объект.Код);
Если НайденныйСчет.Пустая() Тогда
Сообщить("Счет с кодом " + Объект.Код + " не найден в базе-приемнике!");
Отказ = Истина;
КонецЕсли;
При загрузке данных в базу-приемник крайне важно, чтобы записи регистра записывались корректно. Убедитесь, что в ПКО регистра в обработчике ПередЗаписью установлены следующие параметры:
// Устанавливаем признак загрузки, чтобы не срабатывали типовые подписки и проверки
Объект.ОбменДанными.Загрузка = Истина;
// Для регистров бухгалтерии важно управлять удалением старых записей
Объект.Записывать = Истина;
Это гарантирует, что старые движения документа в базе-приемнике будут полностью замещены новыми из файла обмена, что исключает дублирование проводок. Помните: если вы переносите только документ без набора записей, в приемнике он создастся пустым (без проводок), так как автоматическое проведение ручных операций в 1С не предусмотрено — их данные не вычисляются, а просто хранятся в регистрах.