В процессе разработки и поддержки решений на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуациями, когда стандартные механизмы работы с файлами начинают вести себя непредсказуемо. Одной из таких проблем является изменение поведения метода НачатьПомещениеФайлов(), который внезапно перестает возвращать полный путь к файлу в свойстве Имя объекта ОписаниеПереданногоФайла, ограничиваясь только коротким именем. Рассмотрим подробнее, почему это происходит и как вернуть штатную работу системы.
Представим ситуацию: в конфигурации реализован механизм загрузки данных (например, выписок из банка или прайс-листов), который успешно работал долгое время. Программный код на клиенте выглядит стандартным образом для платформы 8.3.13 и выше. Проанализируем пример кода, который вызывает затруднение:
&НаКлиенте
Процедура Команда1(Команда)
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Объект.ИмяФайла));
ПомещениеФайловЗавершение = Новый ОписаниеОповещения("ЗагрузитьФайлНаКлиентеЗавершениеПомещения", ЭтотОбъект);
НачатьПомещениеФайлов(ПомещениеФайловЗавершение, ПомещаемыеФайлы, , Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлНаКлиентеЗавершениеПомещения(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
Если ПомещенныеФайлы.Количество() > 0 Тогда
ОписаниеФайла = ПомещенныеФайлы.Получить(0);
// Вместо "H:\1C\Import\data.txt" получаем просто "data.txt"
Сообщить(ОписаниеФайла.Имя);
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой вчера этот код возвращал полный локальный путь, а сегодня в одной из баз результат изменился. Примечательно, что проблема часто проявляется только в тонком клиенте, в то время как в толстом клиенте метод продолжает возвращать полный путь. Это связано с тем, как платформа обрабатывает контекст безопасности и временные хранилища.
Как показывает практика, наиболее вероятной причиной внезапного изменения поведения системы в одной конкретной базе является повреждение кэша данных сеанса на стороне сервера. Платформа 1С хранит параметры активных сеансов в специальной директории. Если в этих данных происходит сбой, сервер может некорректно обрабатывать дескрипторы файлов, передаваемые от тонкого клиента.
Разберем по шагам процесс исправления этой ошибки через очистку серверного кэша:
Агент сервера 1С:Предприятия 8.3.C:\Program Files\1cv8\srvinfo\reg_1541\.snccntx. Именно в ней хранятся данные контекста сеансов (Session Context). Удалите содержимое этой папки.Важный момент: Очистка папки snccntx не удаляет данные базы, но сбрасывает текущие временные состояния форм и сеансов, что позволяет платформе инициализировать механизмы передачи файлов "с чистого листа".
Проанализируем ситуацию с точки зрения архитектуры платформы. В тонком клиенте (и особенно в веб-клиенте) 1С старается соблюдать требования безопасности. Полный путь к файлу на диске пользователя (например, C:\Users\Ivanov\Desktop\Secret\file.txt) может содержать конфиденциальную информацию (имя учетной записи, структуру папок). Поэтому в ряде случаев платформа намеренно "обрезает" путь, оставляя только имя файла.
Если ваше решение завязано на получение именно полного пути, рекомендуется использовать объект Файл непосредственно перед вызовом процедуры помещения, чтобы сохранить путь в ДополнительныеПараметры.
Чтобы ваш код не зависел от того, вернет ли ОписаниеПереданногоФайла.Имя полный путь или только имя, рассмотрим более надежный подход. Мы можем передать исходный путь через структуру параметров оповещения. Посмотрим на пример:
&НаКлиенте
Процедура КомандаНадежная(Команда)
// Сохраняем путь заранее
ВыбранныйПуть = Объект.ИмяФайла;
ДопПараметры = Новый Структура;
ДопПараметры.Вставить("ПолныйПутьКФайлу", ВыбранныйПуть);
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПомещенияНадежное", ЭтотОбъект, ДопПараметры);
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбранныйПуть));
НачатьПомещениеФайлов(ОписаниеОповещения, ПомещаемыеФайлы, , Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеПомещенияНадежное(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
// Теперь мы всегда имеем доступ к полному пути, независимо от кэша сервера
ИсходныйПуть = ДополнительныеПараметры.ПолныйПутьКФайлу;
Если ПомещенныеФайлы <> Неопределено И ПомещенныеФайлы.Количество() > 0 Тогда
ОписаниеФайла = ПомещенныеФайлы[0];
// Работаем с ОписаниеФайла.Адрес и ИсходныйПуть
КонецЕсли;
КонецПроцедуры
Выясним, какие альтернативы предлагает современная платформа. Начиная с версии 8.3.15, вместо НачатьПомещениеФайлов() рекомендуется использовать асинхронные методы работы с одним файлом или новые методы НачатьПомещениеФайлаНаСервер(). Они более стабильны и лучше работают с контекстом управляемых форм.
Рассмотрим преимущества новых методов:
В завершение отметим, что если вы столкнулись с проблемой "вчера работало, а сегодня нет", и код при этом не менялся — всегда начинайте диагностику с проверки условий окружения (права доступа к временным папкам %TEMP%) и очистки серверного кэша. Это позволит сэкономить время на поиске ошибок в коде, которых там нет.