Работа с файлами (обычная и управляемая форма)
Интеграция - Файловый обмен (TXT, XML, DBF), FTP
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
| Наименование | Скачано | Купить файл | По подписке PRO |
|---|---|---|---|
|
Работа с файлами
.epf 16,24Kb ver:1
113
|
113 | 2 500 руб. Купить | 1 SM Скачать |
|
Работа с файлами без расширения
.epf 16,92Kb ver:2
51
|
51 | 2 500 руб. Купить | 1 SM Скачать |
|
Работа с файлами без расширения 8.3.15
.epf 17,61Kb ver:3
281
|
281 | 2 500 руб. Купить | 1 SM Скачать |
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Введение
Довольно часто нужно решить задачу интеграции работы с файлами в 1С.
Например, у менеджера есть Excel-файл и нужно обработать данные.
Или же наоборот на сервере 1С находится какой-то важный файл и пользователю нужен доступ к этому файлу со своего ПК.
Как итог нужно выполнить передачу файл с клиента на сервере или же с сервера на клиент. Когда база была файловая, то все было просто.
Но теперь у вас база клиент-серверная, да к тому же часть пользователей работают в web-клиенте, и как теперь писать код?! Для решения этой проблемы была разработана обработка-шаблон "Работа с файлами".
Описание
Обработка "Работа с файлами" представляет собой полностью автономное решение, с точки зрения встраивания в любую конфигурацию, как на обычных, так и на управляемых формах! Рекомендуемая версия платформы 8.3.3.721 и выше. В связи с отказом от модальности.
Обработка демонстрирует работу загрузки файла с клиента на сервер и загрузки файла с сервера на клиент.
Тестирование проходило на платформе 8.3.14.1630 в толстом, тонком клиенте, а также web-клиенте.
Версия 3 тестировалась на платформе 8.3.15.1489 в толстом, тонком клиенте, а также web-клиенте.
Весь функционал проиллюстрирован в скриншотах.
На форме обработки есть реквизиты "Интерактивно" - булево, "Результат" - строка. Обработка содержит реквизиты "ИмяФайла" и "ИмяФайлаНаСервере" - строка.
#Область ЧтениеФайлаНаКлиенте
&НаКлиенте
Процедура ИмяФайлаНаКлиентеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаНаКлиентДляСервераНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлСКлиентаНаСерверИнтерактивно
&НаКлиенте
Процедура ЗагрузитьФайлСКлиентаНаСерверИнтерактивно(Команда)
Интерактивно = Истина;
ИмяРеквизита = "ИмяФайла";
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ВыбораФайла
&НаКлиенте
Процедура ПроверитьРаботуРасширенияРаботыСФайлами(ДополнительныеПараметры)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ВыборФайла(ДополнительныеПараметры, Истина, "xls");
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыСФайлами(ДополнительныеПараметры) Экспорт
ПроверитьРаботуРасширенияРаботыСФайлами(ДополнительныеПараметры);
КонецПроцедуры
// Открывает диалог выбора файла.
//
// Параметры:
// Элемент - Элемент управления, для которого выбираем файл.
// ПроверятьСуществование - Если Истина, то выбор отменяется если файл не существует.
//
&НаКлиенте
Процедура ВыборФайла(ИмяРеквизита, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml")
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеВыбораФайла", ЭтотОбъект, ИмяРеквизита);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = РасширениеПоУмолчанию;
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = Объект[ИмяРеквизита];
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Показать(ОписаниеОповещения);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьФильтрДиалогаВыбораФайла()
Фильтр = "Текстовый файл (*.txt)|*.txt|Excel 97-2003 (*.xls)|*.xls|Excel (*.xlsx)|*.xlsx|Изображение (*.png)|*.png|Все файлы (*.*)|*.*";
Возврат Фильтр;
КонецФункции
&НаКлиенте
Процедура ВыполнитьПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
Для Каждого ВыбраныйФайл Из ВыбранныеФайлы Цикл
Объект[ДополнительныеПараметры] = ВыбраныйФайл;
Если Интерактивно Тогда
// До этого вызов диалога выбора файла и установка расширения браузера
// Для веб-клиента
#Если ВебКлиент Тогда
// Создаем массив с описанием передаваемых файлов
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбраныйФайл, ""));
// Передаем файлы на сервер синхронно
// Подготавливаем массив для помещения результатов
//ПомещенныеФайлы = Новый Массив;
//Если НЕ Поместитьфайлы(Помещаемыефайлы, ПомещенныеФайлы, Ложь, УникальныйИдентификатор) Тогда
// Сообщить("0шибка прикрепления файла: " + ОписаниеОшибки());
//Иначе
// //Вызываем серверный метод для обработки данных файлов на серверной стороне
// ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
//КонецЕсли;
// Передаем файлы на сервер асинхронно
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеПомещенияФайлов", ЭтотОбъект);
НачатьПомещениеФайлов(ОписаниеОповещения, Помещаемыефайлы, , Ложь, УникальныйИдентификатор);
// Для тонкого клиента
#Иначе
// Получаем двоичные данные файла
ДвоичныеДанные = Новый ДвоичныеДанные(ВыбраныйФайл);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
#КонецЕсли
КонецЕсли;
КонецЦикла;
КонецЕсли;
Интерактивно = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Если ПомещенныеФайлы <> Неопределено Тогда
ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрикрепитьФайлНаСервер(Данные, ЭтоВебКлиент = Ложь)
// Если процедура была вызвана со стороны веб-клиента, то сначала необходимо получить двоичные данные из временного хранилища значений
Если ЭтоВебКлиент Тогда
АдресПрикрепленныйФайл = Данные[0].Хранение;
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресПрикрепленныйФайл);
Иначе
// Двоичные данные файла, переданные с клиента
ДвоичныеДанные = Данные;
КонецЕсли;
// Ваш код по обработке данных
// Например, прочитаем двоичные данные файла на сервере и выведем его текстовое содержимое
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
Результат = "Прочитаем двоичные данные файла на сервере и выведем его текстовое содержимое: " + Символы.ПС + ЧтениеДанных.ПрочитатьСимволы(, КодировкаТекста.Системная);
ЧтениеДанных.Закрыть();
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлСКлиентаНаСервер
&НаКлиенте
Процедура ЗагрузитьФайлСКлиентаНаСервер(Команда)
ИмяФайлаНаКлиенте = Объект.ИмяФайла;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиЭтоФайл", ЭтотОбъект, ИмяФайлаНаКлиенте);
ТекущийФайл = Новый Файл(ИмяФайлаНаКлиенте);
ТекущийФайл.НачатьПроверкуСуществования(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПроверкиЭтоФайл(Существует, ДополнительныеПараметры) Экспорт
Если Существует Тогда
ВыбраныйФайл = ДополнительныеПараметры;
#Если ВебКлиент Тогда
// Создаем массив с описанием передаваемых файлов
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбраныйФайл, ""));
// Передаем файлы на сервер синхронно
// Подготавливаем массив для помещения результатов
//ПомещенныеФайлы = Новый Массив;
//Если НЕ Поместитьфайлы(Помещаемыефайлы, ПомещенныеФайлы, Ложь, УникальныйИдентификатор) Тогда
// Сообщить("0шибка прикрепления файла: " + ОписаниеОшибки());
//Иначе
// //Вызываем серверный метод для обработки данных файлов на серверной стороне
// ПрикрепитьФайлНаСервер(ПомещенныеФайлы, Истина);
//КонецЕсли;
// Передаем файлы на сервер асинхронно
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеПомещенияФайлов", ЭтотОбъект);
НачатьПомещениеФайлов(ОписаниеОповещения, Помещаемыефайлы, , Ложь, УникальныйИдентификатор);
// Для тонкого клиента
#Иначе
// Получаем двоичные данные файла
ДвоичныеДанные = Новый ДвоичныеДанные(ВыбраныйФайл);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
#КонецЕсли
Иначе
ТекстСообщения = "Укажите существующий файл!";
КлючДанных = Неопределено;
Поле = "ИмяФайла";
ПутьКДанным = "Объект";
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
1. В пункте 1 "С клиента на сервер" также указан код для получения имени реквизита файла для клиенте на вкладке "С сервера на клиент".
#Область ЧтениеФайлаНаСервере
&НаКлиенте
Процедура ИмяФайлаНаСервереНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ИмяРеквизита = ПолучитьИмяРеквизитаНаСервере(Элемент.Имя);
ПроверитьРаботуРасширенияРаботыСФайлами(ИмяРеквизита);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиент
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиент(Команда)
ПутьКФайлуНаКлиенте = Объект.ИмяФайла;
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект, РезультатПоискаФайла, "ВыполнитьПослеНеудачиПолученияФайлов", ЭтотОбъект);
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлуНаКлиенте, АдресФайлаВоВременномХранилище);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, , Ложь);
КонецПроцедуры
&НаСервере
Процедура ПолучитьДанныеФайла(АдресФайла, ПутьКФайлуНаСервере, РезультатПоискаФайла = "") Экспорт
МассивФайлов = НайтиФайлы(ПутьКФайлуНаСервере);
Если МассивФайлов.Количество() > 0 Тогда
ПутьФайла = МассивФайлов[0].ПолноеИмя;
Попытка
ДанныеФайла = Новый ДвоичныеДанные(ПутьФайла);
ПоместитьВоВременноеХранилище(ДанныеФайла, АдресФайла);
Исключение
АдресФайла = Неопределено;
РезультатПоискаФайла = " Не удалось прочитать файл на сервере!";
КонецПопытки;
Иначе
АдресФайла = Неопределено;
РезультатПоискаФайла = " На сервере не найден файл " + ПутьКФайлуНаСервере + "!";
КонецЕсли;
КонецПроцедуры // ПолучитьДанныеФайла
&НаКлиенте
Процедура ВыполнитьПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
Если ПолученныеФайлы = Неопределено Тогда
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не удалось получить!");
ТекстСообщения = "Файл не удалось получить!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияФайла", ЭтотОбъект);
Для Каждого Файл Из ПолученныеФайлы Цикл
НачатьЗапускПриложения(ОписаниеОповещения, Файл.ПолноеИмя);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытияФайла(КодВозврата, ДополнительныеПараметры) Экспорт
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеНеудачиПолученияФайлов(Информация, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка!" + ДополнительныеПараметры);
ТекстСообщения = "Ошибка!" + ДополнительныеПараметры;
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиентИнтерактивно
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентИнтерактивно(Команда)
ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте()
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияРасширенияРаботыСФайламиНаКлиенте", ЭтотОбъект);
НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайламиНаКлиенте(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ЗагрузитьФайлССервераНаКлиентПослеУстановкиРасширенияРаботыСФайлам();
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайламиНаКлиенте", ЭтотОбъект);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыСФайламиНаКлиенте(ДополнительныеПараметры) Экспорт
ПроверитьРаботуРасширенияРаботыСФайламиНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентПослеУстановкиРасширенияРаботыСФайлам()
ПутьКФайлуНаКлиенте = "";
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект, РезультатПоискаФайла, "ВыполнитьПослеНеудачиПолученияФайлов", ЭтотОбъект);
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлуНаКлиенте, АдресФайлаВоВременномХранилище);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = "";
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Сохранить файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = "";
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, ДиалогВыбораФайла, Истина);
КонецПроцедуры
#КонецОбласти
#Область Служебные
&НаСервере
Функция ПолучитьИмяРеквизитаНаСервере(ЭлементИмя)
ИмяРеквизита = "";
МассивПутьКДанным = СтрРазделить(Элементы[ЭлементИмя].ПутьКДанным, ".");
Для Каждого Элемент Из МассивПутьКДанным Цикл
ИмяРеквизита = Элемент;
КонецЦикла;
Возврат ИмяРеквизита;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным)
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ТекстСообщения;
Сообщение.КлючДанных = КлючДанных;
Сообщение.Поле = Поле;
Сообщение.ПутьКДанным = ПутьКДанным;
Сообщение.Сообщить();
КонецПроцедуры
#КонецОбласти
Доработка для отказа установки расширения в web-клиенте.
Ограничения:
1. Платформа не ниже 8.3.13.1513.
2. На мобильной клиенте параметр <Интерактивно> процедуры "НачатьПомещениеФайла" игнорируется и диалоговое окно выбора файла не отображается никогда.
3. Нет возможности получить полный путь файла на клиенте.
Изменения в коде:
При неудачи установить расширение работы с файлами теперь задается вопрос о повторной установке.
Если повторить установку, то алгоритм продолжит работу как и раньше.
Если прервать, то алгоритм завершит работу.
Если пропустить установку, то будет выполняться альтернативный алгоритм без установки расширения работы с файлами (обратите внимание на ограничения данного алгоритма)!
#Область ВыбораФайла
&НаКлиенте
Процедура ПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
Если Подключено Тогда
ВыборФайла(ДополнительныеПараметры, Истина, "xls");
Иначе
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = "Повторить установку расширения?";
ЗаголовокВопроса = "Расширение не подключено!";
КнопкиВопроса = РежимДиалогаВопрос.ПрерватьПовторитьПропустить;
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, КнопкиВопроса, 0, , ЗаголовокВопроса);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияВопроса(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Повторить Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры);
НачатьУстановкуРасширенияРаботыСФайлами(ОписаниеОповещения);
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Пропустить Тогда
ВыборФайлаБезРасширения(ДополнительныеПараметры, Истина, "xls");
Иначе
ТекстСообщения = "Расширение не установлено, продолжить работу невозможно!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыборФайлаБезРасширения(ИмяРеквизита, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml")
ОбработкаНачалаЗагрузки = Новый ОписаниеОповещения("ПередНачаломПомещенияФайла", ЭтотОбъект, ИмяРеквизита);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеВыбораФайлаБезРасширения", ЭтотОбъект, ИмяРеквизита);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = ПолучитьФильтрДиалогаВыбораФайла();
ДиалогВыбораФайла.Расширение = РасширениеПоУмолчанию;
ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = Объект[ИмяРеквизита];
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
НачатьПомещениеФайла(ОписаниеОповещения, , ДиалогВыбораФайла, Истина, УникальныйИдентификатор, ОбработкаНачалаЗагрузки);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеВыбораФайлаБезРасширения(Результат, Адрес, ПомещаемыйФайл, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Объект[ДополнительныеПараметры] = ПомещаемыйФайл;
Если Интерактивно Тогда
//Получаем двоичные данные файла
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
// Передаем данные файла на сервер для записи в базу данных
ПрикрепитьФайлНаСервер(ДвоичныеДанные);
КонецЕсли;
Иначе
ТекстСообщения = "Расширение не установлено, продолжить работу невозможно!";
КлючДанных = Неопределено;
Поле = "";
ПутьКДанным = "";
// Если нет БСП
СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным);
КонецЕсли;
Интерактивно = Ложь;
КонецПроцедуры
#КонецОбласти
#Область ЗагрузитьФайлССервераНаКлиентИнтерактивноБезРасширения
&НаКлиенте
Процедура ЗагрузитьФайлССервераНаКлиентИнтерактивноБезРасширения(Команда)
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
РезультатПоискаФайла = "";
ПутьКФайлуНаСервере = Объект.ИмяФайлаНаСервере;
ПолучитьДанныеФайла(АдресФайлаВоВременномХранилище, ПутьКФайлуНаСервере, РезультатПоискаФайла);
ПолучитьФайл(АдресФайлаВоВременномХранилище, Объект.ИмяФайла, Истина);
КонецПроцедуры
#КонецОбласти
Для обычного приложения код не изменился, т.к. оно запускается только в толстом клиенте.
Адаптация для платформы 8.3.15.1489, режим совместимости конфигурации не играет роли.
Ограничения:
1. Платформа не ниже 8.3.15.1489.
2. Нет возможности получить полный путь файла на клиенте без установки расширения работы с файлами.
Изменения в коде:
1. Методы "НачатьПомещениеФайлов", "НачатьПомещениеФайла" и "НачатьПолучениеФайлов" устарели.
Код заменен на современные методы "НачатьПомещениеФайловНаСервер", "НачатьПомещениеФайлаНаСервер" и "НачатьПолучениеФайловССервера".
2. Добавлены проверки работы с файлами.
3. Оптимизирован код.
Для обычного приложения код немного отличается, в прилагаемой обработке есть обе формы с рабочим кодом. Или же вы можете самостоятельно его поправить!
P.S. Если материал вам помог, поблагодарите автора, поставив звездочку!
Вступайте в нашу телеграмм-группу Инфостарт
ДиалогВыбораФайла ДвоичныеДанные ПомещаемыеФайлы НачатьПомещениеФайлов ПолучитьИзВременногоХранилища ЧтениеДанных НачатьПроверкуСуществования НачатьПолучениеФайлов НачатьПодключениеРасширенияРаботыСФайлами НачатьУстановкуРасширенияРаботыСФайлами ПоместитьВоВременноеХранилище ОписаниеПередаваемогоФайла ПоказатьВопрос ПолучитьФайл НачатьПомещениеФайла НачатьПомещениеФайловНаСервер НачатьПомещениеФайлаНаСервер ПараметрыДиалогаПомещенияФайлов НачатьПолучениеФайловССервера ПараметрыДиалогаПолученияФайлов
См. также
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)
Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!
50050 руб.
25.02.2015 192533 383 296
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)
Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.
27633 руб.
12.06.2017 165013 1009 329
Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)
Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.
50200 руб.
24.04.2015 211440 186 254
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 Бухгалтерский учет Управленческий учет Платные (руб)
Переносите справочную информацию, остатки и документы из УПП 1.3 в ERP 2.6 и КА 2.6 с помощью готовых правил. Переносится более 60 видов документов. Простой интерфейс и понятные настройки.
42000
37800 руб.
24.06.2020 73140 108 35
Операции по ВЭД Файловый обмен (TXT, XML, DBF), FTP Разработчик Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Платные (руб)
Федеральная таможенная служба России давно поддерживает унифицированный формат электронных документов для обмена с информационными системами предприятий. xmlns="urn:customs.ru:Information:ExchangeDocuments:". Структура, утвержденная комиссией Таможенного союза. Осталось только сделать загрузку в 1С из этого формата. На выходе - два документа ГТД по импорту и Поступление (акты, накладные) Обработка актуализирована на начало 2026 года (ставка НДС 22%)
24400 руб.
09.08.2016 97839 381 379
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)
Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.
42000
37800 руб.
15.12.2021 37116 268 68
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)
Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.
27572 руб.
18.02.2016 209243 686 559
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)
Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы
58000 руб.
29.10.2018 64467 86 137
НачатьПомещениеФайла(..)С сервера на клиент
ПолучитьФайл(...)Использовать расширения для работы с файлами очень не удобно так как требуют установки внешнего софта/расширений, что не всегда возможно и в каждый браузер отдельно. Методы выше работают без них и на много лучше адаптированы к веб клиенту.
В справке говорится, что нужно указать:
в интерактивном режиме должен иметь тип ДиалогВыбораФайла,
в неинтерактивном режиме СсылкаНаФайл.
Я использую не интерактивный режим. Что вы в ссылку на файл помещаете?
А для
Выйдет что обязательно пользователю диалог кидать, что по моему мнению не всегда нужно!
Тип: Булево.
Истина - режим, в котором пользователю показывается диалог, в котором он может выбрать действие с получаемым файлом: запустить его или сохранить по выбранному расположению.
В веб-клиенте параметр должен быть равен Истина. В противном случае будет сгенерировано сообщение об ошибке.
В новой версии платформы 8.3.15 разработчики сделали новые методы работы:
Но пока не понятно нужно ли платформа для них или режим совместимости.
Кстати и далее там есть ссылка:
Которая позволяет не использовать расширение работы с файлами с версии платформы 8.3.13.1513, если указывать диалог, т.е. работать интерактивно, без привязки пути файла на клиенте к реквизиту.
Зачем было изобретать велосипед
И на мобильной платформе параметр <Интерактивно> игнорируется и диалоговое окно выбора файла не отображается никогда.
Что делает реализацию еще более ограниченной.
Поэтому выкладываю обработку отдельным файлом.
Диалог отлично показывается и отрабатывает на Тонком клиенте, а в веб-клиенте IE показывает странный диалог, на который не реагирует.
Подозреваю что это где то в настройках IE. Подскажите где искать?
Вот кусок моего кода:
ПолноеИмяФайла = КаталогЭкспортаДокументов + МассивФайлов[Сч].Имя;
ПолучитьФайл(МассивФайлов[Сч].Хранение, ПолноеИмяФайла, Истина);
ПолучаемыеФайлы = Новый Массив;
Для Сч = 0 По МассивФайлов.Количество() - 1 Цикл
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(МассивФайлов[Сч].Имя, МассивФайлов[Сч].Хранение);
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
КонецЦикла;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, КаталогЭкспортаДокументов, Ложь);
ПоказатьНа тонком клиенте отрабатывает и файл создает,
на веб-клиенте задает вопрос нужно ли сохранить файл
(и кто его просил вопросы задавать) и никакого файла нет((
хотя в ОповещениеОЗавершении вместо открытия у меня сообщение об успехе с полным именем - его выводит
пити разные задавала не помогает
складывается впечатление что в IE что-то не так, полазила там - ничего не нашла
Да, код несколько упростила, но думала не критично - раз на тонком выполняется.
Мои переменные
1) МассивФайлов состоящий из структуры:
Имя (просто название без пути)
Хранение (адрес указывающий на значение во временном хранилище)
2)КаталогЭкспортаДокументов путь куда должно сохраняться состоит из выбранного в диалоге и "/", если не хватает
Прощу подсказать, что видно невооруженным глазом? У меня уже замылился наверное.
Перевел конфигурацию в режим совместимости 8.3.15.
Решил просто заменить на новые методы НачатьПомещениеФайловНаСервер.
И получаю ошибку:
Ошибка преобразования данных XDTO:
НачалоСвойства: param Форма: Элемент Тип: {}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ОписаниеПомещенногоФайла'ОписаниеПередаваемогоФайла преобразуется в ОписаниеПомещенногоФайла, а оно не доступно на сервере.
Проверил. Ошибка вылетает даже если оставить конфигурацию на 8.3.14.
Ничего там не подменяется)))
Ничто не мешает вам создать общие функции ВыгрузитьФайлы/ЗагрузитьФайлы (например) и вызывать их с оповещениями и параметрами.
Кстати, вкину свои 5 копеек: теперь появился новый способ передавать файловые данные на сервер. Можно на клиенте получить двоичные данные, забросить их на сервер и там не сохранять во временные файлы, как раньше делали, а обрабатывать через буфер как файловый поток. Правда, пока у платформы на это есть ограничения (табдокумент, например, кушает только mxl и ods), но, думаю, допилят.
И мало того код настолько интересный, что позволяет унифицировать работу с файлами при множестве реквизитов на форме.
На днях была задача еще дополнить использование каждого имени файла своим расширением. Вообще бомба вышла!
В свое время пришлось на одном источнике руками набивать данный код, а здесь я сделал так что бери и копируй!
Надыбал (для себя) новый метод "НачатьСозданиеДвоичныхДанныхИзФайла" называется.
Так, как конструктор Новый ДвоичныеДанные в Web клиенте отсутствует.
Так вот, что при использовании НачатьСозданиеДвоичныхДанныхИзФайла, что при Новый ДвоичныеДанные, что даже при НачатьПомещениеФайлаНаСервер, на клиенте - на клиентском компьютере, откуда идет загрузка файлов, создаются во временной папке временные файлы.
Причем, время загрузки (субъективно, по часам клиента) примерно одинаковое (может расхождение 1 сек. ) , но для варианта НачатьПомещениеФайлаНаСервер в процессе загрузки и потом записи файла, создаются 2 временный файла одинакового размера, равные размеру помещаемого файла, а при НачатьСозданиеДвоичныхДанныхИзФайла и Новый ДвоичныеДанные создаются 2 такого же размера, и еще 2, большего.
Проверил у себя экспериментально, на файловой версии, но БД на сервере, например при записи 270 Mb файла.
Они, правда потом удаляются, но файловые операции, ни разу не быстрые (по сравнению, например с памятью) .
Может, конечно, что не так делаю.
В случае использования ТонкогоКлиента/Web клиента, соответственно с БД, опубликованной через Web сервер - изначально у IIS это 30 000 000 bytes (так понял 1 Kb = 1000 b) ограничение на длину "запроса" , у Apache пока не выяснил сколько.
Но передавать файлы можно меньшего размера, чем указанная величина.
Смотрите настройки для IIS ( у меня в 2016 сервере) VirtualApp->Request Filter Settings.
В случае передачи бОльших файлов, их нужно или "бить" или увиливать этот параметр в настройказ Web серверов.
Иначе будет ошибка.
И, если для web клиента при указании обработчика ошибки в ОписаниеОповещения, вызовется он, хотя не покажет суть ошибки, а только модуль и строку (это будет НачатьПомещениеФайлаНаСервер) , то для ТонкогоКлиента, это не сработает.
Он выведет в любом случае свой текст ошибки:
Ошибка HTTP 404.13 — Not Found
Модуль фильтрации запросов настроен для блокировки запросов, длина содержимого которых превосходит установленный предел.
Наиболее вероятные причины:
Модуль фильтрации запросов настроен на веб-сервере таким образом, чтобы блокировать запросы, длина содержимого которых превосходит заданное значение.
Возможные решения:
Проверьте настройку configuration/system.webServer/security/requestFiltering/requestLimits@maxAllowed ContentLength в файлах applicationhost.config или web.config.
Подробные сведения об ошибке:
Модуль nbsp; RequestFiltering ModuleУведомление BeginRequest Обработчик 1C Web-service Extension Код ошибки 0x00000000
Запрошенный URL-адрес ПоказатьГде установить свой обработчик ошибки - здесь данные передаются на сервер, в каком событии ставить обработчик ошибок пока не понял.
И еще, после добавления файла в БД (добавляю в БД) в ХранилищеЗначений регистра свелений, БД "раздувается" .
Пр удалении - очистки путем установки значения в неопределенно, не "сдувается" .
Пока нашел где-то вариант, что для Sql нужен Shrink, для файловой, не знаю.
Позвольте полюбопытствовать, есть положительный опыт, удалось ? :)
У меня все тривиальнее.
Отсканированные документы, еще ладно, не много места занимают, а вот dwg и из них pdf проекты ...
До гига доходят.
Для метода НачатьСозданиеДвоичныхДанныхИзФайла, а он все таки асинхронный возможно сделать прогресс бар ?
"Своего" встроенного ОповещенияОХодеВыполненияЗагрузки(Создания) нет.
Если знаете, подскажите, как ?
"Создание" двоичных данных не происходит мгновенно.
Вы справку читаете?
Этот метод нужен для веб-клиента, чтобы на клиенте перевести файл в двоичные данные.
А моя публикация сделана, чтобы это не использовать, сразу передается файл. А на сервере уже делайте с ним что угодно!
Суть в том что на форме может быть множество реквизитов, в которые пишется путь файла, и нужно заранее ограничить расширение файла для разных реквизитов. Ничего сложного, просто переписать логику, чтобы в доп параметр и расширение указывалось по умолчанию.
"Добавлены проверки работы с файлами." - это проверка размера и "существования" файла ?
Работает и в web, не при интерактивном варианте без расширения или нет ?
Суть вашей обработки в передаче файла с клиента на сервер и обратно. Всё верно?
Я попытался применить вашу обработку в реальной задачи использования. Я взял файл, который пользователи получают по почте от другой организации и попытался передать с клиента на сервер для дальнейшей обработки. В результате получил ошибку разбора XML. О чем сообщил вам. Ответ ваш был в стиле - "сам дурак".
Сообщать в другую организацию о том, что их текстовый файл не правильно разбирается в XML считаю смешным, так как, с этим форматом работают сотни других организаций и переделывать они точно ничего не будут.
ЗавершениеОбратныйВызов = Новый ОписаниеОповещения("ЗавершениеОбратныйВызов", ЭтаФорма);
ПрогрессОбратныйВызов = Новый ОписаниеОповещения("ПрогрессОбратныйВызов", ЭтаФорма);
ПередНачалоОбратныйВызов = Новый ОписаниеОповещения("ПередНачалоОбратныйВызов", ЭтаФорма);
НачатьПомещениеФайловНаСервер(ЗавершениеОбратныйВызов, ПрогрессОбратныйВызов, ПередНачалоОбратныйВызов,);
В процедуре ЗавершениеОбратныйВызов передаю данные на сервер(массив из ПомещенныйФайл.Адрес - что по сути адрес во временном хранилище). На сервере, когда пытаюсь получить данные файла из адреса без всякой закономерности (ни размер, ни название файла, ни его расширение, ни каталог не являются схожими в таких ситуациях) получаю Неопределено. Кто-нибудь сталкивался с чем то подобным?
Я так понял косяка в коде (73) нет, просто не знали, что платформа удаляет информацию из временного хранилища по определенным правилам?
Вот как раз нарвался на подобную проблему, решения пока не нашел. Буду рад за подсказку.
Задача в следующем:
Необходимо загружать большие объемы данных по несколько тысяч файлов. Ждать "в слепую" - не вариант. Прикрутил прогресс бар, но не все так гладко. Значения для Прогресс бара с сервера возвращаем через "Сервер взаимодействия" и весь прикол в том, что если клиент вызвал серверный метод - сообщения сервера взаимодействия не обрабатываются (прогресс бар не двигается) пока не будет закончена обработка на сервере.
В итоге получается интересная ситуация:
1. Пользователь говорит, что хочет загрузить файлы. Вызывается НачатьПомещениеФайловНаСервер
2. Во время ОписаниеОповещенияОХодеВыполнения - все работает хорошо: прогресс бар движется и интерфейс пользователю доступен.
3. Во время ОписаниеОповещенияОЗавершении - все работает хорошо: прогресс бар движется и интерфейс пользователю доступен мы извлекаем список адресов ВХ и...
4. В конце ОписаниеОповещенияОЗавершении вызываю серверный метод и передаю туда список адресов ВХ - мы ушли на сервер и прогресс бар стоит и интерфейс пользователю НЕ доступен.
5. После окончания работы серверного метода возвращаемся на клиент и видимо начинают обрабатываться сообщения пришедшие с сервера взаимодействия - обрабатываются они очень быстро - прогресс бар побежал, но пока работал серверный метод была полная тишина и полная блокировка интерфейса
6. При попытке серверный метод выкинуть на фоновое задание (чтобы убрать блокировку с интерфейса пока идет обработка на сервере). Возникла проблема: при попытке получить данные из временного хранилища - возвращается Неопределено.
6а. УИД в НачатьПомещениеФайловНаСервер - указал. Выборку из ВХ в фоновом задании делал с включенным "привилегированным доступом" - все равно - неопределено.
Как быть?
А у нас до сих пор стоит Управление торговлей для Беларуси, редакция 3.4.7.155.
Там такого модуля даже нету.
Скорее всего это появилось совсем недавно в УТ 11.5+.
Версия БСП 3.0.1.434.
Скорее всего от нее всё пляшет.
Рейтинг: 1566
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1075055
Создание 10.06.19 00:00
Обновление 01.07.19 11:00
Просмотры 93441
Загрузки 445
Рейтинг
181
Комментарии 92
Код открыт Да
Рубрики Файловый обмен (TXT, XML, DBF), FTP
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)