Средства работы с двоичными данными
Пример: анализ файлов в формате JPEG
Вы можете скачать приложенную обработку прямо сейчас
Постановка задачи
Необходимо просканировать каталог с файлами, выбрать файлы с расширением «.jpg» или «.jpeg» и для каждого такого файла собрать информацию об изображении. Если при анализе выяснится, что файл не соответствует формату JPEG, то такой файл следует пропустить.
Информация, которая нас интересует:
Краткое описание формата JPEG
Кратко опишем некоторые детали формата, существенные для решения нашей задачи. За более подробным описанием формата JPEG можно обратиться к соответствующим источникам:
Решение
Создадим функцию, которая будет сканировать файл, определять его формат и выделять нужную нам информацию.
Важно, что для корректного разбора маркеры необходимо читать последовательно, один за другим, т.к. байты, совпадающие с маркером могут быть в содержимом фрагментов.
И, наконец, соберем всё вместе и напишем функцию, которая будет анализировать все файлы в заданной папке и выдавать полученную информацию в виде таблицы.
Пример: Работа с составными (multipart) HTTP-сообщениями
Вы можете скачать приложенную конфигурацию прямо сейчас
Постановка задачи
В данном примере мы создадим HTTP-сервис, который будет в ответ на запрос от клиента выдавать текстовое сообщение с вложенными картинками. Затем на клиенте мы отобразим полученный ответ.
Ответ от сервиса будет иметь следующий вид:
В любых составных сообщениях в заголовке Content-Type обязательно должен присутствовать атрибут boundary, определяющий строку, которая отделяет друг от друга вложенные сообщения внутри составного сообщения.
В случае стандарта «multipart/form-data», каждое вложенное сообщение в свою очередь должно содержать заголовок Content-Disposition со значением «form-data» и атрибутом «name», который позволяет идентифицировать сообщения.
Создание cервиса для формирования составного сообщения
Добавим новый HTTP-сервис и назовем его «TestMultipart». Для простоты будем считать, что наш сервис будет возвращать заданное составное сообщение в ответ на любой GET-запрос. Поэтому добавляем Шаблон URL с именем «ДляВсех» и значением «/*». Т.е. данный шаблон соответствует любому запросу. Далее добавляем в шаблон HTTP-метод GET с именем «Get».
В качестве обработчика для метода создаем в модуле сервиса функцию ДляВсех_Get :
У нас есть функция, формирующая составное сообщение и теперь нам осталось только определить две вспомогательные функции для создания вложенных сообщения:
Разбор составного сообщения на стороне клиента
Теперь посмотрим, как мы можем работать с составными сообщениями на стороне клиента. Нам необходимо распаковать вложенные сообщения и показать их содержимое.
Создаем новую общую форму. На форму добавляем реквизиты типа Строка:
Далее добавляем элементы управления:
Также создаем новую команду формы с именем ОтправитьЗапрос и привязываем команду к кнопке.
Создаем обработчик команды:
Вся работа по запросу сервиса и отображению результата выполняется в серверной функции ВыполнитьЗапрос :
Осталось определить вспомогательные функции:
Разбор частых ошибок при работе с 1С
Методы решения самых популярных технических ошибок (внутренние ошибки информационной базы), возникающих при работе с различными конфигурациями 1С:Предприятие 8.
В данной статье разберем частые ошибки, которые могут возникать при работе с программами 1С (файловый вариант) и дадим рекомендации по их исправлению.
Сначала сделайте копию
Перед исправлением ошибок настоятельно рекомендуется сделать архивную копию базы. Копию можно сделать разными способами:
Причин возникновения ошибок с информационной базой может быть очень много. Главное при их возникновении внимательно читать текст ошибки, зачастую в нем уже содержится информация по ее исправлению.
База не открывается
Очистка временных файлов. Самый простой способ — это удалить информационную базу из списка и добавить её снова. Нужно выделить проблемную базу, запомнить (записать, скопировать) её путь и нажать удалить. База пропадет из списка.
После окончания тестирования окно закрыть и проверить базу на работоспособность.
Ошибка СУБД. Внутренняя ошибка компоненты dbeng
Ошибка формата потока
Данная ошибка возникает чаще всего из-за неправильного или аварийного завершения работы программы 1С. Например отключение электричества или выключение компьютера при открытой программе.
Неверный формат хранилища данных
Для устранения ошибки необходимо очистить файлы, находящиеся в папке с базой. Очистка должна решить проблему.
Ошибка СУБД. Файл базы данных подтвержден
Самый простой способ избавится от этой ошибки – это восстановить архивную копию базы. Способ эффективен, если копия не старая или не жалко потерять занесенные данные с момента создания копии по дату восстановления. После загрузки копии ошибка скорее всего пропадет, но и данные с момента её создания не вернуть.
Также может помочь:
Обнаружено нарушение целостности системы
Ошибка связана с обнаружением на компьютере пользователя нелицензионного эмулятора ключа защиты или его следов. Вариант исправления – это удалить данный эмулятор и получить лицензию официально. Порой следы эмулятора сложно найти самостоятельно. Если же нелицензионную программу удалось удалить, программа скорее всего не откроется, а запросит ключ защиты. При ошибке обнаружено нарушение целостности системы рекомендуется обратится в службу техподдержки 1С.
Отсутствует файл базы данных
Если программа работает по сети, в первую очередь необходимо проверить работоспособность локальной сети. Возможно есть неполадки и ваш компьютер не видит папку на другом компьютере в котором расположена база.
Если база установлена локально на ваш компьютер, необходимо убедится, что файл базы 1Cv8.1CD действительно расположен по указанному пути. Если нет, то необходимо поменять путь к базе.
Недостаточно памяти
Необходимо постоянно следить за актуальностью платформы и релиза. Некоторые возникающие ошибки можно решить простым обновлением. И не забывайте почаще делать копию базы.
Проведение реклассификации расходов (изменение аналитики отражения), регистрация и распределение расходов будущих периодов в 1С:Управление торговлей 11.
Инструкция по настройке распределенной информационной базы в 1С на примере Управление торговлей 11. Нюансы работы, наиболее частые ошибки и пути их решения.
Описание особенностей разных режимов работы 1С:Предприятие 8. Отличия тонкого, толстого и веб-клиента. Рекомендации по выбору для пользователей.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Доступ к файловой системе из кода конфигурации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При обращении из кода конфигурации к файлам и каталогам файловой системы следует иметь в виду, что доступ к ним ограничен правами пользователя операционной системы, от имени которого запущено приложение.
1.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.
1.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:
* Рабочие процессы могут быть также запущены от имени другого пользователя, отличного от того, под которым запускается агент сервера. Подробнее см. руководство администратора клиент-серверного варианта, описание служебного файла swpuser.ini
Область применения (уточнение): управляемое приложение, обычное приложение.
3. Даже если не планируется локализация конфигурации на другие языки, следует обеспечивать переносимость файлов, сформированных из кода конфигурации, между различными операционными системами с различными кодировками. Для этого необходимо:
3.1. В именах файлов, автоматически формируемых из кода конфигурации, указывать только английские буквы, а также цифры, а в качестве кодировки текстовых файлов использовать только UTF-8 (именно этот формат предпочтителен, т.к. только с ним корректно работает операционная система macOS).
Это ограничение распространяется на файлы сообщений обмена, выгрузки данных, электронных документов и пр., которые автоматические формируются системой, в том числе на файлы, упакованные в архивы (например, zip). Исключение составляют случаи, когда на формат файлов невозможно повлиять, например, это формат сторонней системы.
3.2. В тех случаях, когда имя файла не генерируется системой, а его явно вводит пользователь, разрешить ввод русскоязычных имен, но при этом дать возможность транслитерировать его в англоязычное имя. По умолчанию, если это технически возможно и не снижает удобство работы, рекомендуется предлагать англоязычное имя файла, а для текстовых файлов – сохранение в кодировке UTF-8.
Также эти рекомендации по выбору имени и кодировки файла следует разместить в справке к тем местам программы, где пользователь имеет возможность сохранять файлы и выбирать кодировку.
Работа с временными файлами и каталогами
При необходимости использования временных файлов и каталогов необходимо соблюдать следующие требования:
1. Для получения имени временного файла следует использовать метод ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). В противном случае возможна некорректная работа конфигурации в многопользовательском режиме, с включенными профилями безопасностями, возникновение проблем с правами доступа к файлам операционной системы, а также неконтролируемое увеличение количества ненужных временных файлов, которые не будут своевременно удалены.
ИмяПромежуточногоФайла = «C:\Временные файлы 1С\TempFile.xml»;
Данные.Записать(ИмяПромежуточногоФайла);
У текущего пользователя может не быть прав на запись в указанный каталог. Кроме того, при одновременном выполнении этого кода из двух разных сеансов возникнет ошибка.
При использовании этой функции будет получено уникальное имя, гарантирован доступ к файлу.
Кроме того, при использовании метода ПолучитьИмяВременногоФайла платформа 1С:Предприятие сохраняет контроль над такими файлами и автоматически удаляет их при перезапуске рабочего процесса (если файл был создан на стороне сервера) или клиентского приложения (если файл был создан на стороне клиента).
Если же имя временного файла было сформировано каким-то другим способом, и прикладной код не удалил (либо по какой-то причине не смог удалить) ранее созданный временный файл, то платформа такой файл не контролирует, и он остается в файловой системе на неопределенное время. Накапливание «потерянных» временных файлов может представлять серьезную проблему, особенно для информационных баз с большим количеством активно работающих пользователей (например, при работе в режиме сервиса).
Таким образом, неправильно :
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + «.xml»;
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
Если по каким-то причинам прикладной код не удалит созданный файл (например, между блоками создания и удаления временного файла возникнет штатное или нештатное исключение), этот файл так и останется в каталоге временных файлов.
При использовании метода ПолучитьИмяВременногоФайла будет получено уникальное имя, гарантирован доступ к файлу, а также временный файл будет автоматически удален платформой 1С:Предприятие после завершения рабочего процесса сервера или клиентского приложения.
2. Для создания временного каталога рекомендуется также использовать имя, полученное при помощи метода ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). Это гарантирует уникальность имени создаваемого каталога при работе в многопользовательском режиме и гарантирует, что после перезапуска рабочего процесса или клиентского приложения временный каталог будет автоматически удален платформой 1С:Предприятие. После этого, внутри созданного каталога можно создавать другие каталоги и файлы без ограничений.
Каталог = КаталогВременныхФайлов();
ИмяФайла = «TempDataFile.xml»;
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + «.xml»;
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
4. После окончания работы с временным файлом или каталогом, его необходимо удалить самостоятельно. Нельзя рассчитывать на автоматическое удаление файлов и каталогов при следующем запуске платформы, это может привести к исчерпанию свободного места в каталоге временных файлов.
5.1. В редких случаях может возникнуть необходимость передачи данных во временных файлах между сеансами, например, при подготовке данных для фонового задания, при организации длительного процесса, обслуживающего несколько последовательных вызовов web-сервиса. Необходимо самостоятельно обеспечивать гарантировано общее место хранения, права для доступа к файлам из разных мест их обработки, удаление файлов по истечению сроков их обработки или аварийного завершения процесса обработки. Рекомендуется использовать следующий подход:
Передача файлов между клиентом и сервером
Чтение = Новый ЧтениеТекста(ИмяФайла);
.
Результат = Чтение.Прочитать();
Возврат Результат;
ИмяФайлаДляОбработки = «C:\Файлы для обработки\Загрузка.xml»;
ОписаниеОповещения = Новый ОписаниеОповещения(
«ОбработатьФайлЗавершение», ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла(«txt»);
Данные.Записать(ИмяПромежуточногоФайла);
Чтение = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
.
Результат = Чтение.Прочитать();
.
.
// Первый серверный вызов
ИмяФайлаДляОбработки = «C:\Файлы для обработки\Загрузка.xml»;
ОписаниеОповещения = Новый ОписаниеОповещения(
«ОбработатьФайлЗавершение», ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
.
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
.
.
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.
// Третий серверный вызов с новой версией файла
ОписаниеОповещения = Новый ОписаниеОповещения(
«ПродолжитьОбработкуФайлаЗавершение», ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
.
// Первый серверный вызов
ИмяФайлаДляОбработки = «C:\Файлы для обработки\Загрузка.xml»;
ОписаниеОповещения = Новый ОписаниеОповещения(
«ОбработатьФайлЗавершение», ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
.
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
.
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
.
.
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.
// Третий серверный вызов с новой версией файла
УдалитьИзВременногоХранилища(Адрес);
ОписаниеОповещения = Новый ОписаниеОповещения(
«ПродолжитьОбработкуФайлаЗавершение», ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузки.Интерактивно = Ложь;
ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения,
ПараметрыЗагрузки, ИмяФайлаДляОбработки);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(ПомещенныйФайл, ДополнительныеПараметры)
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
В этой статье приведен пример практического применения Base64, использования ADODB да и просто полезных штук.
Пример и разработка велись на платформе 1С:Предприятие 8.3 (8.3.4.365)
Сервер 1С крутится на MS Windows 2012
Внешняя база на MSSQL 2012 Standart
Подразумевается, что вы знаете:
— что такое 1С и ADODB
— что такое MSSQL и умеете с ним работать/админить (или сможете, если захотите)
— что такое Сериализация
Интро:
В нашей организации ведется собственная разработка на базе 1С Предприятие 83 (было сначала 82, потом перешли на 83. на месте не стоим. )
Это CRM система для работы с обращениями пользователей продуктов нашей компании.
Таки компания растет, развивается и всё такое и безусловно все пользователи как любые пользователи «косячат» или чего-то не понимают и естественно что сам продукт не без изъянов (каимся), и приходится им обращатся в техподдержку различными способами.
Ну так вот, речь пойдет как раз об этих вложениях.
Ну классно, давай, получилось всякого хлама гигов на 10. Написали обработку и запустили. и Всё.
Смотрю я на наши папочки и они медленно исчезают. Все без разбору. Холодный пот побежал по моей спине.
Фу. Осматриваем пепелище. из 4 лет архивов уцелел только последний.
Всё, надо с этим что-то дешлать! Тем более мысли уже были, но как всегда не было времени.. или лень.
Вот несколько вариантов как можно хранить эти самые доп.файлы для нашей базы. Эти варианты первые пришли на ум, у каждого свои плюсы и минусы. По мне самым выигрышным показался вариант с внейшней базой данных.
Варианты решения:
SMB (файловый вариант) | Внешняя БД(Наш вариант) | |||
+ | — быстро — просто | — возможно быстро — чуть более безопаснее — возможно надежнее (смотря как организовано хранилище) | — надежно — безопасно — доступ рулится самой 1С — проще | — безопасно (доступ на уровне SQL) — надежно (можно делать быстрый бэкап всех вложений, или быстро перенести на другой сервер) |
— | — не безопасно — не надежно (опять же это может быть сетевое хранилище) | — чуть по сложнее | -«раздувает» базу, как следствие база начинает работать (для файлового варианта, для серверного возможно нет разницы) | — сложно |
Потери восстановили с помощью обычных утилилит восстановления удаленных файлов, но не всё.
Решение:
И так, выбираем хранить файлы в MSSQL.
Во вложении к этой статье помещена специальная мини конфа с полезным и я надеюсь понятным кодом внутри, которую можно скачать и расковырять как вам нужно.
Структура в 1С :
Документ «Письмо»
РегистрСведений «Вложения»
Методом проб и ошибок пришел к определенной схеме таблицы в которой буду хранить данные на MSSQL сервере
Почему тип = uniqueidentifier. Сначала был типа char(36), в целом так и есть, Уникальный Идентификатор полученый методом Новый УникальныйИдентификатор(), при приведении к строке имеет длину 36 символов. Но, мы будем пользовать специальный тип и приводить к нему передаваемые значения наших UIDов, потому что мы будем индексировать нашу таблицу по этип двум полям. Но можно не индексировать, смотря какое количество записей планируется хранить. У нас это >2 000 000 записей, поэтому нам это даже нужно.
Для быстрого создания, выполняем такой скрипт в консольке нашего MS SQL сервера
И так, новая задача. Как передавать двоичные данные в MSSQL да еще и через COM объект?
Ладно, запросы мы умеем выполнять, и даже что-то инсертить. Круто, но нам надо инсертить Двоичные Данные а не Число или Строку.
В общем становится понятно, что надо передавать что-то сериализууемое. как раз это и будет Base64 строка, полученная методом Base64Строка(Значение). Только осталось найти способ, как в MSSQL запросе всё это переварить и заинсертить то что нужно и потом еще и получить.
Не скрою, сначала я долго и упорно гуглил, вообще сразу попадаются варианты кода и даже рабочие, например такой (очень популярный):
Но, после некоторых тестов, я столкнулся с неведомой проблемой. Наблюдалось невозможность чтения помещенных ранее данных, скрипт отваливался с таймаутом. В консоле сервера были такие же проблемы, и я заподозрил что проблемы именно в самом скрипте, а не сервере или данных как я подумал сразу. Пришлось курить мануалы, помогло вот это:
Вся загвостка оказалась именно в функциях XQuery подзапроса, функция могла работать только со скалярными переменными, и по каким-то неведомым причинам оно воспринимало что в запросе может быть больше 1 значения. Но это только мои догадки.
Для чтения данных пришлось модернизировать функцию, и теперь она 100% рабочая всегда.
Для insert’а данных всё оказалось немного проще.
Пример SQL запроса для помещения данных в БД
Рабочий запрос. Если данные не найдены, возвращается 0, это нужно так же обрабатывать.
Итого. Имея эти штуки в руках, можем применить их в деле.
В этот реквизит мы помещаем полезный HTML код, которые в зависимости от типа вложения отобразит либо PDF либо Изображение.
Выглядит примерно так:
* Обращаю внимание, что здесь тэги с лишними пробелами, для красивого отображения, иначе всё «едет»
Вот и всё, остальное можно увидеть внутри мини конфигурации, лепил специально для статьи.
Если решите использовать этот же вариант хранения файлов, то вам придется написать свою обработку для переноса вложений в базу. У меня есть свои обработки, но к сожалению они заточены под нашу конфигурацию. Да и так бы было совсем не интересно.
Прошу критику и предложения в комменты или личку.
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
Объем присоединенных файлов достиг 75% от объема БД. Резервное копирования и разворачивание БД для разработчиков стало занимать много времени. Принято решение перенести все присоединенные файлы в тома.
Обработка написана на основе типовой обработки «Перенос файлов в тома» конфигурации УТ 11.1.10.94.
Типовая обработка переносит файлы по справочнику «Версии файлов» из регистра сведений «Хранимые файлы версий», а предлагаемая по всем справочникам присоединенных файлов из регистра сведений «Присоединенные файлы». В обработке формируется текст запроса по метаданным, содержащим «Присоединенные файлы» в наименовании и типом хранения в информационной базе. По всем присоединенным файлам двоичные данные регистра сведений «Присоединенные файлы» переносятся в том.
Версия платформы 8.3.5.1486. Сервер 1С x3 2 Linux Debian.
Для настройки хранения
С оздать общий ресурс на файловом сервере. Например \\ FILESERVER\SHARE\
Создать в 1С том для хранения файлов.
Для сервера 1С под управлением Windows указать путь к общему ресурсу для хранения файлов. Для сервера под управлением Linux можно указать только локальный путь. Для этого нужно создать каталог на сервере 1С, в который будет монтироваться общий ресурс.
mkdir / mnt/files/ .
И п римонтировать к созданному каталогу общий ресурс:
Указать для тома локальный путь / mnt/files/. Теперь все файлы будут хран и т ь ся в томе на общем ресурсе
В обработке формируется текст запроса по метаданным, содержащим «ПрисоединенныеФайлы» в наименовании и типом хранения в информационной базе. По всем присоединенным файлам двоичные данные регистра сведений «Присоединенные файлы» переносятся в том.
Обработка запускалась на конфигурации УТ 11.1.10.94.
После выполнения обработки нужно выполнить shrink на MS SQL или vacuum на Postgresql. На файловой версии БД выполнить тестирование и исправление с включенным сжатием таблиц.
Обновление от 20.12.2019
Добавлена версия обработки для конфигурации УТ 11.4 где был переименован общий модуль «ФайловыеФункцииСлужебный» в «РаботаСФайламиСлужебный». И регистр для хранения присоединенных файлов «ПрисоединенныеФайлы» в «ДвоичныеДанныеФайлов».