Git Product home page Git Product logo

serlib1c's Introduction

1C Serialization Library

Checked by Silver Bulleters SonarQube BSL plugin

GitHub release GitHub license GitHub Releases GitHub All Releases

Build Status Quality Gate Coverage Tech debt

Библиотека сериализации 1С (обработка)

Набор процедур и функций для сериализации/десериализации данных 1С и объектов СКД в простые структуры данных (Структура, соответствие, массив).

Варианты использования

  • замена платформенных функций сериализации, например, при сохранении версий объектов
  • передача данных по протоколу HTTP
  • основа для простых обработок обмена данными
  • основа для получения отчетов из внешних ИБ 1С

Особенности

  • разработка ведется в формате EDT
  • процедуры/функции поддерживают ограничение состава полей
  • табличные части преобразуются в служебный элемент структуры с ключом "__ТЧ"
  • при десериализации приоритетными являются метаданные, т.е. не возникает ошибок при изменении структуры данных конфигурации
  • поддерживается возможность назначения процедур дополнения ссылочных данных при выгрузке
  • поддерживается возможность переопределения функций поиска ссылочных данных

Особенности преобразования объектов СКД

  1. ПутьКДанным пользовательских полей СКД формируется системой автоматически, поэтому:

    • после загрузки СКД значение может отличаться на номер поля
    • если в исходной СКД значение было на языке, отличном от языка целевой, то новое значение будет на языке целевой СКД
  2. Поле "Обязательное" роли поля набора данных сейчас устанавливается принудительно, хотя в документации отмечено как "Только чтение" (EDT тоже ругается)

  3. Поле "Схема" вложенной схемы компоновки данных при добавлении имеет тип неопределено и принудительно устанавливается значение "Новый СхемаКомпоновкиДанных()", хотя в документации отмечено как "Только чтение" (EDT тоже ругается)

  4. В исходных настройках СКД в полях ТипЗначения составного типа могут встречаться дубли типов <БизнесПроцесс....> при загрузке дубли схлопываются

  5. В исходных настройках СКД иногда встречается некорректный тип элементов свойства "ПараметрыДанных" объекта "НастройкиКомпоновкиДанных", вместо "ЗначениеПараметраНастроекКомпоновкиДанных" используется "ЗначениеПараметраКомпоновкиДанных". После выгрузки загрузки СКД, все элементы поля "ПараметрыДанных" будут приведены к типу "ЗначениеПараметраНастроекКомпоновкиДанных".

  6. Если в исходных настройках поле типа "Дата" имеет значение Неопределено, то при загрузке будет установлена пустая дата

  7. Если в исходных настройках поле типа "Строка" имеет значение Неопределено, то при загрузке будет установлена пустая строка

  8. Не заполняется поле "Идентификатор" в элементах структуры настроек (Группировки, Таблицы, Диаграммы), т.к. имеет признак "Только чтение", а автоматического присвоения значения не происходит. Влияние на работоспособность СКД пока не проверялось.

Методы преобразования прикладных объектов 1С

Общие методы

  • ОбъектВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ЗаполнитьОбъектИзСтруктуры(Объект, СтруктураОбъекта, СписокСвойств, ИсключаяСвойства)
  • СоздатьОбъектИзСтруктуры(СтруктураОбъекта, УстановитьСсылку, СписокСвойств, ИсключаяСвойства)

  • СсылкаВСтруктуру(Значение)
  • СсылкаИзСтруктуры(СтруктураЗначения)

  • НаборЗаписейРегистраВСтруктуру(НаборЗаписей, СписокСвойств, ИсключаяСвойства)

  • ЗаполнитьНаборЗаписейРегистраИзСтруктуры(НаборЗаписей, СтруктураНабораЗаписей, СписокСвойств, ИсключаяСвойства)

  • СоздатьНаборЗаписейРегистраИзСтруктуры(СтруктураНабораЗаписей, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)


  • ДвиженияДокументаВСтруктуру(Объект, СписокРегистров, ИсключаяРегистры)
  • ДвиженияДокументаИзСтруктуры(Объект, СтруктураДвижений, СписокРегистров, ИсключаяРегистры)

  • ЗначениеВСтруктуру(Значение)
  • ЗначениеИзСтруктуры(СтруктураЗначения, ПолучатьБитыеСсылки)

Прикладные объекты (ссылочные)

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

  • Объект - преобразуемый/восстанавливаемый объект
  • СтруктураОбъекта - результат преобразования / источник для восстановления
  • СписокСвойств - список свойств, которые попадут в результат преобразования
  • ИсключаяСвойства - список свойств, которые не будут преобразованы (приоритет выше чем у СписокСвойств)

  • СправочникВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • СправочникИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • ПланСчетовВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ПланСчетовИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • ПланВидовХарактеристикВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ПланВидовХарактеристикИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • ПланВидовРасчетаВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ПланВидовРасчетаИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • ДокументВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ДокументИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • БизнесПроцессВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • БизнесПроцессИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • ЗадачаВСтруктуру(Объект, СписокСвойств, ИсключаяСвойства)
  • ЗадачаПроцессИзСтруктуры(Объект, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

Дополнение ссылочных данных при выгрузке

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

&НаСервере
Процедура МояПроцедураДополнения(ОписаниеЗначения, Значение) Экспорт
    // Код дополнения
    // ОписаниеЗначения.Вставить("КодЭлемента", Значение.Код);
КонецПроцедуры

где:

  • ОписаниеЗначения - Структура - Структура содержащая поля описания ссылки
  • Значение - ЛюбаяСсылка - ссылка, для которой получено описание

И перед выполнением выгрузки данных добавить обработчик дополнения ссылок

Библиотека.ДобавитьПравилоВыгрузкиТипа("Справочник.МойСправочник", "МояПроцедураДополнения", ЭтотОбъект)

где:

  • Библиотека - Обработка-объект библиотеки преобразования данных (этой библиотеки)
Переопределение поиска ссылочных данных при загрузке

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

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

где доступны параметры:

  • ОписаниеВида - Структура - Структура содержащая описание вида загружаемой ссылки
  • МетаОбъект - ОписаниеМетаданных - Описание метаданных загружаемой ссылки
  • ОписаниеЗначения - Структура - Структура содержащая поля описания искомой ссылки

И перед выполнением выгрузки данных добавить обработчик дополнения ссылок

Библиотека.ДобавитьПравилоЗагрузкиТипа("Справочник.МойСправочник", "Справочник.МойЗагружаемыйСправочник", "МояФункцияПоискаСсылок", ЭтотОбъект)

где:

  • Библиотека - Обработка-объект библиотеки преобразования данных (этой библиотеки)

Прикладные объекты (регистры)

При преобразовании регистров могут быть использованы фильтры свойств. Используется единый набор параметров:

  • НаборЗаписей - преобразуемый/восстанавливаемый набор записей регистра
  • СтруктураОбъекта - результат преобразования / источник для восстановления
  • СписокСвойств - список свойств, которые попадут в результат преобразования
  • ИсключаяСвойства - список свойств, которые не будут преобразованы (приоритет выше чем у СписокСвойств)

  • НаборЗаписейРегистраСведенийВСтруктуру(НаборЗаписей, СписокСвойств, ИсключаяСвойства)
  • НаборЗаписейРегистраСведенийИзСтруктуры(НаборЗаписей, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • НаборЗаписейРегистраНакопленияВСтруктуру(НаборЗаписей, СписокСвойств, ИсключаяСвойства)
  • НаборЗаписейРегистраНакопленияИзСтруктуры(НаборЗаписей, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • НаборЗаписейРегистраБухгалтерииВСтруктуру(НаборЗаписей, СписокСвойств, ИсключаяСвойства)
  • НаборЗаписейРегистраБухгалтерииИзСтруктуры(НаборЗаписей, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

  • НаборЗаписейРегистраРасчетаВСтруктуру(НаборЗаписей, СписокСвойств, ИсключаяСвойства)
  • НаборЗаписейРегистраРасчетаИзСтруктуры(НаборЗаписей, СтруктураОбъекта, ПолучатьБитыеСсылки, СписокСвойств, ИсключаяСвойства)

Коллекции

При преобразовании коллекций выполняется рекурсивное преобразование всех вложенных значений с использованием функций ЗначениеВСтруктуру()/ЗначениеИзСтруктуры().

  • СтруктураВСтруктуру(Значение)
  • СтруктураИзСтруктуры(СтруктураЗначения)

  • МассивВСтруктуру(Значение)
  • МассивИзСтруктуры(СтруктураЗначения)

  • СоответствиеВСтруктуру(Значение)
  • СоответствиеИзСтруктуры(СтруктураЗначения)

  • СписокЗначенийВСтруктуру(Значение)
  • СписокЗначенийИзСтруктуры(СтруктураЗначения)

  • ТаблицаЗначенийВСтруктуру(Значение, СписокСвойств, ИсключаяСвойства)
  • ТаблицаЗначенийИзСтруктуры(СтруктураЗначения, СписокСвойств, ИсключаяСвойства)

  • ДеревоЗначенийВСтруктуру(Значение, СписокСвойств, ИсключаяСвойства)
  • ДеревоЗначенийИзСтруктуры(СтруктураЗначения, СписокСвойств, ИсключаяСвойства)

Методы преобразования данных формы

  • ДанныеФормыВСтруктуру(Форма, ТолькоСохраняемые, СписокСвойств, ИсключаяСвойства)
  • ДанныеФормыИзСтруктуры(Форма, СтруктураДанных, ПроверятьИмяФормы, СоздаватьРеквизиты, СписокСвойств, ИсключаяСвойства)

Методы преобразования объектов СКД

  • СКДВСтруктуру(Объект)
  • СКДИзСтруктуры(Объект, СтруктураОбъекта)

  • НастройкиСКДВСтруктуру(Объект)
  • НастройкиСКДИзСтруктуры(Объект, СтруктураОбъекта)

Методы чтения/записи JSON

При чтении записи JSON выполняется преобразование типов не совместимых с JSON в/из строки. Для преобразования "неизвестных" типов используется ЗначениеВСтрокуВнутр(). Значения типа "Дата" записываются/читаются в формате Microsoft.

  • ЗаписатьОписаниеОбъектаВJSON(ОписаниеОбъекта)
  • ПрочитатьОписаниеОбъектаИзJSON(ТекстОписанияОбъекта, СвойстваСоЗначениемДата)

serlib1c's People

Contributors

arkuznetsov avatar galiullintr avatar shalimski avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

serlib1c's Issues

Функция Совместимость8_3_6 возвращает Неопределено

Падает следующий код:
Задача = Задачи.Задача1.НайтиПоНомеру("000000001");
ПреобразованиеДанных = Обработки.ктв_ПреобразованиеДанных.Создать();
Результат = ПреобразованиеДанных.ЗначениеВСтруктуру(Задача);

Преобразование значения к типу Булево не может быть выполнено
{Обработка.ктв_ПреобразованиеДанных.МодульОбъекта(10166)}: Если Совместимость8_3_6() Тогда

Поддержка сериализации СКД между разными версиями платформы

В новых версиях платформы добавлены новые параметры компоновки данных, которых нет в старых версиях. Для возможности сериализации СКД из новой версии платформы в старую версию (мне, например это пригодилось для отката с 8.3.17 на 8.3.12) можно проверять наличие параметра в СКД в процедуре ЗначенияПараметровОбъектаСКДИзСтруктуры().
Предлагаю внести изменение:

роцедура ЗначенияПараметровОбъектаСКДИзСтруктуры(ОбъектВладелец,
                                                  Объект,
                                                  СтруктураОбъекта,
                                                  ИмяКоллекцииПараметров = "Элементы")
	
	Если НЕ СтруктураОбъекта.Свойство(ИмяКоллекцииПараметров) Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ТекЭлемент Из СтруктураОбъекта[ИмяКоллекцииПараметров] Цикл
		Если ОбъектВладелец.ДоступныеПараметры = Неопределено Тогда
			НовыйЭлемент = Объект[ИмяКоллекцииПараметров].Добавить();
			ЗначениеСКДИзСтруктуры(НовыйЭлемент, ТекЭлемент);
		Иначе	
			ТекПараметр = ОбъектВладелец.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекЭлемент.Параметр));
			Если ТекПараметр = Неопределено Тогда// Добавлена проверка наличия параметра
				Продолжить;
			КонецЕсли;
			ВремЗначение = ЗначениеИзСтруктуры(ТекЭлемент.Значение);
			// Обработка случая пустого значения несериализуемого типа
			Если НЕ ВремЗначение = Неопределено ИЛИ ТипЗнч(ТекПараметр.Значение) = Тип("Неопределено") Тогда
				ТекПараметр.Значение = ВремЗначение;
			КонецЕсли;
...

Точка маршрута БП

не сериализуется и не получается перехватить это дополнительной функцией обработки типа

Идея: Сериализовать объект управляемой формы

Часто необходимо бывает сделать поиск в отладчике (окно Вычислить выражение) в дереве объекта управляемой формы, но поиск там не работает. Если сериализовать форму и сохранить ее в файл, то там можно производить поиск, сравнивать изменения между формами и т.д.

Вопрос: исключение стандартных реквизитов объектов

Почему при преобразовании справочника-объекта в структуру часть его стандартных реквизитов можно отфильтровать (пометка удаления, это группа), а часть - обязательно выгрузится, не взирая на указанные исключения свойств (родитель, владелец и т.п.)?

Не поддерживается тип ГруппировкаТаблицыКомпоновкиДанных

Нет обработки для типа ГруппировкаТаблицыКомпоновкиДанных, что приводит к неполной сериализации/десериализации в некоторых случаях.

Требуемые изменения:

Функция ГруппировкаСКДВСтруктуру(Объект)
	
	СтруктураОбъекта = Новый Структура();
	
	Если НЕ ТипЗнч(Объект) = Тип("ГруппировкаКомпоновкиДанных")
		И НЕ НЕ ТипЗнч(Объект) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда// Добавлена проверка типа
		СтруктураОбъекта.Вставить("__Тип", "Неопределено");
		Возврат СтруктураОбъекта;
	КонецЕсли;

	СтруктураОбъекта.Вставить("__Тип", "ГруппировкаКомпоновкиДанных");
	
	СтруктураОбъекта.Вставить("Тип"             , "ГруппировкаКомпоновкиДанных");

	Если ТипЗнч(Объект) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда// Добавлено переопределение типа
		СтруктураОбъекта.Вставить("__Тип", "ГруппировкаТаблицыКомпоновкиДанных");
		СтруктураОбъекта.Вставить("Тип",   "ГруппировкаТаблицыКомпоновкиДанных");
	КонецЕсли;
...
Процедура ГруппировкаСКДИзСтруктуры(Объект, СтруктураОбъекта)
	
	Если НЕ ТипЗнч(Объект) = Тип("ГруппировкаКомпоновкиДанных")
		И НЕ ТипЗнч(Объект) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда// Добавлена проверка типа
		Возврат;
	КонецЕсли;
...
Процедура КоллекцияСКДИзМассива(Коллекция, МассивКоллекции, УстановитьТипЭлемента = Ложь)
	
	Для Каждого ТекЭлемент Из МассивКоллекции Цикл
		Если УстановитьТипЭлемента
			И ТекЭлемент.__Тип <> "ГруппировкаТаблицыКомпоновкиДанных" Тогда// Добавлена проверка типа
			НовыйЭлемент = Коллекция.Добавить(Тип(ТекЭлемент.__Тип));
		Иначе
			НовыйЭлемент = Коллекция.Добавить();
		КонецЕсли;
...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.