|
Перегрузка Документа. Тестовое задание Ø (Волшебник 20.09.2023 15:21) | ☑ | ||
---|---|---|---|---|
0
Jurest_
20.09.23
✎
15:20
|
Всем привет. Сразу скажу, что можно пользоваться любыми источниками информации, поэтому я здесь. Суть задания, перебросить любой док из базы 1с в txt файл и наоборот. Использовать функции УникальныеИдентификаторы() и тп нельзя. Вопрос: Как правильно перебрать все реквизиты табличных частей документа? Пишу вот так
ТекстДляЗаписи = Новый ТекстовыйДокумент; ВыбранныйДокумент = Объект.Документ; МетаданныеДокументаРеквизиты = ВыбранныйДокумент.Метаданные().Реквизиты; МетаданныеДокументаТЧ = ВыбранныйДокумент.Метаданные().ТабличныеЧасти; Для Каждого Реквизит из МетаданныеДокументаРеквизиты Цикл ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + ВыбранныйДокумент[Реквизит.Имя]); КонецЦикла; Для каждого ТабличнаяЧасть Из МетаданныеДокументаТЧ Цикл ТекстДляЗаписи.ДобавитьСтроку("--------Новая Табличная Часть------"); Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл ТекстДляЗаписи.ДобавитьСтроку("" + СтрокаТабличнойЧасти.Имя + ":" + ВыбранныйДокумент[СтрокаТабличнойЧасти.Имя]); КонецЦикла; КонецЦикла; ТекстДляЗаписи.Записать(Объект.Файл); Ругается на {ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(36)}: Итератор для значения не определен
Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл Подскажите пожалуйста. |
|||
1
Йохохо
21.07.21
✎
00:22
|
Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть] Цикл
? |
|||
2
Йохохо
21.07.21
✎
00:23
|
ТабличнаяЧасть.Имя
|
|||
3
Jurest_
21.07.21
✎
00:27
|
Спасибо, пропустил. Правда теперь на это ругается)
ТекстДляЗаписи.ДобавитьСтроку("" + СтрокаТабличнойЧасти.Имя + ":" + ВыбранныйДокумент[СтрокаТабличнойЧасти.Имя]); Но тут я сам наверное. Спасибо) |
|||
4
Йохохо
21.07.21
✎
00:30
|
она бай намберс
|
|||
5
Jurest_
21.07.21
✎
00:38
|
Не особо понял, о чем ты. Но буду разбираться)
|
|||
6
OldCondom
21.07.21
✎
00:45
|
поставь точку останова в месте ошибки и посмотри что у тебя в "ТабличнаяЧасть". Подсказка: ничего.
|
|||
7
Jurest_
21.07.21
✎
00:48
|
ТабличнаяЧасть Значение:Товары, Тип: ОбъектМетаданных
|
|||
8
Jurest_
21.07.21
✎
00:50
|
Так что все есть.
Еще вопросик, можно ли перебрать все реквизиты СтрокиТЧ не обращаясь к ним на прямую? Имею ввиду не писать СтрокаТЧ.Номерклатура = Значение, а все это как то циклом обойти. |
|||
9
OldCondom
21.07.21
✎
00:51
|
а, там цикл, точно. Ну вот, теперь посмотри там же эту табличнаячасть. Разверни. Там нет коллекции
|
|||
10
Jurest_
21.07.21
✎
00:53
|
Да вроде все есть
https://disk.yandex.ru/i/ChnSUzT7l0fwXg |
|||
11
OldCondom
21.07.21
✎
00:53
|
еще погугли сериализация объектов 1с. Ты можешь просто в json объект перекинуть, потом прочитать
|
|||
12
OldCondom
21.07.21
✎
00:54
|
(10) я вижу объект и его свойства. А ты коллекцию?
|
|||
13
Jurest_
21.07.21
✎
00:54
|
(11) Не, тоже нельзя использовать. Так в задании написано(
|
|||
14
Jurest_
21.07.21
✎
00:54
|
Реквизиты - КоллекцияОбъектовМетаданных
|
|||
15
Jurest_
21.07.21
✎
00:55
|
Или это не то?
Просто Строчку то я правильно получаю |
|||
16
OldCondom
21.07.21
✎
00:55
|
ну так и перебирай их, а не табличная часть. То есть табличнаячасть.реквизиты
|
|||
17
Jurest_
21.07.21
✎
00:58
|
А он мне разве сможет все строчки так перебрать?
|
|||
18
OldCondom
21.07.21
✎
00:58
|
Начни с постановки вопроса. Реквизиты у тебя получиллсь перебрать и получить их значения, так? Табличные части получилось, а вот значения их строк - нет. Так? Или я путаю
|
|||
19
Йохохо
21.07.21
✎
00:59
|
ну если КоллекцияХХХ то она итерируемая а потом тСтрокаТЧ[тЭлементКоллекцияХХХ]
|
|||
20
Jurest_
21.07.21
✎
00:59
|
(18) Строчки получилось получить
|
|||
21
Jurest_
21.07.21
✎
01:00
|
А вот правильно обратиться к каждому полю строчкиТЧ, чтоб вывести в док нет.
|
|||
22
Jurest_
21.07.21
✎
01:01
|
Вот строчка
https://disk.yandex.ru/i/avjjofXwcZbXEg |
|||
23
Йохохо
21.07.21
✎
01:02
|
(21) для нее не работает цикл для каждого?
|
|||
24
Jurest_
21.07.21
✎
01:04
|
{ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(37)}: Получение элемента по индексу для значения не определено
Для каждого Резвизит Из ВыбранныйДокумент[СтрокаТабличнойЧасти] Цикл |
|||
25
OldCondom
21.07.21
✎
01:06
|
Чего то ты не договариваешь. В (22) именно СтрокаТабличнойЧасти - это строкаТЧ документа, а не метаданных. А в коде (1) это метаданные объекта.
|
|||
26
Йохохо
21.07.21
✎
01:07
|
если хочется спать то засунуть имена реквизитов ТЧ (+стандартных) в массив и по нему строчкиТЧ[массивреквТЧ[Счетчик]]
|
|||
27
OldCondom
21.07.21
✎
01:08
|
(24) И снова. Точка останова. Что в ВыбранныйДокумент[СтрокаТабличнойЧасти]? Что в СтрокаТабличнойЧасти?
|
|||
28
Jurest_
21.07.21
✎
01:09
|
Для каждого ТабличнаяЧасть Из МетаданныеДокументаТЧ Цикл
ТекстДляЗаписи.ДобавитьСтроку("--------Новая Табличная Часть------"); Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть.Имя] Цикл Для каждого Резвизит Из ВыбранныйДокумент[СтрокаТабличнойЧасти] Цикл ТекстДляЗаписи.ДобавитьСтроку("" + Реквизит.Имя + ":" + ВыбранныйДокумент[Реквизит.Имя]); КонецЦикла; ДанныеОСтрочке = ВыбранныйДокумент[СтрокаТабличнойЧасти].Метаданные(); КонецЦикла; КонецЦикла; (25) |
|||
29
Йохохо
21.07.21
✎
01:09
|
или у коллекции должен быть метод Количество() и доступ по КоллекцияРеквизитовТЧ[1].Имя
|
|||
30
Jurest_
21.07.21
✎
01:11
|
(27) Действительно, в ВыбранныйДокумент[СтрокаТабличнойЧасти] походу ничего нет
|
|||
31
Jurest_
21.07.21
✎
01:12
|
(26) (29) Блин, что то я себя таким тупым чувствую
|
|||
32
OldCondom
21.07.21
✎
01:20
|
(31) я тоже не понял, о чем он.
У тебя с реквизитами все получилось. Табличная часть почти тоже самое. Тебе нужно обойти табличные части(это ты сделал), потом обойти реквизиты табличной части(этого нет). Далее обходишь Объект[твоя табличная часть из коллекции метаданных объекта] и уже внутри обходишь реквизиты табличной части. Примерно так Для каждого СтрокаТабличнойЧасти Из ВыбранныйДокумент[ТабличнаяЧасть.Имя] Цикл -- это у тебя есть Для каждого Резвизит Из РеквизитыТабличнойЧасти Цикл -- у тебя этого нет, ты не получил коллекцию реквизитов табличной части СтрокаТабличнойЧасти[Реквизит.Имя] -- получаешь значение реквизита строки табличной части документа КонецЦикла; КонецЦикла; |
|||
33
Jurest_
21.07.21
✎
01:24
|
(32) Кажется, я понял о чем ты)) Спасибо большое, пошел пробовать.
|
|||
34
Jurest_
21.07.21
✎
01:41
|
(32) Получилось! Спасибо еще раз. Смог достать каждый реквизит строчкиТЧ.
|
|||
35
Jurest_
21.07.21
✎
18:32
|
С выгрузкой разобрался. Теперь бы с загрузкой. При загрузке надо понять, какой документ вообще надо создавать. У меня есть в текстовом документе строчка, которая содержит представление объекта нужного типа документа. Можно ли по этой строчке как-то найти этот тип и создать документ?
|
|||
36
Pro-tone
21.07.21
✎
18:39
|
(35) допиши в текстовый док поле, которое будет отвечать за вид документа как он назван в пофигураторе кодом ВыбранныйДокумент.Метаданные().Имя
|
|||
37
Jurest_
21.07.21
✎
18:45
|
(36) Большое спасибо. Теперь в Текстовом документе правильное имя документа, который надо создать. Еще один вопрос, как правильно обратиться к документу через переменную?
Я имею ввиду, что можно создать документ так: Документы.РеализацияТоваровИУслуг.СоздатьДокумент(); Вот как вместо РеализацияТоваровИУслуг положить переменную, в которой будет лежать строчка из текстового документа соответствующая имени нужного документа? |
|||
38
OldCondom
21.07.21
✎
18:48
|
Документ[ИмяДокументаСтрокой]
|
|||
39
OldCondom
21.07.21
✎
18:48
|
Документы***
|
|||
40
Jurest_
21.07.21
✎
18:55
|
Спасибо!
|
|||
41
Jurest_
21.07.21
✎
20:05
|
Пытаюсь добавить реквизиты таким кодом, оказывается, это не так просто, как я думал.
НовыйДокумент = Документы[ТипДокумента].СоздатьДокумент(); //НовыйДокумент.Дата = НачалоДня(ТекущаяДата()); Для НомерСтроки = 2 По ЗагружаемыйФайл.КоличествоСтрок() Цикл СтрокаТекста = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки); Если Сред(СтрокаТекста,1,1) <> ":" Тогда МассивСлов = СтрРазделить(СтрокаТекста, ":"); НовыйДокумент[МассивСлов[0]] = МассивСлов[1]; Иначе НомерСтрокиКонцаРеквизитов = НомерСтроки; Прервать; КонецЕсли; КонецЦикла; НовыйДокумент.Записать(); Но проблема в том, что не все реквизиты простые, там есть и ссылки на справочники, перечисления. Реально ли как то проще сделать, а не проверять каждую строку текстового документа на соответствие какому-то типу данных? |
|||
42
Pro-tone
21.07.21
✎
20:22
|
(41) для этого существует КД2 и КД3, в которых описывается структура данных, их типы, все их свойства(реквизиты) и т.п., твое задание не может быть настолько сложным чтоб текстовым документом переносить ссылочные типы реквизитов, значит ты что-то не понял, вероятно нужно перенести только небольшой список нессылочного типа реквизитов, в противном случае, слать подальше кто такое задание дал или потребовать оплаты за его выполнение
|
|||
43
Jurest_
21.07.21
✎
20:26
|
(42) Вот задание. Если я действительно неправильно понял, то попробую по другому сделать. Но пока только одна идея в голове.
https://disk.yandex.ru/i/yEY2uklDADFv0A |
|||
44
acht
21.07.21
✎
20:33
|
(42) > слать подальше кто такое задание дал
Бедный alexrovich, никто его не любит =) Сейчас появятся вопросы по "Нужно разработать внешнюю обработку в Конфигураторе 1С. Назначение обработки – оповестить по электронной почте руководителя компании о новых заказах клиентов с «интересной» суммой." =) |
|||
45
Jurest_
21.07.21
✎
20:34
|
ахахах, не, это я уже сдал))
|
|||
46
Jurest_
21.07.21
✎
20:35
|
(44) Пока гуглил это задание, нашел, что еще и в Сиринт чтобы пройти на стажировку такое задание дают.
|
|||
47
Jurest_
21.07.21
✎
20:37
|
(44) Не можешь подсказать, как вообще подступиться то? Вот я на (41) вот этом встал пока
|
|||
48
Вафель
21.07.21
✎
20:38
|
(44) это они нанимают чуваков для шахматиста ерп внедрять?
|
|||
49
Вафель
21.07.21
✎
20:39
|
Чтобы в текст что то выгружать, помимо самих значений нужно еще хоть какуюто разметку выгружать
|
|||
50
Pro-tone
21.07.21
✎
20:39
|
(43) проси оплату за 4 дня минимум из расчета 6000р за день, это просто наглость такие задания задавать, поди еще и зарплату на вакансию дают 130т.р.
|
|||
51
Jurest_
21.07.21
✎
20:42
|
(50) Написано от 50т.р.
|
|||
52
Jurest_
21.07.21
✎
20:42
|
(50) Интересное предложение, стоит попробовать))
|
|||
53
acht
21.07.21
✎
20:46
|
(47) Ну, вот здесь, например, чувак хранит в строке текста еще и информацию о типе и ключевых реквизитах для поиска: https://github.com/misha1/alexrovich_1c_task3
|
|||
54
Jurest_
21.07.21
✎
20:50
|
(53) Спасибо, ща поизучаю
|
|||
55
Pro-tone
21.07.21
✎
20:51
|
(47) общими мазками дам направление куда копать
1. Сперва в текстовый файл ты должен передать всю структуру возможных типов данных, и их структуру, которые есть во всех документах. Получать эти типы надо рекурсивно, проваливаясь глубже и глубже и сверять с теми типами, которые ты уже положил в описание типов в свой файл. По данной разметке ты будешь понимать как заполнять значениями и какого они типа и какие типы содержать их свойства 2. Далее циклом по конкретному объекту обойти все его метаданные, включая табчасти и их данные внутри, записав в файл имя реквизита, тип его значения и само значение 3. Если тип значения выгружаемого реквизита ссылочный, тебе надо залезть в свою структуру из 1. и по такому же принципу выгрузить его данные, и так по рекурсии падаешь до самого низа ветвления и выгружаешь все до примитивных типов, когда провалиться глубже уже невозможно 4. Далее понять как ты будешь искать в базе приемнике объект (наименование, код, дата), передать эти данные как свойства поиска, запросом будешь искать существующий, если нет его, то загружать Это я примерно описал как работает обработка УниверсальныйОбменДаннымиXML, только она делает это в формате XML. Примерно также работает и выгрузка через xdto, только там структура передается не в самом файле, а она берется из пакета xdto. По такому же принципу, но текстово можно сделать и текстовую выгрузку. |
|||
56
Pro-tone
21.07.21
✎
20:53
|
(51) так это работа типа фриланса? я думал экзаменационный тест
|
|||
57
Jurest_
21.07.21
✎
20:56
|
(56) Не сказал бы, что прям фриланс. Но это тестовое задание, чтобы пройти на работу.
|
|||
58
Jurest_
21.07.21
✎
20:56
|
(55) +- понял логику, большой спасибо за совет!
|
|||
59
Смотрящий
21.07.21
✎
20:59
|
(55) Лошъ, песдешъ и провокация
(57) Пиши/читай данные как RAW как обмен в клюшках сделан |
|||
60
acht
21.07.21
✎
21:01
|
(56) Алексрович пылесосит рынок студентов, чтобы пожрать новых стажеров.
|
|||
61
acht
21.07.21
✎
21:02
|
(55) Хреновый из тебя стажер, не возьмут тебя.
Ему наъ не уперлось полное копирование объектов - например, справочника валют со всеми реквизитами. Ему надо по коду/наименованию найти ссылку и все. |
|||
62
Смотрящий
21.07.21
✎
21:03
|
(60) он же жалный, ипшник этот
|
|||
63
acht
21.07.21
✎
21:04
|
(62) Ну, я же не спрашиваю, что он делает с предыдущими стажерами =) Это пусть у ТС голова болит.
|
|||
64
Pro-tone
21.07.21
✎
21:05
|
(61) плохо ты читал что он хочет
"При нажатии кнопки «Выгрузить» информация, содержащаяся в выбранном пользователем документе, должна выгрузиться в указанный файл. Информация должна быть исчерпывающей, то есть выгружаться должны данные, чтобы при нажатии кнопки «Загрузить» в базе создавалась бы копия исходного документа" |
|||
65
Pro-tone
21.07.21
✎
21:06
|
это маразматическое задание для стажера, похоже на садизм какой-то, слал бы я этого товарища с его заданием далеко и надолго
|
|||
66
acht
21.07.21
✎
21:06
|
(64) Ю копия исходного документа
И где тут про необходмость восстановления потрохов справочника валют? |
|||
67
Pro-tone
21.07.21
✎
21:08
|
(66) ты как копию передашь в базу где нет такого документа? найти по номеру+дате? ну пусто и че дальше? он хочет чтоб все данные дока ушли, и как я понял любого вида дока из конфы
|
|||
68
Pro-tone
21.07.21
✎
21:09
|
(66) а как ты выгрузишь валюту которой нет в приемнике без потрохов?
|
|||
69
Pro-tone
21.07.21
✎
21:10
|
валюту, номенклатуру, да что угодно и т.п., если их нет в приемнике
|
|||
70
Pro-tone
21.07.21
✎
21:11
|
только через передачу потрохов чтоб понимать что к чему приязано
|
|||
71
Jurest_
21.07.21
✎
21:11
|
(63) Прости, а ТС это кто?
|
|||
72
Pro-tone
21.07.21
✎
21:12
|
(71) топик стартер, то есть ты
|
|||
73
OldCondom
21.07.21
✎
21:12
|
(65) Для ТС как раз. И мозгами пошевелит и опыт получит. ТС на самом деле редкий случай, хочет учится + задавая вопрос показывает, что сделано, и весьма не так уж убого.
И тут еще опыт хороший, увидит, что с дол**бами связываться не стоит и найдет нормального работодателя. |
|||
74
OldCondom
21.07.21
✎
21:13
|
или свалит в нормальный язык программирования
|
|||
75
acht
21.07.21
✎
21:14
|
(67) Про то, что документ будет загружаться в другую базу - это ты героически выдумал.
Если бы ты сам прочитал задание на скриншоте, то обратил бы внимание на "(за исключением номера, так как номера документов уникальные)". Что некисло так намекает. |
|||
76
Jurest_
21.07.21
✎
21:14
|
(73) Если ты про меня, то я польщен)
|
|||
77
Jurest_
21.07.21
✎
21:15
|
(74) Пока ищу себя, а то в своей профессии, на которую учусь, сильно разочаровался.
|
|||
79
Pro-tone
21.07.21
✎
21:17
|
(73) ну если только так
(75) надо уточнять в задании такие вещи, если это выгрузка в другую базу, то - (55), если из текущей в текущую, то просто найти по номеру+дате уже выгруженный, передать в текстовый файл его исходный номер и все, при загрузке программно скопировать тот исходный и записать, ему присвоится новый номер |
|||
80
Jurest_
21.07.21
✎
21:18
|
(78) Анекдот ТОП))
|
|||
81
Pro-tone
модератор
21.07.21
✎
21:19
|
(78) мат на форуме запрещен, поэтому удалил
|
|||
82
acht
21.07.21
✎
21:19
|
(79) И это ты еще про движения забыл.
|
|||
84
Pro-tone
21.07.21
✎
21:21
|
(82) не надо их, сами создадутся при проведении если речь о копии
|
|||
85
acht
21.07.21
✎
21:21
|
(78) Там в оригинале вместо абстрактного сына был вполне конерктный Вовочка - анекдот №367407
|
|||
86
acht
21.07.21
✎
21:23
|
(84) И не совпадут с исходными, потому что реализация проведения поменялась между выгрузкой и загрузкой =)
|
|||
87
Pro-tone
21.07.21
✎
21:25
|
(86) скажи еще про ручную корректировку движений, контроль остатков, партионный учет и т.п., это уже флуд
|
|||
88
acht
21.07.21
✎
21:25
|
(87) Ты с своим глубоким копированием первый начал
|
|||
89
Pro-tone
21.07.21
✎
21:27
|
(88) потому что нет однозначной конкретизации в задаче что это не в другую базу, а ТС ничего не уточнял сам как я понял
|
|||
90
Jurest_
21.07.21
✎
21:30
|
(89) Нет, не уточнял. Но уверен, что загрузка документа будет в туже базу, откуда и выгрузка.
|
|||
91
Pro-tone
21.07.21
✎
21:43
|
(90) тогда - (79), 3 значения должны были в текстовом файле - вид документа, номер, дата. И чтение их, поиском исходника и программная копия найденного методом Скопировать () + записать(провести если исходник был проведен). Задача решена.
|
|||
92
Jurest_
21.07.21
✎
21:48
|
Логично, Спасибо!
|
|||
93
hhhh
22.07.21
✎
02:12
|
(91) да не проведется он. Надо движения копировать.
|
|||
94
Keysto
20.09.23
✎
15:19
|
(32) Делаю это же самое задание, и так же проблема с получением реквизитов Табличной части, есть кто может помочь?
Текст = Новый ТекстовыйДокумент; ВыбранныйДокумент = ЭтотОбъект.Документ; РеквизитыДокумента = ВыбранныйДокумент.Метаданные().Реквизиты; РеквизитыТЧ = ВыбранныйДокумент.Метаданные().ТабличныеЧасти; Для Каждого Реквизит ИЗ РеквизитыДокумента Цикл Текст.ДобавитьСтроку("" + ВыбранныйДокумент + " | " + Реквизит.Имя + " : " + ВыбранныйДокумент[Реквизит.Имя]); КонецЦикла; Для Каждого ТЧ ИЗ РеквизитыТЧ Цикл Текст.ДобавитьСтроку("---------------------"); Для Каждого СтрокаТЧ ИЗ ВыбранныйДокумент[ТЧ.Имя] Цикл Для Каждого Реквизит Из РеквизитыТЧ Цикл Текст.ДобавитьСтроку("" + СтрокаТЧ[Реквизит.Имя] + ":" + ВыбранныйДокумент[Реквизит.Имя]); КонецЦикла; КонецЦикла; КонецЦикла; Текст.Записать(Файл); |
|||
95
Волшебник
20.09.23
✎
15:21
|
(94) Создайте новую тему
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |