0. Dementor 585 06.09.19 17:30 Сейчас в теме

Описание формата внутреннего представления данных 1С в контексте обмена данными

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа.

Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Evil Beaver 6291 07.09.19 09:22 Сейчас в теме
Кто-то наконец уже должен был это задокументировать!
Несмотря на общеизвестность формата и его простоту, до сих пор не было твердой копии описания. Спасибо.

Однако
задачи обмена именно в "формате 1С"
- это как? Почти 2020 год на дворе, Скайнет давно победил людишек, а у нас на полном серьезе требуют обмен в формате сериализации 1С? Поделитесь, зачем? Кому это нужно?
3. Perfolenta 169 07.09.19 12:08 Сейчас в теме
(1) бывает удобно иногда... например, мне однажды понадобилось загрузить для анализа данные из 7.7 в 8, а в 7.7 уже был отчет, внутри которого формировалась ТЗ как раз с нужными данными...
Еще из Native ВК передавать данные в 1с тоже было бы удобно в некоторых случаях...
Если были бы полноценные чтение/запись такого формата во внешнем мире, то пригодились бы при случае...
4. Dementor 585 07.09.19 15:15 Сейчас в теме
(1)

у нас на полном серьезе требуют обмен в формате сериализации 1С? Поделитесь, зачем? Кому это нужно?

Может так же как в моем случае просто обмен во внутреннем формате быстрее? Или может там такой объем данных, что при записи в JSON/XML оперативки не хватает и сильно свопит? ХЗ, просто есть факт потребности. А если есть потребность, то пусть будет статья.
Fox-trot; +1 Ответить
11. Evil Beaver 6291 09.09.19 11:46 Сейчас в теме
(4) сильно сомневаюсь что формат "скобок" обгоняет по требованиям к памяти, например CSV. Да и Json радикально не сильно тяжелее будет
8. Yashazz 2855 09.09.19 11:03 Сейчас в теме
(1) Знаете, я это в 2008-м задокументировал, и меня забанили на одном замечательном интернет-ресурсе, посвящённом 1С. Да ещё злобно наезжали, что мол, не рекомендует 1С это делать, вот и нехрен делать.
Так что, есть такая документация. У меня на старом харде. 11 лет уже, как есть, и полагаю, мало что с той поры изменилось. А вот желающие прыгать на грабли и огребать за нарушение рекомендаций, смотрю, всё не переводятся) То к скулю напрямую обращаются, то во внутренний формат лезут...
Serj1C; Evil Beaver; +2 Ответить
15. Dementor 585 09.09.19 15:18 Сейчас в теме
(8) спасибо за мнение. Но есть такое понятие как "целевая аудитория", к которой вы просто не относитесь. Лично для меня было интересно пройтись по недокументированному "минному полю" - узнал некоторые интересные вещи о платформе.

P.S. О том, что 1С не рекомендует использовать данный механизм я сам написал в статье и тем самым предупредил читателей.
P.S.S. Тут не "замечательный интернет-ресурс", так как моя статья успешно прошла премодерацию. Можно выдыхать :)
WellMaster; +1 Ответить
2. for_sale 783 07.09.19 10:10 Сейчас в теме
Не совсем понял посыл статьи, кроме общего описания формата. Но, вдохновлённый фразой "быстрый массив", решил проверить на одном месте в моём коде, где несколько десятков тысяч строк сохраняются в джейсон, а потом - в файл, и, соответственно, обратно извлекаются по надобности.

В общем, извлечение джейсона (стандартными средствами платформы) такого объёма заняло 5 секунд, ЗначениеИзСтрокиВнутр - 12 секунд.
21. fomix 26 11.09.19 11:30 Сейчас в теме
(2) Что JSON, что XML (он же внутр.формат) - суть не важно, все равно и то и другое избыточно по составу. Другое дело скорость выгрузки из 1С всего этого бреда! А тут еще попутно надо #С-нику или PHP-шнику объяснять что и как в 1С устроено.
6. SeiOkami 1136 08.09.19 08:34 Сейчас в теме
(0), очень интересный материал, спасибо за публикацию!
7. VIA_1C 50 09.09.19 08:48 Сейчас в теме
(0) Автору спасибо за наглядное и очень понятное изложение материала. Так и хочется сказать: аффтар пиши есчо! ))
9. Yashazz 2855 09.09.19 11:04 Сейчас в теме
(7) Автор, не пиши такого. Есть инструментарий, вот им и следует пользоваться. А не лазить, куда не рекомендовано.
10. VIA_1C 50 09.09.19 11:08 Сейчас в теме
(9) если Вы не умеете это "готовить", то это сугубо Ваши личные проблемы
12. Evil Beaver 6291 09.09.19 11:48 Сейчас в теме
(10) О, а вы разве умеете? Или вы просто не очень осознаете риски написания в продакшене парсера под недокументированный формат, являющийся, как говорят, "subject-to-change"?
13. VIA_1C 50 09.09.19 12:09 Сейчас в теме
(12) я возможности этого недокументированного формата еще в 7.7 использовал, при необходимости... А вообще каждый сам для себя решает нужно оно ему или нет. Мне - иногда нужно и не надо меня убеждать в том, что мне это не нужно. ))
Dementor; +1 Ответить
17. Yashazz 2855 09.09.19 22:35 Сейчас в теме
(13) Ну многие использовали, но флагом махать зачем? Я тоже много интересного могу рассказать про разницу между ЗначениеВСтроку и ЗначениеВСтрокуВнутр, особенно в плане производительности, и?
16. Yashazz 2855 09.09.19 22:34 Сейчас в теме
(10) Я-то дофига всего умею. Но если предлагают готовить крысятину, то да, я скажу, "не надо" и меня поддержат, несмотря на отличное изложение книги "101 рецепт из крысиного мяса".
14. vadim1011985 71 09.09.19 13:01 Сейчас в теме
Этот формат очень похож (или даже скорее всего это он и есть) на формат описания самой конфигурации 1с (легко можно убедиться через Tools 1CD посмотрев таблицу CONFIG поле BINARYDATA)
Dementor; +1 Ответить
19. DrZombi 28 10.09.19 11:04 Сейчас в теме
(0) Бред, форменный... поставил бы минус, но вам повезло :)
20. Dementor 585 10.09.19 14:08 Сейчас в теме
(19) Борис Георгиевич, перелогиньтесь :))
22. Alex17 12.09.19 16:16 Сейчас в теме
Еще бы автор выложил функцию, которой бы заменой значений можно было исправить типы, ссылочных данных, при перегрузках на разных конфигурациях 1С, цены бы не было. За статью спасибо.
23. Dementor 585 13.09.19 10:27 Сейчас в теме
(22) написать можно, но как вы видите такую замену? Идентификаторы объектов метаданных - разные, уникальные идентификаторы ссылок - тоже разные. Когда мы значение ссылки открываем в чужой базе, мы не только не сможем определить, что это был за справочник, но даже не сможем понять, что это вообще Справочник, а не Документ или характеристика.

Можно выгружать метаданные из первой конфигурации, с помощью дополнительной обработки делать сопоставление объектов во второй (как минимум по наименованию и типу), а далее эту настройку использовать при загрузке. Но что, если нужных уидов не будет? В загруженных документах будет "объект не найден".
24. Alex17 13.09.19 10:56 Сейчас в теме
У меня задача проще. Был перенос данных из УПП в БУХ 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}

Имея данную информацию можно ли сделать подмену
25. Alex17 13.09.19 11:19 Сейчас в теме
Правильно ли я понимаю что достаточно во всех местах заменить {"#",a86305d7-b8a1-4312-901f-2ade3efdb351,164: на {"#",c92a1124-c41e-42a4-bda7-3bbac9c6039e,188: и ссылка будет работоспособной, у меня не прокатило.
26. Alex17 13.09.19 11:35 Сейчас в теме
Вопрос снят, еще раз спасибо, помогло разобраться.
27. Alex17 13.09.19 18:28 Сейчас в теме
Вот собственно функции, может кому понадобятся

Процедура КоманднаяПанельРезультатСохратьТаблицуВФайлУниверсальная(Кнопка)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогВыбораФайла.Фильтр = "Файл данных (*.txt)|*.txt";
	ДиалогВыбораФайла.Расширение = "txt";
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра = 0;
	
	Если ДиалогВыбораФайла.Выбрать() Тогда
		
		СоответствиеЗамены = ПолучитьСоответствиеЗамены();
		Т = ЗначениеВСтрокуВнутр(РезультатТаблица);
		Для каждого стр Из СоответствиеЗамены Цикл
			Т = СтрЗаменить(Т,стр.Значение,стр.Имя);
			Т = СтрЗаменить(Т,Лев(стр.Значение,36),"_" + стр.Имя);    
		КонецЦикла; 
		
		 ТекстовыйФайл = Новый ТекстовыйДокумент;
		 ТекстовыйФайл.УстановитьТекст(Т);
		 ТекстовыйФайл.Записать(ДиалогВыбораФайла.ПолноеИмяФайла);
		 
	КонецЕсли;
КонецПроцедуры

Процедура КоманднаяПанельРезультатЗагрузитьТаблицуИЗФайлаУниверсальная­(Кнопка)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = "Файл данных (*.txt)|*.txt";
	ДиалогВыбораФайла.Расширение = "txt";
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра = 0;
	
	Если ДиалогВыбораФайла.Выбрать() Тогда
		ТекстовыйФайл = Новый ТекстовыйДокумент;
		ТекстовыйФайл.Прочитать(ДиалогВыбораФайла.ПолноеИмяФайла);
		Т = ТекстовыйФайл.ПолучитьТекст();
		СоответствиеЗамены = ПолучитьСоответствиеЗамены();
		Для каждого стр Из СоответствиеЗамены Цикл
			Т = СтрЗаменить(Т,"_" + стр.Имя,Лев(стр.Значение,36));
			Т = СтрЗаменить(Т,стр.Имя,стр.Значение);
		КонецЦикла;
		
		РезультатТаблица = ЗначениеИзСтрокиВнутр(Т);
		
		ЭлементыФормы.ТаблицаРезультата.СоздатьКолонки();
		ЭлементыФормы.КоманднаяПанельРезультат.Кнопки.ВыполнитьАлгоритм.Доступность = Истина;
	КонецЕсли;  
	ЭлементыФормы.НадписьКолСтрокРезультата.Заголовок = СокрЛП(РезультатТаблица.Количество()) + " строк";

КонецПроцедуры

Функция ПолучитьСоответствиеЗамены()
	
	СоответствиеТипов = Новый ТаблицаЗначений;
	СоответствиеТипов.Колонки.Добавить("Имя");
	СоответствиеТипов.Колонки.Добавить("Значение");
	
	ЗапросТекстИтог = "";
	
	Для каждого стр Из Метаданные.Справочники Цикл
		ЗапросТекст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Ссылка,
		|	""<Имя>"" КАК Имя
		|ИЗ
		|	<Имя>
		|ОБЪЕДИНИТЬ ВСЕ
		|/////////////////////////////
		|";
		ЗапросТекст = СтрЗаменить(ЗапросТекст, "<Имя>", "Справочник." + стр.Имя);
		
		ЗапросТекстИтог = ЗапросТекстИтог + ЗапросТекст;
		
	КонецЦикла;
	
	//Для каждого стр Из Метаданные.Документы Цикл
	//	ЗапросТекст = 
	//	"ВЫБРАТЬ ПЕРВЫЕ 1
	//	|	Ссылка,
	//	|	""<Имя>"" КАК Имя
	//	|ИЗ
	//	|	<Имя>
	//	|ОБЪЕДИНИТЬ ВСЕ
	//	|/////////////////////////////
	//	|";
	//	ЗапросТекст = СтрЗаменить(ЗапросТекст, "<Имя>", "Документ." + стр.Имя);
	//	
	//	ЗапросТекстИтог = ЗапросТекстИтог + ЗапросТекст;
	//	
	//КонецЦикла;
	
	ЗапросТекстИтог = Лев(ЗапросТекстИтог,СтрДлина(ЗапросТекстИтог) - 45);
	
	Запрос = Новый Запрос;
	Запрос.Текст = ЗапросТекстИтог;
	ТЗ = Запрос.Выполнить().Выгрузить();   
	
	Для каждого стр Из ТЗ Цикл
		//"{"#",0b5f521e-459d-4962-86a6-f3a45fe61010,34:810100155d08eb1f11e7e01fe335f24f}"
		Значение = ЗначениеВСтрокуВнутр(стр.Ссылка);
		раз = Найти(Значение,":");
		НоваяСтрока = СоответствиеТипов.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока,стр);
		НоваяСтрока.Значение = Сред(Значение,6,раз - 6);
	КонецЦикла; 
	
	Возврат СоответствиеТипов;
	
КонецФункции
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день