- Объекты доступа документов
- Ошибки неуникальности записей в 1С
- Инструкция по свертке неуникальных записей:
- Права доступа в 1С:Предприятии 8
- Связанные права
- Алфавитный список прав доступа 1С:Предприятия
- Механизм сопоставления данных при обмене через универсальный формат
- Сопоставление объектов
- Настройка полей таблицы сопоставления
- Получение данных из другой программы
- Порядок сопоставления объектов
- Варианты идентификации объектов при получении
- Двоичные данные в 1С 8.3 (8.2)
- Что такое двоичные данные и как с ними можно работать в 1С 8
- Чтение и запись двоичных данных в файл
- Чтение двоичных данных из объекта БД
- Кодирование двоичных данных в формат Base64 и обратно
- Итого
Объекты доступа документов
При обновлении конфигурации периодически может возникать ошибка «Записи регистра сведений стали неуникальными» или «Имеются записи с одинаковыми измерениями«
Эта ошибка означает, что при обновлении изменился состав измерений регистра сведений.
Одним из базовых принципов работы регистра сведений является требование, что каждому набору значений измерений регистра сведений соответсвует один и только один набор значений реквизитов. Допустим, в нашей конфигурации есть регистр ответственных лиц по складам в разрезе складов и помещений.
В очередном релизе разработчик решает, что такая детализация ответственности избыточна и оставляет только возможность указания ответственного по складу.
Однако у пользователя в этом регисте указано, что для «Главного склада» за помещение «Продукты» отвечает Иванов, а за помещение «Холодильники» — Петров. При обновлении информационной базы платформа должна оставить только одну запись с ответственным. Но она не может решить за пользователя, кого поставить ответственным за «Главный склад» вцелом (Иванова или Петрова). Поэтому выдается сообщение об ошибке.
В зависимости от конкретной ситуации, сообщение может звучать как «Записи регистра сведений стали неуникальными» либо «Имеются записи с одинаковыми измерениями«.
Смысл сообщения одинаков.
Это сообщение означает, что в новой структуре регистров образовалось несколько записей с одним набором измерений и их нужно свернуть в одну.
Для решения проблемы удаляем одну из записей, чтобы 1С однозначно знала, что за «Главный склад» отвечает Иванов.
Ошибки неуникальности записей в 1С
В типовых конфигурациях в большинстве случаев эта проблема решается разработчиком программно. Т.е. обновление конфигурации само при необходимости сворачивает записи регистра.
Однако в некоторых случаях (например, если выполняется обновление с пропуском части релизов, или конфигурация доработана) данные могут не свернуться и их нужно свернуть самостоятельно. Для того, чтобы определить, что именно изменилось, выполняем режим «Конфигурация» — «Сравнить конфигурации».
И сравниваем основную конфигурацию с конфигурацией базы данных. При таком сравнении мы однозначно можем определить, какие именно поля удалены или изменились.
После этого консолью запросов находим неуникальные записи и удаляем их. Если записей немного, то удалить дубли можно и вручную. Если много, то проще это сделать программно. Предлагаю простую обработку, решающую данную задачу.
Инструкция по свертке неуникальных записей:
1. Открыть обработку. 2. Выбрать регистр сведений, в котором появились неуникальные записи. 3. Отметить измерения которые будут удалены при обновлении.
4. Нажать « дубли».
Обработка найдет дублирующиеся строки и свернет их в одну строку.
После этого обновление конфигурации пройдет корректно.
Также можно просто проверить наличие дублей без изменения данных
Read Full Article
Права доступа в 1С:Предприятии 8
В 1С:Предприятии различают два типа прав – основные и интерактивные.
Основные (неинтерактивные) – проверяются всегданезависимо от способа обращения к объектам информационной базы.
Интерактивные – проверяются при выполнении интерактивных операций (например, операция «Установить пометку удаления»).
Нужно учитывать, что проверку интерактивных прав можно обойти, создав, например, при конфигурировании форму самостоятельно и заменив стандартные команды своими, а проверку неинтерактивных прав нельзя обойти ни при каких обстоятельствах. Неинтерактивными правами защищается характерная для объекта фундаментальная функциональность, за это отвечают, например, такие права, как: «Добавление», «Чтение», «Изменение», «Удаление».
Для построения защищенных прикладных решений достаточно управлять только 4-мя основными правами доступа — «Добавление», «Чтение», «Изменение» и «Удаление».
Система 1С:Предприятие допускает проверку прав из встроенного языка. Например при добавлении команд к формам разработчик должен дополнительно позаботиться о проверке соответствующих интерактивных прав.
Пример проверки прав из языка:
Копировать в буфер обменаПроцедура КнопкаНажатие(Элемент) Разрешено = ПравоДоступа(«ИнтерактивноеУдаление», Метаданные.Документы.Документ1);ЕслиНе Разрешено Тогда Предупреждение («Удалять не разрешено»);// … необходимые действияКонецЕсли// … необходимые действияКонецПроцедуры
При этом нужно помнить о том, что у будущего пользователя конфигурации соответствующие интерактивные и неинтерактивные права к тому или иному объекту могут различаться. Например, может быть разрешено право на «Удаление» и запрещено право «Интерактивное удаление».
Проверка прав объектов производится только в режиме «1С:Предприятие».
При попытке выполнить неразрешенную операцию выдается сообщение об ошибке «Нарушение прав доступа!», и производится отмена всех начатых транзакций.
Проверка основных и интерактивных прав используется расширениями формы, табличного поля и поля ввода (расширение формы определяется ее основным реквизитом, а табличного поля и поля ввода — типом редактируемых данных). Благодаря этому, если не установлено право «Просмотр», то форма списка или форма объекта не откроется, и будет выдано стандартное сообщение о нарушении прав доступа.
Рассмотрим проверку прав расширениями формы, табличного поля и поля ввода на примере документа:
- При открытии формы документа проверяется право «Просмотр», после чего, если это форма нового объекта, то проверяется право «ИнтерактивноеДобавление», а если нет — право «Редактирование». Если выполняется запись с проведением, то проверяются права «ИнтерактивноеПроведение», «ИнтерактивнаяОтменаПроведения» или «ИнтерактивноеПроведениеНеОперативное», в зависимости от режима записи.
- Расширение табличного поля для журнала документов при открытии формы, в которой журнал установлен основным реквизитом, проверяет, что право «Просмотр» установлено хотя бы у одного документа журнала. При проведении документов из журнала проверяются права «ИнтерактивнаяОтменаПроведения», «ИнтерактивноеПроведение» и «ИнтерактивноеПроведениеНеОперативное». При удалении документов проверяется право «ИнтерактивноеУдаление», а при установке/снятии пометки на удаление проверяются права «ИнтерактивнаяПометкаУдаления» и «ИнтерактивноеСнятиеПометкиУдаления». При добавлении нового документа, после выбора его типа, расширение табличного поля журнала документов проверяет право «ИнтерактивноеДобавление».
- Поле ввода для документа проверяет только право «ВводПоСтроке».
Связанные права
Часть прав в системе 1С:Предприятия связаны друг с другом. Это означает, что основные права доступа, такие как «Чтение», «Изменение», «Добавление» и «Удаление» и некоторые другие могут влиять на права, отвечающие за такие операции с объектом, которые, в конечном счете, приведут к простейшим операциям. Например, нельзя разрешить право «Изменение», не выдав право «Чтение».
Интерактивные права напрямую зависят от их неинтерактивных аналогов, т.е. право «Интерактивное удаление» зависит от права «Удаление».
На практике при конфигурировании это выглядит так, что при разрешении интерактивных прав аналогичные им неинтерактивные будут автоматически разрешены, и, наоборот, при снятии неинтерактивных прав соответствующие им интерактивные автоматически будут сброшены.
Допускается лишь установка неинтерактивного права и сброс интерактивного, но не наоборот. Например, нельзя разрешить интерактивное право «Интерактивное удаление» и запретить неинтерактивное «Удаление».
Зависимость прав может выстраиваться в сложные цепочки, например, у объекта «Документ» право «Интерактивная отмена проведения» зависит от прав «Отмена проведения» и «Просмотр» одновременно, где первое зависит от «Изменение», которое, в свою очередь, зависит от права «Чтение» (см. рисунок).
Ключевым является право «Чтение», при его отсутствии автоматически пропадают любые другие права на доступ к объекту.
Алфавитный список прав доступа 1С:Предприятия
Automation | Разрешает использование 1С:Предприятие в режиме automation. |
Администрирование | Разрешает административные действия, например, ведение списка пользователей или открытие конфигурации. |
АктивныеПользователи | Разрешает просмотр списка активных пользователей. Это право может использоваться при организации «гостевого входа» в прикладном решении. |
ВводПоСтроке | Разрешает использование режима ввода по строке для различных объектов. |
ВнешнееСоединение | Разрешает использование 1С:Предприятия через COM соединение. |
Добавление | Разрешает добавление объектов данного вида. Проверяется на уровне объекта и на уровне БД. |
ЖурналРегистрации | Разрешает просмотр журнала подключений и протоколов работы |
Изменение | Разрешает изменение объектов данного вида. Проверяется на уровне объекта и на уровне БД. |
ИнтерактивнаяОтменаПроведения | Разрешает интерактивную отмену проведения |
ИнтерактивнаяПометкаУдаления | Разрешает интерактивную установку пометки удаления |
ИнтерактивноеДобавление | Разрешает интерактивное добавление объектов данного вида |
ИнтерактивноеОткрытиеВнешнихОбработок | Разрешает открытие внешних обработок стандартными командами меню |
ИнтерактивноеПроведение | Разрешает интерактивное проведение документов данного вида |
ИнтерактивноеПроведениеНеОперативное | Разрешает интерактивное проведение (стандартными командами форм) документа в неоперативном режиме |
ИнтерактивноеСнятиеПометкиУдаления | Разрешает интерактивное снятие пометки на удаление |
ИнтерактивноеУдаление | Разрешает интерактивное непосредственное удаление |
ИнтерактивноеУдалениеПомеченных | Разрешает интерактивное удаление помеченных объектов |
Использование | Разрешает использование обработки, отчета, интерфейса |
МонопольныйРежим | Разрешает переключение в монопольный режим при работе в режиме 1С:Предприятия. |
ОтменаПроведения | Разрешает отмену проведения документов |
Проведение | Разрешает проведение документов |
Просмотр | Разрешает просмотр объектов (например, в списках) |
Редактирование | Разрешает редактирование объекта |
Удаление | Разрешает удаление |
УправлениеИтогами | Разрешает управление итогами регистра бухгалтерии и регистра накопления — установку периода, по который рассчитаны итоги, и пересчет итогов |
Чтение | Разрешает чтение данных из информационной базы |
Источник: https://printscanner.ru/obekty-dostupa-dokumentov/
Механизм сопоставления данных при обмене через универсальный формат
Механизм сопоставления данных предназначен для решения задачи синхронизации данных между базой источника и базой приемника при обмене
Внутренние идентификаторы объектов
В идеальном случае данные синхронизируемых приложений могли бы сопоставляться по уникальным внутренним идентификаторам объектов (GUID).
Но для этого необходимо, чтобы добавление данных, подлежащих синхронизации, осуществлялся только в одном приложении, а в другом эти данные появлялись исключительно в результате синхронизации.
В этом случае GUID в двух приложениях у одинаковых объектов будут одинаковыми, и по ним можно будет однозначно сопоставить объекты.
На практике соблюдать данное требование не всегда возможно, особенно в случае настройки синхронизации между приложениями, работа в которых велась независимо. Это связано с тем, что у двух одинаковых объектов, созданных параллельно в каждом приложении, будет два разных GUID.
В некоторых случаях данные не могут быть сопоставлены по GUID по причине его отсутствия (особые случаи, которые не рассматриваются в данной статье).
Публичные идентификаторы объектов
Для успешного сопоставления объектов с разными GUID должно быть место для хранения информация об их соответствии. Таким местом является регистр сведений Публичные идентификаторы синхронизируемых объектов (далее РПИ).
Рис. 1 Регистр сведений Публичные идентификаторы синхронизируемых объектов
Структура регистра представлена в таблице:
Измерения | Тип | Назначение |
Узел информационной базы | ПланОбменаСсылка | Ссылка на узел плана обмена (настройку обмена), для которой хранится соответствие. |
Ссылка | СправочникСсылка,ПланВидовХарактеристикСсылка,ДокументСсылка | Ссылка на объект текущего приложения. |
Идентификатор | Строка (36) | GUID объекта, полученного от приложения-корреспондента. |
Для сопоставления данных двух программ предназначена в БСП 2.3 обработка “Сопоставление объектов информационных баз” для непосредственного использования при синхронизации данных
Рис 2. Основная форма обработки “Сопоставление объектов информационных баз”
Список открывается по команде Выполнить сопоставление на странице Сопоставление данных Помощника интерактивной синхронизации данных. Также можно дважды щелкнуть мышью по строке, в которой обнаружены проблемы сопоставления данных.
Список состоит из двух колонок, каждая из которых соответствует информационной базе, участвующей в обмене. Данные сгруппированы по объектам программы (документы, списки). В нижней части списка выводится информационная строка: сколько элементов сопоставлено, сколько не сопоставлено.
В поле Выводить можно выбрать, какие данные показывать в списке. По умолчанию выводятся Несопоставленные данные.
Сопоставление объектов
- Нажмите Сопоставить автоматически (рекомендуется), выберите поля для сопоставления с помощью флажков. Некоторые поля выбраны программой по умолчанию. Для того чтобы подтвердить свой выбор, нажмите Выполнить сопоставление. После поиска программа выводит на просмотр сопоставленные ею данные. Для подтверждения нажмите Применить.
- После автоматического сопоставления можно оставшиеся объекты сопоставить вручную или изменить сопоставление объектов. Выделите нужные объекты двух баз, нажмите Отменить соответствие, для того чтобы попытаться сопоставить объекты вручную, нажмите Установить соответствие для того чтобы сопоставить объекты.
- Для подтверждения нажмите Записать и закрыть.
Настройка полей таблицы сопоставления
- Нажмите Колонки, чтобы добавить поля в колонки списка. С помощью флажков можно отметить дополнительные поля, для подтверждения нажмите Применить.
Получение данных из другой программы
- Для того чтобы получить данные из другой программы, нажмите Еще – Загрузить данные из другой программы.
Порядок сопоставления объектов
- Рекомендуется выполнять сопоставление и загрузку данных с учетом ссылочных связей. Особенно, если поле используется для сопоставления объектов.
- Например, в конфигурации имеется справочник договоров контрагентов, который подчинен справочнику контрагентов. Сопоставление договоров контрагентов выполняется по справочнику-владельцу, т.е. по справочнику контрагентов. Следовательно, для правильного сопоставления данных необходимо сначала сопоставить и загрузить справочник контрагентов, а затем – справочник договоров контрагентов.
- В противном случае поля таблицы сопоставления могут содержать фиктивные ссылки вида: (26:a0b9001b24e002fe11da347dd41412).
- Фиктивная ссылка указывает на объект в текущей информационной базе, который еще не был загружен из сообщения обмена.
Записи в РПИ создаются и на стороне отправителя при подтверждении получения данных корреспондентом через механизм квитирования. В поле Идентификатор в таких записях устанавливается исходный идентификатор объекта.
Регистрация таких записей необходима для того, чтобы при получении других данных от корреспондента можно было понимать, что данный объект должен быть исключен из процедуры поиска по полям и по уникальному идентификатору.
Варианты идентификации объектов при получении
Порядок автоматического сопоставления объектов при получении, содержится в правилах конвертации объектов (ПКО), предназначенных для получения данных. Правила ПКО находятся в общем модуле МенеджерОбменаЧерезУниверсальныйФормат
Рис 3 Разделы общего модуля МенеджерОбменаЧерезУниверсальныйФормат
Отметим, что в общем модуле МенеджерОбменаЧерезУниверсальныйФормат находятся все компоненты (правила обработки данных, правила конвертации объектов и т.д.
), определяющие прикладную логику обработки данных в процессе их получения, либо отправки . Программный код этого модуля создается автоматически с помощью приложения “Конвертация данных, редакция 3.0” на основе настроенных правил обмена.
Программный код модуля можно создавать вручную, но требует от разработчика большого мастерства.
Вариант автоматического сопоставления (идентификации) объектов при получении задается с помощью свойства ВариантИдентификации ПКО
Рис 4. Настройки идентификации в модуле менеджера
Существуют 3 варианта ( 3 значения) идентификации объекта
- ПоУникальномуИдентификатору –идентификация по GUID,
- СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска–идентификация по GUID и полям поиска,
- ПоПолямПоиска –идентификация по полям поиска,
Рис 5. Настройки идентификации в КД3.0.
Еще одним свойством, определяющим логику сопоставления, является массив полей поиска, определяемый в свойстве ПоляПоиска ПКО.
Алгоритм поиска по полям
Происходит последовательное применение вариантов поиска, заданных в свойстве ПоляПоиска ПКО, используемого при загрузке объекта.
Ограничение.
При сопоставлении на этапе анализа данных применяется только 1-й вариант поиска – ПоУникальномуИдентификатору
Переход к следующему варианту осуществляется в двух случаях:
- У загружаемого объекта не заполнено какое-либо из полей, которое указано в варианте поиска.
- Вариант поиска не дал результата.
Если в загружаемом объекте есть информация об исходном GUID и вариант идентификации для объекта “По GUID” или “По GUID и полям поиска”, то поиск выполняется среди всех объектов заданного типа, кроме тех, для которых в РПИ уже установлены соответствия.
В остальных случаях поиск осуществляется среди всех объектов информационной базы соответствующего типа.
Особенности.
При сопоставлении на этапе анализа данных у загружаемых объектов не проверяется заполнение полей, участвующих в поиске.
На этапе анализа данных соответствие будет установлено только в том случае, когда для одного объекта отправителя был найден один объект получателя.
На этапе загрузки данных соответствие будет установлено и в том случае, когда для одного объекта отправителя нашлось несколько объектов получателя. В такой ситуации соответствие будет установлено с одним из них.
На этапе загрузки данных вариант поиска Номер + Дата для документов работает следующим образом: номер искомого документа проверяется на точное соответствие, дата определяет интервал, в котором проводится поиск по номеру.
Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года.
На этапе анализа данных этот вариант поиска будет работать как обычно: оба поля будут проверяться на точное соответствие.
Источник: https://master1c8.ru/platforma-1s-predpriyatie-8/rukovodstvo-razrabottchika/glava-15-mehanizm-obmena-dannh/mehanizm-sopostavleniya-dannh-pri-obmene-tcherez-universalyny-format/
Двоичные данные в 1С 8.3 (8.2)
Важное замечание в начале. Основной режим работы 1С в этой статье предполагается 1С 8.3.7 в режиме тонкого клиента без модальных вызовов — самый современный на настоящий момент, на который вскоре должны быть переведены все конфигурации. Также постараюсь описать особенности работы в Веб-Клиенте.
Что такое двоичные данные и как с ними можно работать в 1С 8
Двоичные данные (или бинарные) — это файл данных произвольного формата.
Платформа 1С (8.3 и 8.2) в общем случае понятия не имеет, что это. Предполагается, что программист или пользователь знает, какие именно это данные и как их применять.
Тем не менее, если в двоичные данные загружен графический файл, формат которого понимает объект типа «Картинка», то при инициализации картинки такими двоичными данными картинка будет нормально показана, а её свойство «Формат» примет правильное значение.
Платформа 1С при работе с двоичными данными может:
- Хранить в базе данных в реквизитах типа «ХранилищеЗначения», в справочниках, документах, регистрах сведений.
- Читать их из файла и записывать в файл.
- Передавать их между сервером и клиентом через временное хранилище.
- Инициализировать ими объект типа «Картинка».
- Закодировать и раскодировать в/из строковое представление Base64.
- Хранить в объектах конфигурации в качестве Макета.
- Читать двоичные данные из сети при помощи объектов типа «HTTPСоединение» (объект «HTTPОтвет» можно получить в том числе в виде двоичных данных), «ПочтовоеВложение», «ИнтернетПочтовоеВложение».
- Зашифровать, расшифровать, подписать и проверить подпись средствами криптографии.
- Вычислить хеш-функцию с помощью объекта типа «ХешированиеДанных»
Возможно, я еще что-то упустил, однако интуитивно ясно, что практически все, что надо для работы с двоичными данными в 1С, у нас есть. Рассмотрим теперь по порядку несколько конкретных примеров работы с двоичными данными на платформе 1С 8.3.
Чтение и запись двоичных данных в файл
Основной тип объектов двоичных данных платформы 1С так и называется: «ДвоичныеДанные». Вот что говорит о нем «Синтаксис-помощник»:
Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы.
Чтение двоичных данных из файла
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Тип «Двоичные данные» имеет единственный конструктор:
дд = Новый ДвоичныеДанные(имяФайла);
имяФайла — обязательный аргумент.
В итоге получаем программный объект двоичных данных, прочитанный из файла.
Запись двоичных данных в файл
дд.Записать(имяФайла);
Определение размера двоичных данных в байтах
квоБайт = дд.Размер();
Сохранение двоичных данных в реквизит объекта
Рассмотрим сразу запись двоичных данных из файла на клиенте в реквизит объекта базы данных типа ХранилищеЗначения. Причем напишем такой код, который сработает и на веб-клиенте, а также будет лишен модальных вызовов, то есть таких вызовов, которые ожидают действия пользователя и останавливают при этом исполнение программы. Теперь платформа 1С 8.3 требует разрабатывать асинхронные программы.
Выглядит это примерно так: создается обработчик оповещения о выполнении некоторой длительной процедуры, затем запускается процедура «НачатьХХХ()», в которую, кроме понятных аргументов, передается еще и описание обработчика ее завершения. Наша программа спокойно работает далее, а по завершении запущенной процедуры вызывается наш обработчик завершения.
Предположим, у нас на форме есть реквизит типа «СправочникСсылка.Картинки». Справочник «Картинки» имеет реквизит «ДанныеКартинки» типа ХранилищеЗначения.
Создадим команду формы «ЗагрузитьКартинкуИзФайла».
Создадим обработчик команды, выделив команду в списке команд формы и нажав на кнопку с увеличительным стеклом в поле «Действие» панели свойств:
Поскольку все необходимые параметры для записи картинки мы можем передать изнутри клиентской части обработчика, нам нет нужды создавать контекстную серверную процедуру на сервере. Выберем «Создать на клиенте и процедуру на сервере без контекста»:
Вначале напишем наши обработчики команды в старом, «модальном» или «синхронном» стиле:
&НаСервереБезКонтекста Процедура ЗагрузитьКартинкуИзФайлаНаСервере(стрАдрес, спрКартинка) объКартинка = спрКартинка.ПолучитьОбъект(); объКартинка.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(стрАдрес)); объКартинка.Записать(); КонецПроцедуры &НаКлиенте Процедура ЗагрузитьКартинкуИзФайла(Команда) адресДанных = “”; Если ЗначениеЗаполнено(Картинка) Тогда Если ПоместитьФайл(адресДанных, ИмяФайлаКартинки, ИмяФайлаКартинки, Истина, УникальныйИдентификатор) Тогда ЗагрузитьКартинкуИзФайлаНаСервере(адресДанных, Картинка); КонецЕсли; // ПоместитьФайл((Новый ДвоичныеДанные(ИмяФайлаКартинки)) КонецЕсли; // ЗначениеЗаполнено(Картинка) КонецПроцедуры
В моей небольшой тестовой конфигурации этот код отлично сработал в режиме тонкого клиента. Теперь преобразуем модальный вызов «ПоместитьФайл» в асинхронный, он же немодальный. В меню конфигуратора запустим команду меню «Текст >Рефакторинг >Нерекомендуемые синхронные вызовы >Преобразовать вызовы модуля». Нам в ответ сообщат, что «Не рекомендуемых синхронных вызовов преобразовано: 1».
Для компактности я удалил все пустые строки, и вот что получилось вместо клиентской части нашего обработчика:
&НаКлиенте Процедура ЗагрузитьКартинкуИзФайла(Команда) адресДанных = “”; Если ЗначениеЗаполнено(Картинка) Тогда НачатьПомещениеФайла(Новый ОписаниеОповещения(“ЗагрузитьКартинкуИзФайлаЗавершение”, ЭтаФорма, Новый Структура(“адресДанных”, адресДанных)), адресДанных, ИмяФайлаКартинки,, Истина, УникальныйИдентификатор); КонецЕсли; // ЗначениеЗаполнено(Картинка) КонецПроцедуры &НаКлиенте Процедура ЗагрузитьКартинкуИзФайлаЗавершение(Результат, Адрес, ИмяФайлаКартинки, ДополнительныеПараметры) Экспорт адресДанных = ДополнительныеПараметры.адресДанных; Если Результат Тогда ЗагрузитьКартинкуИзФайлаНаСервере(адресДанных, Картинка); КонецЕсли; // ПоместитьФайл((Новый ДвоичныеДанные(ИмяФайлаКартинки)) КонецПроцедуры
Готово! Мы кошерно асинхронно записали картинку из файла на клиенте в реквизит объекта базы данных, в нашем случае — элемента справочника.
Чтение двоичных данных из объекта БД
Для чего нам надо читать двоичные данные из объекта БД? Наверное, три самых частых случая таковы:
- Внедрить картинку в табличный документ, например, отчет. Табличный документ (отчет) часто формируется на стороне сервера, поэтому нам нет нужды гонять картинки через временное хранилище. Мы просто получаем значение из реквизита типа «хранилище значения», инициализируем им объект типа «Картинка» и помещаем эту картинку в табличный документ. А клиентская сторона приложения отображает уже сформированный табличный документ.
- Отобразить на форме некоторую картинку. Нам надо передать двоичные данные на сторону клиента и загрузить их в реквизит формы при открытии формы. Ну и желательно обновлять картинку по некоторым событиям.
- Сохранить двоичный файл на стороне клиента. Здесь надо получить данные с сервера по некоторой команде и просто сохранить их в файл на клиенте.
Пример 1. Вставить картинки в макет (табличный документ).
Допустим, у нас есть база данных со справочником «Картинки», у элементов которых есть реквизит «Картинка» типа ХранилищеЗначения, содержащий данные картинки.
Создадим новую внешнюю обработку, ее основную форму.
На форме создадим 3 реквизита «СпрКартинка1», «СпрКартинка2», «СпрКартинка3» типа «СправочникСсылка.Картинки» и реквизит «ТабДок» типа «ТабличныйДокумент». Перетащим мышкой эти реквизиты в список элементов формы, чтобы на ней образовались соответствующие поля.
Добавим команду формы «НапихатьКартинок» и создадим ее обработчик. На сей раз выберем «Создать на Клиенте и процедуру на сервере», чтобы не передавать много параметров в процедуру без контекста. Напишем такие обработчики:
&НаСервере Процедура НапихатьКартинокНаСервере() Для сч = 1 По 3 Цикл картинка = Новый Картинка(ЭтаФорма[“СпрКартинка” + сч].Картинка.Получить()); ТабДок.Область(4-сч, сч, 4-сч, сч).Картинка = картинка; КонецЦикла; // Для сч = 1 По 3 КонецПроцедуры &НаКлиенте Процедура НапихатьКартинок(Команда) НапихатьКартинокНаСервере(); КонецПроцедуры
И получим примерно такой результат:
Пример 2. Показать картинку из базы данных на форме.
Для демонстрации воспользуемся первой обработкой, где мы записывали файл в БД. Теперь покажем на форме картинку, которая записана в реквизите «Картинка» выбранного на форме элемента справочника «Картинки».
Во-первых, добавим на форму поле, связанное с реквизитом «АдресДанныхКартинки». Например, перетащим мышкой этот реквизит в список элементов формы. Выберем и установим значение свойства «Вид» этого поля в «Поле картинки».
Во-вторых, напишем такую серверную процедуру:
&НаСервере Процедура ОбновитьКартинкуНаСервере() АдресДанныхКартинки = ПоместитьВоВременноеХранилище(Картинка.Картинка.Получить()); КонецПроцедуры // ОбновитьКартинку
И станем вызывать эту процедуру, например, из обработчика события «При изменении» поля «Картинка»:
&НаКлиенте Процедура КартинкаПриИзменении(Элемент) ОбновитьКартинкуНаСервере(); КонецПроцедуры
Проверяем…
Работает!
Сохранение двоичных данных в файл на клиенте
Думаю, с сохранением двоичных данных из базы данных в файл у Вас проблем не возникнет. По крайней мере, если Вы работаете не в веб-клиенте. Читаем, помещаем во временное хранилище на сервере, затем записываем в файл на клиенте.
Кодирование двоичных данных в формат Base64 и обратно
Тут все очень просто. Платформа имеет две глобальные функции, доступные везде:
- Base64Строка()
- Base64Значение()
Первая получает в качестве аргумента объект типа «ДвоичныеДанные», а возвращает его текстовое представление в кодировке base64, а вторая, наоборот, из текста в формате base64 возвращает объект типа «ДвоичныеДанные».
Не очень, правда, представляю, зачем нам это может понадобиться. Во всех встроенных типах объектов вроде ПочтовоеВложение или объектов для работы с XML необходимые преобразования платформа делает сама. Разве что нам потребуется работать с какими-то нестандартными форматами файлов для обмена с внешними системами…
Итого
На самых простых примерах мы увидели все основные принципы и методы работы с двоичными данными в 1С 8.3. Также коснулись актуальной сейчас темы устранения синхронных вызовов. Остальные возможности работы с двоичными данными Вы без труда реализуете по аналогии с рассмотренными здесь.
Спасибо за внимание. Желаю всем вершин профессионализма и глубин познаний. А главное — чтобы это приносило счастье в жизнь Вашу и окружающих.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Источник: https://programmist1s.ru/rabota-s-dvoichnyimi-dannyimi-v-1s/