Описание формата внутреннего представления данных 1С в контексте обмена данными
Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа.
Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.
Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.
Комментарии
Избранное
Подписка
Сортировка:
Древо
Кто-то наконец уже должен был это задокументировать!
Несмотря на общеизвестность формата и его простоту, до сих пор не было твердой копии описания. Спасибо.
Однако
Несмотря на общеизвестность формата и его простоту, до сих пор не было твердой копии описания. Спасибо.
Однако
задачи обмена именно в "формате 1С"
- это как? Почти 2020 год на дворе, Скайнет давно победил людишек, а у нас на полном серьезе требуют обмен в формате сериализации 1С? Поделитесь, зачем? Кому это нужно?
(1) бывает удобно иногда... например, мне однажды понадобилось загрузить для анализа данные из 7.7 в 8, а в 7.7 уже был отчет, внутри которого формировалась ТЗ как раз с нужными данными...
Еще из Native ВК передавать данные в 1с тоже было бы удобно в некоторых случаях...
Если были бы полноценные чтение/запись такого формата во внешнем мире, то пригодились бы при случае...
Еще из Native ВК передавать данные в 1с тоже было бы удобно в некоторых случаях...
Если были бы полноценные чтение/запись такого формата во внешнем мире, то пригодились бы при случае...
(1)
Может так же как в моем случае просто обмен во внутреннем формате быстрее? Или может там такой объем данных, что при записи в JSON/XML оперативки не хватает и сильно свопит? ХЗ, просто есть факт потребности. А если есть потребность, то пусть будет статья.
у нас на полном серьезе требуют обмен в формате сериализации 1С? Поделитесь, зачем? Кому это нужно?
Может так же как в моем случае просто обмен во внутреннем формате быстрее? Или может там такой объем данных, что при записи в JSON/XML оперативки не хватает и сильно свопит? ХЗ, просто есть факт потребности. А если есть потребность, то пусть будет статья.
(1) Знаете, я это в 2008-м задокументировал, и меня забанили на одном замечательном интернет-ресурсе, посвящённом 1С. Да ещё злобно наезжали, что мол, не рекомендует 1С это делать, вот и нехрен делать.
Так что, есть такая документация. У меня на старом харде. 11 лет уже, как есть, и полагаю, мало что с той поры изменилось. А вот желающие прыгать на грабли и огребать за нарушение рекомендаций, смотрю, всё не переводятся) То к скулю напрямую обращаются, то во внутренний формат лезут...
Так что, есть такая документация. У меня на старом харде. 11 лет уже, как есть, и полагаю, мало что с той поры изменилось. А вот желающие прыгать на грабли и огребать за нарушение рекомендаций, смотрю, всё не переводятся) То к скулю напрямую обращаются, то во внутренний формат лезут...
(8) спасибо за мнение. Но есть такое понятие как "целевая аудитория", к которой вы просто не относитесь. Лично для меня было интересно пройтись по недокументированному "минному полю" - узнал некоторые интересные вещи о платформе.
P.S. О том, что 1С не рекомендует использовать данный механизм я сам написал в статье и тем самым предупредил читателей.
P.S.S. Тут не "замечательный интернет-ресурс", так как моя статья успешно прошла премодерацию. Можно выдыхать :)
P.S. О том, что 1С не рекомендует использовать данный механизм я сам написал в статье и тем самым предупредил читателей.
P.S.S. Тут не "замечательный интернет-ресурс", так как моя статья успешно прошла премодерацию. Можно выдыхать :)
Не совсем понял посыл статьи, кроме общего описания формата. Но, вдохновлённый фразой "быстрый массив", решил проверить на одном месте в моём коде, где несколько десятков тысяч строк сохраняются в джейсон, а потом - в файл, и, соответственно, обратно извлекаются по надобности.
В общем, извлечение джейсона (стандартными средствами платформы) такого объёма заняло 5 секунд, ЗначениеИзСтрокиВнутр - 12 секунд.
В общем, извлечение джейсона (стандартными средствами платформы) такого объёма заняло 5 секунд, ЗначениеИзСтрокиВнутр - 12 секунд.
(22) написать можно, но как вы видите такую замену? Идентификаторы объектов метаданных - разные, уникальные идентификаторы ссылок - тоже разные. Когда мы значение ссылки открываем в чужой базе, мы не только не сможем определить, что это был за справочник, но даже не сможем понять, что это вообще Справочник, а не Документ или характеристика.
Можно выгружать метаданные из первой конфигурации, с помощью дополнительной обработки делать сопоставление объектов во второй (как минимум по наименованию и типу), а далее эту настройку использовать при загрузке. Но что, если нужных уидов не будет? В загруженных документах будет "объект не найден".
Можно выгружать метаданные из первой конфигурации, с помощью дополнительной обработки делать сопоставление объектов во второй (как минимум по наименованию и типу), а далее эту настройку использовать при загрузке. Но что, если нужных уидов не будет? В загруженных документах будет "объект не найден".
У меня задача проще. Был перенос данных из УПП в БУХ 3.0. в основном все справочники перенесли по UID. Сейчас идет выверка данных и постобработка документов ввода остатков. Очень удобно сохранить в исходнике во внешний файл срез регистра в ТЗ и потом читать в приемнике. Напр:
UID источника d4ba178b-3934-11e1-a59a-18a905e37a56
ЗначениеВСтрокуВнутр {"#",a86305d7-b8a1-4312-901f-2ade3efdb351,164:a59a18a905e37a5611e13934d4ba178b}
UID приемника d4ba178b-3934-11e1-a59a-18a905e37a56
ЗначениеВСтрокуВнутр {"#",c92a1124-c41e-42a4-bda7-3bbac9c6039e,188:a59a18a905e37a5611e13934d4ba178b}
Имея данную информацию можно ли сделать подмену
UID источника d4ba178b-3934-11e1-a59a-18a905e37a56
ЗначениеВСтрокуВнутр {"#",a86305d7-b8a1-4312-901f-2ade3efdb351,164:a59a18a905e37a5611e13934d4ba178b}
UID приемника d4ba178b-3934-11e1-a59a-18a905e37a56
ЗначениеВСтрокуВнутр {"#",c92a1124-c41e-42a4-bda7-3bbac9c6039e,188:a59a18a905e37a5611e13934d4ba178b}
Имея данную информацию можно ли сделать подмену
Вот собственно функции, может кому понадобятся
Процедура КоманднаяПанельРезультатСохратьТаблицуВФайлУниверсальная(Кнопка)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = "Файл данных (*.txt)|*.txt";
ДиалогВыбораФайла.Расширение = "txt";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
Если ДиалогВыбораФайла.Выбрать() Тогда
СоответствиеЗамены = ПолучитьСоответствиеЗамены();
Т = ЗначениеВСтрокуВнутр(РезультатТаблица);
Для каждого стр Из СоответствиеЗамены Цикл
Т = СтрЗаменить(Т,стр.Значение,стр.Имя);
Т = СтрЗаменить(Т,Лев(стр.Значение,36),"_" + стр.Имя);
КонецЦикла;
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(Т);
ТекстовыйФайл.Записать(ДиалогВыбораФайла.ПолноеИмяФайла);
КонецЕсли;
КонецПроцедуры
Процедура КоманднаяПанельРезультатЗагрузитьТаблицуИЗФайлаУниверсальная (Кнопка)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = "Файл данных (*.txt)|*.txt";
ДиалогВыбораФайла.Расширение = "txt";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
Если ДиалогВыбораФайла.Выбрать() Тогда
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.Прочитать(ДиалогВыбораФайла.ПолноеИмяФайла);
Т = ТекстовыйФайл.ПолучитьТекст();
СоответствиеЗамены = ПолучитьСоответствиеЗамены();
Для каждого стр Из СоответствиеЗамены Цикл
Т = СтрЗаменить(Т,"_" + стр.Имя,Лев(стр.Значение,36));
Т = СтрЗаменить(Т,стр.Имя,стр.Значение);
КонецЦикла;
РезультатТаблица = ЗначениеИзСтрокиВнутр(Т);
ЭлементыФормы.ТаблицаРезультата.СоздатьКолонки();
ЭлементыФормы.КоманднаяПанельРезультат.Кнопки.ВыполнитьАлгоритм.Доступность = Истина;
КонецЕсли;
ЭлементыФормы.НадписьКолСтрокРезультата.Заголовок = СокрЛП(РезультатТаблица.Количество()) + " строк";
КонецПроцедуры
Функция ПолучитьСоответствиеЗамены()
СоответствиеТипов = Новый ТаблицаЗначений;
СоответствиеТипов.Колонки.Добавить("Имя");
СоответствиеТипов.Колонки.Добавить("Значение");
ЗапросТекстИтог = "";
Для каждого стр Из Метаданные.Справочники Цикл
ЗапросТекст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Ссылка,
| ""<Имя>"" КАК Имя
|ИЗ
| <Имя>
|ОБЪЕДИНИТЬ ВСЕ
|/////////////////////////////
|";
ЗапросТекст = СтрЗаменить(ЗапросТекст, "<Имя>", "Справочник." + стр.Имя);
ЗапросТекстИтог = ЗапросТекстИтог + ЗапросТекст;
КонецЦикла;
//Для каждого стр Из Метаданные.Документы Цикл
// ЗапросТекст =
// "ВЫБРАТЬ ПЕРВЫЕ 1
// | Ссылка,
// | ""<Имя>"" КАК Имя
// |ИЗ
// | <Имя>
// |ОБЪЕДИНИТЬ ВСЕ
// |/////////////////////////////
// |";
// ЗапросТекст = СтрЗаменить(ЗапросТекст, "<Имя>", "Документ." + стр.Имя);
//
// ЗапросТекстИтог = ЗапросТекстИтог + ЗапросТекст;
//
//КонецЦикла;
ЗапросТекстИтог = Лев(ЗапросТекстИтог,СтрДлина(ЗапросТекстИтог) - 45);
Запрос = Новый Запрос;
Запрос.Текст = ЗапросТекстИтог;
ТЗ = Запрос.Выполнить().Выгрузить();
Для каждого стр Из ТЗ Цикл
//"{"#",0b5f521e-459d-4962-86a6-f3a45fe61010,34:810100155d08eb1f11e7e01fe335f24f}"
Значение = ЗначениеВСтрокуВнутр(стр.Ссылка);
раз = Найти(Значение,":");
НоваяСтрока = СоответствиеТипов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,стр);
НоваяСтрока.Значение = Сред(Значение,6,раз - 6);
КонецЦикла;
Возврат СоответствиеТипов;
КонецФункции
Показать Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|