8.х Открыть документ ворд из справочника

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Gemini888, 8 авг 2016.

  1. TopicStarter Overlay
    Gemini888
    Offline

    Gemini888

    Регистрация:
    27 июл 2016
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Добрый день. есть чистая база, один справочник с несколькими реквизитами и один из них должен содержать ссылку на вордовский документ, который можно открыть и просмотреть. Помогите, пж, может у кого есть аналогичный пример кода. Создаю реквизит справочника Приложение с типом Хранилище Значения, вставляю код (не мой, найденный на форуме) в модуль объекта, пишет ошибку
    {Справочник.ТП.МодульОбъекта(8,29)}: Тип не определен (ДиалогВыбораФайла)
    ДиалогВыбораФайла = Новый <<?>>ДиалогВыбораФайла(РежимДиалога); (Проверка: Сервер)
    где то прочитала, что нужно обрамлять #Клиент Как это сделать? Помогите пжжж Код ниже

    Процедура КоманднаяПанельПриложениеНажатиеКнопки(Кнопка)
    Перем РежимДиалога, ДиалогВыбораФайла, Кнопки, дд, ИмяФайла, Папка, ПолноеИмяФайла;

    Кнопки = ЭлементыФормы.ДействияФормы.Кнопки.Приложение.Кнопки;
    Если Кнопка = Кнопки.Выбрать тогда

    РежимДиалога = РежимДиалогаВыбораФайла.Открытие;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога);
    ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;
    ДиалогВыбораФайла.ПредварительныйПросмотр = Истина;
    ДиалогВыбораФайла.Заголовок = "Выберите файл приложения";
    ДиалогВыбораФайла.Фильтр = "*.doc|*.doc"; //"*.doc|*.doc|*.xls|*.xls|*.jpg|*.jpg|*.tif|*.tif|*.png|*.png|*.bmp|*.bmp|*.png|*.png|*.*|*.*";
    Если ДиалогВыбораФайла.Выбрать() Тогда
    Попытка
    дд = Новый ДвоичныеДанные(ДиалогВыбораФайла.ПолноеИмяФайла);
    Приложение = Новый ХранилищеЗначения(дд, Новый СжатиеДанных(6));
    Исключение
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;
    КонецЕсли;

    ИначеЕсли Кнопка = Кнопки.Показать тогда

    Если Приложение.Получить() <> Неопределено тогда
    //ИмяФайла = "1.doc");
    //Папка = КаталогВременныхФайлов();
    //ПолноеИмяФайла = Папка + ?(Прав(Папка, 1) = "\", "", "\") + ИмяФайла;
    ПолноеИмяФайла = ПолучитьИмяВременногоФайла(".doc");
    Попытка
    дд = Приложение.Получить();
    дд.Записать(ПолноеИмяФайла);
    ЗапуститьПриложение(ПолноеИмяФайла);
    Исключение
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;
    КонецЕсли;

    ИначеЕсли Кнопка = Кнопки.СохранитьВфайл тогда

    Если Приложение.Получить() <> Неопределено тогда
    РежимДиалога = РежимДиалогаВыбораФайла.Сохранение;
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога);
    ДиалогВыбораФайла.Фильтр = "*.doc|*.doc"; //"*.doc|*.doc|*.xls|*.xls|*.jpg|*.jpg|*.tif|*.tif|*.png|*.png|*.bmp|*.bmp|*.png|*.png|*.*|*.*";
    Если ДиалогВыбораФайла.Выбрать() Тогда
    Попытка
    дд = Приложение.Получить();
    дд.Записать(ДиалогВыбораФайла.ПолноеИмяФайла);
    Исключение
    Предупреждение(ОписаниеОшибки());
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;

    ИначеЕсли Кнопка = Кнопки.Удалить тогда
    // Диалог подтверждения
    // ...
    Приложение = Неопределено;

    КонецЕсли;

    ДоступностьКнопокОбработкиПриложения(Кнопки);

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

    Процедура ДоступностьКнопокОбработкиПриложения(Кнопки)
    Перем д;

    д = Приложение.Получить() = Неопределено;
    Кнопки.Выбрать.Доступность = Не ТолькоПросмотр и д;
    Кнопки.Показать.Доступность = Не ТолькоПросмотр и Не д;
    Кнопки.СохранитьВфайл.Доступность = Не ТолькоПросмотр и Не д;
    Кнопки.Удалить.Доступность = Не ТолькоПросмотр и Не д;

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

    Действие = Новый Действие("КоманднаяПанельПриложениеНажатиеКнопки");
    нм = ЭлементыФормы.ДействияФормы.Кнопки.Добавить("Приложение", ТипКнопкиКоманднойПанели.Подменю); //нм.Картинка = Скрепка;
    нк = нм.Кнопки.Добавить("Выбрать", ТипКнопкиКоманднойПанели.Действие, "Выбрать", Действие); нк.Картинка = БиблиотекаКартинок.ОткрытьФайл;
    нк = нм.Кнопки.Добавить("Показать", ТипКнопкиКоманднойПанели.Действие, "Показать", Действие); нк.Картинка = БиблиотекаКартинок.Печать;
    нк = нм.Кнопки.Добавить("СохранитьВфайл",ТипКнопкиКоманднойПанели.Действие, "Сохранить в файл", Действие);нк.Картинка = БиблиотекаКартинок.СохранитьФайл;
    нк = нм.Кнопки.Добавить("Удалить", ТипКнопкиКоманднойПанели.Действие, "Удалить", Действие); нк.Картинка = БиблиотекаКартинок.Очистить;
    ДоступностьКнопокОбработкиПриложения(нм.Кнопки);
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Выбор файла необходимо выполнять на клиенте.
    Все операции по чтению/записи данных из ИБ/в ИБ - на сервере.

    Весь этот код необходимо переделывать с учетом работы в условиях управляемых форм. Чтобы переделать, необходимо понимать, как одинаковые алгоритмы работают в разных условиях.

    Начните с решения более простой задачи: сделать кнопку на форме, по которой будет открываться диалог выбора. Дальше нужно решить эту же задачу в условиях не модального открытия окон.
  3. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Доброго,
    Давайте начнем сначала, какая у вас платформа 1С ?, какую конфигурацию используете ?
    разработка под управляемые формы или под обычные ? (по коду похоже на обычные)
  4. TopicStarter Overlay
    Gemini888
    Offline

    Gemini888

    Регистрация:
    27 июл 2016
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Платформа 8.2 Конфигурация с нуля, чистая. Создаю лишь один справочник. На форуме, где был приведен код ничего не сказано было про форму, видимо подразумевалась управляемая форма. Я создала обычную форму, и объявила директиву компиляции &НаКлиенте. Теперь пишет ошибку
    {Справочник.ТП.МодульОбъекта(76,18)}: Тип не определен (Действие)
    Действие = Новый <<?>>Действие("КоманднаяПанельПриложениеНажатиеКнопки"); (Проверка: Сервер)
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Судя по коду, подразумевалась обычная форма. В обычных формах нет разницы для директив, оно все будет выполнятся на клиенте, а судя по тому, что вы поставили таки директиву и ошибка ушла, а так же проверка синтаксиса проверяется раздельно для разных контекстов, у вас управляемые формы(управляемое приложение).
  6. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    смотрите синтаксис помощник, конструктор доступен только на управляемых формах
  7. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    Да он только на стороне клиента доступен.....
  8. TopicStarter Overlay
    Gemini888
    Offline

    Gemini888

    Регистрация:
    27 июл 2016
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    А есть пример реализации этой задачи для управляемой формы? Может ссылка? В теории я понимаю, поместить в Хранилище, прочесть из хранилища, команды - а вот на практике, как все в кучу собрать(
  9. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Прошу прощения, ввел в заблуждение, можно делать и в обычных формах, должно рабтать
    посмотрел в УТ10.3
  10. TopicStarter Overlay
    Gemini888
    Offline

    Gemini888

    Регистрация:
    27 июл 2016
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    И я прошу прощения, у меня управляемая форма была, и там и не работает
  11. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Пара процедур выдранных из печатной формы, вывод "doc" файла :
    Код:
    // Получение адреса шаблона
    &НаСервере
    Функция ПолучитьАдресХраненияШаблона()
    
        МакетДвоичныеДанные = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ДополнительноеСоглашение");
       
        Адрес = ПоместитьВоВременноеХранилище(МакетДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
       
        Возврат Адрес
    
    КонецФункции
    
    // Печать формы
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт
    
        АдресХраненияШаблона = ПолучитьАдресХраненияШаблона();
       
        ТекстСообщения = "Печатная форма сформирована, файл сохранен по следующему пути :  ";
       
        Для Каждого ЭлементМассива Из МассивОбъектов Цикл // обычно это список документов, по которым пойдет печать
           
            СделатьЗаписьВЖурналРегистрации("Адрес хранилища :" + СокрЛП(АдресХраненияШаблона));
           
            // формирование документа на печать
            РезультатФормирования = СформироватьДокументНаПечать(ЭлементМассива);
           
            Если РезультатФормирования = Неопределено Тогда
                Продолжить;
            КонецЕсли;
           
            СписокФайлов = Новый Массив;
            Для Каждого СтрокаДанных Из РезультатФормирования Цикл
               
                // Имя временного файла
                ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
               
                Описание = Новый ОписаниеПередаваемогоФайла(ИмяВременногоФайла, АдресХраненияШаблона);
                МассивОписаний = Новый Массив;
                МассивОписаний.Добавить(Описание);
                ПолучитьФайлы(МассивОписаний, , , Ложь);
               
                Отказ = Ложь;
                ЗаполнениеШаблонаДокумента(СтрокаДанных, ИмяВременногоФайла, Отказ);
               
            КонецЦикла;
           
        КонецЦикла;
    
    КонецПроцедуры
    
    // Заполнение "Word"-овского шаблона
    &НаКлиенте
    Процедура ЗаполнениеШаблонаДокумента(ДанныеУчетнойСистемыДляЗаполнения, ИмяВременногоФайла, Отказ)
    
        Если НЕ ТипЗнч(ДанныеУчетнойСистемыДляЗаполнения) = Тип("Структура") Тогда
            Отказ = Истина;
            Возврат;
        КонецЕсли;
       
        Попытка
            КомОбъект = Новый COMОбъект("Word.Application");
        Исключение
            ТекстОшибки = ОписаниеОшибки();
            СделатьЗаписьВЖурналРегистрации(ТекстОшибки);
        КонецПопытки;
       
        Попытка
            КомОбъект.Documents.Open(ИмяВременногоФайла);
        Исключение
            КомОбъект.Quit(0);
            КомОбъект = 0;
           
            Возврат;
           
        КонецПопытки;
       
        // финт ушами
        Отказ = Истина;
       
        // видимость
        КомОбъект.Application.Visible = 1;
       
        // Предварительные настройки документа
        //КомОбъект.Application.DisplayAutoCompleteTips            = Ложь;
        КомОбъект.Application.DisplayDocumentInformationPanel    = Ложь;
        КомОбъект.Application.DisplayRecentFiles                = Ложь;
        //КомОбъект.Application.DisplayScreenTips                = Ложь;
        //КомОбъект.Application.DisplayScrollBars                = Ложь;
        //КомОбъект.Application.PrintPreview                    = Истина;
       
        ПредставлениеИзменениеРегистрационныхПаспортныхДанных = ДанныеУчетнойСистемыДляЗаполнения.ПредставлениеИзменениеРегистрационныхПаспортныхДанных;
       
    
        Variables      = КомОбъект.ActiveDocument.Variables;
        // Заполнение переменных документа
        Для Каждого ЭлементСтруктуры Из ДанныеУчетнойСистемыДляЗаполнения Цикл
            Variables.Item(Строка(ЭлементСтруктуры.Ключ)).Value = ЭлементСтруктуры.Значение;
        КонецЦикла;
       
        // В пустые переменные забьем пробел, чтобы в форме не отражалось "Ошибка! Переменная документа не указана."
        Для Итератор = 1 По Variables.Count Цикл
           
            ЗначениеПеременной = СокрЛП(Variables.Item(Итератор).Value);
            Если ЗначениеПеременной = "" Тогда
                Variables.Item(Итератор).Value = "  ";
            КонецЕсли;
           
        КонецЦикла;
       
        // обновим поля документа
        КомОбъект.ActiveDocument.Fields.UpDate();
          
        // Если пришли сюда, значит некоторым чудом, форму удалось заполнить
        Отказ = Ложь;
    
    КонецПроцедуры
    
    В лоб применять не стоит, нужно адаптировать под конкретную задачу
    --- Объединение сообщений, 8 авг 2016 ---
    В управляемых формах используется "УстановитьДействие", пример :
    Код:
    ПолеВвода.УстановитьДействие("ПриИзменении", "ДанныеДетальноЗначениеНаДеньПриИзменении");
    
    где "ПриИзменении" - событие
    "ДанныеДетальноЗначениеНаДеньПриИзменении" - имя процедуры обработчика события
    ВАЖНО ! в процедуре обработчике должно быть объявлено столько параметров сколько этого требует соотв. событие элемента формы
    в данном примере один :
    Код:
    ДанныеДетальноЗначениеНаДеньПриИзменении(Элемент)
    
    Последнее редактирование: 8 авг 2016
  12. TopicStarter Overlay
    Gemini888
    Offline

    Gemini888

    Регистрация:
    27 июл 2016
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Спасибо)) буду разбирать и адаптировать
  13. Dellorik1992
    Offline

    Dellorik1992

    Регистрация:
    5 авг 2016
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Всем добрый день Спбственно такой вопрос, перепробывал ряд программ и не нашел нужную.Открыть нужно обычный вордовский документ на Sony Ericsson k790i, размером 58 КБ, подскажите пожалуйтса, буду очень благодарен

Поделиться этой страницей