Двоичныеданныефайлов что за регистр
Ошибка при обновлении: Записи регистра сведений стали неуникальными: Двоичные данные файлов
Бухгалтерия предприятия КОРП с версии 3.0.75.58 на версию 3.0.75.93 и выше
РЕШЕНИЕ:
1С Линия консультации 25 февраля 2020, 17:04
Кроме того, нет возможности пометить на удаление или удалить такие записи непосредственно из регистра
Для прояснения ситуации направила разработчику запрос:
Что программа понимает как дубли? Если сочетание Тип владельца + Наименование, показанное в поле Владелец данных, то почему позволяется записывать такие данные?
(ответа пока не получила)
Специальные предложения
В случае регистров сведений:
Система обеспечивает контроль уникальности записей, хранящихся в регистре сведений. Таким образом, в регистре сведений не может находиться двух одинаковых записей. Одинаковыми считаются записи, у которых совпадает ключ записи. Ключ записи формируется системой автоматически, на основании значений, содержащихся в полях записи, и зависит от вида регистра сведений.
В общем случае в формировании ключа записи будут участвовать значения регистратора, периода и значения измерений. Таким образом, например, в непериодическом регистре сведений Цены товаров с независимым режимом записи не может существовать двух записей о розничной цене конфет ассорти. Точно так же, как в периодическом регистре сведений Цены товаров, подчиненном регистратору, не может существовать двух записей о розничной цене конфет ассорти, внесенных одной и той же датой, одним и тем же документом Изменение цен товаров.
Регистр сведений двоичные данные файлов
Важное замечание в начале. Основной режим работы 1С в этой статье предполагается 1С 8.3.7 в режиме тонкого клиента без модальных вызовов — самый современный на настоящий момент, на который вскоре должны быть переведены все конфигурации. Также постараюсь описать особенности работы в Веб-Клиенте.
Что такое двоичные данные и как с ними можно работать в 1С 8
Двоичные данные (или бинарные) — это файл данных произвольного формата.
Платформа 1С (8.3 и 8.2) в общем случае понятия не имеет, что это. Предполагается, что программист или пользователь знает, какие именно это данные и как их применять. Тем не менее, если в двоичные данные загружен графический файл, формат которого понимает объект типа «Картинка», то при инициализации картинки такими двоичными данными картинка будет нормально показана, а её свойство «Формат» примет правильное значение.
Платформа 1С при работе с двоичными данными может:
Возможно, я еще что-то упустил, однако интуитивно ясно, что практически все, что надо для работы с двоичными данными в 1С, у нас есть. Рассмотрим теперь по порядку несколько конкретных примеров работы с двоичными данными на платформе 1С 8.3.
Чтение и запись двоичных данных в файл
Основной тип объектов двоичных данных платформы 1С так и называется: «ДвоичныеДанные». Вот что говорит о нем «Синтаксис-помощник»:
Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы.
Чтение двоичных данных из файла
Тип «Двоичные данные» имеет единственный конструктор:
имяФайла — обязательный аргумент.
В итоге получаем программный объект двоичных данных, прочитанный из файла.
Запись двоичных данных в файл
Определение размера двоичных данных в байтах
Сохранение двоичных данных в реквизит объекта
Рассмотрим сразу запись двоичных данных из файла на клиенте в реквизит объекта базы данных типа ХранилищеЗначения. Причем напишем такой код, который сработает и на веб-клиенте, а также будет лишен модальных вызовов, то есть таких вызовов, которые ожидают действия пользователя и останавливают при этом исполнение программы. Теперь платформа 1С 8.3 требует разрабатывать асинхронные программы.
Выглядит это примерно так: создается обработчик оповещения о выполнении некоторой длительной процедуры, затем запускается процедура «НачатьХХХ()», в которую, кроме понятных аргументов, передается еще и описание обработчика ее завершения. Наша программа спокойно работает далее, а по завершении запущенной процедуры вызывается наш обработчик завершения.
Предположим, у нас на форме есть реквизит типа «СправочникСсылка.Картинки». Справочник «Картинки» имеет реквизит «ДанныеКартинки» типа ХранилищеЗначения.
Создадим команду формы «ЗагрузитьКартинкуИзФайла».
Создадим обработчик команды, выделив команду в списке команд формы и нажав на кнопку с увеличительным стеклом в поле «Действие» панели свойств:
Поскольку все необходимые параметры для записи картинки мы можем передать изнутри клиентской части обработчика, нам нет нужды создавать контекстную серверную процедуру на сервере. Выберем «Создать на клиенте и процедуру на сервере без контекста»:
Вначале напишем наши обработчики команды в старом, «модальном» или «синхронном» стиле:
Получите 267 видеоуроков по 1С бесплатно:
В моей небольшой тестовой конфигурации этот код отлично сработал в режиме тонкого клиента. Теперь преобразуем модальный вызов «ПоместитьФайл» в асинхронный, он же немодальный. В меню конфигуратора запустим команду меню «Текст >Рефакторинг >Нерекомендуемые синхронные вызовы >Преобразовать вызовы модуля». Нам в ответ сообщат, что «Не рекомендуемых синхронных вызовов преобразовано: 1».
Для компактности я удалил все пустые строки, и вот что получилось вместо клиентской части нашего обработчика:
Готово! Мы кошерно асинхронно записали картинку из файла на клиенте в реквизит объекта базы данных, в нашем случае — элемента справочника.
Чтение двоичных данных из объекта БД
Для чего нам надо читать двоичные данные из объекта БД? Наверное, три самых частых случая таковы:
Пример 1. Вставить картинки в макет (табличный документ).
Допустим, у нас есть база данных со справочником «Картинки», у элементов которых есть реквизит «Картинка» типа ХранилищеЗначения, содержащий данные картинки.
Создадим новую внешнюю обработку, ее основную форму.
На форме создадим 3 реквизита «СпрКартинка1», «СпрКартинка2», «СпрКартинка3» типа «СправочникСсылка.Картинки» и реквизит «ТабДок» типа «ТабличныйДокумент». Перетащим мышкой эти реквизиты в список элементов формы, чтобы на ней образовались соответствующие поля.
Добавим команду формы «НапихатьКартинок» и создадим ее обработчик. На сей раз выберем «Создать на Клиенте и процедуру на сервере», чтобы не передавать много параметров в процедуру без контекста. Напишем такие обработчики:
И получим примерно такой результат:
Пример 2. Показать картинку из базы данных на форме.
Для демонстрации воспользуемся первой обработкой, где мы записывали файл в БД. Теперь покажем на форме картинку, которая записана в реквизите «Картинка» выбранного на форме элемента справочника «Картинки».
Во-первых, добавим на форму поле, связанное с реквизитом «АдресДанныхКартинки». Например, перетащим мышкой этот реквизит в список элементов формы. Выберем и установим значение свойства «Вид» этого поля в «Поле картинки».
Во-вторых, напишем такую серверную процедуру:
И станем вызывать эту процедуру, например, из обработчика события «При изменении» поля «Картинка»:
Сохранение двоичных данных в файл на клиенте
Думаю, с сохранением двоичных данных из базы данных в файл у Вас проблем не возникнет. По крайней мере, если Вы работаете не в веб-клиенте. Читаем, помещаем во временное хранилище на сервере, затем записываем в файл на клиенте.
Кодирование двоичных данных в формат Base64 и обратно
Тут все очень просто. Платформа имеет две глобальные функции, доступные везде:
Первая получает в качестве аргумента объект типа «ДвоичныеДанные», а возвращает его текстовое представление в кодировке base64, а вторая, наоборот, из текста в формате base64 возвращает объект типа «ДвоичныеДанные».
Не очень, правда, представляю, зачем нам это может понадобиться. Во всех встроенных типах объектов вроде ПочтовоеВложение или объектов для работы с XML необходимые преобразования платформа делает сама. Разве что нам потребуется работать с какими-то нестандартными форматами файлов для обмена с внешними системами…
Итого
На самых простых примерах мы увидели все основные принципы и методы работы с двоичными данными в 1С 8.3. Также коснулись актуальной сейчас темы устранения синхронных вызовов. Остальные возможности работы с двоичными данными Вы без труда реализуете по аналогии с рассмотренными здесь.
Спасибо за внимание. Желаю всем вершин профессионализма и глубин познаний. А главное — чтобы это приносило счастье в жизнь Вашу и окружающих.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Пример: анализ файлов в формате JPEG
Вы можете скачать приложенную обработку прямо сейчас
Постановка задачи
Необходимо просканировать каталог с файлами, выбрать файлы с расширением «.jpg» или «.jpeg» и для каждого такого файла собрать информацию об изображении. Если при анализе выяснится, что файл не соответствует формату JPEG, то такой файл следует пропустить.
Информация, которая нас интересует:
Краткое описание формата JPEG
Кратко опишем некоторые детали формата, существенные для решения нашей задачи. За более подробным описанием формата JPEG можно обратиться к соответствующим источникам:
Решение
Создадим функцию, которая будет сканировать файл, определять его формат и выделять нужную нам информацию.
Важно, что для корректного разбора маркеры необходимо читать последовательно, один за другим, т.к. байты, совпадающие с маркером могут быть в содержимом фрагментов.
Копировать в буфер обмена
И, наконец, соберем всё вместе и напишем функцию, которая будет анализировать все файлы в заданной папке и выдавать полученную информацию в виде таблицы.
Пример: Работа с составными (multipart) HTTP-сообщениями
Вы можете скачать приложенную конфигурацию прямо сейчас
Постановка задачи
В данном примере мы создадим HTTP-сервис, который будет в ответ на запрос от клиента выдавать текстовое сообщение с вложенными картинками. Затем на клиенте мы отобразим полученный ответ.
Ответ от сервиса будет иметь следующий вид:
В этом сообщении надо обратить внимание на тип содержимого (заголовок Content-Type) – «multipart/form-data». Первое слово «multipart» указывает на то, что HTTP-сообщение является составным, т.е. содержит внутри себя несколько вложенных сообщений. Второе слово – «form-data» – указывает на конкретный стандарт составных сообщений, который часто используется для кодирования почтовых сообщений.
В любых составных сообщениях в заголовке Content-Type обязательно должен присутствовать атрибут boundary, определяющий строку, которая отделяет друг от друга вложенные сообщения внутри составного сообщения.
В случае стандарта «multipart/form-data», каждое вложенное сообщение в свою очередь должно содержать заголовок Content-Disposition со значением «form-data» и атрибутом «name», который позволяет идентифицировать сообщения.
Создание cервиса для формирования составного сообщения
Добавим новый HTTP-сервис и назовем его «TestMultipart». Для простоты будем считать, что наш сервис будет возвращать заданное составное сообщение в ответ на любой GET-запрос. Поэтому добавляем Шаблон URL с именем «ДляВсех» и значением «/*». Т.е. данный шаблон соответствует любому запросу. Далее добавляем в шаблон HTTP-метод GET с именем «Get».
В качестве обработчика для метода создаем в модуле сервиса функцию ДляВсех_Get :
У нас есть функция, формирующая составное сообщение и теперь нам осталось только определить две вспомогательные функции для создания вложенных сообщения:
Копировать в буфер обмена
Разбор составного сообщения на стороне клиента
Теперь посмотрим, как мы можем работать с составными сообщениями на стороне клиента. Нам необходимо распаковать вложенные сообщения и показать их содержимое.
Создаем новую общую форму. На форму добавляем реквизиты типа Строка:
Далее добавляем элементы управления:
Также создаем новую команду формы с именем ОтправитьЗапрос и привязываем команду к кнопке.
Создаем обработчик команды:
Вся работа по запросу сервиса и отображению результата выполняется в серверной функции ВыполнитьЗапрос :
Функция ПрочитатьСообщение содержит самое интересное – разбор полученного от сервиса составного сообщения с использованием новых средств работы с двоичными данными:
Осталось определить вспомогательные функции:
Копировать в буфер обмена
Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).
Объект сериализуется
Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.
Задачи, для решения которых можно использовать двоичные данные:
Работа с двоичными данными:
Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.
Примеры по работе с двоичными данными
Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).
Заполнение:
Получение (фрагмент кода, выполняемый на сервере):
Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.
Функция, скачивающая картинку из интернета:
Использование функции:
Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».
По событию ПриСозданииНаСервере
Готово, на форме у нас картинка.
Двоичные данные и потоки
Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).
Последовательность действий при работе с двоичными данными без использования потоков:
Последовательность действий при работе с потоками:
Пример кода без использования потоков:
Пример кода по работе с потоком:
Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.
Работа с Base64
Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.
Платформа 1С также позволяет кодировать двоичные данные, не прибегая к сериализации. Для этого есть две функции:
Они преобразуются в Base64 и обратно в двоичные данные.
Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.
Работа с файлами в расширении
Подсистема работа с файлами БСП.
Расширение стандартной подсистемы работы с файлами, версия 1.0
Для использования подсистемы Работа с файлами и подсистемы Присоединенные файлы в расширении прикладных решений, созданных на базе БСП 3.1 (платформа 1С 8.3.15 и выше) я написал расширение :
Расширение нужно подключать в обычном безопасном режиме. При применении расширения в безопасном режиме будут расширяться только клиентские методы и серверные обработчики форм, которые установлены через панель свойств. К остальным серверным методам (в т. ч. и к аннотированным серверным методам модулей) расширение применяться не будет.
Для каждого объекта – владельца нужно создавать в расширении справочник с именем
ПрисоединенныеФайлы,
где – имя объекта метаданных, для которого настраиваются присоединенные файлы. Для этого в качестве заготовки можно скопировать Согл_ЗаявкаНаОплатуПрисоединенныеФайлы. У реквизита ВладелецФайла нужно установить тип владельца файла. Например, ДокументСсылка. Согл_ЗаявкаНаОплату
В форме демонстрационного документа Согл_ЗаявкаНаОплату я добавил гиперссылку вложения для показа наименовании всех присоединенных файлов, а а также добавил общую команду Присоединенные файлы в панель навигации формы Перейти
При нажатие по гиперссылку или по общей команде открывается типовая форма списка присоединенных файлов для добавленя, просмотра и редактирования
Присоединенные файлы расширяемой конфигурации хранятся в информационной базе в виде двоичных данных в регистре сведений ДвоичныеДанныеФайла. Но этот регистр имеет одно измерение типа Определяемые типы :
В этом регистре невозможно хранить присоединенные файлы, созданные в расширении потому, что невозможно добавлять в расширении объекты типа Определяемые типы. Поэтому я создал копию регистра сведений ДвоичныеДанныеФайла и переименовал с префиксом расширения, а в свойстве тип измерения файл я указал составной тип объектов присоединённых файлов.
Также в общем модуле расширения я создал следующие функции :
В теле функции МассивТиповПрисоединенныхФайлов нужно включать все справочники типа ПрисоединенныеФайлы, созданные в расширении, а в теле функции МассивТиповВладельцевПрисоединенныхФайлов нужно включать владельцы этих файлов.
На функцию ЭтоПрисоединенныйФайлВРасширении передается ссылка на справочник типа ПрисоединенныеФайлы и она возвращает значение Истина если передаваемая ссылка создан в расширении.
Я переписал программные коды общих модулей подсистемы в расширении таким образом, чтобы операции записи и чтения двоичных данных файла выполнялись по новому регистру, когда владелец являлся объектом, добавленным в расширении. Во всех случаях я использовал метод замены (аннотация Вместо), например:
Шаблон расширения с инструкциями по внедрению в прикладных расширениях стоит 8 000 р. Для его приобретения обращайтеcь ко master1c8x@mail.ru
Новая версия 1.1 расширения подсистемы работы с файлами
Процедура “Перенос файлов” в разделе администрирование/настройки работы с файлами в первой версии шаблона не переносила файлы владельца, созданного в расширении.
В новой версии шаблона расширения доработан модуль формы обработки Перенос файла в расширении, чтобы переносились также файлы владельца, созданного в расширении
Можно также установить отбор по владельцу при переносе:
Шаблон расширения с инструкциями по внедрению в прикладных расширениях стоит 8 000 р. Для его приобретения обращайтеcь ко master1c8x@mail.ru
Полный список дополнительных отчетов и обработок можно посмотреть здесь
Подключение нового объекта конфигурации к подсистеме по работе с файлами
В данной заметке я хочу рассказать как организовать работу с прикрепленными файлами для нового объекта в конфигурациях 1С, которые содержат библиотеку стандартных подсистем (БСП).
Задача. Создать новый документ и для этого документа добавить возможность прикреплять файлы.
Решение данной задачи будем осуществлять на конфигурации «1С: Управление торговлей 11.2», но все действия можно применять и к другим конфигурациям, содержащим БСП (ЗУП 3, БУ 3, ERP 2 и т.д.).
1. Чтобы добавить новый документ необходимо включить возможность редактирования нашей конфигурации.
2. Добавим новый документ с произвольной структурой
3. Добавим копированием новый справочник «БСП_НовыйДокументПрисоединенныеФайлы» и в реквизите «ВладелецФайла» изменим тип на «ДокументСсылка.БСП_НовыйДокумент». Для копирования был выбран справочник «ЗаказКлиентаПрисоединенныеФайлы».
Также не забываем изменить описание и представление объекта.
4. Добавляем в определяемые типы «ВладелецПрисоединенныхФайлов», «ПрисоединенныйФайл», «ПрисоединенныйФайлОбъект» новые объекты.
5. Если необходимо добавить возможность копирования присоединенных файлов при копировании документа, то необходимо в параметры формы документа добавить параметр «ЗначениеКопирования» и сделать его ключевым.
В модуль формы добавить процедуру «ПриЗаписиНаСервере».
6. Для отображения в форме списка наличия прикрепленных файлов необходимо доработать форму списка.
Изменим текст запроса списка
В форму списка добавим колонку «ЕстьФайлы» и изменим настройки отображения.
Запускаем режим «1С:Предприятие» и с помощью обработки из набора внешних обработок библиотеки стандартных подсистем «ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf» обновляем наши новые данные.
Прикрепленный файл