Имя: Пароль:
1C
 
Метаданные. Выгрузка\Загрузка документов.
0 marty0701
 
23.02.11
13:38
Здравствуйте жители!=) Нужна помощь словом или делом. Итак, есть у меня задание, нужно выгрузить исчерпывающую информацию о документе в файл, чтоб потом его можно было загрузить обратно. Собственно, что я понял пока(если не прав, поправьте): 1. Есть поле для выбора документа, который нужно выгрузить, после выбора необходимо получить номер документа, затем через конструкцию =Метаданные.Документ(["Идентификатор"/Номер]).что-то= я смогу получить всю необходимую информацию о документе и о его содержимом. Пока правильно мыслю? 2. Создать файл, например .xls и туда в цикле всю полученную информацию выгрузить. 3. При загрузке необходимо все считать каким-то образом и через все те же метаданные создать новый документ.
Реализация ТОЛЬКО с использованием метаданных.
Алгоритм действий верный? Если нет, что не так? Заранее спасибо за ответы.
1 ДенисЧ
 
23.02.11
13:39
всё верно
2 AlexNew
 
23.02.11
13:40
XLS.
3 vs1c
 
23.02.11
14:31
(0),(1),(2) А что, сериализацию у нас уже отменили?
4 AlexNew
 
23.02.11
14:41
(3) А где написано, что конфигурации одинаковые? (Порядок и состав реквизитов).
5 DrShad
 
23.02.11
14:42
(0) КД не предлагать?
6 vs1c
 
23.02.11
14:56
(4) А где, что разные? Это вопрос к автору (0). Однако мне кажется, что п.3 в (0) намекает на то, что они одинаковые. Кроме всего прочего я говорил немного о другом. Сериализацию можно использовать для выгрузки документа без заморочек (типа анализа метаданных и пр.), и для загрузки. Если конфы одинаковые - вообще песня, нет - парсите XML и опять счастье.
(5) Если бы (0) знал что это - вопрос бы не возник :)
7 vmv
 
23.02.11
16:03
1. Забросить в общий модуль этот функционал
2. Снизу пример вызова.

Примечание: РазложитьСтрокуВМассивПодстрок() - стандартная функция любой типовой, приведена рядом для удобства.
Остальное мое.

Назначение: позволяет получить полную раскладку свойств объекта по ссылке, в том числе и пустой.  


Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")    
   МассивСтрок = Новый Массив();
   Если Разделитель = " " Тогда
       Стр = СокрЛП(Стр);
       Пока 1 = 1 Цикл
           Поз = Найти(Стр, Разделитель);
           Если Поз = 0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр, Поз - 1));
           Стр = СокрЛ(Сред(Стр, Поз));
       КонецЦикла;
   Иначе
       ДлинаРазделителя = СтрДлина(Разделитель);
       Пока 1 = 1 Цикл
           Поз = Найти(Стр, Разделитель);
           Если Поз = 0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз - 1));
           Стр = Сред(Стр, Поз + ДлинаРазделителя);
       КонецЦикла;
   КонецЕсли;
   
КонецФункции
Функция ПолучитьПустуюТаблицуРеквизитов()

   ТзРеквизиты = Новый ТаблицаЗначений;
   
   ТзРеквизиты.Колонки.Добавить("Стандартный");   // Флажок, три состояния: 0 - не реквизит, 1 - стандартный реквизит, 2 - обычный реквизит.  
   ТзРеквизиты.Колонки.Добавить("ИмяТЧ");
   ТзРеквизиты.Колонки.Добавить("Имя");
   ТзРеквизиты.Колонки.Добавить("Синоним");
   ТзРеквизиты.Колонки.Добавить("Тип");
   ТзРеквизиты.Колонки.Добавить("ЗначениеТипа");
   ТзРеквизиты.Колонки.Добавить("Комментарий");
   ТзРеквизиты.Колонки.Добавить("Использование");

   Возврат ТзРеквизиты

КонецФункции
Функция ИнициализироватьСвойстваСтрокиРеквизитов(НоваяСтрокаТз, Реквизит, Стандартный, ИмяТЧ="")
   
   НоваяСтрокаТз.Стандартный   = Стандартный;
   НоваяСтрокаТз.ИмяТЧ         = ИмяТЧ;
   НоваяСтрокаТз.Имя           = ?(Не ПустаяСтрока(ИмяТЧ),ИмяТЧ+".","") + Реквизит.Имя;
   НоваяСтрокаТз.Синоним       = Реквизит.Синоним;
   НоваяСтрокаТз.Тип           = Реквизит.Тип;
   НоваяСтрокаТз.ЗначениеТипа  = Реквизит.Тип.ПривестиЗначение();
   НоваяСтрокаТз.Комментарий   = Реквизит.Комментарий;
   Попытка
       НоваяСтрокаТз.Использование = Реквизит.Использование;      
   Исключение
       НоваяСтрокаТз.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппыИЭлемента;
   КонецПопытки;
   
   Возврат Истина; // Можно проверять успешность инициализации и возвращать Ложь. Правда, нет необходимости
   
