Поиск несериализуемых значений при помещении в хранилище

02.03.16

Разработка - Групповая разработка (Git, хранилище)

В статье разобран пример, как найти несериализуемые значения в случае помещения в хранилище коллекций, содержащих вложенные элементы.
В качестве хранилищ рассмотрены временное хранилище значений и переменные типа ХранилищеЗначения.

Введение

Платформа 8.3.7.1917.

Известно, что в хранилище значений можно поместить только переменные сериализуемого типа. В документации по встроенному языку и в синтакс-помощнике в описании объектов возможность сериализации указывается отметкой "Сериализуется".

При помещении во временное хранилище значений, сериализация которых не поддерживается, возникает ошибка. Текст ошибки зависит от типа переменной. Рассмотрим подробнее каждый из типов.

Хранилище значения

При помещении значения в хранилище конструктором Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>) может возникать ошибка "Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент".

Если в качестве помещаемого значения выступает несериализуемый элемент, то проблем не возникает - мы сразу видим, что он не сериализуется и предпринимаем необходимые действия в зависимости от потребности автоматизации.

Если в качестве помещаемого значения выступает сериализуемая коллекция (например, Структура) с вложенными элементами, то поиск конкретного не сериализуемого значения может принести немало хлопот.

Ниже представлена функция, позволяющая определить, где в коллекциях находятся несериализуемые элементы.

Временное хранилище

При помещении значения во временное хранилище методом ПоместитьВоВременноеХранилище(<Данные>, <Адрес>) может возникать ошибка "Переданное значение не может быть помещено во временное хранилище".

Здесь казалось бы все по аналогии с хранилищем значения, но возник нюанс: если в качестве данных выступает сериализуемая коллекция с вложенными элементами, сериализация которых не поддерживается, то ошибки не возникает.

Т.е. вот такой код выдает ошибку:

ПоместитьВоВременноеХранилище(Метаданные.Справочники);

А такой - нет:

ПоместитьВоВременноеХранилище(Новый Структура("мдСправочники", Метаданные.Справочники));

Не знаю, это баг или фича, пока отправил письмо на v8 с просьбой признать ошибку. По результатам ответа, пополню статью.

В нижепредставленной функции организована проверка и на помещение во временное хранилище. Т.к. механизм очевидно другой, то реализован специальный параметр, который явно указывает какое хранилище проверяем.

Функции поиска несериалиуемого значения

Их две. Первая - собственно вызов с передачей проверяемого объекта:

// Функция - Получить не сериализуемые объекты
//
// Параметры:
//  Объект				 - объект, для которого требуется найти несериализуемые объекты
//  ВариантСериализации	 - вариант сериализации при поиске значений. Может принимать значения:
//							"ХранилищеЗначения"  - используется конструктор объекта ХранилищеЗначения
//							"ВременноеХранилище" - используется метод ПоместитьВоВременноеХранилище
// 
// Возвращаемое значение:
//  Массив - массив путей до несериализуемых объектов
//
Функция ПолучитьНеСериализуемыеОбъекты(Объект, ВариантСериализации = "ХранилищеЗначения") Экспорт

	МассивПутей = Новый Массив();
	
	ДобавитьВМассивПутейНесериализуемыйОбъект(МассивПутей, Объект, ВариантСериализации);
	
	Возврат МассивПутей;

КонецФункции // ПолучитьНеСериализуемыеОбъекты()

Вторая - служебная рекурсия для определения путей несериализуемых объектов:

Процедура ДобавитьВМассивПутейНесериализуемыйОбъект(МассивПутей, Родитель, ВариантСериализации, ПутьКРодителю = "")

	Если ТипЗнч(Родитель) = Тип("Массив")
		 ИЛИ ТипЗнч(Родитель) = Тип("ФиксированныйМассив") Тогда
		
		сч = 0;
		Для каждого ЭлементРодителя Из Родитель Цикл
			ДобавитьВМассивПутейНесериализуемыйОбъект(МассивПутей, ЭлементРодителя, ВариантСериализации, ПутьКРодителю + "[" + Формат(сч, "ЧН=0; ЧГ=") + "]");
			сч = сч + 1;
		КонецЦикла;
	ИначеЕсли ТипЗнч(Родитель) = Тип("Структура")
		 ИЛИ ТипЗнч(Родитель) = Тип("Соответствие")
		 ИЛИ ТипЗнч(Родитель) = Тип("ФиксированнаяСтруктура")
		 ИЛИ ТипЗнч(Родитель) = Тип("ФиксированноеСоответствие")
		 Тогда
		
		Для каждого ЭлементРодителя Из Родитель Цикл
		
			ДобавитьВМассивПутейНесериализуемыйОбъект(МассивПутей, ЭлементРодителя.Ключ,     ВариантСериализации, ПутьКРодителю + "/Ключ");
			ДобавитьВМассивПутейНесериализуемыйОбъект(МассивПутей, ЭлементРодителя.Значение, ВариантСериализации, ПутьКРодителю + "/" + ЭлементРодителя.Ключ);
		
		КонецЦикла;
		
	Иначе
		Попытка
			
			Если ВариантСериализации = "ХранилищеЗначения" Тогда
				Результат = Новый ХранилищеЗначения(Родитель);
			ИначеЕсли ВариантСериализации = "ВременноеХранилище" Тогда
				Адрес = ПоместитьВоВременноеХранилище(Родитель);
				УдалитьИзВременногоХранилища(Адрес);
			КонецЕсли;
		
		Исключение
			МассивПутей.Добавить(ПутьКРодителю);
		КонецПопытки;
	КонецЕсли;
	

КонецПроцедуры // ДобавитьВМассивПутейНесериализуемыйОбъект()

хранилище значения временное хранилище сериализация

См. также

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Программист Стажер Платформа 1С v8.3 Платные (руб)

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 руб.

29.06.2022    10373    84    4    

116

Групповая разработка (Git, хранилище) Программист Руководитель проекта Стажер Бесплатно (free)

Про изменения и новинки в агрегаторе открытых проектов OpenYellow, которые появились с момента его создания: про портал, Github и Telegram

15.07.2024    1703    bayselonarrend    7    

16

Групповая разработка (Git, хранилище) Программист Стажер Бесплатно (free)

О проблемах новых 1С-проектов в общем океане открытого программного обеспечения.

07.07.2024    2537    bayselonarrend    57    

33

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    2337    vkrivov@yandex.ru    8    

17

Групповая разработка (Git, хранилище) Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Столкнулся с проблемой при загрузке метаданных в СППР из GitLab на сервере 1С под Linux (РЭД ОС 7.3). При загрузке метаданных конфигурации, процесс загрузки длился несколько секунд и "благополучно" (без сообщений об ошибке) завершался. При этом метаданные не загружались.

1 стартмани

02.07.2024    444    0    Live    1    

3

Групповая разработка (Git, хранилище) Программист Стажер Бесплатно (free)

Не знаете, чем бы таким заполнить свой профиль Github? Заполните его своими статьями на Инфостарт! Этот простой workflow сам соберет список ваших последних статей и будет периодически обновлять его для актуализации данных.

08.04.2024    1208    bayselonarrend    2    

33

Групповая разработка (Git, хранилище) Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Доработки 1С:ERP на крупных проектах можно организовать, не внося изменения в саму типовую конфигурацию, а используя только расширения и отдельные «микроконфигурации». Расскажем о том, как это сделать без EDT, используя процесс разработки GitHub Flow.

02.04.2024    6752    Begemoth80    24    

51

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2034    bayselonarrend    3    

41
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dtfmffff 16.01.17 10:20 Сейчас в теме
Долго экспериментировал с сохранением несериализуемых значений между серверными вызовами.
Спасибо, это работает: ПоместитьВоВременноеХранилище(Новый Структура("мдСправочники", Метаданные.Справочники));
2. valentinanb 18.08.17 15:04 Сейчас в теме
Оставьте свое сообщение