Хранение рисунков в отдельной базе MSSQL с помощью ADODB и Base64Строка

15.03.10

Интеграция - Внешние источники данных

Обработка показывает, каким образом можно хранить рисунки (и не только) в базе MSSQL, а не в базе 1С. Полезно будет тем, у кого такая информация занимает в базе места больше, чем собственно данные.

Скачать файлы

Наименование Файл Версия Размер
РисункиВSQL.epf
.epf 8,51Kb
330
.epf 8,51Kb 330 Скачать

Руководство решило хранить в базе сканированные копии всех договоров и сопутствующих документов. Все бы ничего, подвязали сканер к 1С, только за год база выросла до 100 гиг. С такой базой ни выгрузку нормально не сделаешь ни базу не поднимешь.

Надо было что-то придумать. Просто хранение файлов на файловом серваке нас не устраивало. Создавать для файлов отдельную базу 1С посчитали нецелесообразным. Решено было хранить данные в отдельной базу MSSQL. Только вот как это делать, никто не знал. На проекте видел несколько обработок, но они только читали данные из MSSQL, а нам нужно в базу писать, да еще и рисунки. Начался поиск решений. В итоге получилось то, что оформлено в данную обработку.

Для работы обработки нужен MSSQL сервер, .Net Framework 1.1 (он содержит ADODB.dll) на клиенте. На сервере создаем базу данных (в моем случае SomeDB) в которой создаем таблицу (в моем случае Pict), в которой создаем 2 колонки для ID рисунка и самого рисунка типа nvarchar(MAX). В обработке заполняем поля выше кнопки "Подключиться к SQL", нажимаем кнопку, в случае успешного подключения вводим имя таблицы, имена столбцов и ИД рисунка (произвольная строка). Выбираем рисунок, видим его внизу слева. Кнопка "Положить в базу" записывает рисунок в БД, кнопка "Выбрать из базы" получит рисунок с введенным ИД из БД и отобразит его в правой части формы. Открываем обработку в конфигураторе, смотрим как все реализовано, ставим плюс мне за труды.

Плюс данного решения - нет необходимости сохранять данные в промежуточный файл для просмотра в 1С.

Минус данного решения - примерный размер базы = размер данных * 3.

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22447    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9207    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48695    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81559    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    29997    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19126    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ПСВ 114 15.03.10 13:25 Сейчас в теме

use tempdb

CREATE TABLE myTable(FileName int,
Document varbinary(max))
GO

insert myTable(Filename,Document)
select 1,null

GO

UPDATE myTable
SET Document = (
SELECT *
FROM OPENROWSET(BULK 'D:\картинка\14.jpg', SINGLE_BLOB)AS x )
WHERE FileName = 1;
GO

select * from mytable


asspid_1c; Dimasik2007; +2 Ответить
2. Ivon 673 15.03.10 13:38 Сейчас в теме
(1). Интересное решение. Не знал. А 1С как воспримет банные из varbinary?
3. a_titeev 31 15.03.10 17:15 Сейчас в теме
ИМХО, все-таки правильнее было бы использовать не nvarchar-поле, а image...
кстати тогда получаем еще одно преимущество - можно хранить, например, различные документы (doc, .xls, .ppt, .txt, .html, .pdf,...), а для них можно применить индексирование с помощью фильтров и использовать full-text search для поиска по содержимому документов...
хранение в nvarchar этого кажись не позволит, ибо сказано было в документации: "Formatted text strings, such as Microsoft® Word™ document files or HTML files, cannot be stored in character string or Unicode columns because many of the bytes in these files contain data structures that do not form valid characters."
4. Ivon 673 15.03.10 18:19 Сейчас в теме
(3). Я использую Base64Строка(Картинка.ПолучитьДвоичныеДанные()). А там можно любые двоичные данные в виде строки представить.
5. a_titeev 31 15.03.10 18:49 Сейчас в теме
(4). Так это и понятно, но лучше бы как-нибудь без Base64... Искусственно размер увеличивается, во первых. Во вторых, если все таки хранить что нибудь типа документов, как я писал ранее, теряется возможность использования полнотекстового поиска по содержимому внутри сиквельной таблицы.
Можно попробовать через временные файлы... Типа так: StoredProc заводишь, которая содержимое image сливает в файл с заданным именем, а ты этот файл ДвоичнымиДанными..., и делаешь что нада... или же сразу картинку на основании файла сделать можно, если это картинка...
подобным образом сделал как то хранение документов, которые потом были доступны в 1с и одновременно с этим на сайтике... правда проект развития не получил, и все наработки непонятно где... скорее всего их и нет уже...
но вообще, для простых вещей конечно и так достаточно...
siranush; +1 Ответить
6. Ivon 673 15.03.10 18:56 Сейчас в теме
(5). Надо будет попробовать. Просто с Base64 вроде как понятнее.
8. Широкий 692 16.03.10 14:18 Сейчас в теме
9. a_titeev 31 16.03.10 14:47 Сейчас в теме
(8). Да-да. Байка про "неиспользование" типа image в будущих версиях есть и я это видел... действительно рекомендуется varbinary(max)... но в том числе и по личному опыту также знаю о различии в скоростях при работе с image и varbinary(max)... тынц

в принципе в 2008 есть уже и varbinary(max) filestream - можно поюзать его... вроде как это уже именно для подобных целей и будет оптимально с точки зрения производительности. сам не пробовал, руки не доходили, попробую как нибудь позже...

(7). Мало того, скорее всего то что залилось в базу - уже не картинка :( ...
11. Ivon 673 16.03.10 14:55 Сейчас в теме
(9). То есть на текущий момент лучше Base64Строка никто ничего работающего предложить не может...
13. Ivon 673 16.03.10 15:07 Сейчас в теме
(9). То есть на текущий момент лучше Base64Строка никто ничего работающего предложить не может...
Можно, конечно использовать Stream, но здесь мы упираемся в необходимость сохранения файла на диск. В принципе, каждый из вариантов имеет свои плюсы и минусы, в мое случае плюс - это отсутствие необходимости вначале писать файл на диск, а минус - картинка занимает больше места, потому что вначале перекодируется с помощью Base64Строка.
Вариант с varbinary в данном случае полностью противоположный моему: необходимость сохранения картинки на диск перед тем, как ее прочитать в поле картинки, но картинка в базе будет занимать меньше.
14. a_titeev 31 16.03.10 15:28 Сейчас в теме
(13). да никуда мы не упираемся... разум коллективный. эффект синергии... придумать можно чё нибудь...
18. a_titeev 31 17.03.10 13:00 Сейчас в теме
(13). н-да... нашел таки сырцы... ну и бред же я писал года полтора назад... ;) шутка...
да все, естественно через файлы... отличие только в том что через OPENROWSET заливались сразу все доки в папке... а для чтения тот же стрим и в файл... стрим нужен был видимо для того чтоб на локальной машине сохранять...
но меня оправдывает то, что работа была именно с документами, а не с картинками, а там точно вариантов нет - только сохранение в темпарь... итак, дело в том, что тип COMSafeArray который ты получаешь на выходе с RecordSet.Fields("...").Value нада в виде типа Картинка получить... напрашивается что то типа ВК слепить по этому поводу... конечно если существует возможность тип Картинка или ДвоичныеДанные из нее вернуть... можно ли, не знаю...
(15). наверное от специфики проекта зависит... в конце концов РБД не везде. да и дело то не только в хранении, а прежде всего в доступе к внешней базе для получения двоичных данных без промежуточных поползновений по жесткому диску... это может быть просто база внешнего приложения, вполне независимого от1с... строка - хорошо, но недостаточно для меня было, т.к. нужно было и документы не испортить (которые в отдельной системе использовались) и в 1с их как то поиметь...
19. Ivon 673 17.03.10 13:10 Сейчас в теме
(18). Согласен, если нужно использовать эти файлы не только в 1С, тогда только в бинарном виде сохранять. У меня случай проще, мне нужно использовать файлы только в 1С 8, поэтому Base64 выглядит привлекательнее, не нужно пользоваться временными файлами.
7. Ivon 673 16.03.10 10:56 Сейчас в теме
Попробовал ложить в двоичном виде - ложить получилось, а вот с чтением проблемы, конструкция
Новый Картинка(RecordSet.Fields(0).Value)

выдает ошибку
Ошибка при вызове конструктора (Картинка): Несоответствие типов (параметр номер '1')

Как побороть - понятия не имею. Если кто-то знает (без сохранения в промежуточный файл), просьба отпостить. Пока вижу единственный рабочий вариант с Base64Строка.
10. Широкий 692 16.03.10 14:54 Сейчас в теме
12. a_titeev 31 16.03.10 15:04 Сейчас в теме
ща, отобьюсь он назойливых... поеду домой, попробую сырцы поискать... sql какой? может правда на filestream переделать?
15. _Z1 38 16.03.10 19:34 Сейчас в теме
Хранить файл в бд конечно хорошо но есть одно но УРБД.

Я считаю что можно воспользоваться моей компонентой по хранению
бинарных файлов в строке. Это лучше чем Base64Строка
компонента и обсуждение здесь
Преобразование картинки в строку
17. Ivon 673 17.03.10 10:21 Сейчас в теме
(16). Немного не по теме. Здесь обсуждается не вытягивание картинки из базы 1С в стороннее приложение, а сохранение изображений в отдельной MSSQL базе непосредственно из 1С и чтение этих изображений непосредственно в 1С.
20. san4o 20.03.10 11:51 Сейчас в теме
Для решения задачи сохранения фотографий во внешней базе данных есть внешняя компонента "Фотоархив". Делалась для работы с фотографиями сотрудников в проекте учета рабочего времени. Работает под 7.7 и 8.1.
База данных - SQL или файл Access (*.mdb). Можно использовать для сохранения любой информации, не только файлы с картинками. Например *.mp3 или *.doc. ВК сама создает базу данных в SQL и таблицу для сохранения. Можно задавать имя таблицы. Таблиц может быть сколько угодно.
Объект сохраняется и извлекается из базы по произвольно сформированному ID. В комплекте поставки пример привязки фотографий по внутреннему ID объекта в 1С.
Есть демо-версия http://www.wbp-sar.ru/joomla/index.php?option=com_content&view=article&id=20:-qq&catid=12:2009-10-08-11-25-36&Itemid=37
21. Ivon 673 22.03.10 09:25 Сейчас в теме
(20). 1) Сайт то-ли не работает полностью, то-ли о нем забыли.
2) Похоже ВК платная, тогда зачем платить деньги, если мой работающий пример бесплатный и тоже позволяет хранить любой файл.
3) Любая ВК требует регистрации ее с правами админа. Мой пример не использует ВК, поэтому будет работать сразу.
22. alex_4x 85 18.06.10 17:53 Сейчас в теме
А будет он работать с базой на postgres ?
23. Ivon 673 18.06.10 18:33 Сейчас в теме
(22). Именно данная обработка нет, но если в ней переделать строку подключения и строки запросов под postgres, то, я уверен, оно заработает.
24. Trakt0risT 111 15.09.10 11:21 Сейчас в теме
Всё бы не чего, но картинку большого размера не получится преобразовать в Строку (Base64Строка ) что делать? ((( есть выход?
25. Ivon 673 15.09.10 13:04 Сейчас в теме
(24). Большого - это какого? Я засовывал фотки 8-10 мегапикселей.
26. Trakt0risT 111 15.09.10 13:49 Сейчас в теме
Размером более 50 мегабайт!
27. Ivon 673 15.09.10 14:07 Сейчас в теме
(26). Может просто долго пишется... Или ошибку выдает?
28. Trakt0risT 111 15.09.10 14:37 Сейчас в теме
Именно ошибку выдает! говорить что слишком большой размер. приэтом пользовался всеми возможными методами преобразования в строку. не помогает! (
решил проблему следующим методом:
Stream=Новый COMОбъект("ADODB.Stream");
Stream.Type=1;
Stream.Open();
Stream.LoadFromFile(FileData1);
32. KroVladS 34 08.08.12 16:51 Сейчас в теме
(28) Trakt0risT,
Можно по подробней, Вы строку передаёте потоком?

(22) alex_4x, (25)
Пытаюсь адаптировать для PostgreSQL. Преоброзование в Base64Строка файлов 8МБ проходит нормально, но при выполнении КомандаSQL.Execute(); либо ругаеться на надостаток памяти либо валиться платформа.
29. legalas84 08.12.11 15:41 Сейчас в теме
Спасибо огромное. помогла обработка!
31. Ivon 673 13.12.11 12:04 Сейчас в теме
(29), (30). У меня в профиле есть статья по хранению рисунков в базе без преобразования в Base64Строка. Работает быстрее и места в БД рисунки занимают меньше.
30. yalo 13.12.11 12:01 Сейчас в теме
Использовала данную обработку как основу для своей обработки. Очень полезная вещь, помогла очень. Спасибо!
33. Ivon 673 08.08.12 16:57 Сейчас в теме
Вообще с Postgre очень странно работает. У меня, например, не работает выгрузка базы по расписанию. 1С просто вываливается с критической ошибкой. С MSSQL все нормально. Да и перестал я использовать 1С-ное поле картинки. Написал свою компоненту на C#, она и ложит рисунки в базу и отображает.
34. KroVladS 34 08.08.12 17:08 Сейчас в теме
Пытался адаптировать под PostgreSQL несколько вариантов файловых хранилишь которые нашёл на infostart.ru всё закончилось неудачай. Хранить через Base64Строка единственное что удалось заставить работать и то толко для небольших файлов :(
35. Alexander78 4 08.08.12 17:50 Сейчас в теме
а если тип данных в БД MySql Blob можно напрямую прочитать из 1С (без временного файла)?
36. Invaa 409 21.05.13 15:42 Сейчас в теме
Раз речь идет о MS SQL, то почему просто не пользоваться штатным механизмом файловых групп? И не нужно никакие сторонние базы создавать. Хочешь хоть каждый справочник или документ на отдельной дисковой подсистеме храни...
37. Ivon 673 21.05.13 17:13 Сейчас в теме
(36) Это Вы про какой штатный механизм упомянули? Что-то никто из моих коллег не в курсе...
38. Silenser 592 31.10.13 08:37 Сейчас в теме
(37) Механизм файловых групп позволяет разделить одну базу данных, на несколько физических файлов данных. Это позволяет разнести одну БД на отдельные дисковые массивы, что поможет решить проблему свободного места и/или производительности. Но, если мне не изменяет память, то при реструктуризации 1С создает копию таблицы, вносит в нее изменения, переносит данные, а затем, удаляет исходную. Создание происходит в дефолтной файловой группе. Таким образом, если я не ошибаюсь, то разделение внутри базы 1С живет до первого обновления, затрагивающего структуру метаданных.
39. Ivon 673 31.10.13 11:28 Сейчас в теме
(38) Silenser.
Я понял. Вопрос был как раз в том, чтобы хранить картинки именно в отдельной базе. Кроме того, хранение в 1С-овской базе занимает, похоже, столько же места, сколько и в отдельной базе MSSQL с использованием Base64Строка, как описано в этой строке, поэтому именно этот механизм в моей конфе не используется, а используется вот этот http://infostart.ru/public/77329/
demart-omsk; FaKer1980; +2 Ответить
40. Ivon 673 20.09.16 12:38 Сейчас в теме
Можно немного подправить код на SQL и саму обработку, следующим образом: создать на SQL хранимую процедуру, которая будет принимать Base64 и перекодировать его обратно в binary и ложить в базу уже двоичные данные, а так же вьюшку, которая будет делать обратное преобразование. Кстати, вьюшку можно прицепить, как внешний источник данных и впоследствии данные выбирать простым запросом 1С. В коде в 1С соответственно поменять вызов Insert на вызов хранимой процедуры, а вместо select использовать либо вьюшку в запросе либо вьюшку, как связанный источник данных.
Оставьте свое сообщение