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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Перенос данных 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    187774    358    288    

417

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

27633 руб.

12.06.2017    160095    963    317    

481

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). Правила подходят для версии ПРОФ и КОРП.

42000 37800 руб.

15.12.2021    33826    254    64    

193

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).

42000 37800 руб.

23.07.2020    67796    314    95    

252

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

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

58000 руб.

15.04.2019    83725    224    174    

161

Перенос данных 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    202570    672    543    

562

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    13276    15    8    

16

Перенос данных 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    62541    80    131    

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