Имя: Пароль:
1C
1С v8
Обработка "Хранилище инструкций для пользователей"
0 Anton_V
 
10.11.19
17:28
Добрый день всем!
Я только начал изучать программирование в среде 1С и очень хотел бы попросить помочь.
Поставлена задача следующего плана: необходимо реализовать, чтобы пользователи могли подгружать инструкции, написанные в *doc/*docx формате в саму 1С и из 1С была возможность сразу открыть любую инструкцию и прочитать, не обращаясь к Word.

Значит, как я увидел это решение задачи. Создаю обработку, в ней добавляю форму, в которой есть кнопка "Добавить", при нажатии на которую открывается окно диалога выбора подгружаемых файлов. Выбираю желаемые файлы с расширением MS Office и список данных файлов отображается в таблице (а сами файлы сохраняются в ХранилищеЗначений). После чего щёлкнув по любому файлу из таблицы открывается поле HTML и данная инструкция отображается прямо в форме, подобно PDF.

Форма выглядит пока в следующем виде:
Cделал кнопку, к которой относится следующая процедура:

<CODE>
&НаКлиенте
Процедура ВыборНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выбор файла";
    Диалог.Фильтр = "Word файлы(*.doc;*.docx)|*.doc;*.docx";
    Диалог.ИндексФильтра = 0;
    Диалог.ПредварительныйПросмотр = Ложь;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.МножественныйВыбор = Истина;
    Диалог.ПолноеИмяФайла = ЗагрузитьИнструкции;
    
    Если Диалог.Выбрать() Тогда
    
        МассивФайлов = Диалог.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            //Обработка файлов
            //...
            //...
            //...
        КонецЦикла
    КонецЕсли;    
КонецПроцедуры
</CODE>

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

По логике, необходимо действовать так:
1. Создать объект для чтения текста из файла;
2. Создать таблицу значений (пустую);
3. Считать текст в переменную "ТекстДанные";
4. Создать хранилище на основании пустой таблицы значений;
5. Создать элемент справочника Файлы;
6. Поместить в реквизит элемента справочника созданное ранее хранилище значений;
7. Записать элемент справочника.

Кто может помочь с кодом, просто ещё не сталкивался с диалогом выбора файла и загрузкой в ХЗ. Необходимо, чтобы выбранные файлы перенеслись в таблицу, при нажатии на колонку которой я мог вывести поле HTML с содержимым документа.

Прошу прощения за странное объяснение, поскольку совсем новичок в этой области и ранее кроме внешних отчётов не занимался разработкой в 1С.

С уважением, Антон.
1 Мимохожий Однако
 
10.11.19
17:48
Дойди отладчиком до выбора файла, смотри.Долго думай.
2 lucbak
 
10.11.19
18:24
3 Anton_V
 
15.11.19
10:56
Сделал по-другому.

Поскольку реализация обработки происходит в чистой конфигурации, то создал новый справочник, который получил название "Файлы". В справочнике "Файлы" добавил реквизиты:
- "Файл" (Тип: ХранилищеЗначения);
- "ИмяФайла" (Тип: Строка);
- "Автор" (Тип: ЛюбаяСсылка).

После этого создал новую обработку, в которой создал реквизит с именем "Файл" (Тип: СправочникСсылка.Файлы).
И перешёл к созданию чистой формы с именем "ФормаВыбора".

Добавил команду "ДобавитьФайл" и связал её с кнопкой, а также создал динамический список, получивший название "СписокФайлов", в котором создал 2 столбца - "Код" и "Имя файла". Больше добавлять не стал, поскольку не вижу смысла в лишних столбцах.

Смысл должен быть такой - при нажатии кнопки "Добавить файл" открывается окно диалога выбора файлов, выбирается файл с расширением *.doc/*.pdf, и загружается в хранилище значений, одновременно появляясь в строках динамического списка. А далее, при двойном щелчке по выбранной строке открывается форма с полем HTML, где содержимое документа визуализируется, подобно PDF-просмотрщику.

Ввиду необходимости появления формы просмотра файла, в справочнике "Файлы" создал новую форму с именем "ФормаПросмотраФайлов", содержащая реквизит "PDF_HTML" с видом "Поле HTML документа.
Модуль формы содержит следующий код:

<CODE>
АдресМ = "ХранилищеЗначений";
PDF_HTTP = "<ht ml><EMB ED id='PDF' width=100% height=100% type=""application/pdf"" src="""+АдресМ+"""></EMBED></html>";
</CODE>

"ФормаВыбора" содержит событие "Выбор", код которого следующий:

<CODE>
Функция ПолучитьИмяФайла(ПолныйПуть)
    
    ИсхСтрока = ПолныйПуть;
    Позиция = Найти(ИсхСтрока, "\");
    ПозицияКонечная = 0;
    
    Пока Позиция <> 0  Цикл
        ПозицияКонечная = ПозицияКонечная + Позиция;
        ИсхСтрока = Сред(ИсхСтрока, Позиция+1);
        Позиция = Найти(ИсхСтрока, "\");
    КонецЦикла;
    
ИмяФайла = Сред(ПолныйПуть, ПозицияКонечная + 1);
Возврат ИмяФайла;

КонецФункции


&НаКлиенте
Процедура ДобавитьФайл(Команда)
    
    ПолноеИмяФайла = "";
    Если ПоместитьФайл( , , ПолноеИмяФайла, Истина) = Истина Тогда
        Данные = Новый ДвоичныеДанные(ПолноеИмяФайла);
        ЗаписатьФайл(ПолучитьИмяФайла(ПолноеИмяФайла), Данные);    
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ЗаписатьФайл(ИмяФайла, Данные)
    
    НовыйФайл = Справочники.Файлы.СоздатьЭлемент();
    НовыйФайл.Файл = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных());
    НовыйФайл.Наименование = ИмяФайла;
    НовыйФайл.ИмяФайла = ИмяФайла;
    // НовыйФайл.Автор = Объект.Ссылка;
    НовыйФайл.Записать();
    
КонецПроцедуры


&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
        
    СтандартнаяОбработка = Ложь;
    
    //ОткрытьФорму("Справочник.Файлы.Форма.ФормаПросмотраФайлов");
        
    //СсылкаНаФайл = ПолучитьНавигационнуюСсылку(ЭтаФорма.Элементы.ИмяФайла, "Файлы");
    //ПолучитьФайл(СсылкаНаФайл, ЭтаФорма.Элементы.ИмяФайла);
    
    //------------------------------------------------------------------------------------------------------
    
    //Адрес = ПолучитьНавигационнуюСсылку(Объект.Файл, "ИмяФайла");
    //ИмяФайла = "" + КаталогВременныхФайловСервер() + Объект.Файл;
    
    Параметры = Новый Структура("ТекущийФайл", Элемент);
    ФормаВыбора = ПолучитьФорму("Справочник.Файлы.Форма.ФормаПросмотраФайлов", Параметры);
    НайденныйЭлемент = ФормаВыбора.ОткрытьМодально();
    
КонецПроцедуры
</CODE>

В итоге выбранные файлы загружаются в хранилище значений, отражаются в списке выбора, но при желании его открыть для просмотра ошибка. Пожалуйста, помогите связать с ФормаПросмотраФайлов, чтобы на форму выводилось содержимое выбранного в списке файла (просмотр в окне HTML).
4 Ник080808
 
15.11.19
11:06
(0) нафиг ворд, форматированный документ тебе в помощь. Пусть сразу в 1с и пишут инструкции
5 Anton_V
 
15.11.19
11:18
(4) Да вот попросили универсальную обработку, которую можно будет применить в различных конфигурациях) Быстро развернуть, например через расширение конфигурации
6 hhhh
 
15.11.19
11:23
(5) а если просто, без всяких таких обработок? Там разве файл не открывается? Обязательно надо с обработкой заморачиваться?
7 Ник080808
 
15.11.19
11:28
(5) так вот тебе и универсальная обработка - делаешь расширение - в него пихаешь справочник инструкции. обработка открывающая форматированный документ. все
8 Anton_V
 
15.11.19
11:30
(6) да просто сам хочу в виде обработки реализовать, чтобы научиться одновременно. Конфигурация пустая, потому и справочники и обработки создавать приходится
9 hhhh
 
15.11.19
11:36
(8) файл обычно открывается без всяких обработок. Просто по пути к файлу.
10 D_E_S_131
 
15.11.19
11:47
Пример реализации на УФ.
Есть некий объект с ТЧ "Памятки".
Реквизиты объекта: "Описание" (строка 150), "ИмяФайла" (строка 150), "Расширение" (строка 10), "ДанныеФайла" (ХранилищеЗначения), "Размер" (число 10.0).
На форме кнопка "Добавить" (для добавления файла). Просмотр файла - по клику на строке ТЧ.

&НаКлиенте
Процедура ДобавитьФайл(Команда)
    
    ПриЗавершении = Новый ОписаниеОповещения("ПоместитьФайлКомандаЗавершение", ЭтотОбъект);
    
    ПередПомещением = Новый ОписаниеОповещения("ПоместитьФайлКомандаПередПомещением", ЭтотОбъект);
    
    ДиалогВыбораФайлов = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    
    ДиалогВыбораФайлов.Заголовок          = "Выбор файла памятки";
    ДиалогВыбораФайлов.МножественныйВыбор = Ложь;
    
    МаскаВсеФайлы = ПолучитьМаскуВсеФайлыКлиента();
    
    ДиалогВыбораФайлов.Фильтр = "Все файлы|" + МаскаВсеФайлы + "|Все файлы|" + МаскаВсеФайлы;
    
    НачатьПомещениеФайла(ПриЗавершении,, ДиалогВыбораФайлов, Истина,, ПередПомещением);
    
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлКомандаЗавершение(ФайлВыбран, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    Если Не ФайлВыбран Тогда
        Возврат;
    КонецЕсли;
    
    ДобавитьПамяткуСервер(Адрес, ВыбранноеИмяФайла);
    
    Модифицированность = Ложь;
    
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлКомандаПередПомещением(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
    
    ОбщийРазмер = РазмерВсехФайловСервер() + ПомещаемыйФайл.Размер();
    
    Если ОбщийРазмер > 10 * 1024 * 1024 Тогда
        
        ПоказатьПредупреждение(, "Превышен максимальный размер прикреплденных файлов 10М");
        
        ОтказОтПомещенияФайла = Истина;
        
    КонецЕсли;
    
    ИмяФайлаПамятки        = ПомещаемыйФайл.Файл.Имя;
    РасширенияФайлаПамятки = ПомещаемыйФайл.Файл.Расширение;
    РазмерФайла            = ПомещаемыйФайл.Размер();
    
КонецПроцедуры

&НаСервере
Функция РазмерВсехФайловСервер()

    Возврат Объект.Памятки.Итог("Размер");

КонецФункции // РазмерВсехФайловСервер()

&НаСервере
Процедура ДобавитьПамяткуСервер(Адрес, ВыбранноеИмяФайла)

    ДД = ПолучитьИзВременногоХранилища(Адрес);
    
    СпрОбъект = РеквизитФормыВЗначение("Объект");
    
    НовСтр = СпрОбъект.Памятки.Добавить();
    
    НовСтр.Описание    = "Памятка №" + Формат(НовСтр.НомерСтроки, "ЧГ=");
    НовСтр.ИмяФайла    = ИмяФайлаПамятки;
    НовСтр.Расширение  = РасширенияФайлаПамятки;
    НовСтр.ДанныеФайла = Новый ХранилищеЗначения(ДД);
    НовСтр.Размер      = РазмерФайла;
    
    СпрОбъект.Записать();
    
    ЗначениеВРеквизитФормы(СпрОбъект, "Объект");

КонецПроцедуры

&НаКлиенте
Процедура ПамяткиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ТекДанные = Элементы.Памятки.ДанныеСтроки(ВыбраннаяСтрока);
    
    Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Памятки.ДанныеФайла", ТекДанные.НомерСтроки - 1);
    
    ПолучитьФайл(Адрес, ТекДанные.ИмяФайла);
    
КонецПроцедуры
11 D_E_S_131
 
15.11.19
11:49
"Реквизиты объекта" = "Реквизиты ТЧ".
Маску "все файлы" поменяй на свои "docx".
12 Anton_V
 
15.11.19
12:34
(10) D_E_S_131, спасибо большое за образец, буду пробовать разбираться
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс