Как из txt файла загрузить данные в новый документ через внешнюю обработку.

1. G_112691538235479115945 22.03.21 12:10 Сейчас в теме
Добрый день.
Суть вопроса. Есть обработка позволяющая выгрузить любой выбранный документ в txt файл вот в таком виде:
ПоступлениеТоваров
17.03.2021 18:13:17
Контрагент=Частное лицо
ДоговорКонтрагента=покупка 1
Номенклатура=стул
Цена=24 124
Количество=1
Сумма=24 124

Где первые 2 строки это наименование документа и его дата.
Нужно написать обработку позволяющую загрузить эти данные в новый созданный документ.
Часть кода я уже написал. сейчас вопрос каки образом можно перечислить реквизиты шапки и реквизитыТЧ найти эти же реквизиты в текстовом файлы взять от туда значения и прописать в документ?
код который сейчас создает документ только с датой.
[1C-CODE
По теме из базы знаний
Найденные решения
18. nomad_irk 81 23.03.21 13:01 Сейчас в теме
(17)
ПолноеИмя = ДокументОбъект.РеквизитДоговорыКонтрагентов.Метаданные().ПолноеИмя()
G_112691538235479115945; +1 Ответить
35. G_112691538235479115945 24.03.21 14:14 Сейчас в теме
в итоге родил такую обработку. не судите строго это в принципе первое что я самостоятельно написал.
&НаСервере
Процедура выгрузитьНаСервере(ДокСсылка)   
    Текст = Новый ТекстовыйДокумент;

//получаем имя документа и дату создания
    ИмяДокумента = ДокСсылка.Метаданные().Имя;
    ДатаДокумента = ДокСсылка.Дата;
//прописываем первыми 2 строками имя документа и дату    
    текст.ДобавитьСтроку("" + ИмяДокумента);
    текст.ДобавитьСтроку("" + ДатаДокумента);

//перебираем все имеющиеся реквизиты шапки документа
для каждого Шреквизит из ДокСсылка.метаданные().Реквизиты цикл
//проверяем если реквизит имеет тип справочникссылка
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Докссылка[""+Шреквизит.имя])) = ложь тогда
//проверяем если реквизит имеет тип перечисление    
        если перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Докссылка[""+Шреквизит.имя]))=ложь тогда
            текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя])
        иначе
            ПолноеИмяПеречисления=ДокСсылка[Шреквизит.имя].метаданные().имя;
            текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя]+"#"+ПолноеИмяПеречисления)
        конецесли;
    иначе
        ПолноеИмяСпр=ДокСсылка[Шреквизит.имя].метаданные().имя;
        текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя].код+"&"+ПолноеИмяСпр);
    конецесли;
конецЦикла;

//заполняем реквизитытабличных частей документа
Для каждого ТабЧасть из докссылка.Метаданные().ТабличныеЧасти Цикл        //Определеяем имена табличных частей
    Для каждого ТекСтрока из Докссылка[ТабЧасть.имя] цикл                    //используя имя табличной части получить строки ТЧ
        для каждого ТЧреквизит из Табчасть.реквизиты цикл                         //находясь на строке ТЧ перебираем реквизиты ТЧ     
//проверяем если реквизит имеет тип справочникссылка    
            Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ТекСтрока[""+ТЧреквизит.имя])) = ложь тогда
                текст.ДобавитьСтроку("ТабличныеЧасти;"+ТабЧасть.Имя+"'"+ ТЧреквизит.Имя+"="+ТекСтрока[""+ТЧреквизит.имя]);
            иначе
                текст.ДобавитьСтроку("ТабличныеЧасти;"+ТабЧасть.Имя+"'"+ ТЧреквизит.Имя+"="+ТекСтрока[""+ТЧреквизит.имя].код);
            конецесли;    
        КонецЦикла;    
    КонецЦикла;      
КонецЦикла;

//записывае текст в файл
    Текст.Записать(сохранитькак);
КонецПроцедуры

&НаКлиенте
Процедура выгрузить(Команда)
    ВыгрузитьНаСервере(ДокСсылка);
КонецПроцедуры


&НаСервере
    Процедура загрузитьНаСервере()
    Документ = Новый ТекстовыйДокумент;
    Документ.Прочитать(ПутьКФайлу,КодировкаТекста.UTF8);
//так как мы значем точно,что первые 2 строки текстового файла, это название документа и его дата то сразу прописываем переменные    
Для Индекс = 1 По Документ.КоличествоСтрок() Цикл
    НаименованиеДокумента=документ.ПолучитьСтроку(1);
    ДатаДокумента=документ.ПолучитьСтроку(2);
КонецЦикла;
//создаем документ с наименование документа из текстового файла и прописываем ему дату.
    Новыйдокумент = документы[НаименованиеДокумента].СоздатьДокумент();
    Новыйдокумент.Дата = Дата(ДатаДокумента);
//так как первые 2 строки уже определены,они нам не нужны по этому начинаем цикл с 3 строки
Для Индекс = 3 По Документ.КоличествоСтрок() Цикл
    Стр = Документ.Получитьстроку(Индекс);
//прописываем разделители
    Разделитель = найти(стр,"=");
    РазделительТЧ=найти(стр,"'");
    РазделительУТЧ=найти(стр,";");
    РазделительТСпр = найти(стр,"&");
    РазделительПеречисления = найти(стр,"#");
//получаем имена,значения и тип реквизитов.
    КодЗначения=сред(стр,Разделитель+1,РазделительТСпр-Разделитель-1);
    НаименованиеРеквизита = Лев(стр,Разделитель-1);
    ПолноеИмяСпр=сред(стр,РазделительТСпр+1);
    ПолноеИмяПеречисления = сред(стр,РазделительПеречисления+1);
    НаименованиеПер=сред(стр,Разделитель+1,РазделительПеречисления-Разделитель-1);
    ИмяТЧ=сред(стр,РазделительУТЧ+1,РазделительТЧ-РазделительУТЧ-1);
    НаименованиеРТЧ=сред(стр,РазделительТЧ+1,Разделитель-РазделительТЧ-1);
    УсловиеДляТЧ= Найти(стр,"ТабличныеЧасти");
//проверяеместь ли упоминание, что это реквизит ТЧ
Если УсловиеДляТЧ=0 тогда
//Получаем реквизит шапки
    Шреквизит=НовыйДокумент.Метаданные().Реквизиты[НаименованиеРеквизита];
//проверяем есть ли упоминание что этот реквизит должен быть справочникссылка. если да то ищем по коду,получаем ссылку и присваиваем значение реквизиту     
        если РазделительТСпр <> 0  тогда
            Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
            новыйдокумент[""+Шреквизит.имя]=Элемент; 
        иначе
//проверяем есть ли упоминание что это перечисление.если да то получаем перечисление и прописываем его в значение, если нет то просто берем значение и прописываем его в реквизит 
            если РазделительПеречисления <> 0 тогда
                перечисление = перечисления[полноеимяперечисления][наименованиеПер];
                новыйдокумент[""+Шреквизит.имя]=перечисление; 
            иначе
                новыйдокумент[""+Шреквизит.имя]=КодЗначения;
            конецесли;
        конецесли;
иначе
//получаем реквизит ТЧ
    ТЧреквизит=Новыйдокумент.метаданные().ТабличныеЧасти[ИмяТЧ].реквизиты[НаименованиеРТЧ];
//так как у нас в документах во всех ТЧ есть реквизит "номенклатура" то по нему будем определять нужно ли создовать новую строку в ТЧ    
        Если НаименованиеРТЧ="Номенклатура" тогда
        НоваяСтрока = новыйдокумент[ИмяТЧ].Добавить();
//проверяем если реквизит имеет тип справочникссылка(у нас в документах состовной тип данных есть только в реквизитах шапки по этому там сделанно по другому)
            если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСтрока[""+ТЧреквизит.имя])) = истина тогда
                ПолноеИмяСпр=НоваяСтрока[ТЧреквизит.имя].метаданные().имя;
                Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
                НоваяСтрока[""+ТЧреквизит.имя]=Элемент;
            иначе
                НоваяСтрока[ТЧреквизит.имя] = КодЗначения; 
            конецЕсли;
        иначе
            если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСтрока[""+ТЧреквизит.имя])) = истина тогда
                ПолноеИмяСпр=НоваяСтрока[ТЧреквизит.имя].метаданные().имя;
                Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
                НоваяСтрока[""+ТЧреквизит.имя]=Элемент;
            иначе
                НоваяСтрока[ТЧреквизит.имя] = КодЗначения; 
            конецЕсли;
        конецЕсли;
конецЕсли;
КонецЦикла;    
    Новыйдокумент.записать();
КонецПроцедуры

&НаКлиенте
Процедура загрузить(Команда)
    загрузитьНаСервере();
КонецПроцедуры


&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу;
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
    + "(*.txt)|*.txt";
    ДиалогВыбораФайла.Фильтр = Фильтр;
    ДиалогВыбораФайла.МножественныйВыбор = Ложь;
    ДиалогВыбораФайла.Заголовок = "Выберите каталог";
                                                                     
    ОповещениеЗавершения = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
    
    ДиалогВыбораФайла.Показать(ОповещениеЗавершения);

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

&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        ПутьКФайлу = ВыбранныеФайлы[0];
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
   Процедура СохранитьКакНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Сохранение;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(Режим);
    
    ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу;
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
    + "(*.txt)|*.txt";
    ДиалогВыбораФайла.Фильтр = Фильтр;
    ДиалогВыбораФайла.МножественныйВыбор = Ложь;
    ДиалогВыбораФайла.Заголовок = "Выберите каталог";
                                                                     
    Оповещения = Новый ОписаниеОповещения("СохранениеФайлаЗавершение", ЭтаФорма);
    
    ДиалогВыбораФайла.Показать(Оповещения);

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

&НаКлиенте
Процедура СохранениеФайлаЗавершение(ВыбранныеФайлыС, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлыС <> Неопределено Тогда
        сохранитькак = ВыбранныеФайлыС[0];
    КонецЕсли;
КонецПроцедуры






Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. glek 119 22.03.21 13:36 Сейчас в теме
(1) У Вас неправильная структура файла для начала:
Секция документа должна быть однозначно определена например текстом НачалоДокумента. А дальше уже дело техники разобрать файл
8. tusv 212 22.03.21 13:52 Сейчас в теме
(7) Тут можно проверить и на Метаданные.Документы.Найти()
Типа так
Перем ТекущийДокумент;
// --- бла бла бла
Если не  Метаданные.Документы.Найти(ТекущаяСтрока) = неопределено Тогда
   Если не ТекущийДокумент = Неопределено Тогда
       //Записываем предыдущий документ;
       ТекущийДокумент.Записать();
   КонецЕсли;
   ТекущийДокумент = Документы[ТекущаяСтрока].СоздатьДокумент();
КонецЕсли;
Показать
2. DenisVol 2 22.03.21 12:17 Сейчас в теме
Если знаете структуру txt и она всегда одинаковая то читайте строку файла, находите в строке свои данные и заполняйте документ
3. G_112691538235479115945 22.03.21 12:31 Сейчас в теме
(2) заранее незнаем. в том то и сложность, что выгруженный документ всегда может быть разный. соответственно набор реквизитов неизвестен заранее.
4. user633533_encantado 12 22.03.21 12:41 Сейчас в теме
(3) При загрузке ищите по метаданным наличие реквизита по имени, если есть - заполняйте.
5. G_112691538235479115945 22.03.21 12:43 Сейчас в теме
(4)можно пример кода. знаний не хватает.
6. user633533_encantado 12 22.03.21 13:05 Сейчас в теме
(5) Обработку для вас написать ? ;)

И что значит "взять из файла значение", у вас это просто строки, их как-то надо будет обрабатывать при чтении, искать в базе по наименованию, например, а значит надо понимать какой это справочник.
Т.е. простого решения не будет.
Kovekh; succub1_5; +2 Ответить
9. G_112691538235479115945 23.03.21 12:37 Сейчас в теме
(6)в общем после долгого шевеления мозгами родил такой код.
Процедура загрузитьНаСервере()

Документ = Новый ТекстовыйДокумент;
Документ.Прочитать("C:\1C\2.txt",КодировкаТекста.UTF8);

Для Индекс = 1 По Документ.КоличествоСтрок() Цикл

НаименованиеДокумента=документ.ПолучитьСтроку(1);
ДатаДокумента=документ.ПолучитьСтроку(2);
КонецЦикла;
Для Индекс = 3 По Документ.КоличествоСтрок() Цикл
Стр = Документ.Получитьстроку(Индекс);
Разделитель = найти(стр,"=");
//РазделительКода = найти(стр,";");
КодЗначения=сред(стр,Разделитель+1);
Наименование = Лев(стр,разделитель-1);
Значение = сред(стр,Разделитель+1);

Новыйдокумент = документы[НаименованиеДокумента].СоздатьДокумент();
Новыйдокумент.Дата = Дата(ДатаДокумента); 

для каждого Шреквизит из Новыйдокумент.метаданные().Реквизиты цикл
    ИмяСправочника=""+ ТипЗнч(Новыйдокумент[""+Шреквизит.имя]);
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Новыйдокумент[""+Шреквизит.имя])) = истина тогда
Элемент = Справочники[ИмяС
правочника].найтипокоду(Значение).получитьОбъект();        
Новыйдокумент[""+Шреквизит.имя]=Элемент иначе
Новыйдокумент[Шреквизит.имя].Наименование=Значение;
Сообщить(Новыйдокумент[""+Шреквизит.имя].код+ "==="+Новыйдокумент[Шреквизит.имя].Наименование);

конецесли;
КонецЦикла;    
КонецЦикла;    
//НовыйДокумент.записать();
КонецПроцедуры

Показать

есть ИмяСправочника одним словом то все нормально но если к примеру 2 словами например Договор Контрагента то соответственно выдает ошибку. как еще можно получить название справочника?
10. nomad_irk 81 23.03.21 12:42 Сейчас в теме
(9)Выгружайте в файл одним словом: ДоговорКонтрагента, либо убирате пробелы при загрузке с помощью СтрЗаменить()
12. G_112691538235479115945 23.03.21 12:45 Сейчас в теме
(10)а через метаданные нового документа разве никак нельзя получить имя справочника в виде "ДоговорыКонтрагентов"
14. nomad_irk 81 23.03.21 12:46 Сейчас в теме
(12)Можно получить полное имя объекта метаданных, например: Справочник.ДоговорыКонтрагентов
13. FatPanzer 23.03.21 12:46 Сейчас в теме
(10) Насколько я знаю - он не заведует выгрузкой. Он получает готовые файлы откуда-то со стороны.
15. nomad_irk 81 23.03.21 12:49 Сейчас в теме
(13)В таком случае могут быть проблемы с определением типа объекта и упасихоспади иметь в конфигурации одноименные объекты разных типов.
11. DenisVol 2 23.03.21 12:43 Сейчас в теме
(10) верно, как вариант убрать пробелы, т.к. идентификаторы (наименования справочников, документов и других метаданных) пишутся без пробелов
16. FatPanzer 23.03.21 12:52 Сейчас в теме
(11) Я вам скажу больше - наименования справочников и их синонимы иногда вообще не совпадают!
nomad_irk; +1 Ответить
17. G_112691538235479115945 23.03.21 12:58 Сейчас в теме
так я немного запутался. в итоге как получить имя справочника в виде ДоговорыКонтрагентов из реквизита документа с типом справочникссылка. потому что если я выбирают типзнч то он мне выдает тип в виде "Договоры Контрагентов". как еще получить я пока не знаю подскажите пожалуйста.
18. nomad_irk 81 23.03.21 13:01 Сейчас в теме
(17)
ПолноеИмя = ДокументОбъект.РеквизитДоговорыКонтрагентов.Метаданные().ПолноеИмя()
G_112691538235479115945; +1 Ответить
19. G_112691538235479115945 23.03.21 13:13 Сейчас в теме
(18)спасибо получил в итоге для своего кода вот таким способом ПолноеИмяСправочника= Новыйдокумент[Шреквизит.Имя].Метаданные().Полноеимя()
20. G_112691538235479115945 23.03.21 14:30 Сейчас в теме
в результате выполнения кода не присваиваются значения для реквизитов с типом справочникссылка. в чем ошибка?
Для Индекс = 3 По Документ.КоличествоСтрок() Цикл
Стр = Документ.Получитьстроку(Индекс);
Разделитель = найти(стр,"=");
КодЗначения=сред(стр,Разделитель+1);
НаименованиеСпр = Лев(стр,разделитель-1);

Шреквизит=Новыйдокумент.метаданные().Реквизиты[наименованиеспр];
ПолноеИмяСпр=Новыйдокумент[Шреквизит.имя].метаданные().имя;
Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).получитьОбъект();
новыйдокумент[""+Шреквизит.имя]=Элемент;

сообщить(новыйдокумент[""+Шреквизит.имя]);
Показать
21. FatPanzer 23.03.21 14:33 Сейчас в теме
(20) Ну естественно. Ссылочному реквизиту нельзя присвоить объектное значение...
G_112691538235479115945; +1 Ответить
22. G_112691538235479115945 23.03.21 14:33 Сейчас в теме
(21)как тогда вставить значение?
23. FatPanzer 23.03.21 14:34 Сейчас в теме
(22) Надо просто вставлять значение правильного типа. Ссылочного.
Я разве пишу не в той кодировке?
24. G_112691538235479115945 23.03.21 14:37 Сейчас в теме
(23)я понял что нужно вставить значение ссылочного типа. как получить ссылку на элемент справочника?
25. G_112691538235479115945 23.03.21 14:39 Сейчас в теме
(24)отбой вопроса сделал так Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка; получил значение с типом справочник ссылка.
26. FatPanzer 23.03.21 14:47 Сейчас в теме
(25) А можно еще и вот так:
Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).Cсылка.Cсылка.Cсылка.Cсылка.Cсылка.Cсылка;
27. G_112691538235479115945 23.03.21 18:15 Сейчас в теме
вопрос почему вот такое выражение не работает ТЧреквизит=Новыйдокумент.метаданные()[наименованиеспр];
в наименованиеспр я передаю ТабличныеЧасти.Товары.Реквизиты.Номенклатура
28. SlavaKron 23.03.21 18:19 Сейчас в теме
(27) Потому что у объекта Новыйдокумент.метаданные() нет свойства "ТабличныеЧасти.Товары.Реквизиты.Номенклатура", есть свойство "ТабличныеЧасти".
G_112691538235479115945; +1 Ответить
29. G_112691538235479115945 23.03.21 18:56 Сейчас в теме
30. G_112691538235479115945 24.03.21 07:32 Сейчас в теме
(28)хорошо тогда так почему не работает ТЧреквизит=Новыйдокумент.метаданные().ТабличныеЧасти[ИмяТЧ].реквизиты[НаименованиеРТЧ];
где ИмяТЧ=товары НаименованиеРТЧ=Номенклатура
31. SlavaKron 24.03.21 07:45 Сейчас в теме
(30)
почему не работает
Если в документе есть табличная часть "Товары" с реквизитом "Номенклатура", то должно работать, иначе смотрите описание ошибки. Ваш код можно сделать безопаснее:
МетаданныеТЧ = Новыйдокумент.Метаданные().ТабличныеЧасти.Найти(ИмяТЧ);
Если МетаданныеТЧ <> Неопределено Тогда
    МетаданныеРеквизита = МетаданныеТЧ.Реквизиты.Найти(НаименованиеРТЧ);
    Если МетаданныеРеквизита <> Неопределено Тогда
            
    КонецЕсли;
КонецЕсли;
32. G_112691538235479115945 24.03.21 07:53 Сейчас в теме
(31)ошибка вот такая
{Обработка.ВыгрузкаФайлов.Форма.Форма.Форма(87)}: Поле объекта не обнаружено (Товары')
ТЧреквизит=Новыйдокумент.метаданные().ТабличныеЧасти[ИмяТЧ].реквизиты[НаименованиеРТЧ];
при этом Табличная часть с названием Товары в документе есть.
в отладчике во такая строка вычисляется. мб есть какие то нюансы?
Новыйдокумент.метаданные().ТабличныеЧасти.Товары.реквизиты.номенклатура
33. SlavaKron 24.03.21 07:57 Сейчас в теме
(32)
Товары'
Апостроф - опечатка?
G_112691538235479115945; +1 Ответить
34. G_112691538235479115945 24.03.21 08:07 Сейчас в теме
(33)точняк. неправильно посчитал количество символов. спасибо.
35. G_112691538235479115945 24.03.21 14:14 Сейчас в теме
в итоге родил такую обработку. не судите строго это в принципе первое что я самостоятельно написал.
&НаСервере
Процедура выгрузитьНаСервере(ДокСсылка)   
    Текст = Новый ТекстовыйДокумент;

//получаем имя документа и дату создания
    ИмяДокумента = ДокСсылка.Метаданные().Имя;
    ДатаДокумента = ДокСсылка.Дата;
//прописываем первыми 2 строками имя документа и дату    
    текст.ДобавитьСтроку("" + ИмяДокумента);
    текст.ДобавитьСтроку("" + ДатаДокумента);

//перебираем все имеющиеся реквизиты шапки документа
для каждого Шреквизит из ДокСсылка.метаданные().Реквизиты цикл
//проверяем если реквизит имеет тип справочникссылка
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Докссылка[""+Шреквизит.имя])) = ложь тогда
//проверяем если реквизит имеет тип перечисление    
        если перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Докссылка[""+Шреквизит.имя]))=ложь тогда
            текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя])
        иначе
            ПолноеИмяПеречисления=ДокСсылка[Шреквизит.имя].метаданные().имя;
            текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя]+"#"+ПолноеИмяПеречисления)
        конецесли;
    иначе
        ПолноеИмяСпр=ДокСсылка[Шреквизит.имя].метаданные().имя;
        текст.ДобавитьСтроку(""+ Шреквизит.Имя+"="+Докссылка[""+Шреквизит.имя].код+"&"+ПолноеИмяСпр);
    конецесли;
конецЦикла;

//заполняем реквизитытабличных частей документа
Для каждого ТабЧасть из докссылка.Метаданные().ТабличныеЧасти Цикл        //Определеяем имена табличных частей
    Для каждого ТекСтрока из Докссылка[ТабЧасть.имя] цикл                    //используя имя табличной части получить строки ТЧ
        для каждого ТЧреквизит из Табчасть.реквизиты цикл                         //находясь на строке ТЧ перебираем реквизиты ТЧ     
//проверяем если реквизит имеет тип справочникссылка    
            Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ТекСтрока[""+ТЧреквизит.имя])) = ложь тогда
                текст.ДобавитьСтроку("ТабличныеЧасти;"+ТабЧасть.Имя+"'"+ ТЧреквизит.Имя+"="+ТекСтрока[""+ТЧреквизит.имя]);
            иначе
                текст.ДобавитьСтроку("ТабличныеЧасти;"+ТабЧасть.Имя+"'"+ ТЧреквизит.Имя+"="+ТекСтрока[""+ТЧреквизит.имя].код);
            конецесли;    
        КонецЦикла;    
    КонецЦикла;      
КонецЦикла;

//записывае текст в файл
    Текст.Записать(сохранитькак);
КонецПроцедуры

&НаКлиенте
Процедура выгрузить(Команда)
    ВыгрузитьНаСервере(ДокСсылка);
КонецПроцедуры


&НаСервере
    Процедура загрузитьНаСервере()
    Документ = Новый ТекстовыйДокумент;
    Документ.Прочитать(ПутьКФайлу,КодировкаТекста.UTF8);
//так как мы значем точно,что первые 2 строки текстового файла, это название документа и его дата то сразу прописываем переменные    
Для Индекс = 1 По Документ.КоличествоСтрок() Цикл
    НаименованиеДокумента=документ.ПолучитьСтроку(1);
    ДатаДокумента=документ.ПолучитьСтроку(2);
КонецЦикла;
//создаем документ с наименование документа из текстового файла и прописываем ему дату.
    Новыйдокумент = документы[НаименованиеДокумента].СоздатьДокумент();
    Новыйдокумент.Дата = Дата(ДатаДокумента);
//так как первые 2 строки уже определены,они нам не нужны по этому начинаем цикл с 3 строки
Для Индекс = 3 По Документ.КоличествоСтрок() Цикл
    Стр = Документ.Получитьстроку(Индекс);
//прописываем разделители
    Разделитель = найти(стр,"=");
    РазделительТЧ=найти(стр,"'");
    РазделительУТЧ=найти(стр,";");
    РазделительТСпр = найти(стр,"&");
    РазделительПеречисления = найти(стр,"#");
//получаем имена,значения и тип реквизитов.
    КодЗначения=сред(стр,Разделитель+1,РазделительТСпр-Разделитель-1);
    НаименованиеРеквизита = Лев(стр,Разделитель-1);
    ПолноеИмяСпр=сред(стр,РазделительТСпр+1);
    ПолноеИмяПеречисления = сред(стр,РазделительПеречисления+1);
    НаименованиеПер=сред(стр,Разделитель+1,РазделительПеречисления-Разделитель-1);
    ИмяТЧ=сред(стр,РазделительУТЧ+1,РазделительТЧ-РазделительУТЧ-1);
    НаименованиеРТЧ=сред(стр,РазделительТЧ+1,Разделитель-РазделительТЧ-1);
    УсловиеДляТЧ= Найти(стр,"ТабличныеЧасти");
//проверяеместь ли упоминание, что это реквизит ТЧ
Если УсловиеДляТЧ=0 тогда
//Получаем реквизит шапки
    Шреквизит=НовыйДокумент.Метаданные().Реквизиты[НаименованиеРеквизита];
//проверяем есть ли упоминание что этот реквизит должен быть справочникссылка. если да то ищем по коду,получаем ссылку и присваиваем значение реквизиту     
        если РазделительТСпр <> 0  тогда
            Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
            новыйдокумент[""+Шреквизит.имя]=Элемент; 
        иначе
//проверяем есть ли упоминание что это перечисление.если да то получаем перечисление и прописываем его в значение, если нет то просто берем значение и прописываем его в реквизит 
            если РазделительПеречисления <> 0 тогда
                перечисление = перечисления[полноеимяперечисления][наименованиеПер];
                новыйдокумент[""+Шреквизит.имя]=перечисление; 
            иначе
                новыйдокумент[""+Шреквизит.имя]=КодЗначения;
            конецесли;
        конецесли;
иначе
//получаем реквизит ТЧ
    ТЧреквизит=Новыйдокумент.метаданные().ТабличныеЧасти[ИмяТЧ].реквизиты[НаименованиеРТЧ];
//так как у нас в документах во всех ТЧ есть реквизит "номенклатура" то по нему будем определять нужно ли создовать новую строку в ТЧ    
        Если НаименованиеРТЧ="Номенклатура" тогда
        НоваяСтрока = новыйдокумент[ИмяТЧ].Добавить();
//проверяем если реквизит имеет тип справочникссылка(у нас в документах состовной тип данных есть только в реквизитах шапки по этому там сделанно по другому)
            если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСтрока[""+ТЧреквизит.имя])) = истина тогда
                ПолноеИмяСпр=НоваяСтрока[ТЧреквизит.имя].метаданные().имя;
                Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
                НоваяСтрока[""+ТЧреквизит.имя]=Элемент;
            иначе
                НоваяСтрока[ТЧреквизит.имя] = КодЗначения; 
            конецЕсли;
        иначе
            если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСтрока[""+ТЧреквизит.имя])) = истина тогда
                ПолноеИмяСпр=НоваяСтрока[ТЧреквизит.имя].метаданные().имя;
                Элемент = Справочники[ПолноеИмяСпр].найтипокоду(КодЗначения).ссылка;
                НоваяСтрока[""+ТЧреквизит.имя]=Элемент;
            иначе
                НоваяСтрока[ТЧреквизит.имя] = КодЗначения; 
            конецЕсли;
        конецЕсли;
конецЕсли;
КонецЦикла;    
    Новыйдокумент.записать();
КонецПроцедуры

&НаКлиенте
Процедура загрузить(Команда)
    загрузитьНаСервере();
КонецПроцедуры


&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу;
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
    + "(*.txt)|*.txt";
    ДиалогВыбораФайла.Фильтр = Фильтр;
    ДиалогВыбораФайла.МножественныйВыбор = Ложь;
    ДиалогВыбораФайла.Заголовок = "Выберите каталог";
                                                                     
    ОповещениеЗавершения = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
    
    ДиалогВыбораФайла.Показать(ОповещениеЗавершения);

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

&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        ПутьКФайлу = ВыбранныеФайлы[0];
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
   Процедура СохранитьКакНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Сохранение;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(Режим);
    
    ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу;
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
    + "(*.txt)|*.txt";
    ДиалогВыбораФайла.Фильтр = Фильтр;
    ДиалогВыбораФайла.МножественныйВыбор = Ложь;
    ДиалогВыбораФайла.Заголовок = "Выберите каталог";
                                                                     
    Оповещения = Новый ОписаниеОповещения("СохранениеФайлаЗавершение", ЭтаФорма);
    
    ДиалогВыбораФайла.Показать(Оповещения);

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

&НаКлиенте
Процедура СохранениеФайлаЗавершение(ВыбранныеФайлыС, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлыС <> Неопределено Тогда
        сохранитькак = ВыбранныеФайлыС[0];
    КонецЕсли;
КонецПроцедуры






Показать
36. Vix 29 24.03.21 19:40 Сейчас в теме
(35) Если выгрузку в текстовый файл писали тоже вы, советую сделать через JSON, там и структура файла будет и парсить очень легко, не говоря уже о скорости выгрузки и загрузки, а так же длине кода.
37. G_112691538235479115945 01.04.21 14:18 Сейчас в теме
Добрый день. продолжаю допиливать данную обработку. теперь столкнулся вот с реквизитом у которого значение выглядит вот в таком виде:
{

"value": "Москва Нагорная улица 34",

"comment": "",

"type": "Адрес",

"country": "РОССИЯ",

"addressType": "Муниципальный"

}
как мне сказать системе при загрузке что все что сидит в скобках это значение для выбранного реквизита?
38. user856012 14 01.04.21 14:39 Сейчас в теме
(37)
как мне сказать системе при загрузке что все что сидит в скобках это значение для выбранного реквизита?
Сначала погуглить "1С загрузка JSON"
39. G_112691538235479115945 01.04.21 15:02 Сейчас в теме
(38)
1С загрузка JSON
т.е. другого варианта нет нужно всю выгрузку переделывать через Json?
40. user856012 14 01.04.21 16:46 Сейчас в теме
(39)
нужно всю выгрузку переделывать через Json?
Зачем "всю"? Только этот реквизит: выделить его как строку JSON и прочитать, методика неоднократно описана:
https://its.1c.ru/db/intgr83/content/10/hdoc
https://wonderland.v8.1c.ru/blog/sredstva-raboty-s-json/

В крайнем случае можно распарсить просто как текст - JSON ведь тоже текст по сути.
41. G_112691538235479115945 02.04.21 11:31 Сейчас в теме
(40)по условию задачи мне нужно разработать свой вариант загрузки и выгрузки. по этому вариант с JSON не подходит.
в ходе гуглинга я понял что данное значение является многострочной строкой. у меня получилось пры выгрузке передать в файл в месте с этим значением и количество строк теперь вопрос такой можно как то при загрузке опираясь на число строк переданное из файла получить всю многостроковую строку разом для записи ее в значение реквизита.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот