543

Окно редактирования объекта конфигурации и палитпя

CBOJ

Окно редактирования объекта конфигурации и палитра свойств

Н

а первый взгляд окно редактирования объекта и палитра свойств дублируют друг друга. В самом деле, в палитре свойств отображены все свойства объекта конфигурации. Зачем было создавать еще и окно редактирования объекта? Ц если существует окно редактирования объекта, то зачем тогда палитра свойств, которая содержит все то же самое, только в другом виде?

Окно редактирования объекта конфигурации предназначено в первую очередь для быстрого создания новых объектов. Быстрое создание подразумевает ввод исчерпывающей информации об объекте. Значит нужно очень хорошо знать структуру объекта, а на это требуется время.... Выходит, что быстро создать объект не получится? Получится! Окно редактирования объекта имеет в своей основе механизм «мастеров»: разработчику в нужной последовательности предлагается ввести необходимые данные. Последовательность ввода данных разработана таким образом, чтобы предыдущие данные могли служить основой для ввода последующих данных. Движение управляется кнопками «Далее» и «Назад». На каждом шаге предлагается ввести группу логически связанных между собой данных.

Но, предположим, что вы уже освоились со структурой объектов или вам просто нужно изменить несколько свойств объекта. Чтобы при этом не нужно было опять «прокручивать» все с самого начала, окно редактирования объекта содержит закладки, которые позволяют вам перейти непосредственно к тому шагу, на котором вводятся интересующие вас данные.

НЕ нашли? Не то? Что вы ищете?

Таким образом окно редактирования объекта помогает быстро создать незнакомый объект конфигурации и в то же время обеспечивает удобный доступ к нужным свойствам при редактировании существующих объектов.

Что же касается палитры свойств, то она предоставляет одну абсолютно незаменимую возможность. Дело в том, что она не привязана по своей структуре к какому-то конкретному виду объектов конфигурации, просто ее содержимое меняется в зависимости от того, какой объект является текущим. За счет этого она может

«запоминать», какое свойство объекта в ней выбрано, и при переходе в дереве к другому объекту, она будет подсвечивать «у себя» все то же свойство, но уже другого объекта.

Такая способность палитры свойств абсолютно незаменима, когда, например, среди трех десятков справочников конфигурации вам нужно быстро найти те, которые подчинены какому-нибудь другому справочнику. В этом случае вы выбираете мышью в палитре свойств свойство «Владелец» любого справочника, затем переходите в дерево объектов конфигурации и просто пробегаете его при помощи стрелок ф или Ф.

544

545

Обработчики событий

П

ри работе с событиями в платформе 1С:Предприятие 8.0, следует различать два типа событий: события, связанные с формой и элементами управления, расположенными в форме, и все остальные события.

Разница заключается в том, что обработчики событий, связанных с формой и элементами управления, расположенными в форме назначаемые, а обработчики всех остальных событий фиксированные.

Фиксированный обработчик события должен иметь имя, совпадающие с именем события - только в этом случае он будет вызываться при возникновении соответствующего события.

Назначаемый обработчик может иметь произвольное имя, и если имя процедуры совпадает с именем события формы или элемента управления - этого совсем не достаточно для того, чтобы процедура вызывалась для обработки события с таким именем. Требуется явное назначение этой процедуры обработчиком этого события. Таким образом любая процедура, расположенная в модуле формы может быть назначена обработчиком любого события (или сразу нескольких событий) формы или элемента управления, расположенного в форме. Имя обработчика в этом случае не имеет значения, важно лишь то, что он назначен обрабатывать какое-либо событие.

Назначение обработчика может выполняться интерактивно, при работе с формой в конфигураторе, или программно, используя методы формы и элементов управления - УстановитьДействие().

События, связанные с формой

С

обытия, обрабатываемые формой, довольно разнообразны и на них стоит остановиться отдельно.

Во-первых, для формы доступна обработка событий, связанных с изменением данных как самой формы, так и подчиненных форм. Поскольку данные формы могут быть самыми различными, определена только категория этих событий, но сами события определяются путем программного назначения обработчика конкретного события. Для этого используется метод объекта Форма -ПодключитьОбработчикИзмененияДанных() (есть и обратный метод - ОтключитьОбработчикИзмененияДанных()). В параметрах этого метода передается имя обработчика данных, а также путь к данным, изменение которых будет отлеживаться этим обработчиком.

" Узнай больше!

В случае, когда в форме объекта редактируются дополнительные, логически связанные данные, существует два способа для отслеживания изменения объекта и синхронизации этих данных:

1. Для синхронизации данных, которые изменяются и
записываются синхронно с объектом, нужно использовать событие
расширения формы объекта
- «ПриИзмененииДанных».

Примером таких данных могут служить наборы записей регистров у документа, или картинка у справочника.

2. Для синхронизации данных, которые редактируются и
записываются отдельно от самого объекта, нужно использовать
обработчик события изменения данных назначенный на изменения
ссылки объекта.

Например, для формы справочника валют, в котором редактируется список курсов валюты, он может выглядеть следующим образом:

ПодключитьОбработчикИзмененияДанных( "СправочнжОбъект. Ссылка", "ПриИзмененииСсылки", Ложь);

546

547

Краткий справочник разработчика

События, связанные

с фор»

Сам же обработчик «ПриИзмененииСсылки()» будет выглядеть следующим образом:

ПроцедураПриИзмененииСсылки(Путъ)

СписокКурсов. Отбор. Валюта. Установить{Ссылка); КонецПроцедуры.

Также для объекта Форма существует возможность указать
обработчик ожидания, который будет вызываться в период ожидания
системы каждый раз по истечению указанного интервала времени. Для
этого используется метод ПодключитьОбработчикОжидания() (соответственно обратный метод

ОтключитьОбработчикОжидания()). В параметрах этого метода передается имя обработчика и интервал, с которым он будет вызываться.

Кроме этого существует ряд событий, позволяющих формам взаимодействовать друг с другом.

Прежде всего это события, связанные с подчиненностью одной формы другой.

Во-первых, форма может обрабатывать событие ОбработкаАктивизацииОбъекта(), которое возникает при изменении активного объекта в одной из подчиненных форм или при вызове в одной из подчиненных форм метода ОповеститьОбАктивизацииОбъекта().

Во-вторых, форма может обрабатывать событие ОбработкаВыбора(), которое возникает при выборе объекта в одной из подчиненных форм или при вызове в одной из подчиненных форм методаОповеститьОВыбореОбъекта().

В-третьих, форма может обрабатывать событие ОбработкаЗаписиНовогоОбъекта(), которое возникает при записи объекта в одной из подчиненных форм или при вызове в одной из подчиненных форм метода ОповеститьОЗаписиНовогоОбъекта().

Но кроме этих трех событий существует еще одно событие объекта Форма, которое позволяет взаимодействовать не только подчиненным, но вообще любым открытым формам. Это событие ОбработкаОповещения(), которое возникает при оповещении всех открытых форм методом глобального контекста Оповестить().

В заключение следует отметить одну интересную особенность в
обработке события модуля приложения

ОбработкаВнешнегоСобытия(). Это событие возникает при посылке внешним приложением сообщения, сформированного в специальном формате. Так вот, внешнее событие сначала будет предложено обработать всем открытым формам (по событию ВнешнееСобытие()), а затем уже это внешнее событие может быть обработано обработчиком модуля приложения.

548

549

Способы работы с коллекцией

М

ногие объекты встроенного языка являются коллекциями Коллекция представляет собой совокупность объектов. Существуют общие принципы работы с любой коллекцией. Во-первых, доступ к каждому объекту коллекции возможен путем перебора элементов коллекции в цикле. Для этого используется конструкция языка Для Каждого из... Цикл ...:

Для Каждого СтрокаТабличнойЧасти из ТабличнаяЧасть Цикл

Сообпшть(СтрокаТабличнойЧасти. Услуга,); КонецЦикла;

Во-вторых, возможен доступ напрямую к элементу коллекции, без перебора коллекции в цикле. Здесь возможны различные комбинации двух обращений:

1. Если каждому элементу коллекции можно сопоставить уникальное имя, тогда обращение к элементу коллекции, как правило, возможно по этому имени:

Справочники. Сотрудники; Справочники [«Сотрудники»];

2. Если нет смысла в «персонификации» элементов коллекции, тогда обращение к элементу коллекции, как правило, возможно по индексу (индекс первого элемента коллекции - ноль):

ТабличнаяЧасть[0];

Следует отметить, что существуют коллекции, сочетающие оба вида обращений. Например, к коллекции колонок таблицы значений можно обращаться как по именам колонок, так и по индексу-

Виды объектов встроенного языка, предназначенные для работы с данными прикладных объектов конфигурации

Д

ля обеспечения доступа к информационным структурам базы данных встроенный язык содержит набор унифицированных объектов. Их можно разделить на несколько видов, в зависимости от их назначения.

Менеджер информационных структур одного вида - этот вид
объектов является коллекцией значений, содержащей менеджеры всех
информационных структур этого вида, существующих в базе данных
(например, менеджер справочников - СправочникиМенеджер -
коллекция значений, содержащая объекты

СправочникМенеджер.<имя>). Предназначен для доступа к отдельным менеджерам информационных структур.

Менеджер конкретной информационной структуры - этот вид
объектов предоставляет средства для работы с конкретной
информационной структурой (например, менеджер документа
Приходная накладная -

ДокументМенеджер. ПриходнаяНакладная).

Объект - с помощью объектов этого вида возможна манипуляция данными информационной структуры. Предоставляют доступ к объекту информационной структуры и позволяют изменять информацию в базе данных. Применяются для тех информационных структур, на объекты которых могут существовать ссылки (справочники - СправочникОбъект.<имя>, документы ДокументОбъект.<имя> и т. д.).

Набор записей - с помощью объектов этого вида также возможна
манипуляция данными информационной структуры. Предоставляют
доступ к объекту информационной структуры и позволяют изменять
информацию в базе данных. Применяются для тех информационных
структур, ссылки на объекты которых в принципе не могут
использоваться в базе данных (регистры -

РегистрНакопленияНаборЗаписей.<имя>, перерасчеты ПерерасчетНаборЗаписей.<имя> и т. д.).

Ссылка - объекты этого вида служат для указания ссылки на объект базы данных, и кроме этого предоставляют некоторую

550

551

Краткий справочник разработчика

информацию об этом объекте (например, документ ДокументСсылка<имя>).

Выборка - объекты этого вида представляют собой набор данных содержащий данные объектов одной информационной структуры отобранных по определенному критерию. Обход выборки выполняется методом Следующий() и считывание данных из базы данных происходит динамически, по мере продвижения по выборке. Получение ссылки на объект возможно при помощи свойства Ссылка, а получение объекта - методом ПолучитьОбъект() (справочник - СправочникВыборка^имя>).

Список - объекты этого вида предназначены для управления списком объекта, отображаемым в табличном поле (перечисление - ПеречислениеСписок.<имя>). Использовать эти объекты имеет смыл только при выводе информации в табличное поле.

Способы доступа к данным

с

истема 1С:Предприятие 8.0 поддерживает два способа доступа к данным, хранящимся в базе данных:

•  объектный (для чтения и записи),

•  табличный (для чтения).

Объектный способ доступа к данным реализован посредством использования объектов встроенного языка. При этом обращение к какому-либо объекту встроенного языка, является обращением к некоторой совокупности данных, как к единому целому.

Например, объект ДокументОбъект. ОказаниеУслуги будет содержать значения всех реквизитов документа «Оказание услуги» и всех его табличных частей.

Объектная техника обеспечивает сохранение целостности объектов, кэширование объектов, вызов соответствующих обработчиков событий и т. д.

Табличный доступ к данным реализован посредством использования запросов к базе данных. В этой технике разработчик получает возможность оперировать отдельными полями таблиц базы данных, в которых хранятся те или иные данные.

Табличная техника предназначена для получения информации из
базы данных по некоторым условиям (отбор, группировка, сортировка,
объединение нескольких выборок, расчет итогов и т. д.). Табличная
техника оптимизирована для обработки больших объемов
информации, расположенной в базе данных, и получения данных,
отвечающих заданным критериям.

552

553

Кэш объ

ек

Кэш объектов

С

истема 1С:Предприятие 8.0 использует механизм кэширования данных объектов, считанных из базы данных при использовании объектной техники. Таким образом, для получения реквизитов какого-либо объекта через ссылку, выполняется обращение к кэшу объектов, расположенному в оперативной памяти.

Кэш объектов состоит из двух частей: транзакционного кэша и обычного кэша. В зависимости от того, происходит ли обращение в рамках транзакции или нет, в действие вступает тот или иной кэш:

А = СправочникНоменклатура. ВидНоменклатуры; I

Все данные, находящиеся в кэше, предназначены только для чтения (ReadOnly), таким образом чтение любых данных, получаемых через ссылку, выполняется только через кэш объектов, а запись - механизмами самих программных объектов.

Обычный кэш

Е

сли при обращении к обычному кэшу требуемых данных в нем нет, то выполняется чтение данных объекта из базЫ данных и сохранение их в кэше. Уникальным идентификатором для кэша, в данном случае, будет являться ссылка на объект базы данных. Поэтому данные каждого считанного

объекта могут существовать в кэше в одном из двух видов: либо все данные объекта, либо представление объекта.

Таким образом, если мы обратимся к кэшу для получения представления объекта, и в кэше есть информация для нашей ссылки, данные будут взяты из кэша (если в кэше весь объект, нужное представление будет получено из данных объекта). Если в кэше нет информации для нашей ссылки - из базы данных в кэш будут считаны только поля, необходимые для формирования представления объекта.

Если мы обратимся к кэшу для получения реквизита объекта, и в кэше есть информация для нашей ссылки, дальнейшие действия будут зависеть от того, что находится в кэше. Если в кэше весь объект - значение реквизита будет получено из кэша. Если в кэше представление объекта - оно будет удалено из кэша и в кэш будут считаны все данные объекта. Если же при получении реквизита объекта в кэше нет информации для нашей ссылки - из базы данных будут считаны все поля объекта.

Считанные данные будут находиться в кэше до тех пор, пока не наступит одно из трех событий:

•  считанные данные будут вытеснены из кэша другими
считанными данными других объектов (переполнение кэша),

•  при очередном обращении к кэшу окажется, что считанные
данные были изменены в базе данных,

•  закончится интервал времени в 20 минут,

•  данные будут изменены в базе данных.

Все считанные данные помещаются в последовательную очередь и, поскольку объем кэша ограничен, наиболее старые данные будут вытесняться из кэша последними считанными данными.

При повторном обращении к кэшу за данными уже считанного объекта будет анализироваться интервал времени, прошедший с момента появления данных в кэше.

Если обращение происходит в пределах 20 секунд после поступления данных в кэш, данные считаются верными (валидными). Если интервал превысил 20 секунд, будет выполняться проверка на то, что версия данных, хранящихся в кэше, соответствует версии данных, находящихся в базе данных. В случае если окажется, что версии данных не совпадают (т. е. произошло изменение данных в базе данных), данные, находящиеся в кэше будут удалены из него и

554

555

Краткий справочник разработчика

выполнено повторное считывание данных из базы данных. Начиная с этого момента начнется отсчет следующего 20-ти секундного интервала валидности этих данных.

Кроме всех вышеперечисленных событий, считанные данные будут удалены из кэша по истечении 20 минут после их последнего считывания из базы данных.

Таким образом при последовательном выполнении двух операторов (где «Номенклатура» - это ссылка на объект справочника):

А = Номенклатура. Наименование; В = Номенклатура. ВидНоменклатуры;

на выполнение второго оператора будет тратиться гораздо меньше времени, поскольку в первом случае будет выполняться обращение к базе данных, а во втором - чтение из оперативной памяти (кэша объектов).

Транзакционный кэш

Е

сли обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кэшу. Транзакционный кэш, по сути, представляет собой ту же последовательную очередь, что и обычный кэш, за исключением того, что все данные, находящиеся в транзакционном кэше, являются валидными (гарантированно актуальными). При считывании данных в транзакционный кэш устанавливается блокировка на данные в базе данных, поэтому они гарантированно не могут быть изменены до окончания транзакции.

Транзакционный кэш хранит считанные данные до тех пор, пока они не будут вытеснены более поздними считанными данными, или пока не закончится транзакция.

По окончании транзакции транзакционный кэш очищается, однако действия, выполняемые при этом, зависят от состояния завершения транзакции.

Если транзакция завершена успешно (Commit), данные всех объектов, содержащиеся в транзакционном кэше, переносятся в обычный кэш, а транзакционный кэш очищается.

Commit

Если был выполнен отказ от изменений (Rollback), то просто очищается транзакционный кэш.

Rollback

556

557

Краткий справочник разработчика

Получение представлений ссылочных объектов

П

ри использовании объекта вида Ссылка в элементах управления, для отображения его на экране всегда используется представление объекта (например, элемент справочника может иметь представление в виде наименования или в виде кода). Поскольку объект вида Ссылка содержит только внутренний идентификатор, выполняется обращение к кэшу объектов за получением представления ссылочного объекта. Если в кэше есть валидное представление - берется оно. Если в кэше есть валидные данные объекта - представление получается из них.

В остальных случаях выполняется чтение в кэш полей объекта, необходимых для формирования представления.

Аналогичный механизм используется при вызове функции:

А = Строка(СсылкаНаЭлементСправочникаНоменклатура);

а также при неявном преобразовании ссылочной переменной к типу Строка.

Теперь, если вспомнить нашу работу с конструктором выходной формы, лишний раз становится понятно, почему конструктор, при выборе ссылочного поля, всегда добавляет к списку выбранных полей представление этого поля. Именно для того, чтобы не выводить в ячейку табличного поля ссылку и не вызывать тем самым преобразования ссылочной переменной к типу Строка со всеми вытекающими отсюда действиями.

Виртуальные таблицы запросов

К

ак вы теперь знаете, при создании запроса система предоставляет нам в качестве источников данных некоторое количество виртуальных таблиц. Название «виртуальные» полностью соответствует их сути, поскольку эти таблицы, в свою очередь, также являются результатом запроса, который система формирует в момент выполнения соответствующего участка кода.

По большому счету разработчик может самостоятельно получить те же самые данные, которые система предоставляет ему в качестве виртуальных таблиц, однако алгоритм получения этих данных не будет оптимизирован в силу следующих двух причин.

Во-первых, все виртуальные таблицы параметризованы, т. е. разработчику предоставляется возможность задать некоторые параметры, которые система будет использовать при формировании запроса создания виртуальной таблицы. Примечательным здесь является то, что задание параметров виртуальной таблицы не всегда приводит к простой подстановке указанных разработчиком значений в текст запроса. В зависимости от того, какие параметры виртуальной таблицы указаны разработчиком, система может формировать РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной таблицы, причем эти запросы будут оптимизированы с точки зрения переданных параметров.

Во-вторых, не всегда разработчик имеет возможность получить доступ к тем данным, к которым имеет доступ система. Например, при использовании виртуальных таблиц регистров сведений, разработчику доступна, по большому счету, вся та же информация о данных регистров, которую использует система при формировании запроса виртуальной таблицы. Совсем иная картина с виртуальными таблицами регистров накопления, где система динамически формирует запрос в зависимости не только от переданных параметров, но и от периода рассчитанных итогов регистра, причем в запросе она использует данные рассчитанных итогов, которые просто не доступны для разработчика при создании запроса.

Конечно, разработчик может самостоятельно перебрать все записи регистра накопления и в итоге получить те же самые данные, которые система предоставляет в виде виртуальной таблицы, однако очевидно,

558

559

что такой запрос будет менее эффективным и потребует от
разработчика гораздо больше трудозатрат.

Манипулирование данными объектов

Н

есмотря на большое разнообразие объектов встроенного языка, предназначенных для работы с информационными структурами, создаваемыми на основе объектов конфигурации, лишь некоторые из объектов встроенного языка позволяют изменять данные, хранящиеся в этих информационных структурах. Такие объекты мы назовем объектами манипулирования данными.

Каждый тип объектов манипулирования данными имеет в конфигураторе соответствующий модуль, который называется либо модулем объекта, либо модулем набора записей, в зависимости от принадлежности к тому или иному объекту конфигурации. Для констант этот модуль называется модулем менеджера значений.

Так вот, модуль объекта манипулирования данными будет всегда выполняться при создании объекта манипулирования данными. Кроме этого, он будет всегда выполняться и при интерактивном обращении пользователя к самой структуре манипулирования данными, поскольку такое обращение будет вызывать создание соответствующего объекта манипулирования данными. Например, при открытии формы элемента справочника будет создаваться объект СправочникОбъект.<имя>.

В модуле объекта манипулирования данными, кроме всего прочего, могут быть описаны процедуры с ключевым словом Экспорт, что подразумевает вызов этих процедур как методов соответствующего объекта манипулирования данными. Здесь важно не путать объект манипулирования данными с другими объектами, позволяющими получить доступ к данным этой информационной структуры.

Например, если мы, для объекта конфигурации Справочник «Клиенты» опишем в модуле объекта процедуру:

Процедура Проверка() Экспорт

КонецПроцедуры;

560

561

Краткий справочник разработчика

Манипулирование данными объек!

то в дальнейшем сможем вызывать ее как метод объекта СправочникОбъект. Клиенты:

Клиент = Справочники. Клиенты. НайтиПоКоду(1)ПолучитьОбъект(); Клиент. Проверка();

Однако следующий код будет приводить к ошибке, т. к. объект СправочникСсылка. Клиенты не имеет метода «Проверка»:

Клиент = Справочники. Клиенты. НайтиПоКоду(1); Клиент. Проверка();

В следующей таблице представлен перечень объектов, позволяющих манипулировать данными. Как всегда, не бывает правил без исключений, и существует два таких исключения.

Во-первых, для констант указаны три объекта манипулирования
данными КонстантаМенеджерЗначения.<имя>,

КонстантаМенеджер.<имя> и КонстантыНабор. На самом деле манипулирование данными константы осуществляется при помощи объектаКонстантаМенеджерЗначения.<имя>.

Два других объекта - КонстантаМенеджер.<имя> и
КонстантыНабор - также позволяют изменять значения констант,
хранящиеся в базе данных, однако они, при выполнении своих
методов Установить() и Записать() вызывают создание объекта
КонстантаМенеджер.<имя>, который и выполняет

непосредственное изменение данных.

При выполнении метода Установить() объекта КонстантаМенеджер.<имя>, будет вызван модуль менеджера значения и обработчики событий ПриЗаписи() и ПередЗаписью() для изменяемой константы. При выполнении метода Записать() объекта НаборКонстант, модуль менеджера значения и соответствующие обработчики будут вызваны для каждой константы, входящей в набор.

Во-вторых, для регистра сведений указаны два объекта манипулирования данными. «В чистом виде» манипулирование данными регистра сведений осуществляется при помощи объекта РегистрСведенийНаборЗаписей.<имя>.

Однако существует возможность манипулирования записями
регистра сведений и при помощи объекта

РегистрСведенийМенеджерЗаписи.<имя>. Но объект

РегистрСведенийМенеджерЗаписи.<имя> работает с данными
регистра не напрямую, а через объект

РегистрСведенийНаборЗаписей.<имя>. Таким образом, модуль
набора записей, а также обработчики событий ПередЗаписью() и
ПриЗаписи() набора записей, будут отрабатывать и при
манипулировании объектом

РегистрСведенийМенеджерЗаписи.<имя>. Однако процедуры и функции, описанные в модуле набора записей с ключевым словом Экспорт, не будут доступны как методы объекта РегистрСведенийМенеджерЗаписи.<имя>.

562

563

 



Константы

Объекты встроенного языка для работы с константами:

*Заливкой выделен объект манипулирования данными

Узнай больше!

Про основные виды объектов встроенного языка можно прочитать в главе «Виды объектов встроенного языка, предназначенные для работы с данными прикладных объектов конфигурации» на странице 551.

КонстантыНабор - предоставляет возможность проведения операций чтения и записи сразу для группы констант, в частном случае - для всех констант. Также используется в форме констант для хранения, записи и считывания констант.

КонстантаМенеджерЗначения<имя> - используется для доступа к константе. Любая запись константы (интерактивно в форме, объекты КонстантыНабор и КонстантаМенеджер.<имя>) создает объект этого типа и производит запись с его помощью, что обеспечивает вызов модуля и обработчиков событий этого объекта.

565

Краткий справочник разработчика

Константы

Использование объектов:

// Константы

//Пример: Открыть основную форму констант

Форма = Константы. ПолучитьФорму(); Форма. Открыть();

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29