Главная
Статьи
Ресурсы
Информация

Часть III. Специальные приемы разработки.


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

 

Глава 1. Общие приемы

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

 

Организация подборов

з

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

Алгоритм организации подборов

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

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

Результат подбора будет доступен в обработчике события «Обработка выбора» формы документа или элемента управления (в зависимости от подчинения формы справочника).

Событие «Обработка выбора» будет вызвано в двух случаях:

Создадим основную форму выбора справочника «Номенклатура». Затем добавим в состав командной панели табличного поля документа «ПриходнаяНакладная» кнопку «Подбор».

Добавим кнопку «Подбор»

 

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

 

• когда в форме справочника будет выполнен интерактивный

выбор,

• когда в форме справочника будет вызван метод

ОповеститьОВыборе().

Различные способы подбора мы проиллюстрируем на примере подбора элементов справочника «Номенклатура» в документ «ПриходнаяНакладная».

Одиночный подбор

П

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

 

ПроцедураКоманднаяПанель1Подбор(Кнопка)

ФормаПодбора = Справочники.Номенклатура

ПолучитьФормуВыбора( ,ЭлементыФормы.Материалы); ФормаПодбора.Открыть(); КонецПроцедуры

Затем создадим обработчик события «Обработка выбора» табличного поля «Материалы», расположенного в форме документа «ПриходнаяНакладная»:

Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение,

СтандартнаяОбработка)

НоваяСтрока = Материалы.Добавить();

НоваяСтрока.Материал = ВыбранноеЗначение;

ЭлементыФормы.Материалы.ТекущаяСтрока = НоваяСтрока; КонецПроцедуры

 

 

Запустите 1С:Предприятие в режиме отладки и проверьте работу одиночного подбора.

Множественный подбор

П

ри множественном подборе форма справочника будех открыта до тех пор, пока пользователь не закроет ее интерактивно или пока не будет вызван метод формы Закрыть().

Для разнообразия создадим форму списка справочника «Номенклатура» и затем в форме документа «ПриходнаяНакладная», в обработчик события нажатия кнопки «Подбор» внесем следующие изменения:

В форме документа «ПриходнаяНакладная» внесем в обработчик события нажатия кнопки «Подбор» следующие изменения:

Процедура КоманднаяПанельШодбор(Кнопка)

ФормаПодбора = Справочники.Номенклатура

.ПолучитьФормуСписка(, ЭлементыФормы.Материалы);

ФормаПодбора.РежимВыбора = Истина;

//ФормаПодбора.ЗакрыватьПриВыборе = Ложь;

ФормаПодбора.МножественныйВыбор = Истина;

ФормаПодбора.Открыть(); КонецПроцедуры

В обработчик события «Обработка выбора» добавим обход массива переданных элементов:

 

ПроцедураКоманднаяПанельШодбор(Кнопка)

ФормаПодбора = Справочники.Номенклатура

.ПолучитьФормуСписка( ,ЭлементыФормы.Материалы);

ФормаПодбора.РежимВыбора = Истина; ФормаПодбора.ЗакрыватьПриВыборе = Ложь; ФормаПодбора.Открыть(); КонецПроцедуры

 

Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение,

СтандартнаяОбработка)

Для СчетчикЦикла = 0 по РезультатВыбора.ВГраница() цикл НоваяСтрока = Материалы.Добавить(); НоваяСтрока.Материал = РезультатВыбора[СчетчикЦикла]; КонецЦикла; КонецПроцедуры

 

 

 

Свойство «ЗакрыватьПриВыборе» как раз и будет задавать режим множественного выбора. Установка же свойства «РежимВыбора» понадобилась нам, так как в этом примере для получения подчиненной формы мы используем метод ПолучитьФормуСписка(). Полученная этим методом форма будет иметь свойство «РежимВыбора» установленным в Ложь (в отличие от получения формы методом ПолучитьФормуВыбора(), когда «РежимВыбора» устанавливается в Истина).

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

Подбор с использованием множественного выбора

Е

ще одним способом организации подбора является

возможность    использования    свойства    формы

«Множественный выбор». Это свойство разрешает множественный выбор в табличных полях формы. В этом случае в форму документа будет возвращен не элемент справочника, а массив элементов, выбранных в табличном поле формы справочника.

Запустите 1С:Предприятие в режиме отладки и проверьте работу множественного подбора (множественный выбор в табличном поле выполняется при нажатой кнопке «Control»).

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

Использование метода ОповеститьОВыборе()

М

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

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

 

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

 

Ввод на основании

М

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

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

Рассмотрим пример, когда документ «ОказаниеУслуги» будет вводиться на основании элемента справочника «Клиенты».

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

 

Перейдем на закладку «Ввод на основании» и определим состав документов, на основании которых может вводиться документ «ОказаниеУслуги», и основанием для которых он может являться:

Затем вызовем конструктор ввода на основании и зададим значения реквизитов документа, создаваемого на основании. Для этого воспользуемся кнопкой «Заполнить выражения»:

 

 

 

Определим состав объектов и вызовем конструктор ввода на основании...

 

 

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

Согласимся со всем, что предложил конструктор, и нажмем «ОК».

В модуле документа будет сформирован текст обработчика события «Обработка заполнения»:

ПроцедураОбработкаЗаполненш(Основание) //{{_КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ

// Данный фрагмент построен конструктором. II При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!

 

 

Если ТипЗнч(Основание) = Тип("СправочникСсылка.Клиенты") Тогда

// Заполнение шапки

Клиент = Основание.Ссылка;

ОбъектОснование = Основание.Ссылка; КонецЕсли;

//} }_KOHCTPyKTOP_BBOД HA_OCHOBAHИИ КонецПроцедуры

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

Запустите 1С:Предприятие в режиме отладки и проверьте работу ввода на основании. Обратите внимание, что в командной панели формы списка справочника «Клиенты» появилась кнопка «Ввести на основании»:

 

 

Объекты, введенные на основании

Н

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

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

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

Объект конфигурации Критерий отбора

О

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

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

Отбор объектов, введенных на основании

П

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

 

 

 

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

На закладке «Состав» в качестве объектов, входящих в критерий, выберем реквизит «Основание» документа «ОказаниеУслуги»:

Запустите 1С:Предприятие в режиме отладки и проверьте работу критерия отбора:

Кнопка «Перейти» открывает форму списка критерия отбора...

 

 

 

 

 

 

 

На закладке «Формы» создадим основную форму списка при помощи конструктора.

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

Чтобы проиллюстрировать действия, выполняемые платформой при открытии формы списка критерия отбора, создадим основную форму списка справочника «Клиенты» и в командную панель формы добавим кнопку «ДокументыКлиента».

Обработчик этой кнопки будет выглядеть следующим образом:

 

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

СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение; СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение =

ЭлементыФормы.СправочникСписок.ТекущаяСтрока; КонецПроцедуры

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

 

ссылке На

КритерийОтбораСписок.ОказаниеУслуги равным элемент справочника.

Запустите 1С:Предприятие в режиме отладки и проверьте работу нового пункта меню.

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

Добавьте в обработчик события «При открытии» формы документа «ОказаниеУслуги» следующие строки:

 

Глава 2. Формы

В этой главе мы собрали приемы работы, которые имеют отношение к формам объектов. Кроме этого в начале главы дается краткое пояснение того, каким образом в системе 1С:Предприятие данные отображаются в формах.

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

СписокКритерияОтбора = ФормаКритерия.ЭлементыФормы.Список.Значение; СписокКритерияОтбора.Отбор.ЗначениеОтбора.Значение =

ЭлементыФормы.СправочникСписок.ТекущаяСтрока;

МассивСсылок = КритерииОтбора.ОказаниеУслуги

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

СообщитьдаужнаяСсылка); КонецЦикла; КонецПроцедуры

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

 

 

Данные и элементы управления

В

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

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

Связь формы и элементов управления с данными осуществляется при помощи реквизитов формы. Список существующих реквизитов формы доступен на закладке «Реквизиты» окна редактирования формы.

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

Похожее влияние источники данных оказывают и на элементы

управления. Например, состав колонок табличного поля будет

различным, если в качестве источника данных этого поля указать

реквизит    формы    с    типом    значения

СправочникСписок.Номенклатура    или

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

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

Рассмотрим этот механизм на примере элемента управления Поле ввода, расположенного в колонке «Вид номенклатуры» формы списка справочника «Номенклатура»:

 

Поскольку    форма    отображает    данные    объекта

СправочникСписок.Номенклатура, к свойствам, методам и

 

 

 

 

событиям объекта Форма добавляется расширение формы списка справочника:

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

 

 

 

 

 

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

 

И в заключение, поскольку поле ввода будет отображать значение реквизита справочника типа Перечисление.ВидыНоменклатуры, к свойствам и событиям поля ввода добавляется расширение поля ввода перечисления. А раз это поле ввода расположено в табличном поле, xo к его свойствам и событиям добавляется также расширение элементов управления, расположенных в табличном поле:

 

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

Например, если в форме существует элемент управления табличное

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

«СправочникСписок», которь1Й имеет Утш Рек™

СправочникСписок.Номенклатура.    значения

 

506

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

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

 

 

Если на этой же форме разместить поле ввода, то его свойство

Данные    может    иметь    значение

 

СправочникСписок.Отбор.Ссылка.Значение.

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

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

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

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

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

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

Использование этого свойства позволяет ограничить пользователя в выборе возможных типов данных значений, вводимых в поле ввода. Например, если реквизит формы имеет составной тип данных:

• Число,

• Строка,

• Дата,

• СправочникСсылка.Клиенты,

• СправочникСсылка.Сотрудники,

 

СправочникСсылка.Номенклатура,

то можно ограничить пользователя лишь возможностью ввода значений примитивных типов:

• Число,

• Дата,

• Строка:

 

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

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

 

Связанные списки

П

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

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

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

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

 

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

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

Установим связь по регистратору... \

 

 

 

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

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

 

 

ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)

ЭлементыФормы.ТабличноеПоле.Значение.Отбор.Регистратор

.Установить(Элемент.ТекущаяСтрока, Истина); КонецПроцедуры

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

 

 

 

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

 

Изменение источника данных табличного поля

В

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

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

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

 

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

Затем создадим вторую кнопку с заголовком «Стоимость материалов». Напишем подсказку - «Отобразить движения по регистру «Стоимость материалов».

Нажмем «ОК» и расположим кнопки в форме:

 

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

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

 

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

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

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

Откройте 1С:Предприятие в режиме отладчика и проверьте работу списка документа «ПриходнаяНакладная».

Процедура ПриОткрытии()

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

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

вторым источником данных для нашего табличного поля. Назовем его

«РегистрСписок»    и    установим    его    тип

РегистрНакопленияСписок.СтоимостьМатериалов:

 

 

 

 

 

его

тип

Укажем РегистрНакопленияСписок.СтоимостьМатериалов.

В заключение создадим процедуру обработки события «При изменении» для кнопки «Остатки материалов»:

ПроцедураОстаткиМатериаловПриИзменении(Элемент)

Если ОстаткиМатериалов = "Остатки" Тогда ЭлементыФормы.ТабличноеПоле.Данные = "ТабличноеПоле";

иначе ЭлементыФормы.ТабличноеПоле.Данные = "РегистрСписок";

КонецЕсли;

ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();

ДокументСписокПриАктивизацииСтроки(ЭлементыФормы.ДокументСписок); КонецПроцедуры

Изменение данных табличного поля путем установки типа значения

К

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

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

Откроем конфигуратор и создадим основную форму списка документа «ОказаниеУслуги» с помощью конструктора. Расположим на ней переключатель из трех кнопок:

 

Зададим следующие выбираемые значения переключателей:

• «ОстаткиМатериалов» - «Остатки»,

• «СтоимостьМатериалов» - «Стоимость»,

• «Продажи» - «Продажи».

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

 

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

Процедура ПриОткрытии()

ОстаткиМатериалов = "Остатки"; Массив = Новый Массив;

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

ТабПоле.Значение.Отбор.Регистратор.Установить(, Истина); КонецПроцедуры

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

 

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

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

ПроцедураОстаткиМатериаловПриИзменении(Элемеит)

Если ОстаткиМатериалов = "Остатки" тогда

НужныйТип = Тип("РегистрНакопленияСписок.ОстаткиМатериалов"); ИначеЕсли ОстаткиМатериалов = "Стоимость" тогда

НужныйТип = ТипС'РегистрНакопленияСписок.СтоимостьМатериалов"); ИначеЕсли ОстаткиМатериалов = "Продажи" тогда

НужныйТип = Тип("РегистрНакопленияСписок.Продажи"); КонецЕсли;

Массив = Новый Массив();

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

НашеОписание = Новый ОписаниеТипов(Массив);

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

НашОтбор = ТабПоле.Значение.Отбор;

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

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

ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)

НашОтбор = ЭлементыФормы.ТабличноеПоле.Значение.Отбор; Если Элемент.ТекущиеДанные = Неопределено Тогда

НашОтбор.Регистратор.Установить(, Истина); Иначе

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

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

Запустите 1С:Предприятие и проверьте работу списка документа «ОказаниеУслуги».

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

Вычисляемые колонки в списках

Н

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

Мы рассмотрим эту ситуацию на примере отображения актуальной цены в списке справочника «Номенклатура».

Откроем в конфигураторе форму списка справочника «Номенклатура» (или, если ее нет, создадим основную форму списка). Воспользуемся контекстным меню правой кнопки мыши и добавим в табличное поле колонку с именем и текстом шапки «Цена»:

В табличное поле списка справочника Номенклатура добавим колонку Цена...

 

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

Процедура СправочникСписокПриВыволеСтроки(Элемент, ОформлениеСтр(

ДанныеСтроки)

//для элементов отобразим цену и ...

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

 

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

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

//низкие цены выделим другим цветом Если АктуальнаяЦена<500 тогда

ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WEBЦвета.Васильковый; КонецЕсли; КонецЕсли; КонецПроцедуры

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

Первое, что мы делаем в этом обработчике - проверяем, что выводимый элемент справочника не является группой. В этом случае мы создаем вспомогательную структуру для описания отбора («ОтборНоменклатуры») и помещаем в ячейку «Цена» актуальное значение цены, полученной из периодического регистра сведений «Цены».

Затем мы анализируем значение выведенной цены и если оно находится в нижнем ценовом диапазоне (менее 500 рублей), выделяем это значение васильковым цветом. Для указания цвета мы используем системный набор значений WEBL4BeTa.

Запустим 1С:Предприятие в режиме отладки и посмотрим, какой внешний вид примет теперь справочник «Номенклатура»:

 

 

 

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

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

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

 

Оформление строк табличного поля

О

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

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

вид.

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

Процедура ПриОткрытии()

СписокСправочника = ЭлементыФормы.СправочникСписок;

//задать режим чередования цветов строк

СписокСправочника.ЦветФонаЧередованияСтрок = WЕВЦвета.Бежевый; СписокСправочника.ЧередованиеЦветовСтрок = Истина;

//скрыть линии сетки

СписокСправочника.ВертикальныеЛинии = Ложь; СписокСправочника.ГоризонтальныеЛинии = Ложь; КонецПроцедуры

 

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

Затем мы скрываем линии разделяющие колонки и строки.

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

Процедура СправочиикСписокПриВыводеСтроки(Элемент,ОформлениеСтрокн,

ДанныеСтроки) //для элементов отобразить цену и...

Если Не ДанныеСтроки.ЭтоГруппа тогда ОтборНоменклатуры = Новый Структура;

ОтборНоменклатуры.Вставить("Номенклатура\ДанныеСтроки.Ссьшка);

ОфорилениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;

АктуальнаяЦена = РегистрыСведений.Цены

_     .ПолучитьПоследнее(, ОтборНоменклатурыЩена;   

 

 

ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;

//низкие цены выделим другим цветом

Если АктуальнаяЦена<500 тогда

ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WЕВЦвета.Васильковый; КонецЕсли;

//... раздвинуть строку если длинное наименование

Если СтрДлина(СокрЛП(ДанныеСтроки.Наименование))>30 Тогда ОформлениеСтроки.Ячейки.Наименование.АвтоВысотаЯчейки = Истина; ОформлениеСтроки.Ячейки.Наименование.ВысотаЯчейки = 3; КонецЕсли; КонецЕсли; КонецПроцедуры

 

Часть IV. Краткий справочник разработчика

Заключительная часть нашей книги содержит набор кратких справочных статей и описаний групп обьектов встроенного языка используемых для работы с теми или иными данными базы данных '

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

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

 

 

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

Ф

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

Правила образования имен переменных

И

мена переменных (параметров) следует образовывать от терминов предметной области. При именовании переменных следует использовать только термины, используемые в документации к 1С:Предприятию 8.0 или в методических материалах фирмы «1С» по 1С:Предприятию 8.0.

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

Например:

работа с каталогом - РаботаСКаталогом

количество пачек в коробке - КоличествоПачекВКоробке

Имена переменных не следует начинать с подчеркивания.

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

 

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

В

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

Например, если нужна переменная, в которой хранится признак наличия ошибок в процедуре, то такая переменная должна называться «ЕстьОшибки». Или если есть признак того, что товар относится к возвратной таре, то такой признак должен называться «ЭтоТара».

Правила образования имен процедур (функций)

И

мена процедур в общем случае, следует образовывать от глаголов неопределенного вида, например:

правильно ПроверитьДублиСтрок(), неправильно ПроверкаДублейСтрок();

правильно ЗагрузитьКонтрагента(), неправильно ЗагрузкаКонтрагента().

Имена процедур и функции должны давать представление о характере выполняемых процедурой (функцией) действий.

Примеры хороших имен: ПроверитьДублиСтрок(), ПодобратьВидРасчета(), ПолучитьИнформациюОПроводке()

Примеры плохих имен:

OK(), Есть(), ЕщеФлажки(), НамПодходит().

 

 

 

Именование функций-флагов

Ф

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

Например, если функция должна проверить наличие дублей строк в табличной части документа, то она должна называться «ЕстьДублиСтрок». Или если функция должна проверить принадлежность документа к накладным, то она должна называться «ЭтоНакладная».

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

Имена обработчиков событий

И

спользуются имена процедур - обработчиков событий, формируемые системой автоматически:

<имя элемента управления> + <название события>

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

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

Правила образования имен элементов управления

Имена надписей образуются по следующим правилам:

• - если надпись относится к элементу управления, имя

составляет как «Надпись»+ ИмяЭлементаУправления;

• - в остальных случаях им составляется как

«Надпись»+ИмяНадписи.

Для именрамок используется префикс «Рамка». Для командной панели формы используется префикс «КоманднаяПанель».

Для имен командных панелей табличных частей формы используется префикс «КоманднаяПанель»+ИмяТабличнойЧасти, например, «КоманднаяПанельСпецификация».

Элементы управления, связанные с данными, называются так же, как данные.

Общие требования к имени объекта конфигурации

И

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

Для реквизитов объектов допускается переставлять слова из синонима местами, например: синоним «Полное наименование», имя «НаименованиеПолное».

Для ведущих объектов подобное не допускается.

Общие требования к синониму объекта конфигурации

С

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

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

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

Для форм синоним должен начинаться со слов, генерируемых конструктором при создании формы («Форма списка...», «Форма элемента...» и т. д.), далее, в случае наличия нескольких форм одного

 

 

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

Для макетов унифицированных форм синоним должен состоять из названия формы, например: «ТОРГ-12».

Общие требования к комментарию объекта конфигурации

К

омментарий задается только в тех случаях, когда необходимы какие-либо пояснения. Комментарий начинается с большой буквы, точки ставятся только после сокращений. Если в синониме использовано сокращение, в комментарии необходимо его расшифровать, например: «Общероссийский классификатор единиц измерения».

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

 

Немного о конфигурациях

П

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

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

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

 

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

Файлы новой поставки могут существовать в виде файлов конфигураций (полная поставка) и файлов обновлений (поставка обновлений).

Хранилище конфигурации    содержит    конфигурацию,

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

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

 

Объекты, объекты, объекты...

Ч

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

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

Как правило, термин объект употребляется в одном из трех контекстов:

• конфигурация,

• база данных,

• встроенный язык,

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

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

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

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

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

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

 

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

 

 

Справочники и документы

И

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

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

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

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

 

Д

ля определения положения документа на оси времени используется реквизит документа «Дата». Дата содержит время с точностью до секунды. Это позволяет контролировать последовательность записи документов. Однако при большом объеме создаваемых документов вероятна ситуация, когда несколько документов будут иметь одинаковое значение даты (т.е. будут созданы в течение одной секунды). Как в этом случае определить последовательность созданных документов?

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

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

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

 

Концепция оперативного и неоперативного проведения документов

П

ри разработке конфигураций на платформе 1С:Предприятие 8.0 принято использовать концепцию оперативного и неоперативного проведения документов.

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

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

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

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

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

реальном режиме многопользовательской работы определить

возможность или невозможность выполнения той или иной операции

(и выполнить ее, если возможно), а неоперативное проведение служит

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

совершены    (или    точно    будут    совершены).

Механизм основных форм

У

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

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

 

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

 

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

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

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

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

Конструктор форм, напротив, исходит из потребностей разработчика. Если разработчик посчитает нужным использовать ДЛЯ

 

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

Н

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

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

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

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

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

 

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

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

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

П

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

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

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

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

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

 

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

С

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

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

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

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

1.    Для синхронизации данных, которые изменяются и

записываются синхронно с объектом, нужно использовать событие

расширения формы объекта - «ПриИзмененииДанных».

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

2.    Для синхронизации данных, которые редактируются и

записываются отдельно от самого объекта, нужно использовать

обработчик события изменения данных назначенный на изменения

ссылки объекта.

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

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

 

 

 

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

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

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

Также для объекта Форма существует возможность указать

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

системы каждый раз по истечению указанного интервала времени. Для

этого используется метод ПодключитьОбработчикОжидания()

(соответственно    обратный    метод

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

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

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

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

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

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

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

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

обработке    события    модуля    приложения

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

 

 

М

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

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

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

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

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

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

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

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

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

 

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

Д

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

Менеджер информационных структур одного вида - этот вид

объектов является коллекцией значений, содержащей менеджеры всех

информационных структур этого вида, существующих в базе данных

(например, менеджер справочников - СправочникиМенеджер -

коллекция    значений,    содержащая    объекты

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

Менеджер конкретной информационной структуры - этот вид

объектов предоставляет средства для работы с конкретной

информационной структурой (например, менеджер документа

Приходная    накладная    -

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

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

Набор записей - с помощью объектов этого вида также возможна

манипуляция данными информационной структуры. Предоставляют

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

информацию в базе данных. Применяются для тех информационных

структур, ссылки на объекты которых в принципе не могут

использоваться    в    базе    данных    (регистры    -

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

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

 

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

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

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

 

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

с

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

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

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

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

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

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

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

Табличная техника предназначена для получения информации из

базы данных по некоторым условиям (отбор, группировка, сортировка,

объединение нескольких выборок, расчет итогов и т.д.). Табличная

техника оптимизирована для обработки больших объемов

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

отвечающих    заданным    критериям.

 

Кэш объектов

С

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

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

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

 

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

Обычный кэш

Е

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

 

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

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

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

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

• считанные данные будут вытеснены из кэша другими

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

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

данные были изменены в базе данных,

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

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

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

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

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

 

 

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

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

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

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

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

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

Е

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

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

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

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

Commit

 

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

Rollback

 

 

 

 

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

П

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

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

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

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

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

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

 

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

К

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

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

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

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

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

 

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

разработчика    гораздо    больше    трудозатрат.

 

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

Н

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

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

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

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

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

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

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

 

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

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

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

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

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

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

данными    КонстантаМенеджерЗначения.<имя>,

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

Два других объекта - КонстантаМенеджер.<имя> и

КонстантыНабор - также позволяют изменять значения констант,

хранящиеся в базе данных, однако они, при выполнении своих

методов Установить() и Записать() вызывают создание объекта

КонстантаМенеджер.<имя>,    который    и    выполняет

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

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

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

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

регистра    сведений    и    при    помощи    объекта

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

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

регистра    не    напрямую,    а    через    объект

РегистрСведенийНаборЗаписей.<имя>. Таким образом, модуль

набора записей, а также обработчики событий ПередЗаписью() и

ПриЗаписи() набора записей, будут отрабатывать и при

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

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

 

 

Константы

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

 

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

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

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

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

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

565

 

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

 

Константы

 

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

 

// Константы

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

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

 

СоздатьМенеджерЗначения()

//Пример: Вывести значения всех констант, существующих в конфигурации

Для Каждого ОчереднаяКонстанта Из Константы Цикл

ИмяКонст=ОчереднаяКонстанта.СоздатьМенеджерЗначения().Метаданные().Имя-ЗначениеКонст = ОчереднаяКонстанта.Получить(); Сообшить("Константа "+ИмяКонст+" = "+ЗначениеКонст); КонецЦикла;

 

II .<имя константы> // [<имя константы>] // Для Каждого ... Из... Цикл ... КоненЦикла;

//Пример: Прочитать значение константы

Результат = Константы.ПрефиксНумерации.ПолучитьО; Сообщить("Значение константы ПрефиксНумерации = "+Результат);

/ЛТример: Установить значение константы «ПрефиксНумерации» равным «ЦБ»

Константы["ПрефиксНумерации"].Установить("ЦБ");

Сообщить("Новое значение = "+Константы["ПрефиксНумерации"].Получить());

/ЛТример: Очистить значения всех констант

Для Каждого ОчереднаяКонстанта Из Константы Цикл

ОчереднаяКонстанта.Установить(Неопределено); КоненЦикла;

// СоздатьНабор()

//Пример: Установить новые значения нескольких констант

Набор = Константы.СоздатьНабор("Руководитель, Бухгалтер"); Набор.Руководитель = "НиколаевДенис Павлович"; Набор.Бухгалтер = "Николаева Людмила Сергеевна"; Набор.Записать();

 

 

Последовательность событий при записи констант из формы

 

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

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

 

Справочники

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

 

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

II Справочники

//Пример: Вывести все типы ссылок на элементы справочников, существующие

//в конфигурации

Массив = Справочники.ТипВсеСсылки().Типы();

Для Каждого ОчереднойТип из Массив Цикл

Сообщить(ОчереднойТип); КонецЦикла;

// .<имя справочника> // [<ими справочника>] // Дли Каиедого ... Из ... Цикл ... КонецЦикла;

//Пример: Создать новую группу справочника Номенклатура

НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу(); НоваяГруппа.Наименование = "Моя новая группа"; НоваяГруппа.Записать();

//Пример: Открыть форму выбора справочника Номенклатура

Форма = Справочники["Номенклатура"].ПолучитьФормуВыбора(); Форма.Открыть();

 

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

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

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

 

//    НайтиПоКоду()

//    НайтиПоНаименованик>()

//    НайтиПоРеквизитуО

//    ПустаяСсылка()

//    ПолучнтьСсылку()

//    .<имя предопределенного элемента справочника>

//Пример: Проверить, помечен лн на удаление элемент справочника Номенклатура //c кодом 13

Если Справочники.Номенклатура.НайтиПоКоду(13).ПометкаУдаления тогда

Сообщить("Элемент с кодом 13 помечен на удаление"); КонецЕсли;

/ЛТример: Является ли элемент справочника Номенклатура с наименованием

//«Услуги» группой

Если Справочники.Номенклатура

.НайтиПоНаименованию"Услуги", Истина).ЭтоГруппа тогда Сообщить("Элемент Услуги является группой"); КонецЕсли;

//Пример: Проверить, что для всех элементов задан вид номенклатуры

ПустаяСсылкаПеречисления = Перечисления.ВидыНоменклатуры.ПустаяСсылка(); Если Не Справочники.Номенклатура.НайтиПоРеквизит("'ВидНоменклатуры",

ПустаяСсылкаПеречисления).Пустая() тогда

Сообщить("Есть элементы для которых не задан вид номенклатуры"); КонецЕсли;

//Пример: Передать пустую ссылку в параметр метода

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

.Выбрать(Справочники.Номенклатура.ПустаяСсылка());   

 

// Выбрать()

// ВыбратьИерархически()

//Пример: Вывести список элементов, расположенных в корне справочника

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

.Выбрать(Справочники.Номенклатура.ПустаяСсылкаО); Пока Выборка.Следующий() Цикл Если Не Выборка.ЭтоГрутша тогда

Сообщить(Выборка); КонецЕсли; КонецЦикла;

//Пример: Удалить все элементы иерархического справочника

Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл

Выборка.Удалить(); КонецЦикла;

// СоздатьГруппу() // СоздатьЭлемент()

//Пример: Создать новый элемент справочника Сотрудники

НовыйЭлемент = Справочники.Сотрудники.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Смирнов Андрей Анатольевич"; //Заполнить табличную часть

НоваяСтрокаТабличнойЧасти = НовыйЭлемент.ТрудоваяДеятельность.Добавить(); НоваяСтрокаТабличнойЧасти.Организация = "OOO НТЦ"; НоваяСтрокаТабличнойЧасти.НачалоРаботы = Дата(2003,05,01); НоваяСтрокаТабличнойЧасти.ОкончаниеРаботы = Дата(2003,12,31); НоваяСтрокаТабличнойЧасти.Должность = "Программист"; НовыйЭлемент.Записать();

 

 

 

// Владелец // Родитель // Ссылка

// Пример: запретить изменение подчиненных элементов, если у владельца // установлено соответствующее свойство «ИзмененияЗапрещены» // в модуле формы элемента справочника

Процедура ПередЗаписью(Отказ)

Если Владелец.ИзмененияЗапрещены Тогда Отказ = Истина;

КонецЕсли; КонецПроцедуры

 

// Ссылка

//Пример: Заполнить табличную часть документа ПриходнаяНакладная всеми //элементами из указанной группы справочника Номенклатура

Выборка = Справочники.Номенклатура.ВыбратьИерархическиСПолеВвода!); Пока Выборка.Следующий() Цикл

СсылкаНаНоменклатуру = Выборка.Ссылка; Если СсылкаНаНоменклатуру.ЭтоГруппа тогда

Продолжить; КонецЕсли;

НоваяСтрока = Материалы.Добавить(); НоваяСтрока.Материал = СсылкаНаНоменклатуру; КонецЦикла;

 

 

 

// ПолучитьОбъект() // Скопировать()

 

// ПолучитьОбъект()

 

 

 

// Пример: Изменить наименование элемента справочника

Элемент = Справочники.Номенклатура.НайтиПоКоду(10).ПолучитьОбъект(); Элемент.Наименование = "Мое новое наименование"; Элемент.Записать();

// Пример: Заполнить справочник тестовыми данными

Элемент = Справочвики.Номенклатура.СоздатьЭлемент(); Элемент.Наименование = "Тестовый элемент"; Элемент.ЗаписатьО; Для ш = 1 по 1000 Цикл

НовыйЭлемент = Элемент.СкопнроватьО;

НовыйЭлемент.Записать(); КонецЦикла;

 

//Пример: пометить все элементы неиерархического справочника на удаление

Выборка = Справочники.Клиенты.Выбрать(); Пока Выборка.Следующий() Цикл

Выборка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина); КонецЦикла;

 

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

Запись элемента справочника

Модуль объекта

Модуль

формы

элемента

справочника

 

Документы

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

 

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

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

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

 

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

// Документы

//Пример: вывести все типы ссылок на элементы справочников, существующие в конфигурации

Массив = Документы.ТипВсеСсылки()Типы(); Для Каждого ОчереднойТип из Массив Цикл

Сообщить(ОчереднойТип);

КонецЦикла;   

 

// НайтиПоНомеру() // НайтиПоРеквизиту() // ПустаяСсылка()

//Пример: Проверить, проведен ли документ ПриходнаяНакладная с номером 3

Если Документы.ПриходнаяНакладная.НайтиПоНомеру(3).Проведен тогда

Сообщить("Документ с номером 3 проведен"); КонецЕсли;

//Пример: Проверить, что во всех документах ПриходнаяНакладная заполнен

//реквизит Склад

ПустаяСсьшкаСклада = Справочники.Склады.ПустаяСсылка();

Если Не Документы.ПриходнаяНакладная

.НайтиПоРеквизиту("Склад", ПустаяСсылкаСклада).Пустая() тогда Сообщит("'Есть документы, у которых не заполнен реквизит Склад"); КонецЕсли;

 

II .<имя документа> // [<имя документа>] // Для Каждого ... Из ... Цикл ... КонецЦикла;

/Шример: Открыть форму нового документа ОказаниеУслуги для интерактивного //заполнения

Форма = Документы["ОказаниеУслуги"].ПолучитьФормуНовогоДокумента(); Форма.Открьпь();

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

конфигурации

Для Каждого ОчереднойДокумент Из Документы Цикл

Форма = ОчереднойДокумент.ПолучитьФормуСписка();

Форма.Открыть(); КонецЦикла;

 

// Выбрать()

//Пример: Выбрать все документы ПриходнаяНакладная за текущий месяц

Выборка = Документы.ПриходнаяНакладная

.Выбрать(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата())); Пока Выборка.Следующий() Цикл

Сообщить(Выборка); КонецЦикла;

// СоздатьДокумент()

//Пример: Создать новый документ ПриходнаяНакладная

НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокументО;

НовыйДокумент.Дата = ТекущаяДата();

НовыйДокумент.Склад = Справочники.Склады.Основной;

//Заполнить табличную часть

НоваяСтрокаТабличнойЧасти = НовыйДокумент.Материалы.Добавить();

НоваяСтрокаТабличнойЧасти.Материал ? Справочники.Номенклатура.НайтиПоКоду(6);

НоваяСтрокаТабличнойЧасти.Количество = 10;

НоваяСтрокаТабличнойЧасти.Цена = 22,5;

НоваяСтрокаТабличнойЧасти.Сумма = 225;

НовыйДокумент.Записать();

 

// ПолучитьОбъект()

 

// Ссылка

//Пример: В модуле объекта вызвать процедуру проверки заполнения реквизитов документа

Если Не ПроверитьЗаполнениеРеквизитов(ЭтотОбъект.Ссылка) тогда

Сообщить(«Реквизиты документа не заполнены!»); КонецЕсли;

 

//Пример: Удалить все документы ПриходнаяНакладная

Выборка = Документы.ПриходнаяНакладная.Выбрать(); Пока Выборка.Следующий() Цикл

Выборка.ПолучитьОбъект()Удалить(); КонецЦикла;

Последовательность событий при записи документа из формы документа

 

 

 

II ПолучитьОбъект() // Скопировать()

//Пример: Пометить документ на удаление

НенужныйДокумент = Документы.ОказаниеУслуги

.НайтиПоНомеру(13).ПолучитьОбъект(); НенужныйДокумент.УстановитьПометкуУдаления(Истина);

// Ссылка

//Сформировать список ссылок на все документы ПриходнаяНакладная за //текущий месяц

СписокНакладных = Новый СписокЗначений; Выборка = Документы.ПриходнаяНакладная

.Выбрать(НачалоМесяца(ТекущаяДата()),КонецМесяца(ТекущаяДата())); Пока Вьтборка.Следующий() Цикл

СписокНакладных.Добавит^Выборка.Ссылка);

КонецЦикла;        ^^

Последовательность событий при проведении документа из формы документа

 

Последовательность событий при отмене проведени документа из формы документа

 

Перечисления

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

 

// .<имя перечисления>

// [<имя перечисления >]

// Для Каждого ... Из ... Цикл ... КонецЦикла;

//Пример: Открыть форму выбора перечисления

Форма = Перечисления.ВидыНоменклатуры.ПолучитьФормуВыбора(); Форма.Открыть();

 

 

 

 

 

ПеречислениеСписок.<имя>

 

//    .<имя значения перечисления>

//    [<имя значения перечисления >]

//    [<идекс элемента коллекции>]

//    Для Каждого... Из ... Цикл ... КонецЦикла;

//    ПустаяСсылка()

//Пример: Получить пустую ссылку на значение перечисления

ПустаяСсылкаПеречисления= Перечисления.ВидыНоменклатуры.ПустаяСсылка(); Если ТекущаяНоменклатура.ВидНоменклатуры = ПустаяСсылкаПеречисления тогда //предложить заполнение вида номенклатуры

...

КонецЕсли;

 

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

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

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

// Перечисления

//Пример: Открыть форму списка перечисления

Форма = Перечисления.ВидыНоменклатуры.ПолучитьФормуСписка(); Форма.Открыть();

 

 

Планы видов характеристик

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

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы со справочниками (см. раздел «Объекты встроенного языка для работы со справочниками» на странице 570).

Последовательность событий при записи вида характеристики из формы

 

 

 

 

 

 

 

 

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

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

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

ПланыСчетовМенеджер |    | ПланСчетовСписок.<имя>

Планы счетов

Глобальный контекст

ПланСчетовМенеджер.<имя>

И ПланСчетовОбъект.ошя>

ПланСчетовСсылка.<имя>

ПланСчетовВыборка.<имя>

ПланСчетовВидыСубконто.<имя>

ПланСчетовВидыСубконтоСтрока.^ашя>

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

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

ПланСчетовВидыСубконто^имя>. Используется для доступа к методам специальной табличной части счета ВидыСубконто в целом.

ПланСчетовВидыСубконтоСтрока^имя>. Строка специальной табличной части счета ВидыСубконто.

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы со справочниками (см. раздел «Объекты встроенного языка для работы со справочниками» на странице 570).

Последовательность событий при записи счета из формы

 

 

 

 

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

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

 

Планы видов расчета

ВытесняющиеВидыРасчетаСтрока.<имя>

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

 

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

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

ВытесняющиеВидыРасчета.<имя>.    Предопределенная

табличная часть вида расчета - список вытесняющих видов расчета. Такая табличная часть определена только для планов видов расчета с признаком ИспользуетПериодДействия. Имеет единственную колонку- ВидРасчета типа ПланВидовРасчетаСсылка.<имя>.

ВытесняющиеВидыРасчетаСтрока^имя>.    Строка

предопределенной таблицы вытесняющих видов расчета.

ВедущиеВидыРасчета.<имя>. Предопределенная табличная

часть вида расчета - список ведущих видов расчета. Имеет

единственную    колонку    -    ВидРасчета    типа

ПланВидовРасчетаСсылка.<имя>.

ВедущиеВидыРасчетаСтрока.<имя>. Строка предопределенной таблицы ведущих видов расчета.

БазовыеВидыРасчета.<имя>. Предопределенная табличная часть вида расчета - список ведущих видов расчета. Такая табличная часть (свойство БазовыеВидыРасчета) определена только для планов видов расчета со свойством ЗависимостьОтБазы не равным значению «Не зависит». Имеет единственную колонку - ВидРасчета типа ПланВидовРасчетаСсылка^имя>.

БазовыеВидыРасчетаСтрока.<имя>. Строка предопределенной таблицы базовых видов расчета.

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы со справочниками (см. раздел «Объекты встроенного языка для работы со справочниками» на странице 570).

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

Последовательность событий при записи вида расчета из формы

 

Регистры сведений

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

 

 

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

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

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

РегистрСведенийМенеджерЗаписи^имя>. Позволяет читать, записывать и удалять отдельную запись регистра сведений. Используется только для регистров сведений, не изменяемых

592

 

593

 

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

 

Регистры сведе

 

ни

 

 

 

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

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

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

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

// РегистрыСведений

//Прнмер: Получить текущую цену из периодического регистра сведений Цены

Элемент = Справочники.Номенклатура.НайтиПоКоду(4); Отбор = Новый Структурв("Номенклатура",Элемент); ЗначенияРесуроов = РегистрыСведений.Цены

.ПолучитьПоследнее(ТекущаяДата(), Отбор);

 

// СоздатьКлючЗаписи()

//Пример: Активизировать требуемую строку списка регистра сведений

СтруктураКлючевыхПолей = Новый Структура;

СтруктураКлючевыхПолей.Вставить("Период",Дата("20040331000000"));

СтруктураКлючевыхПолей.Вставить("Номенклатура",

Справочники.Номенклатура.НайтиПоКоду("0000006")); ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока =

                    РегислрыСведений.Цены.СоздатьКлючЗаписи(СтруктураКлючевыхПолей);

// СоздатьНаборЗаписей()

//Пример: Показать номенклатуру, цена на которую была установлена в заданную //дату и время

Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей(); Набор.Отбор.Период.Установить(ЗаданнаяДата, Истина); Набор.Прочитать();

Для Каждого ОчереднаяЗапись Из Набор Цикл Сообщить("Номенклатура = "+ОчереднаяЗапись.Номенклатура+

", цена = "+ОчереднаяЗапись.Цена); КонецЦикла;

// СоздатьМенеджерЗаписи()

 

II .<имя регистра сведений> // [<имя регистра сведений >] // Для Каждого ... Из ... Цикл ... КонецЦикла;

//Пример: Открыть форму списка регистра сведений Цены

ИмяРегистра= "Цены";

Форма = РегистрыСведений[ИмяРегистра].ПолучитьФормуСписка();

Форма.Открыть();

 

/Шример: Добавить новое значение цены в регистр Цены

Запись = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();

Запись.Период = ТекущаяДата();

Запись.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0000005");

Запись.Цена = 568;

Запись .Записать();

 

 

 

// [<индекс элемента коллекции >]

// Для Каждого ... Из ... Цикл ... КонецЦикла;

/Шример: Показать номенклатуру, цена на которую была установлена в заданную

//дату и время

Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей(); Набор.Отбор.Период,Установить(ЗаданнаяДата,Истина); Набор.Прочитать();

Для Каждого ОчереднаяЗапись Из Набор Цикл Сообщить("Номенклатура = "+ОчереднаяЗапись.Номенклатура+

", цена = "+ОчереднаяЗапись.Цена);

КонецЦикла;    

// ПолучитьМенеджерЗаписи()

//Пример: Удалить все записи регистра сведений за текущий месяц

Выборка = РегистрыСведений.Цевы

.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

Пока Выборка.Следующий() цикл

Выборка.ПолучютьМенеджерЗначения()-Удалить();

КонецЦикла;   

// Выбрать()

// ВыбратьПоРегистратору()

//Пример: Показать изменение цен на элемент номенклатуры в течение года

Отбор = Новый Структур("'Номенклатура", Справочники.Номенклатура.НайтиПоКоду("0000005")); Выборка = РегистрыСведений.Цены

.Выбрать(НачалоГода(ТекущаяДата()),ТекущаяДата(),Отбор); Пока Выборка.Следующий() цикл

Сообщить("Дата = "+Выборка.Период+ ", цена = "+Выборка.Цена);

КонецЦикла;       

 

Последовательность событий

При записи из формы записи регистра сведений из формы записи

 

 

Замечание. Работа с формой записи регистра сведений

осуществляется    при    помощи    объекта

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

 

очередь,    использует    объект

РегистрСведенийНаборЗаписей^имя>.

Особенности    внутренней    реализации    объекта

РегистрСведенийМенеджерЗаписи^имя> таковы, что в случае записи существующей записи регистра сведений, обработчики события ПередЗаписью() и ПриЗаписи() модуля набора записей будут вызваны дважды: сначала для «старого» набора записей (с количеством записей 0) и затем для «нового» набора записей (с количеством записей 1).

При записи из формы набора записей регистра сведений

 

 

Регистры накопления

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

 

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

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

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

РегистрНакопленияЗапись^имя>. Используется для доступа к записи регистра накопления. Объект не создается непосредственно, а предоставляется другими объектами, отвечающими за регистр накопления. Например, данный объект представляет записи регистра в наборе записей.

РегистрНакопленияКлючЗаписи^имя>. Представляет собой набор значений, однозначно идентифицирующих запись регистра.

 

 

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

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

 

// СоздатьНаборЗаписей()

//Пример: Получить движения документа

НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4); Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей(); Движения.Отбор.Регистратор.Значение = НужныйДокумент; Движения.Прочитать();

 

// РегистрыНакопления

 

//Пример: Открыть форму списка регистра ОстаткиМатериалов

Форма = РегистрыНакопления.ОстаткиМатериалов.ПолучитьФормуСписка(); Форма.Открыть();

 

// Выбрать()

// ВыбратьПоРегистратору()

//Пример: Выбрать все записи регистра ОстаткиМатериалов за текущий месяц

Выборка = РегистрыНакопления.ОстаткиМатериалов

.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

 

 

 

II .<имя регистра накопления> // [<имя регистра накопления >] // Для Каждого ... Из ... Цикл... КонецЦикла;

//Пример: Рассчитать итоги регистра ОстаткиМатериалов на указанную дату

ИмяРегистра = ОстаткиМатериалов; РегистрыНакопления[ИмяРегистра]

.УстановитьПериодРассчитанныхИтогов(УказаннаяДата);

// СоздатьКлючЗапнси()

//Пример: Активизировать требуемую строку списка регистра накопления

СтруктураКлючевыхПолей = Новый Структура; СтруктураКлючевыхПолей.Вставить("Регистратор",

Документы.ПриходнаяНакладная.НайтиПоНомеру("0000002"));

СтруктураКлючевыхПолей.Вставить("НомерСтроки",2); ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока =

РегистрыНакопления.ОстаткиМатериалов

.СоздатьКлючЗапис^СтруктураКлючевыхПолей);

 

// [<индексэлементаколлекции>|

// Для Каждого ... Из ... Цикл ... КонецЦикла;

//Пример: Получить движения документа

НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4); Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей(); Движения.Отбор.Регистратор.Значение = НужныйДокумент; Движения.Прочитать();

Для Каждого ОчередноеДвижение Из Движения Цикл //алгоритм обработки движений

КонецЦикла;

 

 

 

Последовательность событий при записи набора записей регистра накопления из формы набора записей

 

Регистры бухгалтерии

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

 

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

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

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

РегистрБухгалтерииЗапись. Используется для доступа к записи регистра бухгалтерии. Объект не создается непосредственно, а предоставляется другими объектами, отвечающими за регистр

603

 

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

 

Регистры бухгалтерии

 

 

 

 

 

бухгалтерии. Например, данный объект представляет записи регистра в наборе записей.

РегистрБухгалтерииСубконто. Коллекция значений субконто записи регистра бухгалтерии. Установка и получение значения конкретного субконто осуществляется через оператор [], в качестве параметра которому передается вид субконто или через имя предопределенного субконто.

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

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы с регистрами накопления (см. раздел «Регистры накопления» на странице 599).

 

Последовательность событий при записи набора записей регистра бухгалтерии из формы

 

 

 

Регистры расчета

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

 

 

 

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

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

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

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

РегистрРасчетаПерерасчеты.<имя>.    Менеджер всех

менеджеров перерасчетов регистра расчетов.

ПерерасчетМенеджер.<имя>. Менеджер перерасчета служитдля получения набора записей перерасчета.

ПерерасчетНаборЗаписей.<имя>. Набор записей перерасчета.

ПерерасчетЗапись.<имя>. Объект используется для доступа к записи перерасчета.

ФактическийПериодДействия. Массив значений типа ЭлементФактическогоПериодаДействия.

ЭлементФактическогоПериодаДействия.    Элемент

фактического периода действия.

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы с регистрами накопления (см. раздел «Регистры накопления» на странице 599).

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

 

 

 

Последовательность событий при записи набора записей регистра расчета из формы

Запись набора

записей регистра

расчета

Модуль набора записей регистра расчета

Модуль формы

набора записей

регистра

ПослеЗаписи()    ~J

расчета

 

Планы обмена

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

 

 

ПланОбменаСписок.<имя>

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

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

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

 

ЗаписьСообщенияОбмена - Объект предназначен для организации записи сообщения обмена данными.

ЧтениеСообщенияОбмена - Объект предназначен для приема

сообщений обмена данными. При начале чтения он осуществляет

проверку правильности задания заголовка сообщения, и отвергает

неправильные сообщения. При завершении чтения данный объект

модифицирует    значение    реквизита    «НомерПринятого»

соответствующего узла плана обмена в соответствии с номером принятого сообщения.

Свойства и методы взаимодействия перечисленных объектов в большинстве своем аналогичны свойствам и методам объектов, предназначенных для работы со справочниками (см. раздел «Объекты встроенного языка для работы со справочниками» на странице 570).

Последовательность событий при записи узла из формы

 

4acTbV. Приложения

 

Вопросы при переходе с версии 7.

 



  Copyright © 2007 Udex.Ru

Hosted by uCoz