<<

стр. 9
(всего 11)

СОДЕРЖАНИЕ

>>

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




497
496
Общие приемы
Специальные приемы разработки

Запустите 1С:Предприятие в режиме отладки и проверьте работу
Создадим новый объект конфигурации «КритерийОтбора» с
критерия отбора:
именем «ОказаниеУслуги». На закладке «Данные» выберем тип
используемого критерия - СправочникСсылка.Клиенты.
На закладке «Состав» в качестве объектов, входящих в критерий,
Кнопка «Перейти» открывает форму списка критерия отбора...
выберем реквизит «Основание» документа «ОказаниеУслуги»:




Обратите внимание, что пункт меню «Перейти», формируемый
платформой автоматически, включил в себя команду открытия формы
списка созданного нами критерия отбора с установленным отбором по
На закладке «Формы» создадим основную форму списка при
текущему элементу справочника «Клиенты».
помощи конструктора.
Чтобы проиллюстрировать действия, выполняемые платформой
при открытии формы списка критерия отбора, создадим основную
форму списка справочника «Клиенты» и в командную панель формы
добавим кнопку «ДокументыКлиента».
Обработчик этой кнопки будет выглядеть следующим образом:

ПроцедураДействияФормыДокументыКяиента(Кнопка) ФормаКритерия =
КритерииОтбора.ОказаниеУслуги.ПолучитьФорму();
ФормаКритерия.Откршъ();
СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение;
СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение =
ЭлементыФормы.СправочникСписок.ТекущаяСтрока;
КонецПроцедуры


Этот обработчик открывает форму критерия отбора и затем
устанавливает значение единственного элемента отбора объекта


499
498
циальные приемы разработки
шальные приемы разработки

ссылке На
Глава 2. Формы
КритерийОтбораСписок.ОказаниеУслуги равным
элемент справочника. В этой главе мы собрали приемы работы, которые имеют
Запустите 1С:Предприятие в режиме отладки и проверьте работу отношение к формам объектов. Кроме этого в начале главы дается
краткое пояснение того, каким образом в системе 1С:Предприятие
нового пункта меню.
данные отображаются в формах.
Получение всех ссылок на все связанные документы дд я
дальнейшего их анализа программными средствами возможно при
помощи метода менеджера критерия отбора - Найти()
Проиллюстрируем это на примере.
Добавьте в обработчик события «При открытии» формы документа
«ОказаниеУслуги» следующие строки:

ПроцедураДействияФормыДокументыКлиента(Кнопка) ФормаКритерия =
КритерииОтбора.ОказаниеУслуги.ПолучитьФорму();
ФормаКритерия.Открыть();
СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение;
СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение =
ЭлементыФормы.СправочникСписок.ТекущаяСтрока;
МассивСсылок = КритерииОтбора.ОказаниеУслуги
.Найти(ЭлементыФормы.СправочникСписок.ТекущаяСтрока);
Для Каждого НужнаяСсылка из МассивСсылок цикл
СообщитьдаужнаяСсылка);
КонецЦикла;
КонецПроцедуры

Запустите 1С:Предприятие в режиме отладки и проверьте вывод
списка зависимых документов в окно сообщений.




501
500
Специальные приемы разработки Формы

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


В
различным, если в качестве источника данных этого поля указать
ажной особенностью платформы 1С:Предприятие gQ
реквизит формы с типом значения
является механизм представления данных в формах
СправочникСписок.Номенклатура или
Ключевым моментом здесь является то, что принадлежность
РегистрНакопленияСписок.ОстаткиКомплектующих. To же самое
формы к тому или иному объекту конфигурации никоим образом
справедливо и для элемента управления командная панель. При
не определяет состав данных, которые форма будет
установленном свойстве командной панели «Автозаполнение», смена
отображать. Например, можно создать общую форму, которая не будет
источника данных (а точнее говоря, источника действий) будет
подчинена ни одному из объектов конфигурации, но которая, в
приводить к изменению состава команд, которые отображает
зависимости от содержимого, будет либо отображать список
командная панель.
справочника, либо позволять редактировать документ. Однако такую
Возможность связать форму и элементы управления с различными
форму уже нельзя будет назначить основной для выполнения
данными является причиной того, что у формы и у элементов
определенных действий.
управления существует несколько расширений. Расширение
Форма сама по себе и ее элементы управления обособлены от
представляет собой набор дополнительных свойств, методов и
объектов конфигурации. Для того чтобы форма отображала какие-либо
событий, появляющихся у объекта. Наличие того или иного
данные, необходимо задать связь самой формы и большинства из ее
расширения определяется либо типом данных, которые отображает
элементов управления с данными. При использовании конструктора
объект, либо расположением его в других объектах.
форм, конфигуратор создает такие связи автоматически. Если
Рассмотрим этот механизм на примере элемента управления Поле
разработчик создает форму вручную - он может определить эти связи
ввода, расположенного в колонке «Вид номенклатуры» формы списка
путем задания свойств формы и элементов управления. В любом
справочника «Номенклатура»:
случае, эти связи могут быть изменены средствами встроенного языка
в процессе выполнения программы.
Связь формы и элементов управления с данными осуществляется
при помощи реквизитов формы. Список существующих реквизитов
формы доступен на закладке «Реквизиты» окна редактирования
формы.
Среди всех реквизитов формы, как правило, существует один
основной реквизит (он выделен жирным шрифтом). Основной реквизит
определяет источник данных для формы в целом. От типа значения
основного реквизита формы зависит не только то, какие данные будУт
отображены в элементах управления формы, но и поведение самой
формы. Например, если основному реквизиту формы указать тип
значения ДокументОбъект.ПриходнаяНакладная, то при закрытии
формы программа будет запрашивать подтверждение записи '
проведения документа. Если же основному реквизиту формы указать
тип значения СправочникСписок.Номенклатура, то подобного
подтверждения при закрытии формы возникать не будет.
Поскольку форма отображает данные объекта
СправочникСписок.Номенклатура, к свойствам, методам и


503
502
Формы
Специальные приемы разработки

Затем, поскольку данными, отображаемыми в табличном поле,
событиям объекта Форма добавляется расширение формы списка
будет список справочника «Номенклатура», к свойствам, методам и
справочника: событиям табличного поля добавляется расширение табличного поля
списка справочника. Но, поскольку это табличное поле расположено в
форме, к его свойствам, методам и событиям добавляется также и
расширение элементов управления, расположенных в форме:




В результате этого у формы появляются такие свойства как
ПараметрТекущаяСтрока, ПараметрВыборПоВладельцу и т.п.




505
504
Специальные приемы разработки


И в заключение, поскольку поле ввода будет отображать значение
должно содержать путь к данным. Путем к данным может являться
реквизита справочника типа Перечисление.ВидыНоменклатуры, к
либоимя реквизита формы, либо путь к одному из свойств реквизита
свойствам и событиям поля ввода добавляется расширение поля ввода
перечисления. А раз это поле ввода расположено в табличном поле, xo Например, если в форме существует элемент управления табличное
к его свойствам и событиям добавляется также расширение элементов поле, можно в качестве данных указать ему имя реквизита
управления, расположенных в табличном поле: У
Р ек ™
«СправочникСписок», которь1Й имеет тш
СправочникСписок.Номенклатура. значения




Теперь, когда мы представляем, что такое расширение, рассмотрим
более подробно расширение элементов управления, расположенных в
форме.
В числе прочего, это расширение добавляет элементам управлени
одно важное свойство - Данные. Это свойство имеет тип Строка


506
507
Специальные приемы разработки Формы

Таким образом свойство Данные позволяет связать элемент
Если на этой же форме разместить поле ввода, то его свойство
управления с теми данными, которые он должен отображать.
Данные может иметь значение
Следует заметить, что при определении свойства Данные в
СправочникСписок.Отбор.Ссылка.Значение.
конфигураторе, предоставляется возможность выбрать только из тех
реквизитов, которые имеют подходящий тип для отображения в
конкретном элементе управления.
Следующим важным свойством, которым обладают элементы
управления расположенные в форме, является свойство
«ТипЗначения». Это свойство содержит тип реквизита, данные
которого отображает элемент управления. При выборе в
конфигураторе значения свойства Данные, свойство Тип значения
заполняется автоматически, на основании типа выбранных данных.
При установленной связи с данными свойство Тип значения
становится недоступным для изменения. Однако, если связь с данными
не задана, можно изменять свойство Тип значения. Такой способ
используется иногда для связи элемента управления не с самими
данными, а с некоторым типом данных. Причем, если указать тип,
допускающий однозначный выбор данных (например,
СправочникСписок.Номенклатура), то эти данные даже будут
отображены в элементе управления.
В качестве примера можно создать форму, не имеющую ни одного
реквизита, разместить в ней табличное поле и указать, что его тип
значения будет равен СправочникСписок.Номенклатура. При
открытии этой формы в режиме 1С:Предприятия мы увидим, что
табличное поле содержит данные элементов справочника
«Номенклатура».
Говоря о связи элементов управления и данных, следует отдельно
упомянуть поле ввода, поскольку это элемент управления имеет одну
особенность - свойство ОграничениеТипа.
Использование этого свойства позволяет ограничить пользователя в
выборе возможных типов данных значений, вводимых в поле ввода.
Например, если реквизит формы имеет составной тип данных:
• Число,
• Строка,
• Дата,
• СправочникСсылка.Клиенты,
• СправочникСсылка.Сотрудники,


508 509
Специальные приемы разработки Формы

Интересной особенностью здесь является то, что типы данных,
СправочникСсылка.Номенклатура,
заданные в свойстве ОграничениеТипа поля ввода, могут не совпасть
то можно ограничить пользователя лишь возможностью ввода с типом данных реквизита, отображаемого в поле ввода.
значений примитивных типов: Например, как в приведенном выше примере, когда в реквизите
уже хранится значение типа СправочникСсылка.Клиенты. В этом
• Число,
случае ограничение типа будет игнорироваться, т.е. тип отображаемых
• Дата, данных будет обладать «большим весом», чем поле ввода, эти данные
• Строка: отображающее. Такое решение вполне логично, поскольку именно
реквизит содержит данные, а поле ввода - всего лишь инструмент для
их отображения.




511
510
[ециальные приемы разработки Формы

Таким образом мы определили, какие данные будут содержаться в
Связанные списки нижнем списке, осталось только установить между двумя списками



П
связь таким образом, чтобы при изменении выбранного элемента в
ри создании прикладных решений часто возникает
верхнем списке, содержимое нижнего списка менялось
необходимость разместить на одной форме несколько соответствующим образом.
списков, информация в которых должна быть логически
Для этого откроем палитру свойств добавленного нами табличного
связана между собой.
поля и воспользуемся свойством «Связь по регистратору». Связь по
Одним из распространенных примеров является необходимость
регистратору мы будем устанавливать с обработчиком события «При
отобразить в форме списка документов движения, которые имеются в активизации строки» верхнего поля «ДокументСписок»:
каком-либо регистре. В этом случае требуется в одном списке
отобразить перечень документов, а в другом - движения того
документа, который выбран в первом списке. Установим связь по регистратору...
Рассмотрим вариант создания такой связи между списками на
\
примере списка документа «ПриходнаяНакладная», в котором будут
отображаться движения документа по регистру «ОстаткиМатериалов».
Откроем конфигуратор и создадим основную форму списка
документа «ПриходнаяНакладная». Уменьшим высоту табличного
поля списка документа и на освободившемся пространстве
расположим табличное поле с именем «ТабличноеПоле» и типом
РегистрНакопленияСписок.ОстаткиМатериалов:

Добавим на форму табличное поле...




513
512
Специальные приемы разработки
Фс

Теперь запустим 1С:Предприятие в режиме отладки и проверим Чтобы выполнить этот пример, уберем для нижнего табличного
работу связанных списков: поля связь по регистратору, а для верхнего создадим обработчик
события «При активизации строки»:

ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)
ЭлементыФормы.ТабличноеПоле.Значение.Отбор.Регистратор
.Установить(Элемент.ТекущаяСтрока, Истина);
КонецПроцедуры




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




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




514 515
Специальные приемы разработки Формы

После того, как мы укажем заголовок первой кнопки - «Остатки
Изменение источника данных табличного материалов» - система автоматически сформирует имя этой кнопки
«ОстаткиМатериалов». Отметим, что эта кнопка будет первой в
поля группе, и напишем подсказку - «Отобразить движения по регистру


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




Откроем палитру свойств кнопки «ОстаткиМатериалов» и укажем,
что тип выбираемого значения будет Строка, а выбираемое значение
будет равно «Остатки».
По умолчанию все кнопки имеют тип выбираемого значения Число
и выбираемое значение 0, поэтому для того, чтобы можно было
анализировать состояние группы переключателей, необходимо для
каждой кнопки в этой группе задать уникальное выбираемое значение.
Кроме этого, одна из кнопок в группе всегда должна быть первой в
группе - именно по ее значению можно будет определить состояние
группы, а переключение кнопок в группе будет выполняться в порядке
обхода элементов управления формы (Форма | Порядок обхода). По
умолчанию установлен автопорядок обхода элементов формы
(свойство формы «Автопорядок обхода»). Поэтому если вам


517
516
Специальные приемы разработки

В этой процедуре, в зависимости от значения переключателя, мы
понадобится установить собственный порядок обхода элементов
выбираем тот или иной источник данных для табличного поля. После
формы, это свойство нужно отключить и тогда станет доступен выбора источника необходимо выполнить метод СоздатьКолонки()
соответствующий пункт меню. для того, чтобы удалить старые колонки табличного поля и загрузить
Сейчас нас устраивает автоматический порядок обхода элементов новые колонки из источника данных табличного поля.
и поэтому мы создадим обработчик события «ПриОткрытии» формы,
Откройте 1С:Предприятие в режиме отладчика и проверьте работу
и зададим в нем начальное значение нашего переключателя: списка документа «ПриходнаяНакладная».

Процедура ПриОткрытии()
ОстаткиМатериалов = "Остатки";
КонецПроцедуры;

Теперь добавим в форму новый реквизит, который будет являться
вторым источником данных для нашего табличного поля. Назовем его
«РегистрСписок» и установим его тип
РегистрНакопленияСписок.СтоимостьМатериалов:




его тип
Укажем
РегистрНакопленияСписок.СтоимостьМатериалов.
В заключение создадим процедуру обработки события «При
изменении» для кнопки «Остатки материалов»:

ПроцедураОстаткиМатериаловПриИзменении(Элемент)
Если ОстаткиМатериалов = "Остатки" Тогда
ЭлементыФормы.ТабличноеПоле.Данные = "ТабличноеПоле";
иначе ЭлементыФормы.ТабличноеПоле.Данные = "РегистрСписок";
КонецЕсли;
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
ДокументСписокПриАктивизацииСтроки(ЭлементыФормы.ДокументСписок);
КонецПроцедуры




519
518
Специальные приемы разработки
Формы

Под переключателем расположим табличное поле с именем
Изменение данных табличного поля путем «ТабличноеПоле», типом ТаблицаЗначений и пустым свойством
Данные:
установки типа значения

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




Создадим процедуру обработки события «При открытии» формы и
установим в ней начальное значение переключателя и начальное
содержимое табличного поля:

Процедура ПриОткрытии()
ОстаткиМатериалов = "Остатки";
Массив = Новый Массив;
Массив.Добавить(Тип("РегистрНакопленияСписок.ОстаткиМатериалов"));
НашеОписание = Новый ОписаниеТипов(Массив); ТабПоле =
ЭлементыФормы.ТабличноеПоле; ТабПоле.ТипЗначения = НашеОписание;
ТабПоле.СоздатьКолонки();
ТабПоле.Значение.Отбор.Регистратор.Установить(, Истина);
КонецПроцедуры
Зададим следующие выбираемые значения переключателей:
В этой процедуре, в зависимости от выбранного значения
• «ОстаткиМатериалов» - «Остатки»,
переключателя мы создаем объект ОписаниеТипов, содержащий
• «СтоимостьМатериалов» - «Стоимость»,
нужный нам тип данных. Затем указываем этот объект в качестве
• «Продажи» - «Продажи».
значения свойства ТипДанных табличного поля. После создания
колонок поля мы устанавливаем использование отбора по значению


520 521
Формы
Специальные приемы разработки

Теперь осталось только создать обработчик события
регистратора, которое, по умолчанию, не определено. Это позволит хПриАктивизацииСтроки» табличного поля «ДокументСписок»:
нам избежать отображения в табличном поле полного списка регистра
в момент открытия формы.
ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)
Затем создадим процедуру обработки события «ПриИзменении» НашОтбор = ЭлементыФормы.ТабличноеПоле.Значение.Отбор;
переключателя, в которой, в зависимости от установленного значения Если Элемент.ТекущиеДанные = Неопределено Тогда
НашОтбор.Регистратор.Установить(, Истина);
переключателя, будем изменять свойство ТипЗначения табличного Иначе
поля: НашОтбор.Регистратор.Установить(Элемент.ТекущаяСтрока, Истина);
КонецЕсли; КонецПроцедуры
ПроцедураОстаткиМатериаловПриИзменении(Элемеит)
Если ОстаткиМатериалов = "Остатки" тогда В этой процедуре мы просто управляем отбором нижнего
НужныйТип = Тип("РегистрНакопленияСписок.ОстаткиМатериалов");
табличного поля в зависимости от содержимого верхнего поля.
ИначеЕсли ОстаткиМатериалов = "Стоимость" тогда
Запустите 1С:Предприятие и проверьте работу списка документа
НужныйТип = ТипС'РегистрНакопленияСписок.СтоимостьМатериалов");
«ОказаниеУслуги».
ИначеЕсли ОстаткиМатериалов = "Продажи" тогда
НужныйТип = Тип("РегистрНакопленияСписок.Продажи");
КонецЕсли;

Массив = Новый Массив();
Массив.Добавить(НужныйТип);
НашеОписание = Новый ОписаниеТипов(Массив);

ТабПоле = ЭлементыФормы.ТабличноеПоле;
ТабПоле.ТипЗначения = НашеОписание;
ТабПоле.СоздатьКолонки();

НашОтбор = ТабПоле.Значение.Отбор;
ЗначениеОтбора = ЭлементыФормы.ДокументСписок.ТекущаяСтрока;
НашОтбор.Регистратор.УстановитьСЗначениеОтбора, Истина);
КонецПроцедуры

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




523
522
Формы
Специальные приемы разработки

ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
АктуальнаяЦена = РегистрыСведений.Цены
Вычисляемые колонки в списках .ПолучитьПоследнее(, ОтборНоменклатуры.Цена;



Н
ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;
еобходимость вывода произвольных данных в колонках
списка возникает, когда вместе с элементом списка нужно //низкие цены выделим другим цветом
отобразить некоторую вычисляемую информацию. Если АктуальнаяЦена<500 тогда
ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WEBЦвета.Васильковый;
Мы рассмотрим эту ситуацию на примере отображения КонецЕсли; КонецЕсли; КонецПроцедуры
актуальной цены в списке справочника «Номенклатура».
Откроем в конфигураторе форму списка справочника Обработчик события табличного поля «При выводе строки»
«Номенклатура» (или, если ее нет, создадим основную форму списка). передает три параметра: «Элемент» - само табличное поле, для
Воспользуемся контекстным меню правой кнопки мыши и добавим в которого было вызвано это событие, «ОформлениеСтроки» - объект,
табличное поле колонку с именем и текстом шапки «Цена»: содержащий оформление выводимой строки табличного поля и
«ДанныеСтроки» - элемент выборки справочника «Номенклатура»,
отображаемый в выводимой строке.
Первое, что мы делаем в этом обработчике - проверяем, что
В табличное поле списка справочника Номенклатура добавим колонку Цена...
выводимый элемент справочника не является группой. В этом случае
мы создаем вспомогательную структуру для описания отбора
(«ОтборНоменклатуры») и помещаем в ячейку «Цена» актуальное
значение цены, полученной из периодического регистра сведений
«Цены».
Затем мы анализируем значение выведенной цены и если оно
находится в нижнем ценовом диапазоне (менее 500 рублей), выделяем
это значение васильковым цветом. Для указания цвета мы используем
системный набор значений WEBL4BeTa.
Запустим 1С:Предприятие в режиме отладки и посмотрим, какой
внешний вид примет теперь справочник «Номенклатура»:




Создадим обработчик события табличного поля «При выводе
строки», и добавим в него следующий текст:

Процедура СправочникСписокПриВыволеСтроки(Элемент, ОформлениеСтр(
ДанныеСтроки)
//для элементов отобразим цену и ...
Если Не ДанныеСтроки.ЭтоГруппа тогда ОтборНоменклатуры = Новый
Структура; ОтборНоменклатутш.ВставитьС'Номенклатура",
ДанныеСтроки.Ссылка);

525
524
^^v



Специальные приемы разработки Формы

При использовании обработчика события «При выводе строки»
Оформление строк табличного поля
нужно быть крайне внимательным и всегда стараться минимизировать


О
обращения к данным, которые не содержатся в параметре дним из полезных свойств элемента управления «Табличное
«ДанныеСтроки». поле» является возможность настройки оформления его
Дело в том, что обработчик этого события вызывается каждый раз строк программным способом.
при возникновении необходимости перерисовки видимой области Для иллюстрации этой возможности мы снова воспользуемся
табличного поля и отрабатывает столько раз, сколько строк содержит формой справочника «Номенклатура» и придадим ей «нестандартный»
видимая область. Необходимость перерисовки видимой области вид.
табличного поля возникает в результате многих событий, связанных
Откроем в конфигураторе форму списка справочника
как с самим табличным полем, так и с формой. Если проанализировать
«Номенклатура» и создадим обработчик события формы «При
работу обработчиков событий формы и табличного поля, можно
открытии» со следующим текстом:
увидеть, что простое добавление новой строки в табличное поле
вызовет, скорее всего, не одну, а несколько перерисовок табличного
поля. Процедура ПриОткрытии()
СписокСправочника = ЭлементыФормы.СправочникСписок;
Поэтому обращение в этом обработчике не к данным строки, а к
данным, содержащимся в базе данных (получение значений через //задать режим чередования цветов строк
точку, обращение к итогам регистров и т.д.), может сильно замедлить СписокСправочника.ЦветФонаЧередованияСтрок = WЕВЦвета.Бежевый;
СписокСправочника.ЧередованиеЦветовСтрок = Истина;
вывод формы на экран. Возможно, в некоторых случаях следует
отказаться от создания вычисляемых колонок в списках, и выводить //скрыть линии сетки
вычисляемые данные только для текущей строки списка в СписокСправочника.ВертикальныеЛинии = Ложь;
дополнительные поля, расположенные на форме. СписокСправочника.ГоризонтальныеЛинии = Ложь;
КонецПроцедуры


Вначале мы задаем режим чередования цветов фона строк списка.
Первая строка будет выводиться на бежевом фоне, вторая на белом,
третья снова на бежевом и т.д.
Затем мы скрываем линии разделяющие колонки и строки.
Теперь откроем обработчик события «ПриВыводеСтроки»
табличного поля списка справочника, и добавим в него следующие
строки:

Процедура СправочиикСписокПриВыводеСтроки(Элемент,ОформлениеСтрокн,
ДанныеСтроки)
//для элементов отобразить цену и...
Если Не ДанныеСтроки.ЭтоГруппа тогда
ОтборНоменклатуры = Новый Структура;
ОтборНоменклатуры.Вставить("Номенклатура\ДанныеСтроки.Ссьшка);
ОфорилениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
АктуальнаяЦена = РегистрыСведений.Цены
_ ______________ .ПолучитьПоследнее(, ОтборНоменклатурыЩена; ___________



526 527
Специальные приемы разработки


ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;
Часть IV. Краткий справочник
//низкие цены выделим другим цветом
разработчика
Если АктуальнаяЦена<500 тогда
ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WЕВЦвета.Васильковый;
КонецЕсли;
Заключительная часть нашей книги содержит набор кратких
//... раздвинуть строку если длинное наименование
справочных статей и описаний групп обьектов встроенного языка
Если СтрДлина(СокрЛП(ДанныеСтроки.Наименование))>30 Тогда
используемых для работы с теми или иными данными базы данных '
ОформлениеСтроки.Ячейки.Наименование.АвтоВысотаЯчейки = Истина;
ОформлениеСтроки.Ячейки.Наименование.ВысотаЯчейки = 3; КонецЕсли;
КонецЕсли; КонецПроцедуры


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




528
529
Стандарты именования переменных, процедур и объектов конфигура


Именование переменных-флагов


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

Ф
следует называть так, как называется истинное значение
ирма «1С» использует ряд стандартов, регламентирующих этого флага.
порядок разработки типовых конфигураций на платформе
Например, если нужна переменная, в которой хранится признак
«1С:Предприятие 8.0». В этой главе мы дадим некоторые
наличия ошибок в процедуре, то такая переменная должна называться
выдержки из этих стандартов, которые касаются
«ЕстьОшибки». Или если есть признак того, что товар относится к
формирования имен объектов конфигурации, переменных, процедур,
возвратной таре, то такой признак должен называться «ЭтоТара».
функций, элементов управления и т. д.
Правила образования имен процедур (функций)
Правила образования имен переменных

И
И
мена процедур в общем случае, следует образовывать от
мена переменных (параметров) следует образовывать от
глаголов неопределенного вида, например:
терминов предметной области. При именовании переменных
следует использовать только термины, используемые в
документации к 1С:Предприятию 8.0 или в методических материалах правильно ПроверитьДублиСтрок(),
фирмы «1С» по 1С:Предприятию 8.0.
неправильно ПроверкаДублейСтрок();
Из имени переменной должно быть понятно ее назначение. Имена
следует образовывать путем «склеивания» слов - удаления пробелов
правильно ЗагрузитьКонтрагента(),
между словами. Каждое отдельное слово в «склеенном» имени
пишется с прописной буквы. Предлоги и местоимения из одной буквы неправильно ЗагрузкаКонтрагента().
также пишутся прописными буквами.
Имена процедур и функции должны давать представление о
Например: характере выполняемых процедурой (функцией) действий.

Примеры хороших имен:
работа с каталогом - РаботаСКаталогом
количество пачек в коробке - КоличествоПачекВКоробке ПроверитьДублиСтрок(),
ПодобратьВидРасчета(),
Имена переменных не следует начинать с подчеркивания. ПолучитьИнформациюОПроводке()
Имена переменных ни в коем случае не должны состоять из одного
символа. Использование коротких имен переменных допускается
Примеры плохих имен:
только для счетчиков циклов.
OK(), Есть(), ЕщеФлажки(), НамПодходит().




531
530
^Стандарты именования переменных, процедур и объектов конфигуряни,,
Краткий справочник разработчика


Для имен командных панелей табличных частей формы
Именование функций-флагов


Ф
используется префикс «КоманднаяПанель»+ИмяТабличнойЧасти,
ункции, которые предназначены для проверки чего-либо, и например, «КоманднаяПанельСпецификация».
возвращают в качестве результата проверки булево
Элементы управления, связанные с данными, называются так же,
значение, следует именовать так, как называется результат
как данные.
проверки, имеющий тип Истина.
Например, если функция должна проверить наличие дублей строк в
Общие требования к имени объекта конфигурации


И
табличной части документа, то она должна называться
мя объекта надо стремиться строить на основе синонима
«ЕстьДублиСтрок». Или если функция должна проверить
объекта так, как это делает система автоматически: пробелы и
принадлежность документа к накладным, то она должна называться
пр. недопустимые символы удаляются, первые буквы слов
«ЭтоНакладная».
делаются заглавными. Сокращения слов (относительно
Однако, если функция (или процедура) «ЕстьДублиСтрок» и синонима) допускаются только в крайних случаях, при этом
проверяет наличие дублей строк, и выполняет объединение необходимо, чтобы по сокращению можно было восстановить слово
дублирующих строк, при этом не возвращает значения, ее следует обратно. В случае длинных синонимов последние слова могут быть
именовать «СвернутьДублиСтрок». опущены, ели это не искажает смысла.
Для реквизитов объектов допускается переставлять слова из
Имена обработчиков событий


И
синонима местами, например: синоним «Полное наименование», имя
спользуются имена процедур - обработчиков событий, «НаименованиеПолное».
формируемые системой автоматически:
Для ведущих объектов подобное не допускается.
<имя элемента управления> + <название события>
Общие требования к синониму объекта конфигурации


С
иноним объекта должен быть определен так, чтобы
Имена по умолчанию формируются при нажатии «лупы» около
осмысленно описывать объект. Сокращения допускаются
события в окне свойств реквизита диалога.
только общепринятые, например, «ОКЕИ», «ИНН». Следует
По таким же правилам следует образовывать имена обработчиков
избегать излишне длинных синонимов, но и укорачивать их с потерей
самостоятельно. смысла тоже плохо. Синоним начинается с большой буквы, точки
ставятся только после сокращений.
Правила образования имен элементов управления
Для ведущих объектов метаданных необходимо стремиться к тому,
Имена надписей образуются по следующим правилам:
чтобы название объекта в меню, подпись в диалоговых формах
совпадали с синонимом или, как минимум, начинались с него.
• - если надпись относится к элементу управления, имя
Для реквизитов объектов подписи в диалогах могут отличаться «в
составляет как «Надпись»+ ИмяЭлементаУправления;
силу обстоятельств» - синоним надо подбирать так, чтобы он
• - в остальных случаях им составляется как
осмысленно описывал реквизит в возможных универсальных формах.
«Надпись»+ИмяНадписи.
Для форм синоним должен начинаться со слов, генерируемых
Для именрамок используется префикс «Рамка». Для командной
конструктором при создании формы («Форма списка...», «Форма
панели формы используется префикс «КоманднаяПанель». элемента...» и т. д.), далее, в случае наличия нескольких форм одного


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


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



П
Для макетов унифицированных форм синоним должен состоять из
ри первом знакомстве с системой 1С:Предприятие может
названия формы, например: «ТОРГ-12».
возникнуть естественный вопрос: если у нас есть две
конфигурации: одна, которую можно редактировать, и
Общие требования к комментарию объекта
другая, с которой работают пользователи, то почему же
конфигурации тогда основной называется редактируемая конфигурация? Ведь с


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




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


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


Ч
то такое объект, применительно к 1С? Этот вопрос зачастую
конфигурация находится на поддержке одновременно у нескольких
ставит в тупик не только начинающих разработчиков, но и
поставщиков, каждый из которых поддерживает только свою часть в
людей, имеющих определенный опыт разработки на
виде отдельной конфигурации. В этом случае информационная база
платформе 1С.
будет хранить несколько конфигураций поставщиков (состояние
предыдущей поставки для каждого поставщика отдельно). Основная трудность заключается в том, что всегда нужно ясно
Файлы новой поставки могут существовать в виде файлов представлять себе, в каком контексте употребляется этот термин.
конфигураций (полная поставка) и файлов обновлений (поставка Как правило, термин объект употребляется в одном из трех
обновлений). контекстов:
Хранилище конфигурации содержит конфигурацию,
• конфигурация,
предназначенную для групповой разработки. Эта конфигурация
• база данных,
хранится не в виде единой конфигурации, а в виде отдельных объектов
• встроенный язык,
в разрезе версий конфигурации. Таким образом, мы можем получить
из хранилища конфигурацию любой версии - для этого она
Говоря о конфигурации, термином объект конфигурации мы
«собирается» из объектов нужной версии.
обозначаем некоторую совокупность описания данных и алгоритмов
Теперь представьте, что между всеми этими видами конфигураций работы с этими данными. Например, в конфигурации может
существует возможность сравнения и обновления конфигураций. В существовать объект справочник «Сотрудники».
этом случае очень легко запутаться и название Основная конфигурация
На основании каждого объекта конфигурации в базе данных
как нельзя лучше отражает конечную цель всех изменений.
создается информационная структура, в которой будут храниться
данные.
Так вот, когда мы говорим о базе данных, термином объект мы
обозначаем всего лишь некий элемент такой информационной
структуры. Характерной особенностью такого элемента является то,
что на него (как на совокупность данных) существует ссылка, которая
может являться значением какого либо поля другой информационной
структуры.
Например, в базе данных существует справочник «Сотрудники» в
котором есть сотрудник Иванов. В этом случае элемент справочника,
содержащий информацию о сотруднике Иванов, будет являться
объектом базы данных. И если в документе «ПриходнаяНакладная»
будет существовать реквизит «ОтветственноеЛицо», то тип значения
этого реквизита будет ссылка на объект базы данных, т.е. на элемент
справочника, содержащий информацию об Иванове.
Если же мы начинаем говорить о встроенном языке и о том, каким
образом средствами встроенного языка работать со справочниками, то



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

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



И
Существует целый ряд объектов встроенного языка, позволяющих
нтересно обратить внимание на разницу в употреблении
работать со справочниками (СправочникиМенеджер
единственного и множественного числа при именовании
СправочникМенеджер^имя>, СправочникСсылка.<имя> и т.д.)'
объектов вида «Справочник» и объектов вида «Документ».
Среди них есть один объект, который предоставляет доступ к объекту
Если вы откроете дерево типовой конфигурации, то увидите, что все
справочника в базе данных - СправочникОбъект.<имя>.
объекты, расположенные в ветке «Справочники», как правило,
именованы во множественном числе. В ветке же «Документы» все
объекты, как правило, именованы в единственном числе. Может
сложиться впечатление что, создавая объект «Справочник», мы
создаем «хранилище» для записей этого справочника, а, создавая
«Документ», мы создаем некий шаблон этого документа. На самом
деле это не так.
Создавая в конфигураторе объект вида «Справочник» мы даем ему
наименование во множественном числе («Товары»), подразумевая тем
самым, что в базе данных этот объект будет состоять из записей,
каждая из которых описывает один товар (в единственном числе).
Создавая в конфигураторе объект вида «Документ» мы даем ему
наименование в единственном числе («Приходная накладная»), однако
на самом деле мы создаем такое же «хранилище», как и в случае со
справочником. Каждая запись этого «хранилища» будет описывать
одну приходную накладную (в единственном числе). Поэтому
концептуально правильно было бы в конфигураторе задавать
наименование объекта вида «Документ» во множественном числе,
подчеркивая тем самым описание набора документов этого вида
(например, «Приходные накладные»).
Однако, психология человека такова, что, открывая ветку
«Документы», он ожидает увидеть перечисление их в единственном
числе, а никак не во множественном. Так происходит потому, что в
реальной жизни трудно найти подходящий термин для описания
совокупности документов одного вида (совокупность записей одного
вида обозначить гораздо проще - справочник, план и т.д.). Поэтому
соответствующая ветка объектов конфигурации имеет название
«Документы», а объекты, создаваемые в этой ветке, именуются в
единственном числе, хотя, по сути, сама ветка содержит описания
«хранилищ» документов разных видов, а каждый элемент в этой ветке
описывает набор всех документов одного вида.




538 539
Концепция оперативного и неоперативного
Понятие момента времени
проведения документов
Д ля определения положения документа на оси времени


П
используется реквизит документа «Дата». Дата содержит время с ри разработке конфигураций на платформе 1С:Предприятие 8.0
точностью до секунды. Это позволяет контролировать принято использовать концепцию оперативного и
последовательность записи документов. Однако при большом объеме неоперативного проведения документов.
создаваемых документов вероятна ситуация, когда несколько Эта концепция подразумевает, что работа пользователей
документов будут иметь одинаковое значение даты (т.е. будут созданы может происходить в двух принципиально разных, по своей сути,
в течение одной секунды). Как в этом случае определить режимах.
последовательность созданных документов?
Оперативное проведение документов пользователями выполняется
Для обработки подобных ситуаций было введено понятие момент
в режиме «реального времени», т.е. отображает изменения, факты,
времени. Момент времени представляет собой совокупность даты, свершающиеся в настоящее время. Оперативное проведение особенно
времени и ссылки на объект базы данных. Момент времени позволяет актуально при многопользовательской работе. Поэтому при
однозначно идентифицировать любой объект ссылочного типа базы оперативном проведении документов следует осуществлять максимум
данных на оси событий, но имеет смысл, в основном, только для проверок, способных исключить ошибки при вводе данных
документов. Кроме того, момент времени позволяет пользователями. Например, при оперативном проведении следует
идентифицировать и не объектные данные, например, записи выполнять контроль остатков на складе списываемой номенклатуры с
регистров, подчиненных регистратору. тем, чтобы исключить одновременную продажу одного товара
Понятие момента времени реализовано во встроенном языке при несколькими продавцами.
помощи универсального объекта МоментВремени. Этот объект имеет Неоперативное проведение документов подразумевает отражение в
свойства «Дата» и «Ссылка», которые позволяют получить базе данных фактов, которые свершились в прошлом, или которые
«составляющие» момента времени, и один метод - Сравнить(), при точно будут совершены в будущем. Поэтому задача неоперативного
помощи которого возможно сравнение двух моментов времени между проведения документов заключается в том, чтобы просто отразить в
собой. Кроме этого объект МоментВремени имеет конструктор и информационной базе данные о совершенных операциях.
может быть создан в явном виде для любого объекта базы данных
При неоперативном проведении документов не производится ряд
ссылочного типа. проверок, в частности контроль остатков. Подразумевается, что если в
Для нескольких документов, имеющих одинаковую дату и время, процессе неоперативного проведения документов были допущены
последовательность их на оси событий определяется системой исходя ошибки (например, списано такое количество номенклатуры, которого
из ссылок на эти документы, может не совпадать с нет на складе), то анализ полученного состояния базы данных является
последовательностью создания документов, и не доступна для отдельной задачей, не относящейся к неоперативному проведению и
изменения пользователем. выполняющейся отдельно от него.
Таким образом, оперативное проведение служит для того, чтобы в
реальном режиме многопользовательской работы определить
возможность или невозможность выполнения той или иной операции
(и выполнить ее, если возможно), а неоперативное проведение служит
для безусловного отражения в базе операций, которые уже были
совершены (или точно будут совершены).




541
540
Механизмосновныхф»гм

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


У
определив ее в качестве основной формы регистра. Но для логики
всех прикладных объектов конфигурации существует
работы системы это не будет иметь принципиального значения
некоторое количество основных форм. Они служат для
отображения данных объекта в том или ином виде. Если
разработчик не назначит в качестве основных форм объекта свои
собственные, система будет генерировать необходимые формы
объекта самостоятельно, в те моменты, когда к ним происходит
обращение. Наличие такого механизма позволяет разработчику не
тратить время на создание форм для тестирования своей разработки, а
воспользоваться тем, что платформа создаст по умолчанию.
Создание этих форм происходит динамически, в процессе работы
системы. Форма создается в тот момент, когда к ней происходит
обращение. Причем не важно, интерактивное это обращение или
программное. Так для констант форма будет создана как при
интерактивном выборе в меню Операции | Константы, так и при
программном вызове метода ПолучитьФорму() объекта
КонстантыМенеджер:

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


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


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



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

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



544 545
Обработчики событий События, связанные с формой

П С
ри работе с событиями в платформе 1С:Предприятие 8.0, обытия, обрабатываемые формой, довольно разнообразны и на
следует различать два типа событий: события, связанные с них стоит остановиться отдельно.
формой и элементами управления, расположенными в
Во-первых, для формы доступна обработка событий,
форме, и все остальные события. связанных с изменением данных как самой формы, так и подчиненных
Разница заключается в том, что обработчики событий, связанных с форм. Поскольку данные формы могут быть самыми различными,
формой и элементами управления, расположенными в форме определена только категория этих событий, но сами события
назначаемые, а обработчики всех остальных событий определяются путем программного назначения обработчика
фиксированные. конкретного события. Для этого используется метод объекта Форма -
Фиксированный обработчик события должен иметь имя, ПодключитьОбработчикИзмененияДанных() (есть и обратный
совпадающие с именем события - только в этом случае он будет метод - ОтключитьОбработчикИзмененияДанных()). В параметрах
вызываться при возникновении соответствующего события. этого метода передается имя обработчика данных, а также путь к
данным, изменение которых будет отлеживаться этим обработчиком.
Назначаемый обработчик может иметь произвольное имя, и если
имя процедуры совпадает с именем события формы или элемента
управления - этого совсем не достаточно для того, чтобы процедура " Узнай больше!
вызывалась для обработки события с таким именем. Требуется явное В случае, когда в форме объекта редактируются дополнительные,
назначение этой процедуры обработчиком этого события. Таким логически связанные данные, существует два способа для
образом любая процедура, расположенная в модуле формы может отслеживания изменения объекта и синхронизации этих данных:
быть назначена обработчиком любого события (или сразу нескольких 1. Для синхронизации данных, которые изменяются и
событий) формы или элемента управления, расположенного в форме. записываются синхронно с объектом, нужно использовать событие
Имя обработчика в этом случае не имеет значения, важно лишь то, что расширения формы объекта - «ПриИзмененииДанных».
он назначен обрабатывать какое-либо событие. Примером таких данных могут служить наборы записей
регистров у документа, или картинка у справочника.
Назначение обработчика может выполняться интерактивно, при
2. Для синхронизации данных, которые редактируются и
работе с формой в конфигураторе, или программно, используя методы
записываются отдельно от самого объекта, нужно использовать
формы и элементов управления - УстановитьДействие().
обработчик события изменения данных назначенный на изменения
ссылки объекта.
Например, для формы справочника валют, в котором
редактируется список курсов валюты, он может выглядеть
следующим образом:

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




546 547
Краткий справочник разработчика События, связанные с фор»

Сам же обработчик «ПриИзмененииСсылки()» будет выглядеть В заключение следует отметить одну интересную особенность в
обработке события модуля приложения
следующим образом:
ОбработкаВнешнегоСобытия(). Это событие возникает при посылке
внешним приложением сообщения, сформированного в специальном
ПроцедураПриИзмененииСсылки(Путъ)
формате. Так вот, внешнее событие сначала будет предложено
СписокКурсов. Отбор.Валюта. Установить{Ссылка);
обработать всем открытым формам (по событию
КонецПроцедуры.
ВнешнееСобытие()), а затем уже это внешнее событие может быть
обработано обработчиком модуля приложения.
Также для объекта Форма существует возможность указать
обработчик ожидания, который будет вызываться в период ожидания
системы каждый раз по истечению указанного интервала времени. Для
этого используется метод ПодключитьОбработчикОжидания()
(соответственно обратный метод
ОтключитьОбработчикОжидания()). В параметрах этого метода
передается имя обработчика и интервал, с которым он будет
вызываться.
Кроме этого существует ряд событий, позволяющих формам
взаимодействовать друг с другом.
Прежде всего это события, связанные с подчиненностью одной
формы другой.
Во-первых, форма может обрабатывать событие
ОбработкаАктивизацииОбъекта(), которое возникает при
изменении активного объекта в одной из подчиненных форм или при
вызове в одной из подчиненных форм метода
ОповеститьОбАктивизацииОбъекта().
Во-вторых, форма может обрабатывать событие
ОбработкаВыбора(), которое возникает при выборе объекта в одной
из подчиненных форм или при вызове в одной из подчиненных форм
методаОповеститьОВыбореОбъекта().
В-третьих, форма может обрабатывать событие
ОбработкаЗаписиНовогоОбъекта(), которое возникает при записи
объекта в одной из подчиненных форм или при вызове в одной из
подчиненных форм метода ОповеститьОЗаписиНовогоОбъекта().
Но кроме этих трех событий существует еще одно событие объекта
Форма, которое позволяет взаимодействовать не только подчиненным,
но вообще любым открытым формам. Это событие
ОбработкаОповещения(), которое возникает при оповещении всех
открытых форм методом глобального контекста Оповестить().



548 549
Виды объектов встроенного языка,
Способы работы с коллекцией

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


Д
Существуют общие принципы работы с любой коллекцией. Во-
ля обеспечения доступа к информационным структурам базы
первых, доступ к каждому объекту коллекции возможен путем данных встроенный язык содержит набор унифицированных
перебора элементов коллекции в цикле. Для этого используется объектов. Их можно разделить на несколько видов, в
конструкция языка Для Каждого из... Цикл ...: зависимости от их назначения.
Менеджер информационных структур одного вида - этот вид
Для Каждого СтрокаТабличнойЧасти из ТабличнаяЧасть Цикл объектов является коллекцией значений, содержащей менеджеры всех
Сообпшть(СтрокаТабличнойЧасти.Услуга,);
информационных структур этого вида, существующих в базе данных
КонецЦикла;
(например, менеджер справочников - СправочникиМенеджер -
коллекция значений, содержащая объекты
Во-вторых, возможен доступ напрямую к элементу коллекции, без
СправочникМенеджер.<имя>). Предназначен для доступа к
перебора коллекции в цикле. Здесь возможны различные комбинации отдельным менеджерам информационных структур.
двух обращений: Менеджер конкретной информационной структуры - этот вид
1. Если каждому элементу коллекции можно сопоставить объектов предоставляет средства для работы с конкретной
уникальное имя, тогда обращение к элементу коллекции, как правило, информационной структурой (например, менеджер документа
возможно по этому имени: Приходная накладная -
ДокументМенеджер.ПриходнаяНакладная).
Объект - с помощью объектов этого вида возможна манипуляция
Справочники.Сотрудники;
Справочники [«Сотрудники»]; данными информационной структуры. Предоставляют доступ к
объекту информационной структуры и позволяют изменять
2. Если нет смысла в «персонификации» элементов коллекции, информацию в базе данных. Применяются для тех информационных
тогда обращение к элементу коллекции, как правило, возможно по структур, на объекты которых могут существовать ссылки
индексу (индекс первого элемента коллекции - ноль): (справочники - СправочникОбъект.<имя>, документы
ДокументОбъект.<имя> и т.д.).
Набор записей - с помощью объектов этого вида также возможна
ТабличнаяЧасть[0];
манипуляция данными информационной структуры. Предоставляют
Следует отметить, что существуют коллекции, сочетающие оба доступ к объекту информационной структуры и позволяют изменять
вида обращений. Например, к коллекции колонок таблицы значений информацию в базе данных. Применяются для тех информационных
можно обращаться как по именам колонок, так и по индексу- структур, ссылки на объекты которых в принципе не могут
использоваться в базе данных (регистры -
РегистрНакопленияНаборЗаписей.<имя>, перерасчеты
ПерерасчетНаборЗаписей.<имя> и т.д.).
Ссылка - объекты этого вида служат для указания ссылки на
объект базы данных, и кроме этого предоставляют некоторую

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

информацию об этом объекте (например, документ




с
Способы доступа к данным
ДокументСсылка<имя>).
Выборка - объекты этого вида представляют собой набор данных
истема 1С:Предприятие 8.0 поддерживает два способа
содержащий данные объектов одной информационной структуры
доступа к данным, хранящимся в базе данных:
отобранных по определенному критерию. Обход выборки выполняется
методом Следующий() и считывание данных из базы данных
• объектный (для чтения и записи),
происходит динамически, по мере продвижения по выборке.
• табличный (для чтения).
Получение ссылки на объект возможно при помощи свойства Ссылка,
а получение объекта - методом ПолучитьОбъект() (справочник - Объектный способ доступа к данным реализован посредством
СправочникВыборка^имя>). использования объектов встроенного языка. При этом обращение к
Список - объекты этого вида предназначены для управления какому-либо объекту встроенного языка, является обращением к
списком объекта, отображаемым в табличном поле (перечисление - некоторой совокупности данных, как к единому целому.
ПеречислениеСписок.<имя>). Использовать эти объекты имеет Например, объект ДокументОбъект.ОказаниеУслуги будет
смыл только при выводе информации в табличное поле. содержать значения всех реквизитов документа «Оказание услуги» и
всех его табличных частей.
Объектная техника обеспечивает сохранение целостности
объектов, кэширование объектов, вызов соответствующих
обработчиков событий и т.д.
Табличный доступ к данным реализован посредством
использования запросов к базе данных. В этой технике разработчик
получает возможность оперировать отдельными полями таблиц базы
данных, в которых хранятся те или иные данные.
Табличная техника предназначена для получения информации из
базы данных по некоторым условиям (отбор, группировка, сортировка,
объединение нескольких выборок, расчет итогов и т.д.). Табличная
техника оптимизирована для обработки больших объемов
информации, расположенной в базе данных, и получения данных,
отвечающих заданным критериям.




552
553
Кэш объ ек

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

С
Таким образом, если мы обратимся к кэшу для получения
истема 1С:Предприятие 8.0 использует механизм представления объекта, и в кэше есть информация для нашей ссылки,
кэширования данных объектов, считанных из базы данных данные будут взяты из кэша (если в кэше весь объект, нужное
при использовании объектной техники. Таким образом, для представление будет получено из данных объекта). Если в кэше нет
получения реквизитов какого-либо объекта через ссылку, информации для нашей ссылки - из базы данных в кэш будут считаны
выполняется обращение к кэшу объектов, расположенному в только поля, необходимые для формирования представления объекта.
оперативной памяти.
Если мы обратимся к кэшу для получения реквизита объекта, и в
Кэш объектов состоит из двух частей: транзакционного кэша и кэше есть информация для нашей ссылки, дальнейшие действия будут
обычного кэша. В зависимости от того, происходит ли обращение в зависеть от того, что находится в кэше. Если в кэше весь объект -
рамках транзакции или нет, в действие вступает тот или иной кэш: значение реквизита будет получено из кэша. Если в кэше
представление объекта - оно будет удалено из кэша и в кэш будут
считаны все данные объекта. Если же при получении реквизита
А = СправочникНоменклатура.ВидНоменклатуры; I
объекта в кэше нет информации для нашей ссылки - из базы данных
будут считаны все поля объекта.
Считанные данные будут находиться в кэше до тех пор, пока не
наступит одно из трех событий:

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

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

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

выполнено повторное считывание данных из базы данных. Начиная с Если транзакция завершена успешно (Commit), данные всех
объектов, содержащиеся в транзакционном кэше, переносятся в
этого момента начнется отсчет следующего 20-ти секундного
обычный кэш, а транзакционный кэш очищается.
интервала валидности этих данных.
Кроме всех вышеперечисленных событий, считанные данные будут
удалены из кэша по истечении 20 минут после их последнего
Commit
считывания из базы данных.
Таким образом при последовательном выполнении двух операторов
(где «Номенклатура» - это ссылка на объект справочника):

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

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

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


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




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


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


П
Виртуальные таблицы запросов
ри использовании объекта вида Ссылка в элементах


К
управления, для отображения его на экране всегда ак вы теперь знаете, при создании запроса система
предоставляет нам в качестве источников данных некоторое
используется представление объекта (например, элемент
количество виртуальных таблиц. Название «виртуальные»
справочника может иметь представление в виде
полностью соответствует их сути, поскольку эти таблицы, в свою
наименования или в виде кода). Поскольку объект вида Ссылка
очередь, также являются результатом запроса, который система
содержит только внутренний идентификатор, выполняется обращение
формирует в момент выполнения соответствующего участка кода.
к кэшу объектов за получением представления ссылочного объекта.
По большому счету разработчик может самостоятельно получить
Если в кэше есть валидное представление - берется оно. Если в кэше
те же самые данные, которые система предоставляет ему в качестве
есть валидные данные объекта - представление получается из них.
виртуальных таблиц, однако алгоритм получения этих данных не
В остальных случаях выполняется чтение в кэш полей объекта,
будет оптимизирован в силу следующих двух причин.
необходимых для формирования представления.
Во-первых, все виртуальные таблицы параметризованы, т.е.
Аналогичный механизм используется при вызове функции:
разработчику предоставляется возможность задать некоторые
параметры, которые система будет использовать при формировании
запроса создания виртуальной таблицы. Примечательным здесь
А = Строка(СсылкаНаЭлементСправочникаНоменклатура);
является то, что задание параметров виртуальной таблицы не всегда
приводит к простой подстановке указанных разработчиком значений в
а также при неявном преобразовании ссылочной переменной к типу
текст запроса. В зависимости от того, какие параметры виртуальной
Строка.
таблицы указаны разработчиком, система может формировать
Теперь, если вспомнить нашу работу с конструктором выходной
РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной
формы, лишний раз становится понятно, почему конструктор, при
таблицы, причем эти запросы будут оптимизированы с точки зрения
выборе ссылочного поля, всегда добавляет к списку выбранных полей
переданных параметров.
представление этого поля. Именно для того, чтобы не выводить в
Во-вторых, не всегда разработчик имеет возможность получить
ячейку табличного поля ссылку и не вызывать тем самым
доступ к тем данным, к которым имеет доступ система. Например, при
преобразования ссылочной переменной к типу Строка со всеми
использовании виртуальных таблиц регистров сведений, разработчику
вытекающими отсюда действиями.
доступна, по большому счету, вся та же информация о данных
регистров, которую использует система при формировании запроса
виртуальной таблицы. Совсем иная картина с виртуальными
таблицами регистров накопления, где система динамически формирует
запрос в зависимости не только от переданных параметров, но и от
периода рассчитанных итогов регистра, причем в запросе она
использует данные рассчитанных итогов, которые просто не доступны
для разработчика при создании запроса.
Конечно, разработчик может самостоятельно перебрать все записи
регистра накопления и в итоге получить те же самые данные, которые
система предоставляет в виде виртуальной таблицы, однако очевидно,




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


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

<<

стр. 9
(всего 11)

СОДЕРЖАНИЕ

>>