1С сообщения в файл

  • автор:

Простая задача:

  • На форме организовать выбор файла (формат файла txt)
  • Заполнить файл данными
  • Ну и сохранить естественно (если файл с данными, то чтобы спросил перезаписать или нет).

Как это сделать?

Организуем форму толстого клиента 1С

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

У добавленного нами поля нужно включить кнопку выбора.

Добавим обработчик нажатия.

Обратите внимание, что в модуле у нас появились две функции – одна обработчик нажатия кнопки «Выполнить», которая была автоматически добавлена на форму обработки при ее создании. Другая – добавленный нами обработчик.

Организуем форму тонкого клиента 1С

Пример такой же организации формы на тонком клиенте 1С.

Добавляем реквизит в обработку — неограниченная строка (т.е. длина = 0).

Только что добавленный реквизит вытаскиваем на форму. Чтобы открыть его свойства — нажмите на вытащенном реквизите правой кнопкой мыши.

Свойство КнопкаВыбора установите Да.

Тонкий клиент не добавляет автоматически кнопку. Поэтому нам нужно самостоятельно на форму обработки добавить кнопку Записать.

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

Также перетащите добавленную команду на форму (влево).

В модуле у нас также две функции – одна обработчик нажатия кнопки «Записать», который мы добавили. Другая – добавленный нами обработчик события при выборе.

Программируем выбор файла

В Windows есть общепринятый диалог работы с выбором файла.

Из 1С есть доступ к управлению этим диалогом. Для этого существует специальный объект «ДиалогВыбораФайла».

Вот пример кода для нашего случая:

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Заголовок = «Выберите имя файла для сохранения»;

Диалог.МножественныйВыбор = Ложь;

Диалог.Фильтр = «Текстовый файл(*.txt)|*.txt»;

//Вызов собственно диалога на экран

Если Диалог.Выбрать() Тогда

//Сюда попадем только если пользователь нажал ОК

//Сохранение выбранного имени файла (полного имени, значит включая путь к нему)

ИмяФайла = Диалог.ПолноеИмяФайла;

КонецЕсли;

Если Вы хотите дать возможность выбирать несколько расширений файлов, например txt и rtf, то нужно написать так:

Диалог.Фильтр = «Документ Microsoft Word (*.txt)|*.txt|»
+ «Документ Microsoft Excell (*.rtf)|*.rtf|»;

Работа с текстовыми файлами в 1С 8.x

  • Как выгрузить данные из справочника в текстовый файл?
  • Как загрузить данные из текстового файла?
  • Как сохранить текст в формате UTF8 без маркера BOM
  • Работа с текстом. Модель последовательного доступа

Как выгрузить данные из справочника в текстовый файл?

Текст = Новый ТекстовыйДокумент; Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Стр = СтрЗаменить(Выборка.Наименование, Символ(34), «%квч%»); Код = Строка(Выборка.Код) + Символ(34); Текст.ДобавитьСтроку(Код + Стр); КонецЦикла; Текст.Записать(«c:\temp\text.txt»);

Как загрузить данные из текстового файла?

Текст = Новый ТекстовыйДокумент; Текст.Прочитать(«c:\temp\text.txt»); Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл Стр = Текст.ПолучитьСтроку(НомерСтроки); Позиция = Найти(Стр, Символ(34)); Код = Сред(Стр, 1, Позиция-1); прНаименование = Сред(Стр, Позиция + 1); Наименование = СтрЗаменить(прНаименование, «%квч%», Символ(34)); Сообщить(Код + «-» + Наименование); КонецЦикла;

Как сохранить текст в формате UTF8 без маркера BOM

Для того, чтобы избавится от символов «п»ї» при записи в текстовый файл в формате UTF8, необходимо использовать формат «CESU-8».ЗаписьPHP = Новый ЗаписьТекста(ФайлДляСохранения,»CESU-8″); ЗаписьPHP.Записать(ТекстUTF8); ЗаписьPHP.Закрыть();

Работа с текстом. Модель последовательного доступа

Путь = «c:\temp\text.txt»; Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Текст.ЗаписатьСтроку(Выборка.Наименование); КонецЦикла; Текст.Закрыть(); Путь = «c:\temp\text.txt»; Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); Стр = Текст.ПрочитатьСтроку(); Пока Стр > Неопределено Цикл Стр = Текст.ПрочитатьСтроку(); Сообщить(Стр); КонецЦикла;

Открыть диалог выбора каталога

ZIP-архив Создание  0
 Для того чтобы записать файлы в ZIP-архив необходимо выполнить несколько простых действий: * Создать архив с необходимыми параметрами, в который будут помещаться файлы. * Поместить в архив необходимые файлы. * Записать архив. Создание объекта За Автоматическая архивация баз 1С с использованием Cobian Backup и VBS скриптов  8
  Клиент попросил настроить автоматическую архивацию баз 1С раз в три дня и выгрузку архивов на Dropbox и на FTP Сервер. Кроме 1С нужно архивировать папку с рабочими документами. Хочет — так хочет, делаем: Первым делом настроим автоматическую архивац   54
 Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: Объект не найден (84:bf5600145e3710ab11dda4c605dbe824) . https://helpf.pro/uploads/img/_1-46z7I4U7Ww.png В Ввести перечисление, выбор перечисления  1
  // В 8-ой версии нет такой фунции, но можно сделать так: ЗначПер=Перечисления.Важность.Средняя; //Установим перечисление предлагаемое выбрать по умолчанию Если ВвестиЗначение(ЗначПер,»Выберите важность:») тогда Сообщить(ЗначПер); //обработка в Ввод дополнительного ежегодного отпуска  1
 Вид расчета, используемый для начисления оплаты дополнительного ежегодного отпуска , описывается в плане видов расчета Основные начисления организаций . Новый вид расчета удобнее создать копированием предопределенного вида расчета Оплата отпуска п Посмотреть все результаты поиска похожих

Выбор файла и загрузка его на сервер в асинхронном режиме

Введение

С появлением управляемого приложения и веб-клиента некоторые задачи, которые решались в обычном приложением за несколько строчек, существенно усложнились. Казалось бы такая простая и часто используемая операция, как интерактивный выбор файла, которая в обычном приложении решалась в одном методе, теперь требует создания цепочки из нескольких процедур, которые вызываются одна за другой через ОписаниеОповещения. Вот как это было с использованием модальных вызовов:

Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка) ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); ДиалогВыбораФайла.Каталог = ЭтотОбъект.Каталог; ДиалогВыбораФайла.Заголовок = «Выберите каталог»; Если НЕ ДиалогВыбораФайла.Выбрать() Тогда Возврат; КонецЕсли; ЭтотОбъект.Каталог = ДиалогВыбораФайла.Каталог; КонецПроцедуры

Но как эту задачу решить на веб-клиенте? В поисковике не удалось найти готового универсального решения. Поискал в типовых, но там все разбросано по модулям и как-то запутано. Посмотрел пример в консоли СКД с диска ИТС для управляемых форм. Там тоже надо вычленять по кусочкам все шаги. Кроме того там применяется одна фича, которая позволяет открывать диалог выбора файла без установленного расширения работы с файлами. Но в общем случае эта хитрость не подойдет, так как она работает только для существующих файлов, насколько я понял. Поэтому написал процедуры, которые можно просто скопировать и использовать в будущем, не тратя время на то, чтобы вспоминать, как это работает.

Диалог выбора файла

Сразу приведу код, который получился после упрощения.

&НаКлиенте Процедура КаталогНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); ДиалогВыбораФайла.Каталог = Объект.Каталог; ДиалогВыбораФайла.Заголовок = «Выберите каталог»; ПараметрыСценария = Новый Структура; Оповещение = Новый ОписаниеОповещения(«КаталогНачалоВыбораЗавершение», ЭтаФорма); ПараметрыСценария.Вставить(«Оповещение_ПослеЗакрытияДиалогаВыбораФайла», Оповещение); ПараметрыСценария.Вставить(«ДиалогВыбораФайла», ДиалогВыбораФайла); ВыполнитьСценарийВыбораФайла(, ПараметрыСценария); КонецПроцедуры &НаКлиенте Процедура КаталогНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат; КонецЕсли; Объект.Каталог = Результат; КонецПроцедуры

Я специально привел ранее вариант для обычных форм, чтобы проще было сравнивать. Код разбился на две примитивные процедуры и практически не изменился за счет метода ВыполнитьСценарийВыбораФайла(). Этот метод скрывает все рутинные асинхронные действия:
— подключает расширение по работе с файлами
— если расширение не подключено, то задает пользователю вопрос по его подключению
— начинает установку расширения, если пользователь подтвердит это действие
— открывает диалог выбора файла
— передает результаты выбора файла назад в прикладную процедуру КаталогНачалоВыбораЗавершение()

Далее приведу код этой служебной процедуры, написанной по принципу, из этой статьи.

Исходный код &НаКлиенте Процедура ВыполнитьСценарийВыбораФайла(Результат = Неопределено, ПараметрыСценария = Неопределено) Экспорт НачатьОтсчетШагов(ПараметрыСценария); Оповещение = Новый ОписаниеОповещения(«ВыполнитьСценарийВыбораФайла», ЭтаФорма, ПараметрыСценария); // подключить расширение работы с файлами Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда НачатьПодключениеРасширенияРаботыСФайлами(Оповещение); Возврат; ИначеЕсли ЭтоРезультатВыполненногоШага(ПараметрыСценария) Тогда // если расширение подключилось, перейти к следующему шагу Если Результат = Истина Тогда // если расширение не подключилось, задать вопрос об его установке ИначеЕсли Результат = Ложь Тогда ТекстСообщения = «Расширение для работы с файлами не установлено. Установить?»; ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет); Возврат; // пользователь отказался от установки расширения по работе с файлами ИначеЕсли Результат <> КодВозвратаДиалога.Да Тогда Возврат; // пользователь подтвердил установку расширения по работе с файлами ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда НачатьУстановкуРасширенияРаботыСФайлами(); Возврат; КонецЕсли; КонецЕсли; // открыть диалог выбора файла Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда // переадресовываем результат на прикладную процедуру ПараметрыСценария.ДиалогВыбораФайла.Показать(ПараметрыСценария.Оповещение_ПослеЗакрытияДиалогаВыбораФайла); Возврат; КонецЕсли; КонецПроцедуры

То есть вместо того, чтобы писать несколько процедур с труднопонимаемыми названиями в стиле ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайла(), вся последовательность действий описана в одной. Кроме того, можно заметить, что она универсальная и не содержит зависимостей от контекста формы. То есть ее можно перенести в другую форму простым копированием

Загрузка файлов с клиента на сервер

Постановка задачи: пусть требуется метод, который умеет помещать на сервер выбранный на клиенте файл. Если выбранный файл является каталогом, то необходимо поместить на сервер все файлы, содержащиеся в этом каталоге (подчиненные каталоги игнорировать).
Последовательность асинхронных действий:
— определить является ли файл каталогом
— если не является, то добавить его в массив помещаемых файлов
— если является, то найти все файлы этого каталога
— каждый из найденных файлов проверить является ли он каталогом. Если не является то добавить в массив помещаемых файлов (каждая итерация цикла обхода файлов является асинхронной, потому что вместо синхронного Файл.ЭтоФайл() необходимо использовать его аналог Файл.НачатьПроверкуЭтоФайл())
— поместить файлы на сервер
— вернуть результат помещения в прикладную процедуру, которая будет выполнять обработку файлов по какому-то алгоритму

Данная задача снова решается за три простых шага

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

Все детали скрыты в процедуре ВыполнитьСценарийЗагрузкиФайлаНаСервер(), которая подходит как для файлов, так и для каталогов. При необходимости ее можно доработать, чтобы она покрывала больше случаев.

Исходный код &НаКлиенте Процедура ВыполнитьСценарийЗагрузкиФайлаНаСервер(Результат = Неопределено, ПараметрыСценария = Неопределено) Экспорт НачатьОтсчетШагов(ПараметрыСценария); Оповещение = Новый ОписаниеОповещения(«ВыполнитьСценарийЗагрузкиФайлаНаСервер», ЭтаФорма, ПараметрыСценария); // определим что на входе: файл или каталог Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда ПараметрыСценария.Вставить(«ИсходныйПомещаемыйФайл», Результат); Файл = Новый Файл(ПараметрыСценария.ИсходныйПомещаемыйФайл); Файл.НачатьПроверкуЭтоФайл(Оповещение); Возврат; КонецЕсли; // если передан каталог, то нужно найти все файлы, содеражщиеся в нем Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда Если Результат = Истина Тогда // если это не каталог, то переходим к следующему шагу ПомещаемыеФайлы = Новый Массив; ПомещаемыеФайлы.Добавить(Новый Файл(ПараметрыСценария.ИсходныйПомещаемыйФайл)); ВыполнитьОбработкуОповещения(Оповещение, ПомещаемыеФайлы); Возврат; Иначе // выполняем поиск всех файлов, содержащихся в переданном каталоге НачатьПоискФайлов(Оповещение, ПараметрыСценария.ИсходныйПомещаемыйФайл, «*.?*»); Возврат; КонецЕсли; КонецЕсли; // проверяем, что найденные файлы не являются каталогами Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда ПараметрыСценария.Вставить(«НайденныеФайлы», Результат); ПараметрыСценария.Вставить(«ПомещаемыеФайлы», Новый Массив); ПараметрыСценария.Вставить(«ИндексПроверяемогоФайла», 0); Результат.НачатьПроверкуЭтоФайл(Оповещение); Возврат; // асинхронная проверка каждого из найденных файлов ИначеЕсли ЭтоРезультатВыполненногоШага(ПараметрыСценария) Тогда Если Результат = Истина Тогда Файл = ПараметрыСценария.НайденныеФайлы; ПараметрыСценария.ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, «»)); КонецЕсли; Если ПараметрыСценария.НайденныеФайлы.Количество() > ПараметрыСценария.ИндексПроверяемогоФайла+1 Тогда ПараметрыСценария.ИндексПроверяемогоФайла = ПараметрыСценария.ИндексПроверяемогоФайла + 1; Файл = ПараметрыСценария.НайденныеФайлы; Файл.НачатьПроверкуЭтоФайл(Оповещение); Возврат; КонецЕсли; КонецЕсли; // помещаем файлы на сервер Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда ПомещаемыеФайлы = ПараметрыСценария.ПомещаемыеФайлы; Если ПомещаемыеФайлы.Количество() Тогда // передаем управление в прикладную процедуру НачатьПомещениеФайлов(ПараметрыСценария.Оповещение_ПослеПомещенияФайлаНаСервер, ПомещаемыеФайлы, , Ложь); КонецЕсли; Возврат; КонецЕсли; КонецПроцедуры

Файл для скачивания

К публикации прилагается пример, который можно использовать как шаблон для описанных операций. В нем реализованы несколько наиболее востребованных случаев: выбор существующего файла, выбор имени файла для сохранения, выбор каталога и множественный выбор. Для полноты картины приведены аналогичные операции для обычных форм. Тестировались процедуры на платфроме 8.3, на конфигурацях начиная с режима совместимости 8.2.13

1С 8.x : Как автоматически сохранить сообщения, выдаваемые в табло «Служебные сообщения»?

1C и Google Maps  17
 была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш Google maps : вывод точек на карту и режим панорамы  5
  В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора ZIP-архив Разделить и Объединить Файл  0
 При работе с большими объемами данных могут возникнуть проблемы при пересылке архивных файлов. Типичной такой ситуацией является ограничение некоторых почтовых серверов на размер сообщения — если письмо превышает некий заранее установленный размер, о Авто добавление обработки в справочник Внешних обработок  0
  Чтобы не изменять типовую конфигурацию приходится использовать типовой механизм внешних печатных форм и обработок. Данный код проверяет — добавлена ли открываемая обработка в конфигурацию, если нет — задает вопрос и при положительном ответе — автома Восстановление узла распределенной информационной базы из резервной копии  0
 В случае возникновения ситуации, при которой необходимо восстановить резервную копию информационной базы, работающую в рамках распределенной информационной базы, можно воспользоваться следующими рекомендациями. Процедура восстановления информационно Посмотреть все результаты поиска похожих

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *