Подсистема "Версионирование объектов". Ошибка сохранения в 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 Сериализация

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    138319    764    292    

405

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

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

28000 руб.

15.12.2021    21912    144    40    

104

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70481    174    146    

117

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

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62448    51    27    

81

SALE! %

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192604    143    241    

274

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

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

39500 руб.

25.02.2015    169822    294    253    

374

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

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

14580 руб.

18.02.2016    184665    573    509    

516

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

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

28000 руб.

23.07.2020    48536    208    64    

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