Особенности работы с типизированными и не типизированными колонками таблицы значений
При создании колонки таблицы значений можно указать или не указать тип значений, которые будут храниться в данной колонке. Информация в типизированных и не типизированных колонках таблицы значений хранится по-разному. В колонке с неуказанным типом значения хранится значение и его контекст, тогда как в колонке с указанным типом хранится только его значение. У каждого способа есть свои плюсы и минусы. Хранение значения и контекста позволяет увеличить производительность при частых обращениях к значениям реквизитов объектов, которые хранятся в таблице значений. Но при этом расходуется много памяти на хранение каждого объекта. Хранение только значения позволяет более компактно хранить информацию. Минусом является то, что при каждом обращении к атрибуту или методу объекта, который хранится в такой колонке, объект будет создаваться, позиционироваться на соответствующую запись и уничтожаться после использования. Чтобы избежать таких накладных расходов, перед обращением к нескольким атрибутам или методам объекта, рекомендуется поместить его значение во временную переменную и использовать ее для доступа к атрибутам и методам объекта. Данный способ позволяет компактно хранить информацию и получить хорошую производительность при работе с большим объемом информации.
Применение процедуры ПриНачалеРаботыСистемы() глобального модуля
В глобальном модуле может быть определена процедура ПриНачалеРаботыСистемы(), которая вызывается на выполнение при запуске системы 1С:Предприятие. Данная процедура предназначена для того, чтобы в конфигурации можно было определить действия, которые должны быть выполнены при начале работы системы 1С:Предприятие. Однако операторы тела глобального модуля (операторы, размещаемые в конце модуля и не входящие в какую-нибудь процедуру) также выполняются при запуске системы 1С:Предприятие. При выполнении тела глобального модуля сам глобальный модуль еще не полностью инициализирован, а если точнее, то его экспортируемые переменные, процедуры и функции на данный момент еще не доступны извне самого глобального модуля. И если в теле глобального модуля, например, с помощью функции ОткрытьФорму() запустить какую-либо обработку, то данная обработка не сможет быть выполнена, если в ней содержатся обращения к переменным, процедурам или функциям глобального модуля.
Процедура ПриНачалеРаботыСистемы() вызывается после выполнения тела глобального модуля. При вызове данной процедуры глобальный модуль уже полностью инициализирован и доступен для обращения из других модулей. Поэтому в данной процедуре можно выполнять действия запускающие другие модули, из которых осуществляется обращение к объектам глобального модуля.
Доступ во встроенном языке к метаданным
В 1С:Предприятии 7.7 существует возможность обращаться к объектам метаданных средствами встроенного языка. Эта возможность используется, прежде всего, для создания универсальных алгоритмов, не зависящих от конфигурации и конкретных объектов метаданных.
Весь доступ к метаданным осуществляется через объект "Метаданные" и иерархию подчиненных ему объектов. Фактически объект "Метаданные" является корнем иерархической системы объектов, которые во многом похожи на дерево метаданных в конфигураторе.
В отличие от других средств встроенного языка доступ к метаданным не имеет подробного описания в документации. Это объясняется тем, что названия атрибутов и методов совпадают с терминами, выводимыми в текстовом представлении структуры метаданных (меню "Конфигурация – Описание структуры метаданных"). Соответственно для ознакомления с составом атрибутов и методов следует получить текстовое представление и определить в нем необходимые термины. Специфические атрибуты и методы (не отображаемые в текстовом представлении) отражены в документации и Синтакс-Помощнике.
Обращение к объектам метаданных выполняется с помощью методов вышестоящего объекта. Название метода совпадает с названием типа объекта метаданных. В качестве параметра может быть передан идентификатор искомого объекта или его номер. Если объект найден, то возвращается собственно объект метаданных. Если объект не найден то возвращается пустой объект метаданных. Для проверки того, возвращен пустой объект или нет, следует использовать метод "Выбран".
Например:
Если Метаданные.Документ("Счет").Выбран()=0 Тогда
Сообщить("В конфигурации нет документа Счет");
КонецЕсли
Если параметр не задан, то возвращается количество объектов метаданных данного типа.
Например:
Сообщить("В конфигурации "+Метаданные.Документ()+" документов");
Эта возможность используется для обхода всех объектов метаданных
определенного типа.
Например:
Для Инд=1 По Метаданные.Документ() Цикл
Сообщить("Документ "+Метаданные.Документ(Инд));
КонецЦикла;
Для доступа к объектам метаданных, которые подчинены полученным объектам, также соответственно используются методы, совпадающие с именами метаданных. Заметим, что реквизит документа также является объектом метаданных (имеет идентификатор, синоним и т.д.).
Например:
Если
Метаданные.Документ("Счет").РеквизитШапки("Заказчик").Выбран()=0 Тогда
Сообщить("В конфигурации нет реквизита Заказчик документа
Счет");
КонецЕсли;
Для доступа к свойствам объектов метаданных используются атрибуты с соответствующими именами.
Например:
Сообщить("Тип номера расходного ордера:
"+Метаданные.Документ("РасходныйОрдер").ТипНомера);
Таким образом, если ознакомиться с содержимым текстового представления метаданных, то можно определить названия методов и атрибутов для доступа ко всем объектам метаданных и их свойствам.
Некоторые свойства объектов метаданных являются ссылками на другие объекты. В этом случае возвращается объект метаданных, к которому можно обращаться также как и объектам, полученным с помощью методов объекта "Метаданные".
Например:
Сообщить("Длина кода справочника владельца справочника Договора:
"+Метаданные.Справочник("Договора").Владелец.ДлинаКода);
Для некоторых объектов их свойства могут содержать несколько ссылок на различные объекты метаданных. В этом случае к ним применяются методы "Количество" и "Получить".
Например:
Сообщить("Количество ссылок в графе Сумма журнала Общий :"
+Метаданные.Журнал("Общий").Графа("Сумма").Ссылки.Количество());
Заметим, что возвращаемые значения свойств объектов метаданных, соответствующие одному из нескольких возможных вариантов, возвращаются в строковом виде в соответствии с установленном для конфигурации языком (русским или английским). Возможные значения в английском варианте можно посмотреть, сформировав текстовое описание метаданных при установленном в конфигурации английском языке.
Следует учитывать, что механизм обращения к метаданным не связан непосредственно с данными и не позволяет получать значения, хранящиеся в информационной базе или значения агрегатных типов которые могут храниться в информационной базе. Он предназначен только для получения информации о структуре метаданных. То есть все объекты, получаемые через объект "Метаданные", имеют специальный тип "Метаданные". Например, используя доступ к метаданным нельзя получить значение типа "Перечисление". То есть объект метаданных может сообщить свойства перечисления, но не может выдать собственно значение типа "Перечисления" чтобы присвоить его, например, реквизиту документа или сравнить с существующим значением. Для получения собственно значения типа "Перечисление" необходимо воспользоваться самим объектом "Перечисление". Однако существует возможность искать значение перечисления по идентификатору, полученному из метаданных.
Например:
Для Инд=1 По Метаданные.Перечисление("ВидыПлатежа").Значение() Цикл
Сообщить(Перечисление.ВидыПлатежа.ЗначениеПоИдентификатору(
Метаданные.Перечисление("ВидыПлатежа").Значение(Инд).Идентификатор));
КонецЦикла;
Объекты, используемые для доступа к метаданным, могут запоминаться в переменных для сокращения в дальнейшем доступа к их свойствам и подчиненным объектам.
Например:
МДСчет= Метаданные.Документ("Счет");
Сообщить("Тип реквизита Заказчик документа Счет:
"+МДСчет.РеквизитШапки("Заказчик").Тип);
Заметим, что объекты, используемые для доступа к метаданным, не могут сравниваться между собой. Для того чтобы сравнить, например, два объекта метаданных одного и того же типа на идентичность можно сравнить их идентификаторы.
Особенности работы с реквизитами неопределенного типа
В 1С:Предприятии 7.7 существует возможность создавать в объектах метаданных реквизиты неопределенного типа. Например, эта возможность активно используется для хранения в документе значений субконто связанных с некоторым счетом, по которому должны формироваться проводки документом.
Особенность использования реквизитов неопределенного типа заключается в том, что их значения нельзя присваивать, не назначив предварительно тип. Тип назначается с помощью метода "НазначитьТип" того объекта, которому принадлежит реквизит. Таким образом, реквизиты неопределенного типа отличаются от обычных переменных модулей, тип которых может свободно изменяться при присвоении значения.
Замечание!
В модуле формы документа (аналогично и справочника) для назначения типа реквизиту документа следует вызывать метод "НазначитьТип" у самого документа (то есть не через точку, а непосредственно). Вызов метода "НазначитьТип" для элемента управления (через объект Форма) следует применять только к реквизитам диалога формы (не являющимися реквизитами документа).