КонецФункции
Функция ПолучитьРеквизитыОбъектаМетаданных(Ссылка, ВключаяСвойстваРеквизита = Ложь, ВключаяСтандартныеРеквизиты = Ложь, ВключаяТабличныеЧасти = Ложь) Экспорт
    Перем ОбъектМетаданных, ТаблицаТип, ТаблицаВид;
    Перем СтандартныеРеквизитыОбъектаМетаданных, РеквизитыОбъектаМетаданных;
   
    ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка));
    мИмяТаблицыПоСсылке = РазложитьСтрокуВМассивПодстрок(ОбъектМетаданных.ПолноеИмя(), ".");
    Если Не мИмяТаблицыПоСсылке.Количество() Тогда
        Возврат Неопределено;
    КонецЕсли;
    ТаблицаТип = мИмяТаблицыПоСсылке[0];
    ТаблицаВид = мИмяТаблицыПоСсылке[мИмяТаблицыПоСсылке.ВГраница()];
   
    Если ТипЗнч(ВключаяТабличныеЧасти) = Тип("Строка") Тогда
        Если ВключаяСтандартныеРеквизиты Тогда
            СтандартныеРеквизитыОбъектаМетаданных = ОбъектМетаданных.ТабличныеЧасти[ВключаяТабличныеЧасти].СтандартныеРеквизиты;
        КонецЕсли;
        РеквизитыОбъектаМетаданных = ОбъектМетаданных.ТабличныеЧасти[ВключаяТабличныеЧасти].Реквизиты;    
    Иначе    
        Если ВключаяСтандартныеРеквизиты Тогда
            СтандартныеРеквизитыОбъектаМетаданных = ОбъектМетаданных.СтандартныеРеквизиты;
        КонецЕсли;
        РеквизитыОбъектаМетаданных = ОбъектМетаданных.Реквизиты;    
    КонецЕсли;
   
    Если ВключаяСвойстваРеквизита Тогда
        ТзРеквизиты = ПолучитьПустуюТаблицуРеквизитов();
    Иначе
        сРеквизиты = Новый Соответствие;
    КонецЕсли;
   
    // Стандартные реквизиты
    Если ВключаяСтандартныеРеквизиты Тогда
        Для Каждого Реквизит Из СтандартныеРеквизитыОбъектаМетаданных Цикл
            Если ВключаяСвойстваРеквизита Тогда
                НоваяСтрокаТз = ТзРеквизиты.Добавить();
                Если ТипЗнч(ВключаяТабличныеЧасти) = Тип("Строка") Тогда  
                    ИнициализироватьСвойстваСтрокиРеквизитов(НоваяСтрокаТз, Реквизит, 1, ВключаяТабличныеЧасти);
                Иначе    
                    ИнициализироватьСвойстваСтрокиРеквизитов(НоваяСтрокаТз, Реквизит, 1);
                КонецЕсли;
            Иначе
                Если ТипЗнч(ВключаяТабличныеЧасти) = Тип("Строка") Тогда  
                    сРеквизиты.Вставить(ВключаяТабличныеЧасти + "." + Реквизит.Имя, Реквизит.Синоним);
                Иначе    
                    сРеквизиты.Вставить(Реквизит.Имя, Реквизит.Синоним);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
   
    // Обычные реквизиты
    Для Каждого Реквизит Из РеквизитыОбъектаМетаданных Цикл
        Если ВключаяСвойстваРеквизита Тогда
            НоваяСтрокаТз = ТзРеквизиты.Добавить();
            Если ТипЗнч(ВключаяТабличныеЧасти) = Тип("Строка") Тогда  
                ИнициализироватьСвойстваСтрокиРеквизитов(НоваяСтрокаТз, Реквизит, 2, ВключаяТабличныеЧасти);
            Иначе    
                ИнициализироватьСвойстваСтрокиРеквизитов(НоваяСтрокаТз, Реквизит, 2);
            КонецЕсли;
        Иначе
            Если ТипЗнч(ВключаяТабличныеЧасти) = Тип("Строка") Тогда  
                сРеквизиты.Вставить(ВключаяТабличныеЧасти + "." + Реквизит.Имя, Реквизит.Синоним);
            Иначе    
                сРеквизиты.Вставить(Реквизит.Имя, Реквизит.Синоним);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;    
   
    // Реквизиты Табличных частей
    Если ВключаяТабличныеЧасти = Истина Тогда
        Для Каждого ТЧ Из ОбъектМетаданных.ТабличныеЧасти Цикл
            Если ВключаяСвойстваРеквизита Тогда
                ТзРеквизитыТЧ = ПолучитьРеквизитыОбъектаМетаданных(Ссылка, ВключаяСвойстваРеквизита, ВключаяСтандартныеРеквизиты, ТЧ.Имя);
                Попытка
                    ИспользованиеТЧ = ТЧ.Использование;      
                Исключение
                    ИспользованиеТЧ = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппыИЭлемента;
                КонецПопытки;
                ТзРеквизитыТЧ.ЗаполнитьЗначения(ИспользованиеТЧ, "Использование");
                Для Каждого СтрокаРеквизитТЧ Из ТзРеквизитыТЧ Цикл
                   НоваяСтрокаТз = ТзРеквизиты.Добавить();
                   ЗаполнитьЗначенияСвойств(НоваяСтрокаТз, СтрокаРеквизитТЧ);
                КонецЦикла;
            Иначе
                сРеквизитыТЧ  = ПолучитьРеквизитыОбъектаМетаданных(Ссылка, ВключаяСвойстваРеквизита, ВключаяСтандартныеРеквизиты, ТЧ.Имя);
                Для Каждого ЭлементРеквизитыТЧ Из сРеквизитыТЧ Цикл
                    сРеквизиты.Вставить(ЭлементРеквизитыТЧ.Ключ, ЭлементРеквизитыТЧ.Значение);
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
   
    Если ВключаяСвойстваРеквизита Тогда
        Возврат ТзРеквизиты;
    Иначе
        Возврат сРеквизиты;
    КонецЕсли;
   
КонецФункции


Примеры иницмализации вызова:

// Ссылка
ПустаяСсылка = Документы.НалоговаяНакладная.ПустаяСсылка();
ПустаяСсылка = ПоллеВвода.Значение.Ссылка;
//и т.д.

Вызов

ТзСвойства   = Add_МетаданныеКонфигурации.ПолучитьРеквизитыОбъектаМетаданных(ПустаяСсылка, Истина, Истина, Истина);

// ТзСвойства  можно простомтреть в отладчике, обход свойств с заполнением нового тоже прост. Свойства реквизитов и табличных частей легко видими и фильтьтруему по по ключам "Имя" и "ИмяТЧ". Как-то так:)
8 marty0701
 
23.02.11
16:41
Oo, спасибо всем за ответы. Буду мучить.
9 marty0701
 
23.02.11
16:42
to vs1c: Можно использовать ТОЛЬКО метаданные=)
10 marty0701
 
23.02.11
16:44
сериализация в 1с это данные в xml? xml нельзя использовать)
11 vs1c
 
23.02.11
17:00
(10) Нельзя использовать XML? А 1С можно? Открою секрет - для решения Вашей задачи с использованием XML не требуется ничего кроме 1С. И если не затруднит поясните - "Можно использовать ТОЛЬКО метаданные". А то приходит в голову аналогия - нужно ехать на велосипеде, использовать можно только руль, колеса не предлагать.
12 marty0701
 
23.02.11
17:19
=) Нельзя использовать процедуры и методы обмена данными в XML\ как - то так. 1С видимо необходимо использовать:) Про метаданные, может неправильно выразился, но при написании мне необходимо использовать элемент языка "Метаданные."
13 Defender aka LINN
 
23.02.11
17:21
(12) Тестовое задание? А, простите, кого на работу берут - нас или вас?
14 marty0701
 
23.02.11
17:24
to Defender aka LINN, да я у Вас решения готового и не прошу, просто ищу некоторую информацию, найти не могу, вот и интересуюсь здесь. Про метаданные вообще информация не особо, по-крайней мере мне понятна. Что понял - написал, что не понял - спросил. Ответили - Спасибо, нет - аналогично.
15 vs1c
 
23.02.11
17:27
А-а, ну понятно. Хотя нет, один вопрос еще есть - если это тест, то что за контора такую придурь в виде тестов выкатывает?
16 Amra
 
23.02.11
17:30
(15) Тест, точно, помниться и мне такой давали, вот только название конторы не помню.
17 marty0701
 
23.02.11
17:33
Теперь мне не стоит задавать вопросы? :) Странно даже... Тест, ну тест, я же не прошу решить его за меня, ведь так?
Контора известная, вопрос по подобному тесту уже был на форуме.
18 vs1c
 
23.02.11
17:41
(17) Ну что Вы, не обижайтесь... Просто хотел узнать куда не надо ходить на собеседования. Ведь это тоже вопрос, который достоин ответа? Верно? Так кто эти герои?
19 marty0701
 
23.02.11
17:47
Да я и не обижаюсь, глупо это по-моему. название - ООО "ЦАК "Сиринт". Да и до работы мне пока далеко, я на роль подмастерия пока, чтоб научиться, там без з\п :) Работа за знания:)
20 fisher
 
23.02.11
17:54
(18) Абсолютно нормальное тестовое задание. И ограничения вполне понятные. Тестовое задание - оно для проверки навыков программирования, а не для собственно решения.
21 vs1c
 
23.02.11
18:05
2(19) Любая работа должна оплачиваться, в противном случае это что-то другое, а не работа. ИМХО.
2(20) Ничего нормального тут нет. Если задание, как Вы говорите, для проверки навыков программирования, то и проверяйте какие навыки есть у человека по использованию конкретного инструмента (1С). Что из всего того что есть в платформе он знает и чем умеет пользоваться. Вот это ИМХО нормально. А вводить дебильные ограничения - это как я уже говорил - придурь. Или у них в конторе используется версия V8 только с метаданными, стальных функций нет и не будет?
22 fisher
 
23.02.11
18:11
(21) Мне, как нанимателю, будет абсолютно пофиг на твоё знание инструмента при отсутствии элементарных навыков структурного программирования и низкой культуре кодинга.
А это тестовое задание вполне способно просветить в этом вопросе.
23 Amra
 
23.02.11
18:11
(19) Хм, известная? Первый раз такое название слышу
24 marty0701
 
23.02.11
18:13
Про использование элемента языка Метаданные. "Это делается для универсализации программного кода". Ну не работа, труд?  за знания, опыт:).
25 marty0701
 
23.02.11
18:14
Известная, в плане того,что уже светилось название на форуме, либо я перегнул со словами:)
26 vs1c
 
23.02.11
18:19
2(22) А вот мне, как работодателю, будет абсолютно пофиг, что есть в наличии элементарные навыки структурного программирования. Т.к. если человек освоил мат.часть (инструмент), то эти самые навыки у него сто пудов есть. А культура... это мы ему в конторе быстро объясним, как культурно писать код (у каждой конторы свое представление об этой самой культуре). Так что ничего кроме комплексов тестирующих такое задание не проясняет.
2(23) Новосибирск, там видимо о них всё гремит.
27 vs1c
 
23.02.11
18:22
2(24) Не увидел (по сайту по крайней мере), что кого-то зовут бесплатно работать "за знания", даже стажерам зарплату предлагают. Врут?
28 fisher
 
23.02.11
18:25
(26) Освоить мат-чать можно по-разному. Я намного охотнее возьму чела с прямыми руками и светлой головой, но с пробелами в знаниях по конкретным инструментам, чем опытного шамана с кашей в голове. Который будет писать в принципе работоспособный код, который потом никто не будет в состоянии сопровождать.
29 marty0701
 
23.02.11
18:29
Чтобы стать стажером, надо сначала попасть в группу обучения, потом в группе обучения обучиться собственно. Потом, если вы круто отличились от всех обучаемых с вами, и, естественно, выполнили на отлично еще одно тестовое задание(не это), только в этом случае вас примут в стажеры и вы получите право на получение з\п, а потом рост, карьера, перспективы... %)
30 vs1c
 
23.02.11
18:34
2(28) А кто с этим спорит. Я лишь говорю о том, что коэффициент кривизны рук определяется не такими заданиями как в (0). Ну к примеру - "Нужно выгрузить в файл(ы) определенные документы, убить их в базе, загрузить их обратно из файла и что бы было как было. Поясните все известные вам способы, для решения этой задачи." И не надо ничего писать,пусть человек просто расскажет, что и как он собирается сделать. Вот как-то так. Если он даже рассказать это не сможет - какая культура, какие навыки, а?
31 vs1c
 
23.02.11
18:38
2(29) Не это не придурь, это лохотрон.
32 URAL
 
23.02.11
18:48
33 guitar_player
 
23.02.11
19:07
(21) В 1С есть пару функций позволяющих сериализировать данные автоматически. Задание на изучение основных объектов конфигурации, алгоритмику и т.д.

(19) О з\п в этой конторе в ближайший год можете даже не надеяться... да и потом сообственно
34 guitar_player
 
23.02.11
19:07
(29) Блин Слава уже совсем отжигает)))
35 marty0701
 
23.02.11
19:13
2guitar_player: Печально =( Ну с чего-то начинать надо, мои грабли будут=) Стажеров то никто и брать не хочет, всем нужны профессионалы, желательно с опытом управления космическими шатлами =)
36 Mitriy
 
23.02.11
19:23
(34) это называется немного грубее - офигел... и еще зажрался...
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс