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

См. также

SALE! 10%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 24894 руб.

12.06.2017    153119    897    302    

463

SALE! 10%

Перенос данных 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 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

61356 55220 руб.

15.04.2019    79099    213    163    

152

SALE! 10%

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

52967 47670 руб.

25.02.2015    178260    328    275    

396

SALE! 10%

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

58422 52580 руб.

03.12.2020    42133    120    75    

114

SALE! 10%

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

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

38000 34200 руб.

15.12.2021    29848    214    58    

159

SALE! 10%

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

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

38000 34200 руб.

23.07.2020    61863    290    81    

230

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

Федеральная таможенная служба России давно поддерживает унифицированный формат электронных документов для обмена с информационными системами предприятий. xmlns="urn:customs.ru:Information:ExchangeDocuments:". Структура, утвержденная комиссией Таможенного союза. Осталось только сделать загрузку в 1С из этого формата. На выходе - два документа ГТД по импорту и Поступление (акты, накладные) Обработка актуализирована на начало 2025 года

4800 руб.

09.08.2016    89042    333    378    

92

SALE! 10%

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

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

61356 55220 руб.

29.10.2018    59216    68    121    

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