Как исправить проблему слешей при переносе томов архива 1С с Windows на Linux?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Перенос серверной части 1С:Предприятие с операционной системы Windows на Linux — это ответственный процесс, который часто сопровождается нюансами, незаметными на первый взгляд. Одной из наиболее типичных проблем является некорректное отображение путей к файлам в томах архива. В Windows разделителем директорий служит обратный слеш \, тогда как в Linux используется прямой слеш /. Если просто скопировать файлы и обновить пути к томам, система может продолжить искать внутренние пути по старому формату, что приведет к ошибкам в отчетах о целостности данных.

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

Анализ ситуации: почему возникают ошибки в отчетах

Рассмотрим сценарий: вы успешно перенесли электронный архив (картинки номенклатуры, скан-копии документов) с Windows-сервера на Linux. Вы поправили основные пути в справочнике Тома хранения файлов, сменив, например, \\win-server\archive на /home/1c/archive. На первый взгляд, всё работает: файлы открываются, новые документы загружаются. Однако при запуске регламентного отчета "Контроль целостности томов" система выдает сообщения о том, что данные в томе отсутствуют.

Проанализируем причину. В базе данных 1С, в справочниках присоединенных файлов, путь к конкретному файлу внутри тома часто хранится в виде строки в реквизите ПутьКФайлу. Этот путь формируется в момент создания файла. Если файл был создан в Windows-версии, путь в базе выглядит как 20230510\myfile.pdf. При переносе на Linux система пытается найти файл, используя путь /home/1c/archive/20230510\myfile.pdf. Для ОС Linux символ \ не является разделителем папок, а воспринимается как часть имени файла. Естественно, файл с таким "странным" именем в директории 20230510 не находится.

Способ 1. Программное исправление через обработку "Групповое изменение реквизитов"

Самый простой и безопасный способ исправить ситуацию в типовых конфигурациях (УТ 11, ERP, БП 3.0) — использовать встроенные инструменты. Разберем по шагам, как это сделать:

  1. Откройте меню Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. В поле "Выбирать элементы" выберите справочник, в котором хранятся ваши файлы. Обычно это Номенклатура присоединенные файлы, Договоры контрагентов присоединенные файлы или общий справочник Файлы.
  3. Нажмите кнопку "Дополнительные параметры" и установите флаг "Показывать служебные реквизиты". Без этого вы не увидите поле с путем к файлу.
  4. Найдите в списке реквизитов ПутьКФайлу.
  5. В современных версиях обработки можно нажать "Дополнительно" и выбрать "Выполнить произвольный алгоритм". Это позволит нам применить замену символов ко всем выбранным объектам.

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


// В контексте обработки объект доступен как "Объект"
Если Найти(Объект.ПутьКФайлу, "\") > 0 Тогда
    Объект.ПутьКФайлу = СтрЗаменить(Объект.ПутьКФайлу, "\", "/");
    // В групповой обработке метод Записать() вызывается автоматически, 
    // если это предусмотрено настройками, но для уверенности в произвольном коде:
    Объект.Записать();
КонецЕсли;

Способ 2. Использование специализированной обработки "Подбор и обработка объектов"

Если вы предпочитаете использовать внешние обработки или встроенную обработку "Подбор и обработка объектов", алгоритм остается схожим. Однако здесь важно не совершить классическую ошибку: изменение реквизита в памяти без его сохранения в базу данных.

Рассмотрим подробнее правильный алгоритм для обработки:


// Правильный код для замены слешей
ПутьДо = Объект.ПутьКФайлу;
НовыйПуть = СтрЗаменить(ПутьДо, "\", "/");

Если ПутьДо <> НовыйПуть Тогда
    Объект.ПутьКФайлу = НовыйПуть;
    Попытка
        Объект.Записать();
        Сообщить("Обновлен путь для файла: " + Объект.Наименование);
    Исключение
        Сообщить("Не удалось записать файл: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Важный момент: Обратите внимание на использование метода Объект.Записать(). Без него ваши изменения останутся только во временной памяти обработки и не попадут в таблицу базы данных SQL, что и случилось у автора исходного вопроса на форуме.

Нюансы работы файловой системы Linux: регистр имен

Проанализируем еще одну проблему, которая часто всплывает сразу после замены слешей. В ОС Windows файловая система нечувствительна к регистру символов (File.jpg и file.jpg — это одно и то же). В Linux ситуация иная: регистр имеет значение.

Если в базе данных путь записан как 2019/PHOTO/Image.jpg, а на диске папка называется photo (строчными буквами), то 1С на Linux выдаст ошибку "Файл не найден". При массовом переносе данных рекомендуется либо привести все имена файлов и папок на диске к нижнему регистру, либо убедиться, что записи в 1С в точности соответствуют реальным именам файлов.

Прямое исправление через SQL (для опытных администраторов)

Если объем данных огромен (миллионы файлов), обработка средствами 1С может занять много времени. В таких случаях системные администраторы могут использовать прямой SQL-запрос к базе данных. Рассмотрим пример логики запроса для PostgreSQL:


-- ПРИМЕР ЗАПРОСА (Обязательно сделайте бэкап!)
UPDATE _ReferenceXXXX -- Здесь имя таблицы справочника присоединенных файлов
SET _FldYYYY = REPLACE(_FldYYYY, '\', '/') -- Здесь имя колонки пути
WHERE _FldYYYY LIKE '%\%';

Внимание: Использование прямых запросов к БД нарушает лицензионное соглашение 1С и может привести к непредсказуемым последствиям, если вы не знаете структуру таблиц вашей конфигурации. После такого обновления обязательно нужно очистить серверный кэш 1С.

Заключение

Подведем итог: проблема "невидимых" файлов в томах при переезде на Linux чаще всего кроется не в правах доступа (хотя chown и chmod сделать необходимо), а в статических строковых записях путей внутри базы данных. Замена обратного слеша \ на прямой / в реквизитах справочников присоединенных файлов полностью устраняет ошибки в отчетах контроля целостности и гарантирует стабильную работу системы.

Рекомендуется выполнять эти действия в период минимальной активности пользователей и только после создания полной резервной копии базы данных.

← На главную