Имя: Пароль:
1C
1С v8
Выгрузка табличной части документа
,
0 Zibra72
 
02.07.19
14:13
Всем доброго времени суток!

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

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


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

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

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


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

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

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

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

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

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

Буду благодарен всем, кто сможет помочь еще раз!
48 sqr4
 
11.07.19
17:04
А зря лучше новую. Да нужно будет все связные справочники создать. Сайт это такая же контактная информация, как и телефон.
49 sqr4
 
11.07.19
17:05
(47) Также предусмотри возможность чтобы вся херня не задваивалась
50 Zibra72
 
11.07.19
17:12
(48) Как соединить партнера и контрагента я, вроде, понял, у контрагента соответствующие реквизит есть, туда запросом перекинуть данные из этого контрагента в партнера и присоединить обратно. А как присоединить ко всему этому добру договор и контактные лица?
Еще для договора нужно поле "организация". Сейчас в базе уже есть много контрагентов/партнеров и тд, но организаций всего штук 5, так что это не те же партнеры, как я понял.
(49) Вы про двойников контрагентов или что? Про двойников я попробую учесть поиском в базе, если Вы про что-то другое - объясните, пожалуйста
51 sqr4
 
11.07.19
17:28
(50) да про это. У договоров и контактных лиц, наверно они будут владельцами
52 Zibra72
 
11.07.19
17:36
(51) Вроде пока алгоритм действия понятен, буду пробовать реализовывать. Спасибо!
53 FIXXXL
 
12.07.19
12:33
> Дело происходит в "Управление торговлей 11.4", а данные в excel выгружены из "Торговля и склад 7.7".
странные тесты... денег то заплатят за это?
54 Zibra72
 
13.07.19
23:23
(53) Пока нет, это ж тесты)
55 Zibra72
 
13.07.19
23:29
Возникла проблемка при загрузке информации о банковском счете контрагента. Номер счета и валюты загружаются, а БИК - нет. Ошибок не выдает, но при создании счета поле остается пустым. Не могу нагуглить, в чем дело, про программное заполнение ни слова...
56 hhhh
 
14.07.19
01:28
(55) БИК это у банка поле. Банк вам надо.
57 Zibra72
 
14.07.19
22:57
(56) В справочнике "БанковскиеСчетаКонтрагентов" есть реквизит "БИКБанка", который я и пытаюсь заполнить. Реквизит "НомерСчеты" заполняется и отображается без проблем а БИК - не показывается после записи
58 Garykom
 
гуру
14.07.19
23:10
(57) Поищи справочник Банки
59 Zibra72
 
14.07.19
23:47
(58) Такого нет, есть только "БанковскиеСчетаКонтрагентов" и "БанковскиеСчетаОрганизаций". "БИКБанка" типа строка, записать туда тоже пытаюсь строку
Других структур про банки поиск тоже не выдал
60 hhhh
 
15.07.19
00:00
(59) что-то вы врете, смотрю справочник БанковскиеСчетаКонтрагентов, там первый реквизит НомерСчета, второй реквизит Банк.
61 Zibra72
 
15.07.19
00:07
(60) Да, есть. Неправильно понял прошлое сообщение, прошу прощения.
Но я не могу создать банк только по его БИК-у. Про расчетный счет контрагента мне известно только его номер и БИК банка. И найти банк по БИК в справочнике "КлассификаторБанков", куда ссылается реквизит "Банк" у расчетного счета не могу, там нет такого реквизита...
62 hhhh
 
15.07.19
00:37
(61) да, уж
63 Zibra72
 
15.07.19
00:43
(62) Есть какие-нибудь идеи, почему он не заполняется?)
64 hhhh
 
15.07.19
01:29
(63) кто он? банк? Наверно, потому что вы его не заполнили, вот он и не заполняется.
65 hhhh
 
15.07.19
01:30
откройте сам справочник этот найдите там бик.
66 Zibra72
 
18.07.19
17:22
С БИКом и всем остальным разобрался, большое спасибо!
Остался последний (надеюсь) пункт - заполнить адрес доставки у партнера.
Уже перепробовал устанавливать все виды из Справочники.ВидыКонтактнойИнформации, но никак не могу заполнить адрес доставки. Через форму тоже не получается докопаться - там стоит декорация контактных данных... Как можно до него добраться?
Простой адрес заполняется без проблем.
67 Fish
 
18.07.19
17:24
(66) Показывай, как делал.
68 Zibra72
 
18.07.19
17:27
(67) ПартнерАдресФиз = НовыйПартнер.КонтактнаяИнформация.Добавить();
     ПартнерАдресФиз.Вид = Справочники.ВидыКонтактнойИнформации.АдресПартнера(перебирал все виды со словом адрес - адрес доставки все равно не заполняется);
     ПартнерАдресФиз.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
     ПартнерАдресФиз.Представление = АдресФиз;
69 Fish
 
18.07.19
17:29
(68) А поле "Значение" не пробовал заполнять?
70 Zibra72
 
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"" Значение=""""/></Состав></Состав></КонтактнаяИнформация>";


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

И подскажете что-нибудь насчет адреса доставки?
73 hhhh
 
19.07.19
10:03
(72) если юридический адрес, то вам неверно не партнера, а контрагента надо.