Часто приходилось встречать обмен м/у конфигурациями написанными в 1С 7.7 посредством методов "ЗначениеВСтрокуВнутр" и "ЗначениеВСтрокуВнутр". В настоящее время возникла необходимость написать обмен м/у 7.7 и 8.2. Из 7.7 выгружается таблица значений в которой находятся различного рода данные (за исключением ссылочных). Дабы не переписывать обмен полностью а только на стороне 1С 8.2 предлагаю вашему вниманию заготовку функции по разбору таблицы. Почему заготовку - потому что данная функция работает упрощенно с типами данных, без преобразования, и имеет еще некоторые недостатки которые для моей задачи не существенны. Все же надеюсь что кому то это наработка поможет.
&НаСервере
Функция ПолучитьТаблицуЗначенийИз1С77(Адрес)
Таблица = Новый ТаблицаЗначений;
ЧтениеТХТ = Новый ЧтениеТекста(Адрес);
МассивТипов = Новый Массив;
ИндексСтроки = 0;
//Сформируем массив начальных строк типов данных
МассивТипов.Добавить("{" + """"+ "S"+""""+",");
МассивТипов.Добавить("{" + """"+ "D"+""""+",");
МассивТипов.Добавить("{" + """"+ "N"+""""+",");
МассивТипов.Добавить("{" + """"+ "U"+""""+",");
МассивТипов.Добавить("{" + """"+ "B"+""""+",");
Строка = ЧтениеТХТ.ПрочитатьСтроку();
ПерваяСтрока = Истина;
Пока Строка <> Неопределено Цикл
//Первую строку отбросим
Если ПерваяСтрока Тогда
Строка = ЧтениеТХТ.ПрочитатьСтроку();
ПерваяСтрока = Ложь;
Продолжить;
КонецЕсли;
//Проверим является ли данная строка типом
//Если строка является типом то это есть строка колонки
//Если строка Типом не является то это есть новая колонка
Если СтрДлина(Строка) = 1 Тогда Строка = ЧтениеТХТ.ПрочитатьСтроку(); Продолжить; КонецЕсли;
Если Строка = "}}}}" Тогда Строка = ЧтениеТХТ.ПрочитатьСтроку(); Продолжить; КонецЕсли;
Если Строка = "}," Тогда Строка = ЧтениеТХТ.ПрочитатьСтроку(); Продолжить; КонецЕсли;
//Это строка с названием новой колонки
Если МассивТипов.Найти(Лев(Строка,5)) = Неопределено Тогда
Колонка = СтрЗаменить(Строка, ",", Символы.ПС);
Колонка = СтрПолучитьСтроку(Колонка, 1);
//Уберем дополнительные символы
Колонка = Лев (Колонка, СтрДлина(Колонка) - 1);
Колонка = Прав(Колонка, СтрДлина(Колонка) - 2);
Таблица.Колонки.Добавить(Колонка);
ИндексСтроки = 0;
Иначе//Это строка со значением
Значение = Лев(Строка, СтрДлина(Строка)-3);
Значение =Прав(Значение, СтрДлина(Строка)-29);
//Уберем доп символы кавычек из строки значения
Пока Лев(Значение, 1) = """" Цикл
Значение = Прав(Значение, СтрДлина(Значение)-1);
КонецЦикла;
Пока Прав(Значение, 1) = """" Цикл
Значение = Лев(Значение, СтрДлина(Значение)-1);
КонецЦикла;
//Добавим колонки которых нет
Если Таблица.Количество()< ИндексСтроки+1 Тогда
Таблица.Добавить();
КонецЕсли;
//УстановимЗначениеСтроки
ИскомаяСтрока = Таблица.Получить(ИндексСтроки);
ИскомаяСтрока[Колонка] = Значение;
ИндексСтроки = ИндексСтроки+ 1;
Конецесли;
Строка = ЧтениеТХТ.ПрочитатьСтроку();
КонецЦикла;
Возврат Таблица;
КонецФункции
Использование функции:
1. На выходе из 1С 7.7 мы имеем таблицу с заранее известными колонками. Допустим есть две колонки "Расчетный счет" и "Организация". Значение строк табличной части - номер Р/С и ИНН организации
2. С помощью метода "ЗначениеВСтроку" записываем нашу таблицу в txt файл.
3.В 1С 8.2 в обработке прописываем вызов вышеописаной функции. В качестве параметра - передадим адрес текстового файла полученного в пункте 2.
4. Результатом вызова функции будет таблица аналогичная таблице записанной в текстовый файл в пункте 2.
5. Поскольку структура таблицы в 1С 7.7 нам известна - мы можем привести типы для таблицы полученной в 4. Например даты будут идти строкой типа 20120312, с помощью функции Дата() можно преобразовать ее к нужному типу.
Данная функция используется на практике при переносе платежных поручений из 1С 7.7 в 1С 8.2