Имя: Пароль:
1C
 
Перегрузка Документа. Тестовое задание
Ø (Волшебник 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
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) Создайте новую тему