Перенос серверной части 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 не находится.
Самый простой и безопасный способ исправить ситуацию в типовых конфигурациях (УТ 11, ERP, БП 3.0) — использовать встроенные инструменты. Разберем по шагам, как это сделать:
Номенклатура присоединенные файлы, Договоры контрагентов присоединенные файлы или общий справочник Файлы.ПутьКФайлу.Выясним, какой код необходимо написать для замены. Нам нужно использовать функцию СтрЗаменить. Посмотрим на пример кода:
// В контексте обработки объект доступен как "Объект"
Если Найти(Объект.ПутьКФайлу, "\") > 0 Тогда
Объект.ПутьКФайлу = СтрЗаменить(Объект.ПутьКФайлу, "\", "/");
// В групповой обработке метод Записать() вызывается автоматически,
// если это предусмотрено настройками, но для уверенности в произвольном коде:
Объект.Записать();
КонецЕсли;
Если вы предпочитаете использовать внешние обработки или встроенную обработку "Подбор и обработка объектов", алгоритм остается схожим. Однако здесь важно не совершить классическую ошибку: изменение реквизита в памяти без его сохранения в базу данных.
Рассмотрим подробнее правильный алгоритм для обработки:
// Правильный код для замены слешей
ПутьДо = Объект.ПутьКФайлу;
НовыйПуть = СтрЗаменить(ПутьДо, "\", "/");
Если ПутьДо <> НовыйПуть Тогда
Объект.ПутьКФайлу = НовыйПуть;
Попытка
Объект.Записать();
Сообщить("Обновлен путь для файла: " + Объект.Наименование);
Исключение
Сообщить("Не удалось записать файл: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Важный момент: Обратите внимание на использование метода Объект.Записать(). Без него ваши изменения останутся только во временной памяти обработки и не попадут в таблицу базы данных SQL, что и случилось у автора исходного вопроса на форуме.
Проанализируем еще одну проблему, которая часто всплывает сразу после замены слешей. В ОС Windows файловая система нечувствительна к регистру символов (File.jpg и file.jpg — это одно и то же). В Linux ситуация иная: регистр имеет значение.
Если в базе данных путь записан как 2019/PHOTO/Image.jpg, а на диске папка называется photo (строчными буквами), то 1С на Linux выдаст ошибку "Файл не найден". При массовом переносе данных рекомендуется либо привести все имена файлов и папок на диске к нижнему регистру, либо убедиться, что записи в 1С в точности соответствуют реальным именам файлов.
Если объем данных огромен (миллионы файлов), обработка средствами 1С может занять много времени. В таких случаях системные администраторы могут использовать прямой SQL-запрос к базе данных. Рассмотрим пример логики запроса для PostgreSQL:
-- ПРИМЕР ЗАПРОСА (Обязательно сделайте бэкап!)
UPDATE _ReferenceXXXX -- Здесь имя таблицы справочника присоединенных файлов
SET _FldYYYY = REPLACE(_FldYYYY, '\', '/') -- Здесь имя колонки пути
WHERE _FldYYYY LIKE '%\%';
Внимание: Использование прямых запросов к БД нарушает лицензионное соглашение 1С и может привести к непредсказуемым последствиям, если вы не знаете структуру таблиц вашей конфигурации. После такого обновления обязательно нужно очистить серверный кэш 1С.
Подведем итог: проблема "невидимых" файлов в томах при переезде на Linux чаще всего кроется не в правах доступа (хотя chown и chmod сделать необходимо), а в статических строковых записях путей внутри базы данных. Замена обратного слеша \ на прямой / в реквизитах справочников присоединенных файлов полностью устраняет ошибки в отчетах контроля целостности и гарантирует стабильную работу системы.
Рекомендуется выполнять эти действия в период минимальной активности пользователей и только после создания полной резервной копии базы данных.