При разработке решений на платформе 1С:Предприятие мы часто сталкиваемся с необходимостью работы с файлами: их созданием, чтением, записью и хранением. Однако, когда наше решение начинает работать в кроссплатформенной среде, например, при переходе с операционной системы Windows на Linux, возникают специфические проблемы, связанные с различиями в файловых системах и путях. Давайте вместе разберем эти особенности и выясним, как обеспечить корректную работу с файлами вне зависимости от операционной системы. Для успешной миграции также важно учитывать особенности настройки Astra Linux с установкой зависимостей пакетов, необходимых для стабильной работы платформы — для этого подойдёт утилита для кроссплатформенного управления кластерами 1С.
Прежде чем мы перейдем к решениям, давайте проанализируем ситуацию и рассмотрим основные различия между файловыми системами Windows и Linux, которые напрямую влияют на работу с путями к файлам в 1С.
МойФайл.txt и мойфайл.txt — это два совершенно разных файла. В Windows же эти имена считаются идентичными. Это очень важный момент, который часто приводит к ошибкам "файл не найден" при миграции.\), а в Linux — прямая косая черта (/). Платформа 1С:Предприятие (и 1С:Шина) может автоматически корректировать разделители, если путь задан как строковый литерал в коде. Однако, когда мы получаем фактические пути с помощью встроенных функций, они будут содержать разделители, используемые текущей операционной системой. Поэтому при анализе или конструировании путей нам всегда следует учитывать разделитель текущей ОС.C:, D:). Вместо этого существует единая корневая файловая система, обозначаемая символом /, к которой монтируются все остальные файловые системы и устройства. Явно заданные в коде пути, ориентированные на буквы дисков Windows (например, "C:\МоиДокументы\файл.txt"), не будут работать в Linux./temp/file.txt) в Linux однозначно определяет расположение файла. В Windows такой путь (например, \temp\file.txt) означает, что файл находится в каталоге temp в корневом каталоге текущего диска, что не всегда однозначно.Понимание этих различий критически важно для создания кроссплатформенных решений.
Наиболее надежный и рекомендуемый подход для обеспечения кроссплатформенной работы с файлами в 1С — это формирование файлов на сервере с последующей передачей их на клиент для сохранения в выбранный пользователем каталог. Этот метод минимизирует проблемы с путями, правами доступа и спецификой файловых систем. Для упрощения этой задачи можно использовать готовую внешнюю обработку для копирования файлов и каталогов между Клиентом и Сервером. Рассмотрим процесс подробнее по шагам.
Шаг 1: Формирование файла на сервере 1С
Начнем с того, что сам файл мы будем создавать на стороне сервера 1С. Это логично, поскольку именно сервер обычно выполняет основную логику по генерации данных. При этом нам не нужно беспокоиться о конечном пути сохранения на клиенте.
Для временного хранения файлов на сервере нам следует использовать встроенные функции платформы, которые гарантируют корректное формирование пути и имени файла во временном каталоге сервера, независимо от его операционной системы. Разработчикам также могут быть полезны специальные инструменты для работы с файловой системой на сервере в режимах тонкого и веб-клиента — для этой задачи есть внешняя обработка для администрирования файлов на сервере.
Мы будем использовать методы ВременныйКаталог() для получения пути к временному каталогу и ПолучитьИмяВременногоФайла() для генерации уникального имени файла в этом каталоге.
// Пример кода на стороне сервера (модуль сервера или общий модуль с вызовом на сервере)
Функция СформироватьФайлНаСервере(ИмяФайлаБезРасширения) Экспорт
// Получаем путь к временному каталогу на сервере
Перем ПутьКВременномуКаталогу;
#Если Сервер Тогда
ПутьКВременномуКаталогу = ВременныйКаталог();
#Иначе
// Этот код не будет выполнен на клиенте, но для полноты примера
ПутьКВременномуКаталогу = "";
#КонецЕсли
// Генерируем уникальное имя файла во временном каталоге
// Например, "МойОтчет_UUID.pdf"
Перем ИмяВременногоФайла;
Если Не ПустаяСтрока(ПутьКВременномуКаталогу) Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ИмяФайлаБезРасширения + ".pdf");
Иначе
Возврат Неопределено; // Ошибка, если не удалось получить временный каталог
КонецЕсли;
// Здесь размещаем код по генерации содержимого файла
// Например, создадим текстовый файл с каким-то содержимым
Попытка
ТекстовыйДокумент = Новый ТекстовыйДокумент();
ТекстовыйДокумент.УстановитьТекст("Это тестовый файл, сформированный на сервере 1С.");
ТекстовыйДокумент.Записать(ИмяВременногоФайла, КодировкаТекста.UTF8);
Исключение
Сообщить("Ошибка при формировании файла на сервере: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат ИмяВременногоФайла; // Возвращаем полный путь к сформированному файлу на сервере
КонецФункции
Шаг 2: Передача файла с сервера на клиент
После того как файл сформирован на сервере, нам необходимо передать его на сторону клиента. Для этого мы будем использовать асинхронные методы платформы, такие как НачатьПолучениеФайлаССервера или НачатьПолучениеФайловССервера.
Разберем пример вызова на клиенте:
// Пример кода на стороне клиента (модуль формы)
&НаКлиенте
Процедура СохранитьФайлНаКлиенте()
// Вызываем серверную функцию для формирования файла
Перем ПутьКФайлуНаСервере;
ПутьКФайлуНаСервере = СформироватьФайлНаСервере(); // Вызываем экспортируемую серверную функцию
Если ПутьКФайлуНаСервере = Неопределено Тогда
Сообщить("Не удалось сформировать файл на сервере.");
Возврат;
КонецЕсли;
// Начинаем получение файла с сервера
НачатьПолучениеФайлаССервера(ПутьКФайлуНаСервере, Новый ОписаниеОповещения("ПослеПолученияФайлаССервера", ЭтотОбъект), "МойОтчет.pdf");
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолученияФайлаССервера(ПолученныйФайл, ДополнительныеПараметры) Экспорт
Если ПолученныйФайл = Неопределено Тогда
Сообщить("Не удалось получить файл с сервера.");
Возврат;
КонецЕсли;
ЗаписатьФайлНаКлиенте(ПолученныйФайл);
КонецПроцедуры
Шаг 3: Сохранение файла на клиенте в выбранный пользователем каталог
После получения файла пользователь выбирает место сохранения. Если вашей задачей является массовая выгрузка внешних отчетов и обработок на локальный компьютер, логику можно автоматизировать аналогичным образом через диалоги выбора каталогов — поможет универсальный инструмент для формирования и выгрузки файлов с сервера.
// Пример кода на стороне клиента (модуль формы)
&НаКлиенте
Процедура ЗаписатьФайлНаКлиенте(ПутьКВременномуФайлуНаКлиенте)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите место для сохранения файла";
Диалог.ПолноеИмяФайла = "МойОтчет.pdf";
// Открываем диалог выбора файла
Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораКаталогаНаКлиенте", ЭтотОбъект), ПутьКВременномуФайлуНаКлиенте);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораКаталогаНаКлиенте(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Или ВыбранныеФайлы.Количество() = 0 Тогда
Сообщить("Сохранение файла отменено пользователем.");
Возврат;
КонецЕсли;
Перем ПутьДляСохранения;
ПутьДляСохранения = ВыбранныеФайлы[0];
Перем ПутьКВременномуФайлуНаКлиенте;
ПутьКВременномуФайлуНаКлиенте = ДополнительныеПараметры;
Попытка
КопироватьФайл(ПутьКВременномуФайлуНаКлиенте, ПутьДляСохранения);
Сообщить("Файл успешно сохранен по пути: " + ПутьДляСохранения);
Исключение
Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Иногда возникает необходимость прямого доступа сервера 1С (работающего на Linux) к общим папкам Windows.
Настройка Samba на Linux-сервере
Для начала потребуется установить пакеты Samba и настроить файл smb.conf.
Монтирование общих папок Windows
Используется команда mount -t cifs. Важно указать опцию iocharset=utf8 для корректной работы с кириллицей.
// Пример монтирования:
sudo mount -t cifs -o username=windows_user,password=windows_password,iocharset=utf8 //windows_server_ip/share_name /mnt/windows_share
Особенности и рекомендации
ulimit с 1024 до 16384.Платформа 1С позволяет адаптировать логику в зависимости от текущей ОС.
// Пример определения типа клиента
&НаКлиенте
Функция ПолучитьТипОперационнойСистемыКлиента()
ПараметрыПриложения = ПолучитьПараметрыКлиентскогоПриложения();
Если ПараметрыПриложения.МобильноеПриложение Тогда
Возврат "Мобильное устройство";
ИначеЕсли ПараметрыПриложения.ТолстыйКлиент ИЛИ ПараметрыПриложения.ТонкийКлиент Тогда
Если Найти(ВерсияПлатформы.ТипКлиента, "Windows") > 0 Тогда
Возврат "Windows";
ИначеЕсли Найти(ВерсияПлатформы.ТипКлиента, "Linux") > 0 Тогда
Возврат "Linux";
Иначе
Возврат "Неизвестная ОС";
КонецЕсли;
КонецЕсли;
КонецФункции
Важно: При разработке для Linux следует учитывать отсутствие механизмов COM и ActiveDocument.
Права доступа
Проверяйте права пользователя, от имени которого запущен сервер 1С, к целевым каталогам Linux.
Локаль
При миграции на Linux крайне важно правильно настроить русскоязычную локаль для корректной работы с именами файлов.
Хранение файлов в томах
В Linux тома могут быть расположены на NFS-шарах, что требует правильного монтирования и настройки прав доступа — для этого есть обработка для автоматизации переноса файлов из базы в тома.
Надеемся, что этот подробный разбор поможет вам успешно работать с файлами в 1С в любой операционной системе!