Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Длинная строка в таблицу (число прочтений - 2778 )
ssv
Junior Member
**
Отсутствует



Сообщений: 16
Местоположение: Орел
Зарегистрирован: 29. Ноября 2007
Пол: Мужской
Длинная строка в таблицу
18. Марта 2008 :: 07:16
Печать  
Долго искал, но ничего толком не нашел. А ситуация такова:
Есть документ с реквизитом Строка неограниченной длинны. В SQL БД это поле text.
В данный реквизит документа пишется ТаблицаЗначений с преобразованием:
<Реквизит>=ЗначениеВСтроку(<ТаблицаЗначений>).

Соответственно в 1С данные вынимаются как <ТаблицаЗначений>=ЗначениеИзСтроки(<Реквизит>).

Так Вот вопрос в том как прямым запросом разобрать строку и получить таблицу
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Длинная строка в таблицу
Ответ #1 - 18. Марта 2008 :: 07:41
Печать  
Цитата:
Так Вот вопрос в том как прямым запросом разобрать строку и получить таблицу


Таблицу - не знаю как, но вот, что я одно время проделывал с документом - может мысль какая и появится у тебя:

Код
Выбрать все
	DocTA = CreateObject("Document");
	Lst = CreateObject("ValueList");
	Lst.AddValue("O");
	Lst.AddValue("0");
	Lst.AddValue("0");
	Lst.AddValue(TrimAll(RecSet.Fields("IDDOCDEF").Value));
	Lst.AddValue("0");
	Lst.AddValue("0");
	IDDocTA = RecSet.Fields("IDDOC").Value;
	NDTA=""+_strtoID(left(IDDocTA,6))+right(IDDocTA,3);
	NDTA = right("		 "+NDTA, 13);
	Lst.AddValue(NDTA);
	DocTA.FindDocument(ValueFromStringInternal("{"+Lst.ToSeparatedString()+"}"));
	Message(""+ValueTypeStr(DocTA)+" ("+DocTA.Selected()+") {"+Lst.ToSeparatedString()+"}"); 


этот код ищет Документ, преобразуя значения скуля во внутренний формат 1С.
  
Наверх
 
IP записан
 
ssv
Junior Member
**
Отсутствует



Сообщений: 16
Местоположение: Орел
Зарегистрирован: 29. Ноября 2007
Пол: Мужской
Re: Длинная строка в таблицу
Ответ #2 - 18. Марта 2008 :: 08:03
Печать  
sml писал(а) 18. Марта 2008 :: 07:41:
Цитата:
Так Вот вопрос в том как прямым запросом разобрать строку и получить таблицу


Таблицу - не знаю как, но вот, что я одно время проделывал с документом - может мысль какая и появится у тебя:

...................

этот код ищет Документ, преобразуя значения скуля во внутренний формат 1С.


Весь фокус в том, что нужно не в 1с разобрать строку, а в самом запросе.
Я так понимаю нужно сделать процедурку, которая преобразует строку в исходящую таблицу.
ТаблицаЗначений в строке имеет строго определенный формат. Вот только бы пример для начала как разобрать строку.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Длинная строка в таблицу
Ответ #3 - 18. Марта 2008 :: 12:13
Печать  
А  зачем все это?
Если структура ТЗ-шки постоянная - то пиши сразу в СКЛ в доп таблицу, не придется заниматься сбором-разбором.
  
Наверх
ICQ  
IP записан
 
ssv
Junior Member
**
Отсутствует



Сообщений: 16
Местоположение: Орел
Зарегистрирован: 29. Ноября 2007
Пол: Мужской
Re: Длинная строка в таблицу
Ответ #4 - 19. Марта 2008 :: 07:30
Печать  
Salimbek писал(а) 18. Марта 2008 :: 12:13:
А  зачем все это?
Если структура ТЗ-шки постоянная - то пиши сразу в СКЛ в доп таблицу, не придется заниматься сбором-разбором.


Есть система, которая уже давно работает и переделывать ее с использованием дополнительных таблиц просто нерационально (более 70 копий системы, на это поле завязан партионный учет, переделывать более 20 документов).

А понадобилось достать напрямую данные из др. системы. Фактически прямыми запросами преобразовать данные и загнать в др. систему. Делать в 1с файлы выгрузки-загрузки непродуктивно в связи со спецификой. Все работает на самом SQL через специальные job-ы прямым обращением и переливкой данных с одного сервера на другой и в др. систему.


В принципе я в конечном итоге уже написал разбор данных и вот тестирую - все работает на ура. Просто полагал, что кто-то сталкивался и знает какие-то универсальные методы по разбору строк, сделанных 1с. Ведь фактиччески в строку неограниченной длины 1с может загнать практически любую структурированную информацию.
  
Наверх
 
IP записан
 
mov68
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 180
Зарегистрирован: 21. Декабря 2007
Re: Длинная строка в таблицу
Ответ #5 - 19. Марта 2008 :: 15:24
Печать  
Цитата:
[quote author=Salimbek link=1205824610/0#3 date=1205842387]А  зачем все это?
В принципе я в конечном итоге уже написал разбор данных ....


А нельзя ли глянуть?
  
Наверх
 
IP записан
 
ssv
Junior Member
**
Отсутствует



Сообщений: 16
Местоположение: Орел
Зарегистрирован: 29. Ноября 2007
Пол: Мужской
Re: Длинная строка в таблицу
Ответ #6 - 21. Марта 2008 :: 12:38
Печать  
mov68 писал(а) 19. Марта 2008 :: 15:24:
Цитата:
[quote author=Salimbek link=1205824610/0#3 date=1205842387]А  зачем все это?
В принципе я в конечном итоге уже написал разбор данных ....


А нельзя ли глянуть?


Думаю текст запросов ничего не даст. Общий принцип такой:
1. В строке находится строго типизированная таблица значений.
2. Открываешь курсор и разбираешь каждую строку. При разборе загоняешь в таблицу.
3. Потом таблицу можно привертеть к любой др. выборке.

пример на ТЗ с тремя полями:
1 поле строка, 2 поле строка, 3 поле число
Код
Выбрать все
DECLARE tables_cursor CURSOR
   FOR 	SELECT *
	FROM #prom_spis_rekv
OPEN tables_cursor
FETCH NEXT FROM tables_cursor INTO @r,@iddoc
WHILE (@@FETCH_STATUS <> -1) BEGIN

	IF substring(@r,1,18)='{"ТаблицаЗначений"' BEGIN
		SELECT @r=substring(@r,charindex('{{"Товар"',@r,2)+2,len(@r))
		SELECT @r=substring(@r,charindex('{{',@r,2)+2,len(@r))
		set @kolvo=0
		while charindex('},{"Реквизит"',@r,1)>1 BEGIN
			SELECT @kolvo=@kolvo+1
			SELECT @r=substring(@r,charindex('"Строка"',@r,1)+10,len(@r))
			INSERT INTO #spis_rekv (iddoc,rowno,article)
				VALUES(@iddoc,@kolvo,substring(@r,1,charindex('"',@r,2)-1))
			SELECT @r=substring(@r,charindex('"',@r,1)+3,len(@r))
		end

		SELECT @r=substring(@r,charindex('{{',@r,2)+1,len(@r))
		SET @i=1
		while @i<=@kolvo BEGIN
			SELECT @r=substring(@r,charindex('"Строка"',@r,2)+10,len(@r))
			update #spis_rekv
				SET Property=substring(@r,1,charindex('"',@r,2)-1)
				WHERE RowNo=@i AND iddoc=@iddoc
			SELECT @i=@i+1
		END

		SELECT @r=substring(@r,charindex('{{',@r,2)+1,len(@r))
		SET @i=1
		while @i<=@kolvo BEGIN
			SELECT @r=substring(@r,charindex('"Число"',@r,2)+9,len(@r))
			update #spis_rekv
				SET kolvo=cast(rtrim(ltrim(substring(@r,1,charindex('"',@r,2)-1))) as money)
				WHERE RowNo=@i AND iddoc=@iddoc
			SELECT @i=@i+1
		END

	END
	FETCH NEXT FROM tables_cursor INTO @r,@iddoc
END
DEALLOCATE tables_cursor
 


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать