Имя: Пароль:
1C
1С v8
выбор документа из базы данных и преобразование его в txt файл
,
0 illi_dan
 
28.04.18
18:46
Добрый день уважаемые форумчане. Мне необходимо реализовать запись документа из базы данных в текстовый формат представления без использования сериализации,функций ЗаписатьВстроку() и без использования xml и json.Так как я пересел с плюсов, у меня возникли некоторые трудности. Я не особо понимаю, как выглядит объект "метаданных" изнутри. У нас ведь они могут быть разного типа и соответственно количество полей будет разное, как можно тогда написать общий для всех код,который выгружал бы эти данные? Буду благодарен так же за ссылки где можно подробно об этом почитать.Спасибо
1 Остап Сулейманович
 
28.04.18
18:57
(0) Если перешел с плюсов - тогда должен бы знать за коллекции и foreach. Оно также точно есть в 1С.
Посему
Для каждого реквизит ИЗ Реквизиты
....
КонецЦикла;
Для каждого ТабличнаяЧасть ИЗ ТабличнаяЧасти ....
   Для Каждого текСтрока ИЗ ТабличнаяЧасть ....
   КонецЦикла;
КонецЦикла;
2 illi_dan
 
28.04.18
19:09
Благодарю. А каким кодом можно открыть выбор документа в форме? Нашел,что открывается с помощью "форма.ОткрытьМодально()" Но там вызывают метод формы по отношению к конкретному типу(справочник,регистр и т.д),мне же нужен произвольный. Прошу прощения если путаюсь в терминах
3 illi_dan
 
28.04.18
19:11
выбор документа в форме я имею ввиду такое же открывающееся меню, как тут:"ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие)"
4 mistеr
 
28.04.18
19:55
(2) Выбрать документ произвольного типа можно стандартной процедурой ВвестиЗначение().

    Перем ДокСсылка;
    
    ВвестиЗначение(ДокСсылка, "Выбрите документ", Документы.ТипВсеСсылки());
5 mistеr
 
28.04.18
20:02
(0) >как можно тогда написать общий для всех код,который выгружал бы эти данные?

Для этого и нужен объект метаданных. Он описывает структуру прикладного объекта. Если провести аналогию с плюсами, то конкретный вид документа это класс, а метаданные это RTTI для этого класса. Получается объект метаданных методом Метаданные():

    Метаданные = ДокСсылка.Метеданные()

У этого объекта есть свойства-коллекции Реквизиты и ТабличныеЧасти. Обходишь их циклом, получаешь имена реквизитов, получаешь значения реквизитов документа через [].

    ИмяРеквизита = "Дата";
    ДатаДокумента = ДокСсылка[ИмяРеквизита];
6 illi_dan
 
28.04.18
22:37
Спасибо огромное.
7 illi_dan
 
28.04.18
23:38
Прошу прощения, но вот этот код





Процедура ДокументНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Перем нач;
    ОписаниеОповещения=Новый ОписаниеОповещения("КонецВвода",ЭтаФорма);
    ПоказатьВводЗначения(ОписаниеОповещения,нач,,);    
КонецПроцедуры


Процедура КонецВвода()Экспорт
    
    
КонецПроцедуры



почему-то вылетает с ошибкой
"отсутствует способ ввести значение требуемого типа",что я не так делаю?
8 Красный рассвет
 
28.04.18
23:42
Зачем ты пересаживаешься с плюсов на 1С, а не на веб и прочие джавы?
9 illi_dan
 
29.04.18
00:53
Хм,с++ это приговор?
10 zwei
 
29.04.18
12:27
(9) Симптом
11 mistеr
 
29.04.18
12:58
(7) Нужно задать тип вводимого значения. Явно тип задается четвертым параметром. Если не задан, как у тебя, то берется тип переменной-приемника. У тебя он тоже не задан. Поэтому и ошибка.
12 illi_dan
 
29.04.18
16:28
(11) Прошу не бить тапками, но я не особо понимаю вот в этом примере

вестиЗначение(ДокСсылка, "Выбрите документ", Документы.ТипВсеСсылки());

"Документы"- это созданный объект с именем "Документы" такого вида:

Документы = новый <тип>;

?

Тогда какого типа должен быть этот объект,что бы можно было бы вызвать функцию "ТипВсеСсылки()"?
13 mexanik_96
 
29.04.18
16:35
(0) зачем с плюсов в 1с?
14 mexanik_96
 
29.04.18
16:36
вообще красногласые говорят кресты, а тут плюсы, студент что ли?
15 illi_dan
 
29.04.18
16:38
(11) Нашел что 3 аргумент функции ВвестиЗначение() в принимает "ОписаниеТипов",но как тогда передать все возможные типы? Просто на ваш код ругается,что мол "документы" переменная не определенна
16 illi_dan
 
29.04.18
16:38
(14) да
17 mistеr
 
29.04.18
16:58
(12) "Документы" - это типа глобальный объект, его создавать не нужно. Но если у тебя управляемые формы (по твоему коду похоже, что так), то на клиенте она не доступна, только на сервере.

(15) Описание типов придется сформировать на сервере и передать на клиента.
18 illi_dan
 
29.04.18
19:07
(17) пробую вот так

&НаСервере
Функция ГенерДок()
    возврат Документы;    
КонецФункции



&НаКлиенте
Процедура ДокументНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
      Перем ДокСсылка;
    Документы=ГенерДок();
    ВвестиЗначение(ДокСсылка, "Выберите документ",Документы.ТипВсеСсылки());
    
КонецПроцедуры

Падает с "ошибка отображения типов".Есть ли возможность сделать это без сервера?
19 hhhh
 
29.04.18
20:23
(18) просто заведи реквизит с типом ДокументСсылка. И кинь его мышкой на на форму. Всё, никакого программного кода писать не надо.
20 mistеr
 
29.04.18
20:23
Возврат Документы.ТипВсеСсылки()
21 trdm
 
30.04.18
11:12
А зачем с плюсов уходить?
22 illi_dan
 
30.04.18
21:08
(19)я собственно так и сделал,но мне нужно сделать форму,при открытии которой можно выбрать документ из базы.
23 hhhh
 
30.04.18
22:38
(22) почему при открытии? Это бзик такой или пари? Просто у тебя есть поле на форме типа документ. Значения в него вводятся также как и везде.
24 illi_dan
 
01.05.18
00:03
(20) так тоже выдает ошибку "отсутсвует способ ввести значение требуемого типа"(
25 illi_dan
 
01.05.18
00:04
(23) такое задание вот
26 illi_dan
 
01.05.18
00:44
(20) прошу прощение,все работает)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан