Также следует иметь в виду, что преобразуются к строке отдельные значения, а не объекты данных. То есть, можно преобразовать к строке значение реквизита элемента справочника, но нельзя преобразовать к строке весь элемент справочника целиком. Для сохранения в строке элемента справочника, необходимо сохранять отдельно все его реквизиты.
Способы преобразования к строке.
Значения могут преобразовываться к строке в двух разных форматах - внутреннем и внешнем. Использование этих форматов существенно отличается по своему назначению и возможностям. При преобразовании к строке формат (внутренний или внешний) всегда задается явно. Он определяется именем функции или ее параметром. При обратном преобразовании (из строки) необходимо вызывать соответствующую функцию преобразования именно из того формата, в котором выполнялось сохранение значения в сроковом виде.
Внутренний формат.
Для преобразования к строковому виду (и обратно) во внутреннем формате используются следующие функции:
- ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр;
- ЗначениеВФайл / ЗначениеИзФайла - параметр "Формат" =1;
- СохранитьЗначение / ВосстановитьЗначение.
Кроме того, во внутреннем строковом формате хранятся значения расшифровок табличного документа.
Значение, полученное в сроковом виде во внутреннем формате, может быть преобразовано из строки к исходному типу только в той же информационной базе. Это объясняется тем, что для сохранения значения во внутреннем формате используются системные идентификаторы (не отображаемые на экране), как объектов метаданных, так и объектов данных. При попытке преобразовать значение, сохраненное во внутреннем формате, в другой конфигурации может произойти неправильное преобразование значения.
Если объект данных в информационной базе, на который ссылалось значение, удален (например, элемент справочника), то при преобразовании значения из строки обращение к этому значению не вызовет системной ошибки, но, разумеется и не позволит получить данные удаленного объекта.
Строки, полученные преобразованием значений к строке во внутреннем формате нельзя хранить в информационной базе. Прежде всего, это приведет к нарушению работы механизма контроля ссылочной целостности. Также, это может повлиять на работу компоненты "Управление распределенными данными ИБ". Разумеется, такое хранение значений, также не позволит системе оптимизировать обращение к данным при использовании версий 1С:Предприятия для SQL. Заметим, что хранение в информационной базе значений преобразованных в строку нарушает идеологию 1С:Предприятия и затрудняет отладку и модификацию конфигураций.
Отдельно следует отметить возможность использования преобразования значений к строке во внутреннем формате для однозначной идентификации объектов, при переносе информации из одной информационной базы в другую. То есть, при загрузке некоторых данных из другой информационной базы строковые представления значений другой ИБ в данной ИБ не могут использоваться собственно для обратного преобразования, но могут использоваться для сопоставления двух значений той ИБ, из которой идет загрузка. Например, если загружается справочник, то ссылку на родителя загружаемого элемента можно сопоставить со ссылкой ранее загруженной группы справочника, для точной идентификации родителя. Разумеется, сопоставлять можно только строки, полученные в одной информационной базе. То есть в описанном примере строковое представление во внутреннем формате должно выгружаться и для самих групп и для родителей элементов, чтобы при загрузке их можно было сопоставить. Для сопоставления можно рекомендовать запоминать при загрузке групп строковые представления этих групп в исходной ИБ, а при загрузке элементов искать группу соответствующую загружаемому элементу по строковому представлению родителя элемента в исходной ИБ.
Внешний формат
Для преобразования к строковому виду во внешнем формате используются
следующие функции:
- ЗначениеВСтроку / ЗначениеИзСтроки;
- ЗначениеВФайл / ЗначениеИзФайла - параметр "Формат" =0.
В отличие от внутреннего формата, при преобразовании значения в строку во внешнем формате система использует не системные идентификаторы объектов метаданных и данных, а обычные строковые идентификаторы объектов метаданных и те значения данных, на основании которых можно однозначно идентифицировать объект. Например, для преобразования к строке во внешнем формате значения типа "Справочник.Товары" будет использован идентификатор справочника "Товары", а также код элемента справочника. Если для кода справочника уникальность установлена в пределах группы, то будет использован полный код с учетом всех вышестоящих групп. Если справочник является подчиненным, то для идентификации значения будут использован код элемента справочника - владельца. Разумеется, если для справочника отключен контроль уникальности кодов, то преобразование значения этого типа практически не имеет смысла. Для сохранения значения типа "документ", если уникальность номеров поддерживается в пределах некоторого интервала (года, месяца), то для сохранения и восстановления значения используется также дата документа.
Внешний формат преобразования к строке может использоваться для переноса значений между различными информационными базами. Разумеется, успех обратного преобразования зависит от того, имеются ли в той информационной базе, в которой значение преобразуется из строки объекты метаданных с соответствующими идентификаторами и объекты данных соответствующими кодами/номерами. Например, полученное нами в строковом виде значение типа "Справочник.Товары", будет правильно обратно преобразовано, если имеется справочник, товары и элемент справочника с тем кодом, который был у элемента, на который ссылалось значение преобразованное к строке.
При восстановлении значения из строки во внешнем формате преобразование может быть не выполнено по нескольким причинам. Например, в той конфигурации, в которой происходит преобразование из сроки, не существует объекта метаданных с идентификатором, соответствующим типу значения, сохраненного в строке. Другой причиной может быть отсутствие в информационной базе объекта данных с тем кодом (номером), который был у элемента справочника, документа или счета, на который ссылалось сохраненное в строке значение. Кроме того, преобразование может быть не выполнено из-за отличий в свойствах объектов метаданных. Например, если при сохранении в строку значения типа "Справочник.Товры" у справочника "Товары" была установлена уникальность кода в пределах подчинения, а при восстановления значения из строки уникальность кода была установлена в пределах всего справочника, то значение из строки не будет восстановлено. Однако, неудачное преобразование из строки не вызывает системной ошибки, а приводит лишь к получению пустого значения.
Заметим, что возможность преобразования к строке во внешнем формате может использоваться при передаче данных из одной информационной базы 1С:Предприятия в другую с помощью Ole Automation, так как непосредственно передать значение типа "справочник", "документ" и т.п. через Ole
Automation нельзя.
Следует учитывать, что восстановление значений типа "справочник", "документ" или "счет" из строки во внешнем формате в отличие от использования внутреннего формата занимает определенное время, так как при этом выполняется обращение к информационной базе для поиска значений по сохраненному номеру (коду).
Заметим, что преобразование к строке и обратно значений типа "число", "строка" и "дата" происходит однозначно (гарантированно) в обоих форматах, так как эти значения не зависят от конфигурации. В качестве примера такого сохранения в методической конфигурации в обработке "НастройкаПрописи" выполняется сохранение в файле строк, используемых для вывода чисел, дат и периодов прописью.
Работа со значениями агрегатных типов во встроенном языке
При работе со значениями агрегатных типов во встроенном языке системы 1С:Предприятие следует учитывать некоторые особенности, которые не всегда являются очевидными.
Каждое значение агрегатного типа в системе 1С:Предприятие включает две составляющие:
внутренний идентификатор объекта данных;
ссылка на объект доступа.
Внутренний идентификатор объекта предназначен для максимально полной идентификации объекта, соответствующего значению агрегатного типа. А объект доступа служит для обращения к объекту данных посредством реквизитов и методов. При выполнении присваивания переменной встроенного языка значения агрегатного типа, в переменную копируется внутренний идентификатор объекта и ссылка на объект доступа, если таковой имеется. Сам объект доступа при этом не копируется! Таким образом, в результате
выполнения оператора
A = B;
при условии, что переменная B имела значение агрегатного типа и уже имела ссылку на объект доступа, переменные A и B будут ссылаться на один и тот же объект доступа. В отличие от базовых типов (число, строка, дата), для которых при присваивании копируется само значение, при присваивании агрегатных типов копируется не объект доступа, а только ссылка на него.
Здесь, однако, следует учитывать, что не всегда значение агрегатного типа содержит ссылку на тот или иной объект доступа. В некоторых случаях объекта доступа, соответствующего значению агрегатного типа может еще не существовать.
Значение агрегатного типа всегда содержит ссылку на объект доступа в тех случаях, когда значение было создано с помощью функции СоздатьОбъект(). А вот у атрибутов запросов, реквизитов справочников, документов и т. п., имеющих агрегатный тип, значения изначально не содержат ссылок на объекты доступа, пока они не будут созданы при обращении к атрибутам и методам. Соответственно и при присваивании таких значений переменным встроенного языка, переменные также не приобретают ссылок на объекты доступа, если они еще не были созданы.