Вход | Регистрация
 

Перегрузка Документа. Тестовое задание

Перегрузка Документа. Тестовое задание
Я
   Jurest_
 
21.07.21 - 00:15
Всем привет. Сразу скажу, что можно пользоваться любыми источниками информации, поэтому я здесь. Суть задания, перебросить любой док из базы 1с в txt файл и наоборот. Использовать функции УникальныеИдентификаторы() и тп нельзя. Вопрос: Как правильно перебрать все реквизиты табличных частей документа? Пишу вот так
    ТекстДляЗаписи = Новый ТекстовыйДокумент;
    ВыбранныйДокумент = Объект.Документ;
    МетаданныеДокументаРеквизиты = ВыбранныйДокумент.Метаданные().Реквизиты;
    МетаданныеДокументаТЧ = ВыбранныйДокумент.Метаданные().ТабличныеЧасти;
    Для Каждого Реквизит из МетаданныеДокументаРеквизиты Цикл
        ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + ВыбранныйДокумент[Реквизит.Имя]);
    КонецЦикла;
    Для каждого ТабличнаяЧасть Из МетаданныеДокументаТЧ Цикл
        ТекстДляЗаписи.ДобавитьСтроку("--------Новая Табличная Часть------");
        Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл
            ТекстДляЗаписи.ДобавитьСтроку("" + СтрокаТабличнойЧасти.Имя + ":" + ВыбранныйДокумент[СтрокаТабличнойЧасти.Имя]);
        КонецЦикла;
    КонецЦикла;
    ТекстДляЗаписи.Записать(Объект.Файл);
Ругается на
{ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(36)}: Итератор для значения не определен
        Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл

Подскажите пожалуйста.
   Йохохо
 
1 - 21.07.21 - 00:22
Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть] Цикл
?
   Йохохо
 
2 - 21.07.21 - 00:23
ТабличнаяЧасть.Имя
   Jurest_
 
3 - 21.07.21 - 00:27
Спасибо, пропустил. Правда теперь на это ругается)

ТекстДляЗаписи.ДобавитьСтроку("" + СтрокаТабличнойЧасти.Имя + ":" + ВыбранныйДокумент[СтрокаТабличнойЧасти.Имя]);

Но тут я сам наверное. Спасибо)
   Йохохо
 
4 - 21.07.21 - 00:30
она бай намберс
   Jurest_
 
5 - 21.07.21 - 00:38
Не особо понял, о чем ты. Но буду разбираться)
   OldCondom
 
6 - 21.07.21 - 00:45
поставь точку останова в месте ошибки и посмотри что у тебя в "ТабличнаяЧасть". Подсказка: ничего.
   Jurest_
 
7 - 21.07.21 - 00:48
ТабличнаяЧасть Значение:Товары, Тип: ОбъектМетаданных
   Jurest_
 
8 - 21.07.21 - 00:50
Так что все есть.
Еще вопросик, можно ли перебрать все реквизиты СтрокиТЧ не обращаясь к ним на прямую? Имею ввиду не писать СтрокаТЧ.Номерклатура = Значение, а все это как то циклом обойти.
   OldCondom
 
9 - 21.07.21 - 00:51
а, там цикл, точно. Ну вот, теперь посмотри там же эту табличнаячасть. Разверни. Там нет коллекции
   Jurest_
 
10 - 21.07.21 - 00:53
Да вроде все есть
https://disk.yandex.ru/i/ChnSUzT7l0fwXg
   OldCondom
 
11 - 21.07.21 - 00:53
еще погугли сериализация объектов 1с. Ты можешь просто в json объект перекинуть, потом прочитать
   OldCondom
 
12 - 21.07.21 - 00:54
(10) я вижу объект и его свойства. А ты коллекцию?
   Jurest_
 
13 - 21.07.21 - 00:54
(11) Не, тоже нельзя использовать. Так в задании написано(
   Jurest_
 
14 - 21.07.21 - 00:54
Реквизиты - КоллекцияОбъектовМетаданных
   Jurest_
 
15 - 21.07.21 - 00:55
Или это не то?
Просто Строчку то я правильно получаю
   OldCondom
 
16 - 21.07.21 - 00:55
ну так и перебирай их, а не табличная часть. То есть табличнаячасть.реквизиты
   Jurest_
 
17 - 21.07.21 - 00:58
А он мне разве сможет все строчки так перебрать?
   OldCondom
 
18 - 21.07.21 - 00:58
Начни с постановки вопроса. Реквизиты у тебя получиллсь перебрать и получить их значения, так? Табличные части получилось, а вот значения их строк - нет. Так? Или я путаю
   Йохохо
 
19 - 21.07.21 - 00:59
ну если КоллекцияХХХ то она итерируемая а потом тСтрокаТЧ[тЭлементКоллекцияХХХ]
   Jurest_
 
20 - 21.07.21 - 00:59
(18) Строчки получилось получить
   Jurest_
 
21 - 21.07.21 - 01:00
А вот правильно обратиться к каждому полю строчкиТЧ, чтоб вывести в док нет.
   Jurest_
 
22 - 21.07.21 - 01:01
   Йохохо
 
23 - 21.07.21 - 01:02
(21) для нее не работает цикл для каждого?
   Jurest_
 
24 - 21.07.21 - 01:04
{ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(37)}: Получение элемента по индексу для значения не определено
            Для каждого Резвизит Из ВыбранныйДокумент[СтрокаТабличнойЧасти] Цикл
   OldCondom
 
25 - 21.07.21 - 01:06
Чего то ты не договариваешь. В (22) именно СтрокаТабличнойЧасти - это строкаТЧ документа, а не метаданных. А в коде (1) это метаданные объекта.
   Йохохо
 
26 - 21.07.21 - 01:07
если хочется спать то засунуть имена реквизитов ТЧ (+стандартных) в массив и по нему строчкиТЧ[массивреквТЧ[Счетчик]]
   OldCondom
 
27 - 21.07.21 - 01:08
(24) И снова. Точка останова. Что в ВыбранныйДокумент[СтрокаТабличнойЧасти]? Что в СтрокаТабличнойЧасти?
   Jurest_
 
28 - 21.07.21 - 01:09
Для каждого ТабличнаяЧасть Из МетаданныеДокументаТЧ Цикл
        ТекстДляЗаписи.ДобавитьСтроку("--------Новая Табличная Часть------");
        Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть.Имя] Цикл
            Для каждого Резвизит Из ВыбранныйДокумент[СтрокаТабличнойЧасти] Цикл
                ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + ВыбранныйДокумент[Реквизит.Имя]);
            КонецЦикла; 
            ДанныеОСтрочке = ВыбранныйДокумент[СтрокаТабличнойЧасти].Метаданные();
        КонецЦикла; 
    КонецЦикла; (25)
   Йохохо
 
29 - 21.07.21 - 01:09
или у коллекции должен быть метод Количество() и доступ по КоллекцияРеквизитовТЧ[1].Имя
   Jurest_
 
30 - 21.07.21 - 01:11
(27) Действительно, в ВыбранныйДокумент[СтрокаТабличнойЧасти] походу ничего нет
 
 
   Jurest_
 
31 - 21.07.21 - 01:12
(26) (29) Блин, что то я себя таким тупым чувствую
   OldCondom
 
32 - 21.07.21 - 01:20
(31) я тоже не понял, о чем он.
У тебя с реквизитами все получилось.
Табличная часть почти тоже самое. Тебе нужно обойти табличные части(это ты сделал), потом обойти реквизиты табличной части(этого нет).
Далее обходишь Объект[твоя табличная часть из коллекции метаданных объекта] и уже внутри обходишь реквизиты табличной части.
Примерно так
Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть.Имя] Цикл -- это у тебя есть
Для каждого Резвизит Из РеквизитыТабличнойЧасти Цикл -- у тебя этого нет, ты не получил коллекцию реквизитов табличной части
СтрокаТабличнойЧасти[Реквизит.Имя] -- получаешь значение реквизита строки табличной части документа
КонецЦикла;
КонецЦикла;
   Jurest_
 
33 - 21.07.21 - 01:24
(32) Кажется, я понял о чем ты)) Спасибо большое, пошел пробовать.
   Jurest_
 
34 - 21.07.21 - 01:41
(32) Получилось! Спасибо еще раз. Смог достать каждый реквизит строчкиТЧ.
   Jurest_
 
35 - 21.07.21 - 18:32
С выгрузкой разобрался. Теперь бы с загрузкой. При загрузке надо понять, какой документ вообще надо создавать. У меня есть в текстовом документе строчка, которая содержит представление объекта нужного типа документа. Можно ли по этой строчке как-то найти этот тип и создать документ?
   Pro-tone
 
36 - 21.07.21 - 18:39
(35) допиши в текстовый док поле, которое будет отвечать за вид документа как он назван в пофигураторе кодом ВыбранныйДокумент.Метаданные().Имя
   Jurest_
 
37 - 21.07.21 - 18:45
(36) Большое спасибо. Теперь в Текстовом документе правильное имя документа, который надо создать. Еще один вопрос, как правильно обратиться к документу через переменную?
Я имею ввиду, что можно создать документ так: Документы.РеализацияТоваровИУслуг.СоздатьДокумент(); Вот как вместо РеализацияТоваровИУслуг положить переменную, в которой будет лежать строчка из текстового документа соответствующая имени нужного документа?
   OldCondom
 
38 - 21.07.21 - 18:48
Документ[ИмяДокументаСтрокой]
   OldCondom
 
39 - 21.07.21 - 18:48
Документы***
   Jurest_
 
40 - 21.07.21 - 18:55
Спасибо!
   Jurest_
 
41 - 21.07.21 - 20:05
Пытаюсь добавить реквизиты таким кодом, оказывается, это не так просто, как я думал.

НовыйДокумент = Документы[ТипДокумента].СоздатьДокумент();
    //НовыйДокумент.Дата = НачалоДня(ТекущаяДата());

    Для НомерСтроки = 2 По ЗагружаемыйФайл.КоличествоСтрок() Цикл
        СтрокаТекста = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки);
        Если Сред(СтрокаТекста,1,1) <> ":" Тогда
            МассивСлов = СтрРазделить(СтрокаТекста, ":");
            НовыйДокумент[МассивСлов[0]] = МассивСлов[1];
        Иначе
            НомерСтрокиКонцаРеквизитов = НомерСтроки;
            Прервать;
        КонецЕсли; 
    КонецЦикла;
    НовыйДокумент.Записать();

Но проблема в том, что не все реквизиты простые, там есть и ссылки на справочники, перечисления. Реально ли как то проще сделать, а не проверять каждую строку текстового документа на соответствие какому-то типу данных?
   Pro-tone
 
42 - 21.07.21 - 20:22
(41) для этого существует КД2 и КД3, в которых описывается структура данных, их типы, все их свойства(реквизиты) и т.п., твое задание не может быть настолько сложным чтоб текстовым документом переносить ссылочные типы реквизитов, значит ты что-то не понял, вероятно нужно перенести только небольшой список нессылочного типа реквизитов, в противном случае, слать подальше кто такое задание дал или потребовать оплаты за его выполнение
   Jurest_
 
43 - 21.07.21 - 20:26
(42) Вот задание. Если я действительно неправильно понял, то попробую по другому сделать. Но пока только одна идея в голове.
https://disk.yandex.ru/i/yEY2uklDADFv0A
   acht
 
44 - 21.07.21 - 20:33
(42) > слать подальше кто такое задание дал

Бедный alexrovich, никто его не любит =)

Сейчас появятся вопросы по "Нужно разработать внешнюю обработку в Конфигураторе 1С. Назначение обработки – оповестить по электронной почте руководителя компании о новых заказах клиентов с «интересной» суммой." =)
   Jurest_
 
45 - 21.07.21 - 20:34
ахахах, не, это я уже сдал))
   Jurest_
 
46 - 21.07.21 - 20:35
(44) Пока гуглил это задание, нашел, что еще и в Сиринт чтобы пройти на стажировку такое задание дают.
   Jurest_
 
47 - 21.07.21 - 20:37
(44) Не можешь подсказать, как вообще подступиться то? Вот я на (41) вот этом встал пока
   Вафель
 
48 - 21.07.21 - 20:38
(44) это они нанимают чуваков для шахматиста ерп внедрять?
   Вафель
 
49 - 21.07.21 - 20:39
Чтобы в текст что то выгружать, помимо самих значений нужно еще хоть какуюто разметку выгружать
   Pro-tone
 
50 - 21.07.21 - 20:39
(43) проси оплату за 4 дня минимум из расчета 6000р за день, это просто наглость такие задания задавать, поди еще и зарплату на вакансию дают 130т.р.
   Jurest_
 
51 - 21.07.21 - 20:42
(50) Написано от 50т.р.
   Jurest_
 
52 - 21.07.21 - 20:42
(50) Интересное предложение, стоит попробовать))
   acht
 
53 - 21.07.21 - 20:46
(47) Ну, вот здесь, например, чувак хранит в строке текста еще и информацию о типе и ключевых реквизитах для поиска: https://github.com/misha1/alexrovich_1c_task3
   Jurest_
 
54 - 21.07.21 - 20:50
(53) Спасибо, ща поизучаю
   Pro-tone
 
55 - 21.07.21 - 20:51
(47) общими мазками дам направление куда копать

1. Сперва в текстовый файл ты должен передать всю структуру возможных типов данных, и их структуру, которые есть во всех документах. Получать эти типы надо рекурсивно, проваливаясь глубже и глубже и сверять с теми типами, которые ты уже положил в описание типов в свой файл. По данной разметке ты будешь понимать как заполнять значениями и какого они типа и какие типы содержать их свойства
2. Далее циклом по конкретному объекту обойти все его метаданные, включая табчасти и их данные внутри, записав в файл имя реквизита, тип его значения и само значение
3. Если тип значения выгружаемого реквизита ссылочный, тебе надо залезть в свою структуру из 1. и по такому же принципу выгрузить его данные, и так по рекурсии падаешь до самого низа ветвления и выгружаешь все до примитивных типов, когда провалиться глубже уже невозможно
4. Далее понять как ты будешь искать в базе приемнике объект (наименование, код, дата), передать эти данные как свойства поиска, запросом будешь искать существующий, если нет его, то загружать

Это я примерно описал как работает обработка УниверсальныйОбменДаннымиXML, только она делает это в формате XML. Примерно также работает и выгрузка через xdto, только там структура передается не в самом файле, а она берется из пакета xdto. По такому же принципу, но текстово можно сделать и текстовую выгрузку.
   Pro-tone
 
56 - 21.07.21 - 20:53
(51) так это работа типа фриланса? я думал экзаменационный тест
   Jurest_
 
57 - 21.07.21 - 20:56
(56) Не сказал бы, что прям фриланс. Но это тестовое задание, чтобы пройти на работу.
   Jurest_
 
58 - 21.07.21 - 20:56
(55) +- понял логику, большой спасибо за совет!
   Смотрящий
 
59 - 21.07.21 - 20:59
(55) Лошъ, песдешъ и провокация
(57) Пиши/читай данные как RAW
как обмен в клюшках сделан
   acht
 
60 - 21.07.21 - 21:01
(56) Алексрович пылесосит рынок студентов, чтобы пожрать новых стажеров.
 
 
   acht
 
61 - 21.07.21 - 21:02
(55) Хреновый из тебя стажер, не возьмут тебя.

Ему наъ не уперлось полное копирование объектов - например, справочника валют со всеми реквизитами. Ему надо по коду/наименованию найти ссылку и все.
   Смотрящий
 
62 - 21.07.21 - 21:03
(60) он же жалный, ипшник этот
   acht
 
63 - 21.07.21 - 21:04
(62) Ну, я же не спрашиваю, что он делает с предыдущими стажерами =) Это пусть у ТС голова болит.
   Pro-tone
 
64 - 21.07.21 - 21:05
(61) плохо ты читал что он хочет

"При нажатии кнопки «Выгрузить» информация, содержащаяся в выбранном пользователем документе, должна выгрузиться в указанный файл. Информация должна быть исчерпывающей, то есть выгружаться должны данные, чтобы при нажатии кнопки «Загрузить» в базе создавалась бы копия исходного документа"
   Pro-tone
 
65 - 21.07.21 - 21:06
это маразматическое задание для стажера, похоже на садизм какой-то, слал бы я этого товарища с его заданием далеко и надолго
   acht
 
66 - 21.07.21 - 21:06
(64) Ю копия исходного документа
И где тут про необходмость восстановления потрохов справочника валют?
   Pro-tone
 
67 - 21.07.21 - 21:08
(66) ты как копию передашь в базу где нет такого документа? найти по номеру+дате? ну пусто и че дальше? он хочет чтоб все данные дока ушли, и как я понял любого вида дока из конфы
   Pro-tone
 
68 - 21.07.21 - 21:09
(66) а как ты выгрузишь валюту которой нет в приемнике без потрохов?
   Pro-tone
 
69 - 21.07.21 - 21:10
валюту, номенклатуру, да что угодно и т.п., если их нет в приемнике
   Pro-tone
 
70 - 21.07.21 - 21:11
только через передачу потрохов чтоб понимать что к чему приязано
   Jurest_
 
71 - 21.07.21 - 21:11
(63) Прости, а ТС это кто?
   Pro-tone
 
72 - 21.07.21 - 21:12
(71) топик стартер, то есть ты
   OldCondom
 
73 - 21.07.21 - 21:12
(65) Для ТС как раз. И мозгами пошевелит и опыт получит. ТС на самом деле редкий случай, хочет учится + задавая вопрос показывает, что сделано, и весьма не так уж убого.
И тут еще опыт хороший, увидит, что с дол**бами связываться не стоит и найдет нормального работодателя.
   OldCondom
 
74 - 21.07.21 - 21:13
или свалит в нормальный язык программирования
   acht
 
75 - 21.07.21 - 21:14
(67) Про то, что документ будет загружаться в другую базу - это ты героически выдумал.
Если бы ты сам прочитал задание на скриншоте, то обратил бы внимание на "(за исключением номера, так как номера документов уникальные)". Что некисло так намекает.
   Jurest_
 
76 - 21.07.21 - 21:14
(73) Если ты про меня, то я польщен)
   Jurest_
 
77 - 21.07.21 - 21:15
(74) Пока ищу себя, а то в своей профессии, на которую учусь, сильно разочаровался.
   Pro-tone
 
79 - 21.07.21 - 21:17
(73) ну если только так
(75) надо уточнять в задании такие вещи, если это выгрузка в другую базу, то - (55), если из текущей в текущую, то просто найти по номеру+дате уже выгруженный, передать в текстовый файл его исходный номер и все, при загрузке программно скопировать тот исходный и записать, ему присвоится новый номер
   Jurest_
 
80 - 21.07.21 - 21:18
(78) Анекдот ТОП))
   Pro-tone
 
Модератор
81 - 21.07.21 - 21:19
(78) мат на форуме запрещен, поэтому удалил
   acht
 
82 - 21.07.21 - 21:19
(79) И это ты еще про движения забыл.
   Pro-tone
 
84 - 21.07.21 - 21:21
(82) не надо их, сами создадутся при проведении если речь о копии
   acht
 
85 - 21.07.21 - 21:21
(78) Там в оригинале вместо абстрактного сына был вполне конерктный Вовочка - анекдот №367407
   acht
 
86 - 21.07.21 - 21:23
(84) И не совпадут с исходными, потому что реализация проведения поменялась между выгрузкой и загрузкой =)
   Pro-tone
 
87 - 21.07.21 - 21:25
(86) скажи еще про ручную корректировку движений, контроль остатков, партионный учет и т.п., это уже флуд
   acht
 
88 - 21.07.21 - 21:25
(87) Ты с своим глубоким копированием первый начал
   Pro-tone
 
89 - 21.07.21 - 21:27
(88) потому что нет однозначной конкретизации в задаче что это не в другую базу, а ТС ничего не уточнял сам как я понял
   Jurest_
 
90 - 21.07.21 - 21:30
(89) Нет, не уточнял. Но уверен, что загрузка документа будет в туже базу, откуда и выгрузка.
   Pro-tone
 
91 - 21.07.21 - 21:43
(90) тогда - (79), 3 значения должны были в текстовом файле - вид документа, номер, дата. И чтение их, поиском исходника и программная копия найденного методом Скопировать () + записать(провести если исходник был проведен). Задача решена.
   Jurest_
 
92 - 21.07.21 - 21:48
Логично, Спасибо!
   hhhh
 
93 - 22.07.21 - 02:12
(91) да не проведется он. Надо движения копировать.


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