Каталог решений - Значение 1С8 -> ЗначениеВФайл 1C77 (ЗначениеВСтрокуВнутр, ЗначениеВСтроку)

Значение 1С8 -> ЗначениеВФайл 1C77 (ЗначениеВСтрокуВнутр, ЗначениеВСтроку)

Значение 1С8 -> ЗначениеВФайл 1C77 (ЗначениеВСтрокуВнутр, ЗначениеВСтроку)

В наличии

Код который помог мне передавать в платформу 7.7 такие объекты как Структура, Массив (есть возможность передавать таблицу значений)

Категория:

Описание

 Для примера взял составную структуру данных:

  Массив = Новый Массив; 
  Массив.Добавить(1);
  Массив.Добавить(2);
  Массив.Добавить(3);
  Массив.Добавить(4);
  
  Структура = Новый Структура; 
  Структура.Вставить("STR1", 1);
  Структура.Вставить("STR2", 1);
  Структура.Вставить("STR3", 3);
  
  Значение=Новый Структура; 
  Значение.Вставить("Массив",Массив);
  Значение.Вставить("Структура",Структура);
  

Такая структура данных в 1С77 представляется в ввиде:

  Массив = СоздатьОбъект("СписокЗначений"); 
  Массив.ДобавитьЗначение(1);
  Массив.ДобавитьЗначение(2);
  Массив.ДобавитьЗначение(3);
  Массив.ДобавитьЗначение(4);
  
  Структура = СоздатьОбъект("СписокЗначений"); 
  Структура.ДобавитьЗначение(1,"STR1");
  Структура.ДобавитьЗначение(1,"STR2");
  Структура.ДобавитьЗначение(3,"STR3");
  
  Параметр=СоздатьОбъект("СписокЗначений"); 
  Параметр.Установить("Массив", Массив);
  Параметр.Установить("Структура",Структура);
  

Через призму функции ЗначениеВФайл

  {"VL",{
  {{"VL",{
  {{"N","0","0","0","0","0","1"},""},
  {{"N","0","0","0","0","0","2"},""},
  {{"N","0","0","0","0","0","3"},""},
  {{"N","0","0","0","0","0","4"},""}}},"Массив"},
  {{"VL",{
  {{"N","0","0","0","0","0","1"},"STR1"},
  {{"N","0","0","0","0","0","1"},"STR2"},
  {{"N","0","0","0","0","0","3"},"STR3"}}
  },"Структура"}
  }
  }

1) Определил с какими типами данных и как с ними работать (Строка, Число, Булево).

  Функция ЗначениеВСтроку(Значение) Экспорт
  	Если ТипЗнч(Значение) = Тип("Строка") Тогда
  		Возврат СтрокаВСтроку(Значение);
  	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
  		Возврат ЧислоВСтроку(Значение);
   	ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
  		Возврат ДатаВСтроку(Значение);
  	ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
  		Возврат ?(Значение, ЧислоВСтроку(1), ЧислоВСтроку(0));
          // этот участок кода сделан для ссылок где реализовал реквизит 'СсылкаНаОбъект' 
          // в которой содержится значение конкретного элемента справочника (Пример: {"O","0","0","196","0","0","   1089488M  "})
  	// в данном примере не реализовано
          ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Значение)) Тогда
  		ОбъектМетаданных =  Значение.Метаданные();
  		Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Или Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
  			Возврат СсылкаВСтроку(Значение, ОбъектМетаданных);
  		Иначе
  			Возврат СтрокаВСтроку(Значение);
  		КонецЕсли;
  	Иначе
  		Возврат СоставноеЗначениеВСтроку(Значение);	
  	КонецЕсли;
  КонецФункции
  

2) Конвертирую значение в простую строку (формат 1С77)

  Функция Блок(Знач ТипСтрокой, 
  	Знач Ячейка1 = Неопределено, 
  	Знач Ячейка2 = Неопределено, 
  	Знач Ячейка3 = Неопределено, 
  	Знач Ячейка4 = Неопределено, 
  	Знач Ячейка5 = Неопределено, 
  	Знач Ячейка6 = Неопределено, 
  // составной тип ввиду {x,x,x,x,x,x} не должен заключатся в кавычки
  // пример {"VL", {{x,x,x,x,x,x}, "x"}} - правильно
  //        {"VL", {"{x,x,x,x,x,x}", "x"}} - не правильно 
  	БлокДанных = Ложь)
  	
  	МассивДанных = Новый Массив;
  	
  	Если ТипСтрокой <> Неопределено Тогда
  		МассивДанных.Добавить(Ячейка(ТипСтрокой));
  	КонецЕсли;
  	
  // на первом неопределено нужно зарубить иструкцию
  	Если Ячейка1 <> Неопределено Тогда
  		МассивДанных.Добавить(?(БлокДанных, Ячейка1, Ячейка(Ячейка1)));
  		Если Ячейка2 <> Неопределено Тогда
  			МассивДанных.Добавить(?(БлокДанных, Ячейка2, Ячейка(Ячейка2)));
  			Если Ячейка3 <> Неопределено Тогда
  				МассивДанных.Добавить(?(БлокДанных, Ячейка3, Ячейка(Ячейка3)));
  				Если Ячейка4 <> Неопределено Тогда
  					МассивДанных.Добавить(?(БлокДанных, Ячейка4, Ячейка(Ячейка4)));
  					Если Ячейка5 <> Неопределено Тогда
  						МассивДанных.Добавить(?(БлокДанных, Ячейка5, Ячейка(Ячейка5)));
  						Если Ячейка6 <> Неопределено Тогда
  							МассивДанных.Добавить(?(БлокДанных, Ячейка6, Ячейка(Ячейка6)));
  						КонецЕсли;
  					КонецЕсли;
  				КонецЕсли;
  			КонецЕсли;
  		КонецЕсли;
  	КонецЕсли;
  	
  	Возврат "{" + СтрСоединить(МассивДанных, ",") + "}";
  	
  КонецФункции
  
  

3) Особенность каждого значение в блоке возвести все данные в кавычки (даже пустые)

  Функция Ячейка(Значение)
  	Если Значение = Неопределено Тогда
  		Возврат Неопределено;
  	ИначеЕсли Значение = "" Тогда
  		Возврат """""";
  	Иначе
  		Возврат """" + Строка(Значение) + """";
  	КонецЕсли;	
  КонецФункции
  

4) Описываю конвертацию простых типов

  Функция СтрокаВСтроку(Значение)
  	Возврат Блок("S", "0", "0", "0", "0", "0", Значение);
  КонецФункции
  
  Функция ЧислоВСтроку(Значение)
  	Возврат Блок("N", "0", "0", "0", "0", "0", Значение);
  КонецФункции
  
  Функция ДатаВСтроку(Значение)
  	Возврат Блок("D", "0", "0", "0", "0", "0", Формат(Значение, "ДФ=yyyyMMdd"));
  КонецФункции
  

5) Описываю составные значения (СписокЗначений в строковом представлении 1C77 имеет следующий вид: {"VL", {#Значение}})

  Функция СоставноеЗначениеВСтроку(Значение)
  	
  	ПредставлениеЗначения = Новый Массив;
  	ПредставлениеЗначения.Добавить(Ячейка("VL"));
  	
  	ПредставлениеДанных = Новый Массив;
  	Если ТипЗнч(Значение) = Тип("Массив") Тогда
  		Для Индекс = 0 по Значение.Количество() - 1 Цикл
  			ПредставлениеДанных.Добавить(Блок(Неопределено, ЗначениеВСтроку(Значение.Получить(Индекс)), Ячейка(""),,,,,Истина));
  		КонецЦикла
  	ИначеЕсли ТипЗнч(Значение) = Тип("Структура") Тогда
  		Для каждого КлючЗначение Из Значение Цикл
  			ПредставлениеДанных.Добавить(Блок(Неопределено, ЗначениеВСтроку(КлючЗначение.Значение), Ячейка(КлючЗначение.Ключ),,,,,Истина));
  		КонецЦикла
  	ИначеЕсли ТипЗнч(Значение) = Тип("Соответствие") Тогда
  	КонецЕсли;
  	
  	ПредставлениеЗначения.Добавить("{" + СтрСоединить(ПредставлениеДанных, ",") + "}");
  	 
  	Возврат "{" + СтрСоединить(ПредставлениеЗначения, ",") + "}";
  КонецФункции
  
  

При выполнении функции:

  ЗначениеВСтроку(Значение)

где значение — это описание составной коллекции (см. выше) должен дать результат следующего ввида:

  {"VL",{
  {{"VL",{
  {{"N","0","0","0","0","0","1"},""},
  {{"N","0","0","0","0","0","2"},""},
  {{"N","0","0","0","0","0","3"},""},
  {{"N","0","0","0","0","0","4"},""}}},"Массив"},
  {{"VL",{
  {{"N","0","0","0","0","0","1"},"STR1"},
  {{"N","0","0","0","0","0","1"},"STR2"},
  {{"N","0","0","0","0","0","3"},"STR3"}}},"Структура"}}
  }

Что соответствует представлению в 1С77. Вызов функции ЗначениеИзФайла(<ИмяФайла>,<Объект>,<Формат>) возвратить исходное представление значения.

 

P.S. Пример структуры которую я передаю с помощью этих процедур в 1С77 для вызова УниверсальногоОбмена (Конвертация данных):

Формирую в 1С8.3

  ТекстОписаниеОбмена = ТиССервер.ЗначениеВСтроку(Ответ);
  

 Где ответ это составная структура с описанием процесса выгрузки

  {"VL",{
  {{"S","0","0","0","0","0","316b3e20_a8fd_4c94_8ecf_a67a92a5abd6"},"Идентификатор"},
  {{"S","0","0","0","0","0","\\...\resource1C\v7_316b3e20_a8fd_4c94_8ecf_a67a92a5abd6_proc.ert"},"ОбработчикОбмена"},
  {{"S","0","0","0","0","0","\\...\resource1C\v7_316b3e20_a8fd_4c94_8ecf_a67a92a5abd6_rules.xml"},"ПравилаОбмена"},
  {{"S","0","0","0","0","0","\\...\resource1C\"},"КаталогФайлов"},
  {{"D","0","0","0","0","0",""},"НачалоПериода"},
  {{"D","0","0","0","0","0","20210419"},"КонецПериода"},
  {{"S","0","0","0","0","0","export_data"},"Команда"},
  {{"S","0","0","0","0","0","refБанковскиеСчета,ref"},"ИспользуемыеПравила"},
  {{"N","0","0","0","0","0","0"},"КоличествоЭлементов"},
  {{"N","0","0","0","0","0","0"},"РежимРазработчика"},
  {{"VL",{
     {{"VL",{
      {{"N","0","0","0","0","0","0"},"Использовать"},
      {{"S","0","0","0","0","0","ТекущийЭлемент"},"ПолеОтбора"}, 
      {{"S","0","0","0","0","0","="},"Условие"},
      {{"B","0","0","1414","0","0","        70M  "},"Значение"},
      {{"S","0","0","0","0","0","Справочник"},"ТипОбъекта"},
      {{"S","0","0","0","0","0","БанковскиеСчета"},"Объект"},
      {{"N","0","0","0","0","0","0"},"Длина"},
      {{"N","0","0","0","0","0","0"},"Точность"}}},""}}},"ТаблицаНастройкиОтбора"}}}
  

Конвертация данного значения в СписокЗначение 1С77 происходит простым способом

  если winhttprequest.Status = 200 тогда
  	значениеизфайла(winhttprequest.responsetext,результат);
  	если результат = мпустоезначение тогда
  		сообщить("ошибка обработки параметров get запроса");
  	конецесли;
  конецесли;

 

Получение информации об обмене описываю функцией след содержания:

  ...
  
  записать_лог("RN(export_data)");
  	        
  результатобмена = "";
  	
  обработчикобмена = параметры.получить("ОбработчикОбмена");
  Если существует_файл(обработчикобмена) = 0 Тогда
  	Возврат результатобмена;
  КонецЕсли; 
  	
  правилаобмена = параметры.получить("ПравилаОбмена"); 
  Если существует_файл(правилаобмена) = 0 Тогда
  	Возврат результатобмена;
  КонецЕсли; 
  	
  каталогфайлов = параметры.Получить("КаталогФайлов");
  результатобмена = каталогфайлов + "v7_" + идентификатор + "_data.xml";
  	
  параметрыформы = СоздатьОбъект("СписокЗначений");
  параметрыформы.Установить("ИмяФайлаПравил", правилаобмена);
  	
  параметрыформы.Установить("ИмяФайлаДанных", результатобмена);
  	
  датаначала = параметры.Получить("НачалоПериода");
  параметрыформы.Установить("ДатаНачала", датаначала); 
  	
  датаконец = параметры.Получить("КонецПериода");
  параметрыформы.Установить("ДатаОкончания", датаконец); 
  	
  параметрыформы.Установить("ИмяКоманды", "Выгрузить"); 
  	
  ТаблицаНастройкиПараметров = СоздатьОбъект("СписокЗначений"); 
  ТаблицаНастройкиПараметров.ДобавитьЗначение(параметры.Получить("КоличествоЭлементов"),"КоличествоОбъектов");
  ТаблицаНастройкиПараметров.ДобавитьЗначение(параметры.Получить("РежимРазработчика"),"РежимРазработчика");
  параметрыформы.Установить("ТаблицаНастройкиПараметров", ТаблицаНастройкиПараметров);    
  	
  // Конвертировать в ТЗ
  МассивСтрок = параметры.Получить("ТаблицаНастройкиОтбора");
  	
  параметрыформы.Установить("КомментироватьВыгрузкуОбъектов", 0);
  параметрыформы.Установить("ИспользуемыеПравилаВыгрузки", параметры.получить("ИспользуемыеПравила"));	
  параметрыформы.Установить("ИмяАлгоритма");
  	
  Сообщить("Начал <" + идентификатор + ">"); 
  	
  ОткрытьФорму("Обработка", параметрыформы, обработчикобмена); 
  	
  Сообщить("Окончил <" + идентификатор + ">");
  
  описаниеошибок = параметрыформы.получить("СписокОшибок");
  	
  Если описаниеошибок = ПолучитьПустоеЗначение() Тогда
  	записать_лог("DSCR(Данные выгружены)");
  Иначе
  	записать_лог("DSCR(" + описаниеошибок + ")");
  КонецЕсли; 
  	
  ...
  

 

has been added to your cart:
Оформление заказа