Создание ссылок на файлы в 1С:Предприятие — задача, с которой сталкиваются и бухгалтеры при работе с первичными документами, и разработчики при автоматизации бизнес-процессов. В зависимости от версии платформы (1С 8.2 или 1С 8.3) и конфигурации (Управление торговлей, Бухгалтерия предприятия, Зарплата и управление персоналом) способы добавления ссылок могут различаться. Эта статья охватывает все актуальные методы: от простой вставки через интерфейс до написания кода на встроенном языке.
Особенность работы с файлами в 1С заключается в том, что система оперирует не прямыми путями (как в Windows), а объектами типа "ХранилищеЗначения" или "ДвоичныеДанные". Это обеспечивает безопасность и кросс-платформенность, но требует специфических подходов. Например, ссылка на файл в справочнике ДоговорыКонтрагентов будет храниться иначе, чем прикреплённый документ в ПоступлениеТоваров. Разберёмся, как реализовать каждый сценарий.
1. Способ: Ручное добавление ссылки через интерфейс 1С
Самый простой метод, не требующий знания программирования. Подходит для пользователей, которые нуждаются в прикреплении файлов к документам или справочникам "на лету". Рассмотрим на примере конфигурации 1С:Бухгалтерия 8.3 (ред. 3.0).
Алгоритм действий:
- 📁 Откройте документ или элемент справочника, к которому нужно прикрепить файл (например,
Счёт на оплату покупателю). - 🖼️ В панели инструментов документа найдите кнопку "Прикрепить файл" (значок скрепки) или вкладку
Файлы. - 📎 Нажмите
Добавить→ выберите файл на своём компьютере. Система автоматически создаст ссылку и сохранит файл в базе. - 🔗 После сохранения документа ссылка будет доступна в виде гиперссылки с именем файла.
Ограничения метода:
- ⚠️ Файлы хранятся внутри базы 1С, что увеличивает её размер. Для больших файлов (например, сканов договоров в высоком разрешении) это может замедлить работу.
- ⚠️ Нет возможности настроить внешнее хранилище (например, сетевой диск или облако) без доработок конфигурации.
Если кнопка "Прикрепить файл" отсутствует, проверьте настройки прав пользователя в разделе Администрирование → Настройки пользователей и прав → Роли. Возможно, у вашей роли нет прав на работу с файлами.
2. Способ: Использование реквизита типа "ХранилищеЗначения"
Для разработчиков и опытных пользователей, которые хотят гибко управлять файлами, подходит метод с использованием реквизита типа "ХранилищеЗначения". Этот способ позволяет хранить файлы непосредственно в объектах конфигурации (например, в справочниках или документах) и программно управлять ими.
Пошаговая инструкция:
- Откройте конфигуратор (
Файл → Конфигуратор). - Перейдите в нужный объект (например, справочник
Контрагенты). - Добавьте новый реквизит с типом
ХранилищеЗначенияи именем, например,ПрикреплённыеФайлы. - В модуле объекта напишите обработчик для загрузки файла:
Процедура ПрикреплённыеФайлыНачалоВыбора(Элемент, СтандартнаяОбработка)СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда
Данные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
Объект.ПрикреплённыеФайлы.Записать(Данные);
КонецЕсли;
КонецПроцедуры
Преимущества метода:
- 🔧 Полный контроль над файлами через код (можно добавлять валидацию, ограничения по размеру, типу файлов).
- 📊 Файлы хранятся в базе, что упрощает резервное копирование.
- 🔄 Можно реализовать версионирование файлов (например, хранить историю изменений договоров).
Как извлечь файл из ХранилищаЗначения?
Чтобы получить файл обратно, используйте метод Прочитать():
Данные = Объект.ПрикреплённыеФайлы.Прочитать();
Данные.Записать("C:\Temp\ВыгруженныйФайл.pdf");
Обратите внимание, что путь для сохранения должен существовать, иначе возникнет ошибка.
3. Способ: Ссылка на файл через внешнее хранилище (сетевой диск, FTP)
Если файлы хранятся вне базы 1С (например, на сетевом диске или FTP-сервере), можно создать ссылку на них в виде гиперссылки. Этот метод подходит для крупных файлов (видео, архивы проектов), которые нецелесообразно хранить в базе.
Пример реализации:
- 📂 Загрузите файл на сетевой диск (например,
\\server\docs\contracts\dogovor123.pdf). - 🔗 В 1С добавьте реквизит типа
Строка(например,СсылкаНаФайл). - 📝 В модуле формы добавьте обработчик для открытия файла:
Процедура СсылкаНаФайлПриНажатии(Элемент)Путь = Объект.СсылкаНаФайл;
Если НЕ ЗначениеЗаполнено(Путь) Тогда
Предупреждение("Ссылка не указана!");
Возврат;
КонецЕсли;
Попытка
СистемаКоманд.Выполнить(Путь);
Исключение
Предупреждение("Не удалось открыть файл: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
⚠️ Внимание: При использовании сетевых путей убедитесь, что у всех пользователей 1С есть права доступа к папке. В противном случае ссылка будет нерабочей. Для FTP потребуется дополнительная настройка аутентификации в коде.
| Метод хранения | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Внутри базы 1С | Простота, резервное копирование вместе с базой | Увеличивает размер базы, ограничения по размеру файлов | Для небольших файлов (до 10 МБ) |
| ХранилищеЗначения | Гибкость, программный контроль | Требует доработки конфигурации | Для автоматизированных систем с большим количеством файлов |
| Внешнее хранилище | Не нагружает базу, подходит для больших файлов | Сложности с правами доступа, резервным копированием | Для архивов, видео, крупных документов |
4. Способ: Гиперссылка в текстовом поле (HTML)
Если вам нужно вставить кликабельную ссылку на файл внутри текстового поля (например, в описании товара или комментарии к документу), можно использовать HTML-разметку. Этот метод работает в полях типа Строка (с включённым режимом Многострочный) или HTMLДокумент.
Инструкция:
- В форме документа или справочника добавьте реквизит типа
Строкас длиной не менее 200 символов. - В модуле формы напишите обработчик для вставки HTML-кода:
Процедура ВставитьСсылкуНаФайл(Команда)ПутьКФайлу = "\\server\docs\contracts\dogovor123.pdf";
ТекстСсылки = "Скачать договор №123";
Объект.Описание = "<a href=""file://" + ПутьКФайлу + """" + ">" + ТекстСсылки + "</a>";
КонецПроцедуры
- Настройте отображение поля как
ПолеHTMLДокументав форме.
Важные нюансы:
- 🔗 Для локальных файлов используйте префикс
file://(например,file://C:/Documents/contract.pdf). - 🌐 Для сетевых путей указывайте UNC-путь (например,
file://\\server\share\file.pdf). - ⚠️ В браузерах и некоторых версиях 1С
file://может блокироваться по соображениям безопасности.
Путь к файлу указан корректно (без опечаток)|Файл существует по указанному пути|У пользователя есть права на чтение файла|Поле в 1С настроено как HTML-документ-->
5. Способ: Программное создание ссылки через "ДвоичныеДанные"
Для разработчиков, которые работают с файлами на уровне кода, актуально использование объекта "ДвоичныеДанные". Этот метод позволяет загружать файлы в базу, манипулировать ими (например, архивировать) и сохранять обратно на диск.
Пример кода для загрузки файла в документ:
Процедура ЗагрузитьФайлВДокумент(ПутьКФайлу)
// Чтение файла с диска
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
// Сохранение в реквизит документа
Объект.ФайлДанные = ДвоичныеДанные;
// Альтернативно: запись в ХранилищеЗначения
Хранилище = Новый ХранилищеЗначения();
Хранилище.Записать(ДвоичныеДанные);
Объект.ХранилищеФайла = Хранилище;
КонецПроцедуры
// Обратная выгрузка
Процедура СохранитьФайлНаДиск(ПутьСохранения)
ДвоичныеДанные = Объект.ФайлДанные;
ДвоичныеДанные.Записать(ПутьСохранения);
КонецПроцедуры
Критичный нюанс: при работе с "ДвоичнымиДанными" файлы хранятся в оперативной памяти, поэтому для больших файлов (более 100 МБ) используйте потоковую обработку, чтобы избежать ошибок переполнения.
6. Способ: Интеграция с внешними системами (REST API, облака)
Для современных бизнес-процессов актуальна интеграция 1С с облачными хранилищами (Yandex Disk, Google Drive) или корпоративными системами документооборота. В этом случае ссылка на файл будет веб-адресом (URL), а сами файлы — храниться вне 1С.
Пример интеграции с Yandex Disk:
- 🔑 Получите OAuth-токен для доступа к API Яндекс.Диска (инструкция на сайте Яндекса).
- 📤 Напишите функцию загрузки файла:
Функция ЗагрузитьФайлНаЯндексДиск(ПутьКФайлу, ИмяФайлаНаДиске)Токен = "ваш_oauth_токен";
URL = "https://cloud-api.yandex.net/v1/disk/resources/upload?path=" + ИмяФайлаНаДиске + "&overwrite=true";
HTTPЗапрос = Новый HTTPЗапрос(URL);
HTTPЗапрос.УстановитьЗаголовок("Authorization", "OAuth " + Токен);
HTTPОтвет = Новый HTTPСоединение().Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Данные = Новый ДвоичныеДанные(ПутьКФайлу);
URLЗагрузки = JSON.Прочитать(HTTPОтвет.ПолучитьТекст()).href;
HTTPЗапрос = Новый HTTPЗапрос(URLЗагрузки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(Данные);
HTTPОтвет = Новый HTTPСоединение().ПослатьДляЗаписи(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 201 Тогда
Возврат "https://disk.yandex.ru/d/" + JSON.Прочитать(HTTPОтвет.ПолучитьТекст()).path;
Иначе
ВызватьИсключение "Ошибка загрузки: " + HTTPОтвет.ПолучитьТекст();
КонецЕсли;
Иначе
ВызватьИсключение "Ошибка получения URL: " + HTTPОтвет.ПолучитьТекст();
КонецЕсли;
КонецФункции
- 🔗 Сохраните полученную веб-ссылку в реквизит документа.
⚠️ Внимание: При работе с API сторонних сервисов учитывайте ограничения по количеству запросов и размеру файлов. Например, в бесплатном тарифе Яндекс.Диска лимит — 10 ГБ.
Типичные ошибки и их решения
При работе со ссылками на файлы в 1С пользователи и разработчики часто сталкиваются с типичными проблемами. Разберём самые распространённые:
- Ошибка "Файл не найден":
- 🔍 Проверьте путь к файлу (особенно регистр символов в Linux-системах).
- 🔄 Если файл на сетевом диске, убедитесь, что диск подключён (иногда буквы дисков меняются после перезагрузки).
- 📌 Убедитесь, что поле настроено как
ПолеHTMLДокумента. - 🔗 Проверьте формат ссылки: для локальных файлов должен быть префикс
file://.
- 🗃️ Используйте потоковое чтение/запись вместо
ДвоичныеДанные. - 📉 Разбейте файл на части (актуально для файлов > 500 МБ).
Перед массовой загрузкой файлов в 1С всегда тестируйте процесс на 2-3 файлах. Это поможет избежать ошибок переполнения базы или потери данных.
FAQ: Частые вопросы по работе со ссылками на файлы в 1С
Можно ли в 1С сделать ссылку на файл в облаке (Google Drive, OneDrive)?
Да, но для этого потребуется:
- Сгенерировать публичную ссылку на файл в облаке (в настройках доступа выбрать "Все, у кого есть ссылка").
- Вставить эту ссылку в реквизит типа
Строкав 1С. - Настроить обработчик для открытия ссылки в браузере:
Процедура ОткрытьОблачнуюСсылку(Ссылка)СистемаКоманд.Выполнить("rundll32 url.dll,FileProtocolHandler " + Ссылка);
КонецПроцедуры
Обратите внимание: при таком подходе файлы не хранятся в 1С, а только ссылки на них.
Как ограничить типы файлов, которые можно прикрепить в 1С?
Для реквизита типа ХранилищеЗначения ограничение настраивается в коде. Пример для разрешения только PDF и DOCX:
Процедура ПрикрепитьФайл(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Документы (.pdf, .docx)|.pdf;.docx";
Если Диалог.Выбрать() Тогда
// Далее код загрузки файла
КонецЕсли;
КонецПроцедуры
Для встроенного механизма прикрепления файлов (через кнопку "Скрепка") ограничения настраиваются в конфигураторе на уровне ролей.
Почему после обновления 1С перестали работать ссылки на файлы?
Причины могут быть следующими:
- 🔄 Изменилась структура хранения файлов в новой версии платформы (актуально для переходов с 8.2 на 8.3).
- 🔐 Обновились права доступа к сетевым папкам.
- 📁 В новой версии 1С может блокироваться выполнение внешних команд (например, открытие
file://ссылок). - Проверьте журнал регистрации 1С на ошибки.
- Обновите обработчики открытия файлов с учётом новых ограничений безопасности.
- Для сетевых путей используйте UNC-формат вместо букв дисков (например,
\\server\shareвместоZ:\).
Решение:
Как сделать, чтобы прикреплённые файлы автоматически архивировались?
Для этого нужно доработать модуль объекта. Пример кода для автоматического ZIP-архивирования:
Процедура ПрикрепитьФайлСАрхивацией(ПутьКФайлу)
// Чтение исходного файла
ИсходныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
// Создание ZIP-архива
ЗаписьZIP = Новый ЗаписьДанных();
Архив = Новый ZIPАрхив(ЗаписьZIP);
Архив.Добавить(ПутьКФайлу, ИсходныеДанные);
Архив.Закрыть();
// Сохранение архива в базе
Объект.АрхивФайла = ЗаписьZIP.ЗакрытьИПолучитьДвоичныеДанные();
КонецПроцедуры
Для извлечения файла из архива используйте класс ЧтениеДанных и ZIPАрхив.
Можно ли в 1С сделать ссылку на файл, который хранится в базе данных (например, SQL)?
Да, но для этого потребуется:
- Настроить внешнее хранилище в конфигураторе (раздел
Администрирование → Внешние источники данных). - Создать реквизит типа
Строкадля хранения идентификатора файла в SQL. - Написать обработчики для загрузки/выгрузки файлов через запросы к базе. Пример:
Запрос = Новый Запрос;Запрос.Текст =
"ВЫБРАТЬ ФайлДанные
ИЗ ДокументыФайлы
ГДЕ ИдДокумента = &ИдДокумента";
Запрос.УстановитьПараметр("ИдДокумента", Объект.Ссылка.УникальныйИдентификатор());
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
ДвоичныеДанные = Результат[0].ФайлДанные;
ДвоичныеДанные.Записать("C:\Temp\ФайлИзSQL.pdf");
КонецЕсли;
Такой подход актуален для распределённых систем, где файлы хранятся в централизованной базе данных.