Организация простейшего внешнего хранилища прикрепленных к документу (элементу справочника, ...) файлов на web-сервере, или не засоряем базу 1С

03.06.15

База данных - Чистка данных

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

Для решения проблемы с неприличным объёмом базы данных 1C из-за хранения в ней приложенных файлов в справочнике типа "ХранилищеДополнительнойИнформации" и всех вытекающих из этого неудобств, таких как огромного размера выгрузки ИБ и файла бэкапов, было написано следующее. (Данное решение не претендует на замену встроенных механизмов хранения файлов в конфигурациях типа "документооборот" без соответствующей доработки, однако, ничто не мешает доработать описанный принцип под конкретные нужды.)

Принцип довольно прост:

  • Добавляем на форму нужного объекта HTML-поле, в котором будет отображаться web-интерфейс файлового менеджера (по-моему, ограничений на платформу здесь нет, HTML на форме можно было и в 7.7 отобразить, поправьте, если не прав),
  • Берём любой понравившийся web- файловый менеджер, и ставим его на web-сервер (в данной статье как пример взят и изменен под свои нужды дистрибутив простого php файлового менеджера Sabre (изменённая версия на github) как web сервер использовался WAMP с основной кодировкой utf-8. Также все отлчино работает на LAMP. Версия php - предпочитаю свежую, но, возможно, Sabre будет работать и на 5.3 и ниже.)
  • При открытии формы объекта, отображаем на нашей форме файл-менеджер, вызванный с определенными GET-параметрами (например, относительный путь к папке, формируемый из имени и номера объекта). Также, если нужно, можно сделать разделение по ролям, кому можно удалять\редактировать\просматривать, кому - нет и вместо передачи простых GET-запросов хоть XML или JSON через POST и авторизацию прикрутить, как душе угодно)
  • В итоге пользователь может скачивать и прикреплять файлы, подробности процесса остаются для него не очевидными, а сами файлы лежат себе на том же (или другом) сервере в определенном месте, удобно распределенные по папкам - напр. /Документ/325/файл_документа_325.pdf и не захламляют базу.

Реализация:

Рассмотрим довольно простую и быструю реализацию задумки на примере WAMP:

устанавливаем последнюю версию web-сервера (допустим, в папку d:\wamp) Чтобы можно было загружать файлы до 100 мегабайт изменяем php.ini в d:\wamp\bin\apache\apache_ВЕРСИЯ_\bin\

...
post_max_size = 100M
...
upload_max_filesize = 100M
...

Чтобы сервис стартовал автоматически, запускаем services.msc, ищем wampapache64 (если x64) и ставим тип запуска - "Автоматически"

Важно! Чтобы wampmanager.exe при выходе не завершал заодно и работу web-сервера, что, сами понимаете чем чревато, изменяем wampmanager.tpl и wampmanager.ini предварительно завершив wampmanager.exe. Ищем блок [myexit] и комментируем нежелательные действия: wampmanager.ini:

[myexit]
;WAMPMYEXITSTART
;Action: service; Service: wampapache64; ServiceAction: stop; Flags: ignoreerrors
;Action: service; Service: wampmysqld64; ServiceAction: stop; Flags: ignoreerrors
Action:  exit
;WAMPMYEXITEND

wampmanager.tpl:

[myexit]
;WAMPMYEXITSTART
;Action: service; Service: ${c_apacheService}; ServiceAction: stop; Flags: ignoreerrors
;Action: service; Service: ${c_mysqlService}; ServiceAction: stop; Flags: ignoreerrors
Action:  exit
;WAMPMYEXITEND

Далее распаковываем в папку d:\wamp\www\ изменённую вверсия Sabre с github, переходим в браузере на http://localhost/Sabre1c-master/install/ и настраиваем как пожелаем. Создаём папку для загрузок, какую указали (по-умолчанию upload) в d:\wamp\www\Sabre1c-master\ переходим на http://localhost/Sabre1c-master/?CWD=\Тест\123 и загружаем любой файл, проверяем результат в папке d:\wamp\www\Sabre1c-master\upload\Тест\123\ появился загруженный файл.

Работу файл-менеджера проверял как на windows, так и на linux web-серверах, проблем с кодировкой имени файла при загрузке\скачивании удалось избежать. Пробелы в имени файла при загрузке заменяются символами нижнего подчёркивания. Если есть необходимость запретить загружать файлы с расширением, не включенным в список разрешенных, можно раскоментировать и попровить несколько строк в файле core\upload.php:

	$ext_allowed = array('txt', 'jpg', 'pdf', 'zip', 'png');
		if(!in_array(strtolower($extension), $ext_allowed)){
		header('location: ../?action=upload&file=');
		exit;
	}

Теперь идём в 1с и размещаем на нужном документе или справочнике ПолеHTMLДокумента с аналогичным именем и добавляем в функцию модуля ПриОткрытии() код:

// пример для обычных форм 8.X, Документ
Процедура ПриОткрытии(Отказ) {
	Если ДокументОбъект.Номер Тогда
		ЭлементыФормы.ПолеHTMLДокумента.Видимость=Истина;
		// если у вас числовая нумерация, Адрес="http://localhost/Sabre1c-master/?CWD="+"/"+ДокументОбъект.Метаданные().Имя+"/"+Формат(ДокументОбъект.Номер,"ЧГ=0");
		Адрес="http://localhost/Sabre1c-master/?CWD="+"/"+ДокументОбъект.Метаданные().Имя+"/"+ДокументОбъект.Номер;
		ЭлементыФормы.ПолеHTMLДокумента.Документ.URL = Адрес; 
	КонецЕсли;
КонецПроцедуры

// пример для управляемых форм 8.X, Справочник
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если Объект.Код Тогда
		Элементы.ПолеHTMLДокумента.Видимость=Истина;
		// если у вас числовая нумерация, Адрес="localhost/Sabre1c-master/?CWD="+"/contacts/"+Формат(Объект.Код,"ЧГ=0");
		Адрес="localhost/Sabre1c-master/?CWD="+"/contacts/"+Объект.Код;
		ПолеHTMLДокумента=Адрес;
	КонецЕсли;
КонецПроцедуры

Готово.

Также можно написать простейшую обработку, чтобы выгрузить все файлы из хранилища в базе в папку на диске.

Процедура ЭкспортФайловХранилищаНажатие(Элемент)
	Путь="d:\wamp\www\Sabre1c-master\upload\"
	ИмяХранилищаДопИнф="ХранилищеДополнительнойИнформации";
	Выборка = Справочники[ИмяХранилищаДопИнф].Выбрать();
	Пока выборка.Следующий() = 1 Цикл
		Попытка
			// если у вас числовая нумерация, ID=Формат(выборка.Объект.Код,"ЧГ=0");
			ID=выборка.Объект.Код;
		Исключение
			Попытка
				// если у вас числовая нумерация, ID=Формат(выборка.Объект.Номер,"ЧГ=0");
				ID=выборка.Объект.Номер;
			Исключение
				ID="null";
			КонецПопытки;
		КонецПопытки;
		
		РезультПуть=Путь + выборка.Объект.Метаданные().Имя + "\" + ID + "\";
		СоздатьКаталог(РезультПуть);
		Если выборка.ИмяФайла <>"" Тогда
			Результ = РезультПуть + СтрЗаменить(выборка.ИмяФайла, "/", " ");
			выборка.Хранилище.Получить().Записать(Результ);
			Сообщить("Выгружен "+Результ);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Всё нижеописанное Вы можете повторить для себя, но исключительно на свой страх и риск. Автор не несет ответственности за возникновение каких-либо проблем.

И удалить выгруженные файлы из БД.

Процедура УдалениеФайловХранилищаНажатие(Элемент)
	Выборка = Справочники.ХранилищеДополнительнойИнформации.Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Выборка.Объект.Метаданные().Имя = "ЗаказПокупателя" Тогда
			ТекЭлемент = Выборка.ПолучитьОбъект();
			Попытка 
				ТекЭлемент.Удалить();
			Исключение 
				Сообщить("Не удалось удалить элемент!" + ТекЭлемент.Код);
			КонецПопытки;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Теперь, чтобы фактический размер БД уменьшился после удаления из нее хлама, осталось только выгрузить и загрузить ИБ.

Вступайте в нашу телеграмм-группу Инфостарт

php web хранилище файлов хранилище дополнительной информации внешнее

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    61282    325    160    

295

Чистка данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 1.6 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Платные (руб)

Данные обработки помогут Вам легко и, главное быстро, выполнить удаление любых данных в Ваших базах 1С на платформах 8.1-8.3. Обработки помогут легко просмотреть связи ссылок в виде дерева, выбрать что удалять, а что нет, используя любые отборы. Это позволит уменьшить объем лишней и не нужной информации в справочниках и документах, планах видов характеристик и др. объектах и облегчит работу с данными пользователям и Вам. Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. (Обновление от 26.02.2026, версия 4.5, 4.6.0)

14640 руб.

22.02.2013    145126    288    153    

456

Чистка данных Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Если в вашей информационной базе крутится очень много данных, или база должна быть доступна 24/7 (как в моем случае), или же вы боитесь запускать тестирование и исправление, НО существует потребность удалить битые ссылки, тогда эта обработка сможет Вам помочь. Обработка выявляет битые ссылки как в самих объектах метаданных, так и в их табличных частях(!), а так же может их удалить.

5084 руб.

23.08.2021    12170    26    3    

32

Оптовая торговля Логистика, склад и ТМЦ Чистка данных Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Если вы начали работать в программном продукте Управление Торговлей, редакция 11 или Комплексная Автоматизация редакция 2 и включили механизм учёта серий, то перейти обратно в учёт без серий будет не так-то просто. Сложность заключается в том, что нужно очистить серии в табличной части документа, например, Реализация Товаров и услуг. Предлагаем алгоритм перехода на учет без серий для программного продукта УТ11. (Очистка серий.)

5084 руб.

09.04.2019    31415    48    15    

51

Чистка данных Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Обработка позволяет удобно и выборочно удалить данные из базы 1С на управляемых формах например БП 3.0, УТ 11, КА 2, ERP, УНФ, ЗУП 3, Розница и др. Это могут быть неактуальные организации или другие перечни объектов. При этом есть возможность провести анализ пересечений документов с другими организациями и таким образом уберечься от того, что при удалении обороты по другой организации изменятся. Объекты нужно выбирать вручную и после этого запускать команду удаления. Будут удалены все ссылки на них.

5000 руб.

28.11.2019    30040    80    21    

95

Чистка данных Инструменты администратора БД Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 1С:Библиотека стандартных подсистем 1С:Франчайзи, автоматизация бизнеса Абонемент ($m)

Хочешь выборочно удалить одну организацию, тестовую номенклатуру или «мусорного» контрагента, любую ссылку - без ручного поиска ссылок и часовых разборок зависимостей? Этот инструмент сам строит дерево связей, каскадно чистит с "глубоким поиском" документы, справочники, пвх, любые ссылки, регистры, движения в так же делает резервную копию и за пару минут оставляет базу чистой и полностью работоспособной (Управляемые формы, обычный интерфейс)

1 стартмани

03.02.2026    2172    82    war41k    0    

25

Чистка данных Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 Абонемент ($m)

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

1 стартмани

25.12.2023    13435    297    WeterSoft    7    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Prometeus2011 176 03.06.15 17:03 Сейчас в теме
Плюс за оригинальность и труды, но есть 2 замечания:
1. Трудоемко. Требует использование стороннего ПО. Проще использовать зашитую в платформу 8.х возможность клиент-серверного обмена.
2. Замена принципа работы интерфейса (в частности порядка прикрепления файлов к объектам) всегда переносится пользователями болезненно, особенно в организации, где пользюков, человек эдак 150 в базе сидит. По-этому, лучше внешне не менять ничего, а лишь при вызове штатных обработчиков перехватывать их исполнения и класть файлу не в ХЗ, а передавать на сервер. Но да это не столь важно.

В общем, как вариант... Сам озабочен этим, ибо графики много, а хранить ее в базе - не кошерно.
2. Dimon2005 6 04.06.15 11:28 Сейчас в теме
Надо будет попробовать. Спасибо!!
3. zqzq 25 05.06.15 09:41 Сейчас в теме
Если у документа поменяют номер или у справочника код - все связанные файлы потеряются?.. Тогда уж к ссылке нужно привязываться.

В БСП вроде что-то было для хранения файлов вне базы через веб-сервер.
4. dgolovanov 05.06.15 16:32 Сейчас в теме
Охренеть, простейший. Внедрите БСП и будет вам хранение файлов во внешних томах на дисках.
Silenser; exciter; +2 Ответить
5. iolko 344 15.06.15 07:03 Сейчас в теме
Вы ощущаете когнитивный диссонанс, когда сталкиваетесь с многогигабайтной базой данных, забитой разношёрстными файлами хранилища дополнительной информации
.

Есть такой момент, НО. В 1С (практически все типовые конфигурации) этот механизм используют (если не настраивать хранение файлов на дисках).
Здесь необходимо четкое понимание объемов хранения, и последствий, которые за собой эти хранимые объемы повлекут.

У нас в компании уже много лет реализовано хранение прикрепленных файлов на дисках, а в базу пишется только путь до файла. При этом в данный момент объем хранимой информации, а это:
screen shot-ы экранов пользователя с ошибками в отделе тех поддержки, различные заявки и пр, довольно велик, но собственно хранится и ни как не нагружает БД. При чем можно достаточно четко разграничить права доступа к этой информации средствами АД.
Для отправки сообщения требуется регистрация/авторизация