Подсистема "Версионирование объектов". Ошибка сохранения в xml

16.02.21

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Здесь рассматривается возможный метод исправления ошибки "Недостаточно памяти для записи файла формата Base64" путем изменения алгоритма сериализации объектов в подсистеме "Версионирование".

 После внедрения подсистемы "Версионирование объектов" в первый же день стала возникать ошибка, связанная с нехваткой памяти. База 1с работает на платформе 8.3.6.

 

 

В отладчике отследили, что она возникает на вызове процедуры ЗаписатьXML() в функции СериализоватьОбъект() модуля ВерсионированиеОбъектов. Причем ошибка появляется только при записи объектов, у которых присутствует реквизит с типом ХранилищеЗначений. 

Функция СериализоватьОбъект(Объект) Экспорт
	
	ЗаписьXML = Новый ЗаписьFastInfoset;
	ЗаписьXML.УстановитьДвоичныеДанные();
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);	
	
	Возврат ЗаписьXML.Закрыть();

КонецФункции

В сети удалось найти обсуждение этой проблемы на форумах, но все рекомендации сводились к решению отключить версионирование либо некоторых объектов, либо в целом. Но в данном случае этот вариант не подходил, поскольку нужна запись версий всех справочников и документов.

В итоге, пришли к решению формировать XML с использованием базовой подсистемы, т.е. последовательной записи. Реквизиты с типом ХранилищеЗначений обрабатывать отдельно и записывать значение Неопределено. Ниже приводится измененная функция СериализоватьОбъект() и вспомогательные методы.

Функция СериализоватьОбъект(Объект) Экспорт
	
	ЗаписьXML = Новый ЗаписьFastInfoset;
	ЗаписьXML.УстановитьДвоичныеДанные();
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ИспользоватьПоследовательнуюЗаписьXML = Константы.ИспользоватьПоследовательнуюЗаписьXMLДляВерсионированияОбъектов.Получить();	
	Если Не ИспользоватьПоследовательнуюЗаписьXML Тогда
		ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);	
	Иначе
		МетаданныеОбъекта = Объект.Метаданные();
		Если ОбщегоНазначения.ЭтоСправочник(МетаданныеОбъекта) Тогда		
			ИмяОбъекта = "CatalogObject." + МетаданныеОбъекта.Имя;

			ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяОбъекта);
			ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");	
			ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
			ЗаписьXML.ЗаписатьАтрибут("xsi:type", ИмяОбъекта);
			
			ЗаписатьXML(ЗаписьXML, Объект.Ссылка.УникальныйИдентификатор(), "Ref", НазначениеТипаXML.Неявное);
			Если ЕстьСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, "ЭтоГруппа") Тогда
				ЗаписатьXML(ЗаписьXML, Объект.ЭтоГруппа, "IsFolder", НазначениеТипаXML.Неявное);
			КонецЕсли;	
			ЗаписатьXML(ЗаписьXML, Объект.ПометкаУдаления, "DeletionMark",НазначениеТипаXML.Неявное);	
			Если ЕстьСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, "Владелец") Тогда
				ЗаписатьXML(ЗаписьXML, Объект.Владелец, "Owner", НазначениеТипаXML.Явное);	
			КонецЕсли;	
			Если ЕстьСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, "Родитель") Тогда
				ЗаписатьXML(ЗаписьXML, Объект.Родитель, "Parent", НазначениеТипаXML.Явное);	
			КонецЕсли;	
			Если ЕстьСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, "Код") Тогда
				ЗаписатьXML(ЗаписьXML, Объект.Код, "Code", НазначениеТипаXML.Неявное);	
			КонецЕсли;
			Если ЕстьСтандартныйРеквизит(МетаданныеОбъекта.СтандартныеРеквизиты, "Наименование") Тогда
				ЗаписатьXML(ЗаписьXML, Объект.Наименование, "Description", НазначениеТипаXML.Неявное);
			КонецЕсли;
		
			ЗаписатьРеквизитыИТабличныеЧасти(Объект, МетаданныеОбъекта, ЗаписьXML);

			ЗаписьXML.ЗаписатьКонецЭлемента();
		ИначеЕсли ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Тогда		
			ИмяОбъекта = "DocumentObject." + МетаданныеОбъекта.Имя;

			ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяОбъекта);
			ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");	
			ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
			ЗаписьXML.ЗаписатьАтрибут("xsi:type", ИмяОбъекта);
			
			ЗаписатьXML(ЗаписьXML, Объект.Ссылка.УникальныйИдентификатор(), "Ref", НазначениеТипаXML.Неявное);
			ЗаписатьXML(ЗаписьXML, Объект.ПометкаУдаления, "DeletionMark", НазначениеТипаXML.Неявное);
			ЗаписатьXML(ЗаписьXML, Объект.Дата, "Date", НазначениеТипаXML.Неявное);		
			ЗаписатьXML(ЗаписьXML, Объект.Номер, "Number", НазначениеТипаXML.Неявное);	
			ЗаписатьXML(ЗаписьXML, Объект.Проведен, "Posted", НазначениеТипаXML.Неявное);
		
			ЗаписатьРеквизитыИТабличныеЧасти(Объект, МетаданныеОбъекта, ЗаписьXML);

			ЗаписьXML.ЗаписатьКонецЭлемента();				
		Иначе
			ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);
		КонецЕсли;
	КонецЕсли;
	
	Возврат ЗаписьXML.Закрыть();

КонецФункции

 


Процедура ЗаписатьРеквизитыИТабличныеЧасти(Объект, МетаданныеОбъекта, ЗаписьXML) Экспорт
	
	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл	
		Если Реквизит.Тип = Новый ОписаниеТипов("ХранилищеЗначения") Тогда
			ЗаписатьXML(ЗаписьXML, Неопределено, Реквизит.Имя,	НазначениеТипаXML.Неявное);	
		Иначе
			ЗаписатьXML(ЗаписьXML, Объект[Реквизит.Имя], Реквизит.Имя, НазначениеТипаXML.Явное);	
		КонецЕсли;
	КонецЦикла;

	Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл	
		ЗаписьXML.ЗаписатьНачалоЭлемента(ТабличнаяЧасть.Имя);
		Для Каждого Строка Из Объект[ТабличнаяЧасть.Имя] Цикл
			ЗаписьXML.ЗаписатьНачалоЭлемента("Row");	
			
			Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл	
				Если Реквизит.Тип = Новый ОписаниеТипов("ХранилищеЗначения") Тогда
					ЗаписатьXML(ЗаписьXML, Неопределено, Реквизит.Имя,	НазначениеТипаXML.Неявное);	
				Иначе
					ЗаписатьXML(ЗаписьXML, Строка[Реквизит.Имя], Реквизит.Имя, НазначениеТипаXML.Явное);	
				КонецЕсли;
			КонецЦикла;			
			ЗаписьXML.ЗаписатьКонецЭлемента();
		КонецЦикла;
		ЗаписьXML.ЗаписатьКонецЭлемента();
	КонецЦикла;

КонецПроцедуры

Функция ЕстьСтандартныйРеквизит(СтандартныеРеквизиты, Имя) Экспорт
	
	ЕстьРеквизит = Ложь;
	Для Каждого Реквизит Из СтандартныеРеквизиты Цикл
		Если Реквизит.Имя = Имя Тогда
			ЕстьРеквизит = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ЕстьРеквизит;
	
КонецФункции

После перехода на последовательную запись XML ошибка перестала возникать. Конечно, это решение имеет свои недостатки. Например, запись XML для документа с 2000 строками табличной части выполняется не одну секунду, а пять. Но можно развить это решение, введя дополнительный признак, какой метод записи XML использовать для конкретного справочника или документа как объекта метаданных. И использовать последовательную запись XML только для объектов, имеющих реквизиты с типом ХранилищеЗначений.

Вступайте в нашу телеграмм-группу Инфостарт

ВерсионированиеОбъектов XML Сериализация

См. также

НДС 22% Учетные задачи ККМ Файловый обмен (TXT, XML, DBF), FTP 1С 8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Бухгалтерский учет Налоговый учет НДС Платные (руб)

Готовое обновление для конфигурации 1С:Управление торговлей 10.3, 1С:Комплексная автоматизация 1.1 , 1С:Управление производственным предприятием 1.3 обеспечивающее полную поддержку новой ставки НДС 22%. Для 1С:УТ 10.3 реализована поддержка печати чеков ККМ, а также Правила обмена с 1С:БП 3.0. Решение встраивает необходимые изменения в перечисления и документы, включая торговые операции и печатные формы.

12200 руб.

16.12.2025    7807    83    0    

78

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

22650 руб.

12.06.2017    159104    952    317    

478

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    187054    352    287    

413

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.267.x) и БП 3.0 (3.0.194.x). Правила подходят для версии ПРОФ и КОРП.

38000 34200 руб.

15.12.2021    33159    246    64    

187

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    62167    79    130    

77

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16531 руб.

18.02.2016    201148    667    543    

559

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.25.x).

38000 34200 руб.

23.07.2020    66797    311    88    

250
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 302 19.02.21 09:26 Сейчас в теме
Пора уже переходить на платформенное версионирование
gubanoff; +1 Ответить
2. maria_vl 5 24.02.21 06:53 Сейчас в теме
Согласна, но пока по определенным причинам это невозможно
Для отправки сообщения требуется регистрация/авторизация