Имя: Пароль:
1C
1С v8
получения вложенного файла из документа
0 Kucha88
 
23.11.18
06:59
Просвещенные умы, всем доброе утро! Прошу сразу не кидать камень в меня.   Прошу помочь с таким вопросом. Создаю обработку с формой. На форме делаю кнопку Открыть ДИ. Сам файл ДИ находиться в документе Документ, где на форме документа есть Табличное поле в котором как раз и находиться данный файл который загружен в SQL, используя параметры подключения. Пытаюсь как то задействовать процедуру открыть файл на своей форме Обработки. Но не получается никак.
Предыстория: есть справочник Кандидат, заношу туда элемент ФИО(строка), Подразделение(Справочник.Подразделения), Должность(Справочник.Должность). и есть в элементе тоже табличное поле куда загружается файл ДИ, при загрузке, создается Документ в котором хранятся версии данного документа и так далее. Дак вот на форме есть ФИО - ссылкаСправочник.кандидат Делаю запрос на получение документа Документ но я не знаю что в Параметр передать, а нужно передать значение с формы ФИО(это реквизит обработки), но когда просто передаю ФИО ругается что не может преобразовать к типу строка. Пробовал всяко не получается. Что поставить в параметр и как открыть файл в из табличного поля Документ или может открывать пробовать из элемента справочника Кандидат ????
1 catena
 
23.11.18
07:07
Показывай, как передаешь
2 Kucha88
 
23.11.18
07:22
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    Кандидат.Документ КАК СЭДДокумент
                          |ИЗ
                          |    Документ.Кандидат КАК Кандидат
                          |ГДЕ
                          |    Кандидат.Актив = &ФИО");
        
        Запрос.УстановитьПараметр("ФИО" , ФИО)

Ах да забыл еще указать что при загрузке файла в элементе формы справочника Кандидат, создается еще один документ Кандидат - является связующим, у него есть реквизит Актив - ссылка на справочник.Кандидат и Актив = ДокументСсылка.СЭДДокумент.
3 Kucha88
 
23.11.18
07:23
(2)  через данный документ передаю значение элемента из формы чтобы найти нужный документ и уже из Документа Кандидат нахожу ссылку на нужный Документ.СэдДокумент. но не могу правильно передать значение параметра
4 catena
 
23.11.18
07:40
Тип значения реквизитов Актив и ФИО?
5 catena
 
23.11.18
07:40
И точный текст ошибки при выполнении кода из (2)
6 бегинер
 
23.11.18
07:47
реквизит Актив - ссылка на справочник.Кандидат
и
ФИО

явно разные у вас по типу

первый ссылочный
а второй - строка

Кандидат.Актив = &СЦЫЛКО");
Запрос.УстановитьПараметр("СЦЫЛКО" , ДокументСсылка.СЭДДокумент)
7 Kucha88
 
23.11.18
07:48
(4) Актив = СправочникСсылка.Кандидат
ФИО на форме обработки = СправочникСсылка.Кандидат
Но в Справочнике Кандидат - фио - это просто строка


(5) {Обработка.ПриемНаРаботу.Форма.Форма(237)}: Ошибка при вызове метода контекста (Сообщить): Несоответствие типов (параметр номер '1')
        сообщить(выборка);
по причине:
Несоответствие типов (параметр номер '1')
8 Kucha88
 
23.11.18
07:50
(6) бегинер вот именно что я не знаю ДокументСсылка.СэдДокумент - мне этот документ нужно получить используя значение СпрочникСсылка.Кандидат, значение которого прописано в ДокументСсылка.Кандидат и в этом же документе есть Актив - ДокументСсылка.СэдДокумент
9 catena
 
23.11.18
07:52
(7)Я просила ошибку кода из (2). Там нет Сообщить, вы нас обманываете.
10 бегинер
 
23.11.18
07:54
вот так попробуй нижнюю часть запроса:
Кандидат.Актив = &СЦЫЛКО");
Запрос.УстановитьПараметр("СЦЫЛКО" , Актив)
11 бегинер
 
23.11.18
07:56
Актив - это ссылка на нужный тебе элемент справочника Кандидат
12 Kucha88
 
23.11.18
07:57
(11)  бегинер - а откуда программа знает что именно этот элемент ? я же его выбираю на своей форме, где есть реквизит ФИО.
13 бегинер
 
23.11.18
07:58
ты выбираешь на какой форме? на внешней произвольной или на форме элемента справочника Кандидат?
14 Kucha88
 
23.11.18
08:00
(9) я пытаюсь вывести выборку из запроса чтобы понять находит он нужный документ или нет, так как через консоль запросов выходит мне нужный документ.

(13) бегинер выбираю на форме обработки
15 бегинер
 
23.11.18
08:01
если произвольная (форма обработки):
ищи через (чтобнайти ссылку на нужного чела)
справочники.кандидат.найтипореквизиту("ФИО"....
или запросом по ФИО к спарвочнику Кандидат


если на форме элемента справочника:

Актив=этотобъект.ссылка
16 бегинер
 
23.11.18
08:05
а раз ты пишешь что на форме твоей обработке:
Актив = СправочникСсылка.Кандидат

ФИО на форме обработки = СправочникСсылка.Кандидат

то напиши как ты ФИО получаешь для передачи-установки параметра запроса?


Запрос.УстановитьПараметр("ФИО" , ЭлементыФормы.ФИО.Значение)

и твой запрос должен работать исходный, если так ФИО задашь
17 Kucha88
 
23.11.18
08:10
(16) Актив находиться не на форме обработки, Актив - реквизит Документы.Кандидат у которого есть Реквизит Документ - СправочникСсылка.Кандидат. Т.е. справочник.Кандидат и Документы.СЭДДокумент связывает документ Документы.Кандидат - который имеет ссылки как на СЭДдокумент так и на Справочник.Кандидат.
А на моей форме обработки выбирается ФИО - элемента справочника  Кандидат. и тем самым нужно передать данные этого элемента в запрос чтобы получить Документы.СэдДокумент
18 бегинер
 
23.11.18
08:11
(17)
Запрос.УстановитьПараметр("ФИО" , ЭлементыФормы.ФИО.Значение)
вот так сделай
19 бегинер
 
23.11.18
08:11
и выполни запрос
20 Kucha88
 
23.11.18
08:13
(19) Хорошо сделал, а как тогда посмотреть результат запроса что именно этот документ нашел ???
21 бегинер
 
23.11.18
08:16
(20) проверить результат запроса: смтори что у тебя в поле "СЭДДокумент" результата
22 бегинер
 
23.11.18
08:19
РезультатЗапроса = Запрос.Выполнить();
сообщить(РезультатЗапроса.Выбрать().Количество());
если РезультатЗапроса.Выбрать().Количество()>0 тогда;    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    сообщить(ВыборкаДетальныеЗаписи.СЭДДокумент;
КонецЦикла;
конецесли;
23 Kucha88
 
23.11.18
08:26
(22)  да все верно работает запрос. Спасибо разобрался теперь. я так и делал ранее просто я не знал что нужно Сообщить() какой результат выдать. теперь я понял.

А подскажи пожалуйста как теперь получить файл, который находиться в табличном поле на форме (ФормаДокумента) СЭДДокумент, чтобы открыть вложенный файл
24 бегинер
 
23.11.18
08:29
(23) напиши структуру это Табличного поля

это табличное поле не привязанное к документу СЭДДокумент?

или это !Табличная часть! документа СЭДДокумент?

напиши все какие там поля у ТЧ/ТП и их типы
25 Kucha88
 
23.11.18
08:34
(24) Все это относиться к СЭДДокумент, по этому мы через запрос и искали его.
СЭДДокумент, у него есть: ФормаДокумента, на данной форме есть ТабличноеПоле(ТабличнаяЧастьВерсииДокумента с типом ТЗ), вот в данном ТабличномПоле и находиться файл, мне его нужно получить теперь открыть
26 бегинер
 
23.11.18
08:46
РезультатЗапроса = Запрос.Выполнить();
сообщить(РезультатЗапроса.Выбрать().Количество());
если РезультатЗапроса.Выбрать().Количество()>0 тогда;    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    док=ВыборкаДетальныеЗаписи.СЭДДокумент.ПолучитьОбъект();
    Для Каждого Колонка Из     док.ТабличнаяЧастьВерсииДокумента.Колонки Цикл
        Сообщить(Колонка.Имя);
    КонецЦикла;                
КонецЦикла;
конецесли;

попробуй
27 Kucha88
 
23.11.18
09:18
(26)  ошибка выходит:
{Обработка.ПриемНаРаботу.Форма.Форма(207)}: Поле объекта не обнаружено (ТабличнаяЧастьВерсииДокумента)
                Для каждого Колонка из Док.ТабличнаяЧастьВерсииДокумента.колонки цикл
28 бегинер
 
23.11.18
09:23
ну посмотри в конфигураторе у документа СЭДДокумент есть табличная часть и какое у нее имя?

а то может это ТабличнаяЧастьВерсииДокумента не привязана к документу, тогда нужно смотреть код формы документа  на предмет как, откуда и какие данные попадают в табличное поле "ТабличнаяЧастьВерсииДокумента"
29 бегинер
 
23.11.18
09:24
чтоб узнать где эти данные хранятся
30 Kucha88
 
23.11.18
09:36
(28)  бегинер, табличной части нет. Просто на форму документа переменная ТабличноеПоле и имя ее ТабличнаяЧастьВерсииДокумента с типомЗначения ТаблицаЗначений.
инициализация табличной части происходит так:
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    СЭДФайл.Ссылка,
                          |    СЭДФайл.Наименование,
                          |    СЭДФайл.ДатаИзменения,
                          |    СЭДФайл.РазмерФайла,
                          |    СЭДФайл.РасширениеФайла,
                          |    СЭДФайл.Автор,
                          |    СЭДФайл.ЭЦП,
                          |    СЭДФайл.Подписан,
                          |    СЭДФайл.ИдентификаторФайла,
                          |    СЭДФайл.ПараметрыПодключенияБазыДанных,
                          |    СЭДФайл.Заблокирован,
                          |    СЭДФайл.ТипСостоянияФайла
                          |ИЗ
                          |    Документ.СЭДФайл КАК СЭДФайл
                          |ГДЕ
                          |    СЭДФайл.Документ = &Документ
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    СЭДФайл.Дата,
                          |    СЭДФайл.Номер");
    
    Запрос.УстановитьПараметр("Документ", ДокументСсылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    НомерСтроки = 0;
    
    Пока Выборка.Следующий() Цикл
        
        НомерСтроки = НомерСтроки + 1;
        НоваяСтрока = ТабличнаяЧастьВерсииДокумента.Добавить();  
        НоваяСтрока.НомерСтроки = НомерСтроки;
        НоваяСтрока.Наименование = Выборка.Наименование;
        НоваяСтрока.ДатаИзменения = Выборка.ДатаИзменения;
        НоваяСтрока.РазмерФайла = Выборка.РазмерФайла;
        НоваяСтрока.Автор = Выборка.Автор;
        НоваяСтрока.ЭЦП = Выборка.ЭЦП;
        НоваяСтрока.ТипСостоянияФайла = Выборка.ТипСостоянияФайла;
        НоваяСтрока.РасширениеФайла = Выборка.РасширениеФайла;
        НоваяСтрока.ИдентификаторФайла = Выборка.ИдентификаторФайла;
        НоваяСтрока.ПараметрыПодключенияБазыДанных = Выборка.ПараметрыПодключенияБазыДанных;
        НоваяСтрока.Подписан = Выборка.Подписан;
        НоваяСтрока.Заблокирован = Выборка.Заблокирован;
        НоваяСтрока.ДокументФайлСсылка = Выборка.Ссылка;

    КонецЦикла;

    НайденнаяСтрока = ТабличнаяЧастьВерсииДокумента.Найти(НомерТекущейСтроки, "НомерСтроки");
    
    Если Неопределено <> НайденнаяСтрока Тогда
        
        ЭлементыФормы.ТабличнаяЧастьВерсииДокумента.ТекущаяСтрока = НайденнаяСтрока;
        
    КонецЕсли;
31 бегинер
 
23.11.18
09:48
ну все версии файлов хранятся в документе "СЭДФайл"

Запрос2.УстановитьПараметр("Документ", ДокументСсылка);


поменяй на

Запрос2.УстановитьПараметр("Документ", ВыборкаДетальныеЗаписи.СЭДДокумент);

т.е. в первом запросе мы находим сам документ, а в твоем коде заполения ТП - как раз и есть код - получения всех версий файлов документа - это будет второй запрос


в первый мой код внутрь цикла вставляй второй запрос - который ищет все версии файлов нужного документа
32 бегинер
 
23.11.18
10:06
РезультатЗапроса = Запрос.Выполнить();
сообщить(РезультатЗапроса.Выбрать().Количество());
если РезультатЗапроса.Выбрать().Количество()>0 тогда;    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        сообщить(ВыборкаДетальныеЗаписи.СЭДДокумент);
    Запрос2 = Новый Запрос("ВЫБРАТЬ
                          |    СЭДФайл.Ссылка,
                          |    СЭДФайл.Наименование,
                          |    СЭДФайл.ДатаИзменения,
                          |    СЭДФайл.РазмерФайла,
                          |    СЭДФайл.РасширениеФайла,
                          |    СЭДФайл.Автор,
                          |    СЭДФайл.ЭЦП,
                          |    СЭДФайл.Подписан,
                          |    СЭДФайл.ИдентификаторФайла,
                          |    СЭДФайл.ПараметрыПодключенияБазыДанных,
                          |    СЭДФайл.Заблокирован,
                          |    СЭДФайл.ТипСостоянияФайла
                          |ИЗ
                          |    Документ.СЭДФайл КАК СЭДФайл
                          |ГДЕ
                          |    СЭДФайл.Документ = &Документ
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    СЭДФайл.Дата,
                          |    СЭДФайл.Номер");
    
        Запрос2.УстановитьПараметр("Документ", ВыборкаДетальныеЗаписи.СЭДДокумент);
        Выборка2 = Запрос2.Выполнить().Выбрать();
        Пока Выборка2.Следующий() Цикл
            сообщить(Выборка2.Наименование);
            сообщить(Выборка2.ДатаИзменения);
            сообщить(Выборка2.РазмерФайла);
            сообщить(Выборка2.Автор);
            сообщить(Выборка2.ЭЦП);
            сообщить(Выборка2.ТипСостоянияФайла);
            сообщить(Выборка2.РасширениеФайла);
            сообщить(Выборка2.ИдентификаторФайла);
            сообщить(Выборка2.ПараметрыПодключенияБазыДанных);
            сообщить(Выборка2.Подписан);
            сообщить(Выборка2.Заблокирован);
            сообщить(Выборка2.Ссылка);
        КонецЦикла;
    КонецЦикла;                
КонецЦикла;
конецесли;
33 Kucha88
 
23.11.18
11:09
(32) данные в окне сообщения выходят, а как сделать чтобы этот файл запускался ЗапуститьПриложение()
34 Kucha88
 
23.11.18
11:41
(32)  бегинер, я уже разобрался как открыть файл через ЗапуститьПриложение. Огромнейшее спасибо тебе за просветление.... Примного тебе благодарен. и очень приятно было с тобой общаться по данному вопросу....
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан