Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Выгрузка табличной части документа

Выгрузка табличной части документа
Я
   Zibra72
 
02.07.19 - 14:13
Всем доброго времени суток!

Устраиваюсь в компанию, выдали тестовое задание - создать управляемую форму выгрузки/загрузки документа любого типа через .txt формат без сериализации XML или JSON. Находил на этом форуме точно такое же задание, но все, о чем там писали, уже реализовал. Так как текстовый файл должен быть понятным пользователю, ЗначениеВФайл()/ЗначениеИзФайла() использовать не получается. ЗначениеВСтрокуВнутр() использовать запрещено по условию.
Возникли следующие вопросы:
1. Реквизиты выгрузить в текст получилось, но при попытке загрузки в новый созданный документ реквизита (значение и тип я считываю из этого же текстового файла, данный реквизит точно должен быть у этого документа, так как считываю тип документа и создаю именно его), через НовыйДок[НазвРекв] = ЗначРекв выдает ошибку "Поле объекта не обнаружено". При этом если я конкретно указываю НовыйДок["КонкретноеНазвРеквНеИзФайла"] = КакоеТоЗнач ошибку не выдает, но ничего не записывает, хотя с НовыйДок["Дата"] = ДатаИзДока все работает правильно. Что я здесь делаю не так?
2. Нужно выгружать/загружать еще и табличную часть документа. Делаю следующим образом: для каждой табличной части документа выгружаю ее в таблицу Табл = Док[ТабличнаяЧасть.Имя].Выгрузить();, прохожу по строкам и выписываю все значения в txt файл. При этом не могу в "Табл" получить название колонки таблицы, а могу получить только название самой таблицы, значения и типы ее элементов. Есть ли удобный способ получить все данные из табличной части документа или как это корректно сделать способом, который я описал?  
3. Некоторые реквизиты документов и табличных частей - ссылки на справочники,перечисления, доки и тд. При выгрузке их в txt формат преобразуются просто в строки, даже когда пытаюсь преобразовать в ссылку справочника, например: Значение=Справочники[Строка(ТипРекв)].НайтиПоНаименованию(Значение).Ссылка; Как можно записать ссылку в текстовый файл и потом считать ее или как из строки получить обратно ссылку и заполнить ей реквизит?

И еще, можете посоветовать учебники для начинающего в 1С, где можно было бы почитать обо всех этих штуках?
Заранее благодарен за ответы!
 
 
   dka80
 
1 - 02.07.19 - 14:24
НовыйДок["КонкретноеНазвРеквНеИзФайла"] = КакоеТоЗнач - не совпадают типы какого-то значения и доступные типы реквизита
   dka80
 
2 - 02.07.19 - 14:25
НовыйДок[НазвРекв] = ЗначРекв выдает ошибку "Поле объекта не обнаружено"
Поставь точку останова на этой строчке, посмотри чему равно НовыйДок, НазвРекв. Посмотри, НовыйДок есть ли устанавливаемый тобой реквизит НазвРекв
   Zibra72
 
3 - 02.07.19 - 14:47
(2) Работаю для отладки с документом АвансовыйОтчет. Новый документ имеет этот же тип ДокументОбъект.АвансовыйОтчет. Первый же реквизит - ВалютаДокумента типа СправочникСсылка.Валюты. СтрокаИмя - считываю из файла название реквизита, СтрокаИмя = "ВалютаДокумента", СтрокаЗнач = "руб.", СтрокаТип = "Валюты". При попытке НовыйДок[СтрокаИмя] = СтрокаЗнач выдает ошибку. При записи даты таким же образом все ок, а тут даже не видит поле "ВалютаДокумента"
   Жан Пердежон
 
4 - 02.07.19 - 15:05
(0)
во-первых, тестовое задание выдали тебе, чтобы оценить именно твой уровень, а не форума;
во-вторых, с такими заданиями работодателя надо сразу слать куда подальше, имхо.
   Zibra72
 
5 - 02.07.19 - 15:20
(4) Задание выдали, чтобы перед самой стажировкой я хоть как-то научился работать с 1С, оценить мой уровень владения  не получится, потому что он нулевой) Спросил у знатоков что-бы как раз и научиться, нужно же как-то решать задание
И что не так с заданием, что советуете послать?)
   sqr4
 
6 - 02.07.19 - 15:29
А давай год
   sqr4
 
7 - 02.07.19 - 15:29
*код
   Zibra72
 
8 - 02.07.19 - 15:34
(7) Код выгрузки реквизитов:
   Zibra72
 
9 - 02.07.19 - 15:40
(8) Для каждого Реквизит Из ДокументВвод.Метаданные().Реквизиты Цикл ;
        Имя = Реквизит.Имя;
        Значение = ДокументВвод[Имя];
        Если Строка(Значение) = "" тогда
            продолжить;
        конецесли;
        Если ТипЗнч(Значение) = Тип("Число") ИЛИ ТипЗнч(Значение) = Тип("Строка") ИЛИ ТипЗнч(Значение) = Тип("Булево") ИЛИ ТипЗнч(Значение) = Тип("Дата") Тогда
            ТипРекв = ТипЗнч(Значение);
        Иначе
            Типп = Реквизит.Тип.Типы();
            для каждого ти из Типп цикл 
                ТипРекв = Метаданные.НайтиПоТипу(Ти).ПолноеИмя();
                ТипРекв = Прав(Строка(ТипРекв), СтрДлина(Строка(ТипРекв)) - Найти(Строка(ТипРекв), "."))
            конеццикла;
            Значение = Справочники[Строка(ТипРекв)].НайтиПоНаименованию(Значение).Ссылка;
        КонецЕсли;
        ТекстФайла.ЗаписатьСтроку(Имя + " :: " + ТипРекв + " :: " + Значение);
    КонецЦикла;


Пытаюсь сделать ссылку и выгрузить ее, но, кажись, это бесполезно. 

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

Тут не могу достучаться до названия колонки


Загрузка реквизитов: 
Стр = Текст.ПрочитатьСтроку();
    Пока СтрЗаменить(Стр, " ", "") <> "ТабличнаяЧасть" Цикл
        МногострочнаяСтрока = СтрЗаменить(Стр, "::", Символы.ПС);
        //Если СтрПолучитьСтроку(МногострочнаяСтрока,2) = "Число" или СтрПолучитьСтроку(МногострочнаяСтрока,2) = "Строка" или СтрПолучитьСтроку(МногострочнаяСтрока,2) = "Булево" или СтрПолучитьСтроку(МногострочнаяСтрока,2) = "Дата" тогда

            //Сообщить(СтрПолучитьСтроку(МногострочнаяСтрока,1));

        НовыйДок[СтрПолучитьСтроку(МногострочнаяСтрока,1)] =  СтрПолучитьСтроку(МногострочнаяСтрока,3);
            
        //конецесли;

        Стр = Текст.ПрочитатьСтроку();   
    КонецЦикла;

Выгрузку реализовал очень частично, четвертые сутки думаю над выгрузкой табличной части...Закомментировал условие для отладки, первый же реквизит "ВалютаДокумента" крашится, как описал выше
   sqr4
 
10 - 02.07.19 - 15:50
По табличной части
для каждого строк из Таблица цикл
   Для Каждого Колонка из Таблица.Колонки Цикл
        Значение = Строк[Колонка];
   КонецЦикла;
КонецЦикла;

Также у колонки есть и имя и тип.
 
 Рекламное место пустует
   sqr4
 
11 - 02.07.19 - 15:55
Для реквизитов используй УникальныйИдентификатор()
Т.е  не Значение = Справочники[Строка(ТипРекв)].НайтиПоНаименованию(Значение).Ссылка; а  
Значение = ДокументВвод[Имя].УникальныйИдентификатор();
   Zibra72
 
12 - 02.07.19 - 16:01
(11) По условию нельзя использовать УникальныйИдентификатор(). А по (10) жалуется "Получение элемента по индексу для значения не определено Значение = Строк[Колонка];"
   sqr4
 
13 - 02.07.19 - 16:10
Значение = Строк[Колонка.имя]
   sqr4
 
14 - 02.07.19 - 16:13
Если УИ нельзя использовать, то для справочника наименование, для перечисление имя значения
   Zibra72
 
15 - 02.07.19 - 16:23
(13) Спасибо, вроде, то, что нужно. (14) Я так и делаю, разве нет? Только все равно Значение не приобретает какой-то другой формат при выводе, чтобы было понятно, что это ссылка. Или так и не должно быть? Понимаю, что нужно еще условие для проверки справочник/перечисление и уже так искать, но сначала со справочниками хотя-бы разобраться.
   sqr4
 
16 - 02.07.19 - 16:41
ТекстФайла.ЗаписатьСтроку(Имя + " :: " + ТипРекв + " :: " + Значение);
Модернизируйте вот эту строку, где будет понятно что это ссылочный тип, хотя не понятно почему не использовать именно эту строку
 ТипРекв = Метаданные.НайтиПоТипу(Ти).ПолноеИмя();
   sqr4
 
17 - 02.07.19 - 16:41
без удаления того что до дочки
   sqr4
 
18 - 02.07.19 - 16:41
точки*
   Zibra72
 
19 - 02.07.19 - 16:54
(16) Не совсем понимаю, как Вы предлагаете модернизировать. Сейчас в файл выводится, например, строка
ФизЛицо :: ФизическиеЛица :: Иванов Иван Иванович, где первое - реквизит документа, второе - сокращенный тип (от СправочникСсылка.ФизическиеЛица - из реквизитов в конфигурации), третье - значение. Можно ли это значение получить и записать ссылкой, а не просто взять строку из заполненного поля, чтобы потом не искать по справочникам физ лиц товарища Иванова, а сразу вставить ссылку не простой строкой?
   sqr4
 
20 - 02.07.19 - 16:56
УникальныйИдентификатор() = Ссылка
   sqr4
 
21 - 02.07.19 - 16:59
Просто ссылка в базе имеет представление, которое и формируется в большинстве случаем как наименование, и применяя к ней Строка() вы получаете как раз представление. Т.е запрет на использование УникальныйИдентификатор(), предполагает что вы выберете реквизит и будете его использовать в качестве Уникального идентификатора. Это может быть либо код либо наименование. Например для справочника Банки Код, вроде бы то что нужно)
   Fish
 
22 - 02.07.19 - 17:01
Интересно потом эту ветку работодателю показать :))
   sqr4
 
23 - 02.07.19 - 17:03
(22) ну если человек готовится на стажера и с такими подсказками справится, то почему бы не взять?
   sqr4
 
24 - 02.07.19 - 17:03
+(23) особенно это будет сделка
   Fish
 
25 - 02.07.19 - 17:04
(21) Если один реквизит не обеспечивает уникальность ключа, то ключ можно сделать из совокупности реквизитов, на 100% обеспечивающих уникальность.
   sqr4
 
26 - 02.07.19 - 17:04
да!
   Zibra72
 
27 - 02.07.19 - 17:17
Дык дело в том, что когда спросил совета у работодателя, что да как сделать можно, он посоветовал гуглить или спросить здесь)) А гугл все равно ведет сюда)
А насчет (21), получил коды ссылочных типов. Теперь буду искать, как по этим кодам при загрузке обратно получить нужное значение. Спасибо!
   Fish
 
28 - 02.07.19 - 17:20
Я так понимаю, тест в основном направлен не на решение задачи, а на проверку способности гуглить и задавать вопросы на мисте :))
   Zibra72
 
29 - 02.07.19 - 17:31
(28) Это типовое тестовое задание многолетней давности, как я понял. Так что да, главное - научиться искать то, чего нет в книгах))
Или все такие есть? Мне советовали почитать руководство начинающего разработчика, но там по коду почти ничего нет, все в целом по конфигурации. А про функции, параметры где можно почитать? Понятно, что если знаешь название - то СП, но если нужно что-то новое? Гугл не выдает никаких справочников... Изучал С# - все на метаните с 0 до приличного уровня, например, а с 1С есть похожие ресурсы?
   Fish
 
30 - 02.07.19 - 17:33
(29) Да не, это я шучу. А на самом деле тут самый живой ресурс по 1С. Не без троллинга, конечно, но специалистов тут много, всегда помогут.
   Zibra72
 
31 - 04.07.19 - 16:25
Спасибо всем, кто помог!
Остался последний шаг - при записи нового документа единственное, что не выгружается в текстовый файл и потом не загружается обратно - счет-фактура. В реквизитах и табличной части документа ее нет, видна только на форме самого документа в "подвале".
Можно как-нибудь узнать, есть ли у документа это свойство и как его программно выгрузить в txt файл и потом загрузить на новосозданный документ?
   sqr4
 
32 - 04.07.19 - 16:45
Вообщем, это другой документ, связанный с этим
   sqr4
 
33 - 04.07.19 - 16:45
Реквизиты связи в том документе.
 
 
   Zibra72
 
34 - 04.07.19 - 17:00
(33) А как до них добраться можно? В Документ.Метаданные().Реквизиты их нет...
   sqr4
 
35 - 04.07.19 - 17:03
их и не будет. У счет фактуре реквизит документоснование или табличная часть со списком доков оснований. При открытии, документ ищется среди оснований счет фактур и если находится, то выводится надпись
   sqr4
 
36 - 04.07.19 - 17:03
Вообщем для перенос, надо еще и ее за собой цеплять и создавать ну это в идеале
   Fish
 
37 - 04.07.19 - 17:06
(31) Посмотри, откуда она на форму попадает.
   Zibra72
 
38 - 04.07.19 - 17:16
(36) А как узнать, нужно ли это для данного документа?
(37) Насколько я понял, на форме есть реквизит "СчетФактура" и кнопка "ВыписатьСчетФактуру". Но через Документы.РеализацияТоваровУслуг.Формы.ФормаДокументаОбщая не могу получить этот самый реквизит.
   Fish
 
39 - 04.07.19 - 17:20
(38) Я ничего не понял из того, что ты написал :)
А я имел ввиду следующее:
Ту написал "видна только на форме самого документа в "подвале"" - т.е. тебе надо найти в коде модуля формы место, где заполняется этот реквизит формы.
   sqr4
 
40 - 04.07.19 - 17:32
(38) ты и не получишь его, через форму, забудь, это так не работает. На форме данные только отображаются, я уже сказал как нужно делать и в какую сторону идти. В форме ты лишь убедишься, что заполняется этот реквизит именно оттуда.
   sqr4
 
41 - 04.07.19 - 17:41
(38) Запросом надо найти или не найти счет фактуру для которого этот документ - основание.
   sqr4
 
42 - 04.07.19 - 17:42
Как то так

ВЫБРАТЬ
    СчетФактураПолученныйДокументыОснования.Ссылка КАК Ссылка
ИЗ
    Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураПолученныйДокументыОснования
ГДЕ
    СчетФактураПолученныйДокументыОснования.ДокументОснование = &ДокументОснование
   Zibra72
 
43 - 04.07.19 - 18:29
(42) Как я понял, вместо &ДокументОбоснование нужно вставить ссылку на документ, который должен быть основанием. Подставляю ДокументВвод типа ДокументСсылка, полученный из поля ввода, но вылезает ошибка "не задано значение параметра ДокументВвод"
   Zibra72
 
44 - 04.07.19 - 19:01
(36) Нашел документ счет-фактуры без запроса, перебором в цикле. Предлагаете его тоже полностью выгружать/загружать или достаточно при загрузке документа создать новую счет-фактуру и задать ей основанием новосозданный документ?
   sqr4
 
45 - 05.07.19 - 09:19
(44) циклом перебирать все СФ плохая идея, запросом быстрее гораздо. Предлагаю полностью
   catena
 
46 - 05.07.19 - 09:34
(44)Вы мудрите, в задаче было сказано о выгрузке реквизитов документа или о выгрузке всех связанных объектов? Так-то документом основания ваш документ любого типа может быть не только у счет-фактуры. И не только документом-основания.
   Zibra72
 
47 - 11.07.19 - 17:00
Всем спасибо, все сделал и сдал!
Теперь выдали второе задание на загрузку контрагентов из excel)) И у меня снова вопросы)
Не хочу создавать новые темы, поэтому спрошу здесь, может кто поможет.

В общем, как я понял из списка реквизитов, представленных в таблице, нужно создавать не просто контрагента, но и связывать его с партнером, контактными лицами и договором. Может я не прав насчет этого, но тогда не знаю, как контрагенту вписать следующие поля:
1. вид взаимоотношений(покупатель/поставщик, есть в "партнере")
2. 2 телефона (в контрагенте только 1, в партнере сколько хочешь)
3. регион
4. название и валюту договора
5. номер расчетного счета, БИК
6. данные нескольких контактных лиц (в партнере можно вписать только одного, но, как я понял, можно привязать к партнеру список контактных лиц)
7.сайт (вообще нигде не могу найти этого реквизита...)

Дело происходит в "Управление торговлей 11.4", а данные в excel выгружены из "Торговля и склад 7.7".

Буду благодарен всем, кто сможет помочь еще раз!
   sqr4
 
48 - 11.07.19 - 17:04
А зря лучше новую. Да нужно будет все связные справочники создать. Сайт это такая же контактная информация, как и телефон.
   sqr4
 
49 - 11.07.19 - 17:05
(47) Также предусмотри возможность чтобы вся херня не задваивалась
 
 Рекламное место пустует
   Zibra72
 
50 - 11.07.19 - 17:12
(48) Как соединить партнера и контрагента я, вроде, понял, у контрагента соответствующие реквизит есть, туда запросом перекинуть данные из этого контрагента в партнера и присоединить обратно. А как присоединить ко всему этому добру договор и контактные лица?
Еще для договора нужно поле "организация". Сейчас в базе уже есть много контрагентов/партнеров и тд, но организаций всего штук 5, так что это не те же партнеры, как я понял.
(49) Вы про двойников контрагентов или что? Про двойников я попробую учесть поиском в базе, если Вы про что-то другое - объясните, пожалуйста
   sqr4
 
51 - 11.07.19 - 17:28
(50) да про это. У договоров и контактных лиц, наверно они будут владельцами
   Zibra72
 
52 - 11.07.19 - 17:36
(51) Вроде пока алгоритм действия понятен, буду пробовать реализовывать. Спасибо!
   FIXXXL
 
53 - 12.07.19 - 12:33
> Дело происходит в "Управление торговлей 11.4", а данные в excel выгружены из "Торговля и склад 7.7".
странные тесты... денег то заплатят за это?
   Zibra72
 
54 - 13.07.19 - 23:23
(53) Пока нет, это ж тесты)
   Zibra72
 
55 - 13.07.19 - 23:29
Возникла проблемка при загрузке информации о банковском счете контрагента. Номер счета и валюты загружаются, а БИК - нет. Ошибок не выдает, но при создании счета поле остается пустым. Не могу нагуглить, в чем дело, про программное заполнение ни слова...
   hhhh
 
56 - 14.07.19 - 01:28
(55) БИК это у банка поле. Банк вам надо.
   Zibra72
 
57 - 14.07.19 - 22:57
(56) В справочнике "БанковскиеСчетаКонтрагентов" есть реквизит "БИКБанка", который я и пытаюсь заполнить. Реквизит "НомерСчеты" заполняется и отображается без проблем а БИК - не показывается после записи
   Garykom
 
58 - 14.07.19 - 23:10
(57) Поищи справочник Банки
   Zibra72
 
59 - 14.07.19 - 23:47
(58) Такого нет, есть только "БанковскиеСчетаКонтрагентов" и "БанковскиеСчетаОрганизаций". "БИКБанка" типа строка, записать туда тоже пытаюсь строку
Других структур про банки поиск тоже не выдал
   hhhh
 
60 - 15.07.19 - 00:00
(59) что-то вы врете, смотрю справочник БанковскиеСчетаКонтрагентов, там первый реквизит НомерСчета, второй реквизит Банк.
   Zibra72
 
61 - 15.07.19 - 00:07
(60) Да, есть. Неправильно понял прошлое сообщение, прошу прощения.
Но я не могу создать банк только по его БИК-у. Про расчетный счет контрагента мне известно только его номер и БИК банка. И найти банк по БИК в справочнике "КлассификаторБанков", куда ссылается реквизит "Банк" у расчетного счета не могу, там нет такого реквизита...
   hhhh
 
62 - 15.07.19 - 00:37
(61) да, уж
   Zibra72
 
63 - 15.07.19 - 00:43
(62) Есть какие-нибудь идеи, почему он не заполняется?)
   hhhh
 
64 - 15.07.19 - 01:29
(63) кто он? банк? Наверно, потому что вы его не заполнили, вот он и не заполняется.
   hhhh
 
65 - 15.07.19 - 01:30
откройте сам справочник этот найдите там бик.
   Zibra72
 
66 - 18.07.19 - 17:22
С БИКом и всем остальным разобрался, большое спасибо!
Остался последний (надеюсь) пункт - заполнить адрес доставки у партнера.
Уже перепробовал устанавливать все виды из Справочники.ВидыКонтактнойИнформации, но никак не могу заполнить адрес доставки. Через форму тоже не получается докопаться - там стоит декорация контактных данных... Как можно до него добраться?
Простой адрес заполняется без проблем.
   Fish
 
67 - 18.07.19 - 17:24
(66) Показывай, как делал.
   Zibra72
 
68 - 18.07.19 - 17:27
(67) ПартнерАдресФиз = НовыйПартнер.КонтактнаяИнформация.Добавить();
     ПартнерАдресФиз.Вид = Справочники.ВидыКонтактнойИнформации.АдресПартнера(перебирал все виды со словом адрес - адрес доставки все равно не заполняется);
     ПартнерАдресФиз.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
     ПартнерАдресФиз.Представление = АдресФиз;
   Fish
 
69 - 18.07.19 - 17:29
(68) А поле "Значение" не пробовал заполнять?
   Zibra72
 
70 - 18.07.19 - 17:40
(69) Заполняю. Через XML.
ПартнерАдресФиз.ЗначенияПолей = "<КонтактнаяИнформация xmlns=""http://www.v8.1c.ru/ssl/contactinfo""; xmlns:xs=""http://www.w3.org/2001/XMLSchema""; xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""; Представление="""  + ПартнерАдресФиз.Представление + """><Комментарий/><Состав xsi:type=""Адрес"" Страна=""РОССИЯ""><Состав xsi:type=""АдресРФ""><СубъектРФ xsi:nil=""true""/><СвРайМО><Район xsi:nil=""true""/></СвРайМО><Город xsi:nil=""true""/><НаселПункт xsi:nil=""true""/><Улица>" + ПартнерАдресФиз.Представление + "</Улица><ДопАдрЭл ТипАдрЭл=""10100000"" Значение=""""/></Состав></Состав></КонтактнаяИнформация>";


Дело в том, что если ставлю вид = ...АдресПартнера, заполняется просто поле "адрес", которое под полем "адрес доставки". Если беру другие виды из ВидыКонтактнойИнформации - вообще не заполняется, что и логично.
   hhhh
 
71 - 18.07.19 - 17:54
(70) сами лепите xml? Там же есть функция в конфе типа значения полей.
   Zibra72
 
72 - 18.07.19 - 17:59
(71) Можно поподробнее об этом, пожалуйста?

И подскажете что-нибудь насчет адреса доставки?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует