Главная » 1С Предприятие » МОДУЛЬ  ФОРМЫ СПИСКА СПРАВОЧНИКА ДЕТИ

0

Содержит  предопределенную  процедуру  ПриОткрытии,   вычисляющую  и   обновляющую  в  результате  вызова процедуры ИзменитьВозраст значение  реквизита Возраст  всех записей  справочника Дети. Запись о ребенке старше  18 лет помечается для удаления. Если  форма  списка  справочника Дети  открывается  не  из  справочника-владельца, а, например, встроенной  функций  ОткрытьФорму, то  в  качестве владельца формы устанавливается последний  сотрудник  из справочника  Сотрудники_2,  имеющий данные о детях в справочнике Дети.

процедура ИзменитьВозраст(Дети, дТ) далее

// Обновляет, вызывая процедуру ИзменитьВозраст,

// значение реквизита Возраст в справочнике Дети роцедура  ПриОткрытии()

перем сСотр_2, Дети, послВлад, дТ; дТ = ТекущаяДата();

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

// не может быть перепозиционирован

Дети = СоздатьОбъект("Справочник.Дети");

сСотр_2  = СоздатьОбъект("Справочник.Сотрудники_2");

// Перемещаемся на первый элемент справочника Сотрудники_2 сСотр_2.ВыбратьЭлементы();

пока сСотр_2.ПолучитьЭлемент() = 1 цикл если сСотр_2.ЭтоГруппа() = 1 тогда

продолжить;               //        Пропускаем группы  справочника Сотрудники_2 конецЕсли;

Дети.ИспользоватьВладельца(сСотр_2.ТекущийЭлемент());

// или проще: Дети.ИспользоватьВладельца(сСотр_2);

// Встаем на первой, относящейся к элементу-владельцу записи справочника Дети ,

если Дети.ВыбратьЭлементы( ) =  1 тогда

// Используем  переменную  послВлад при  автономном открытии

// формы списка справочника Дети послВлад = сСотр_2.ТекущийЭлемент();

конецЕсли; ИзменитьВозраст(Дети, дТ);

конецЦикла; // пока сСотр_2.ПолучитьЭлемент()  = 1

// Если справочник Дети открывается автономно, например, так:

//ОткрытьФорму("Справочник.Дети");

// то владелец  отсутствует.  Установим в качестве  такового

// элемент послВлад  справочника  Сотрудники_2

// Метод  формы списка справочника  ИспользоватьВладельца, возвращает текущий

// элемент-владелец формы списка справочника Дети. Если владельца нет если ПустоеЗначение(ИспользоватьВладельца()) =  1  тогда

ИспользоватьВладельца(послВлад); конецЕсли;

Дети = 0; сСотр_2 = 0;

конецПроцедуры // ПриОткрытии

// Вычисляет и обновляет значение реквизита Возраст  для записей справочника Дети,

// подчиненных ранее заданному владельцу процедура  ИзменитьВозраст(Дети, дТ)

перем  нгр, нгт, нмр, нмт, числоЛет, числоМес;

// Выбор  элементов справочника Дети, связанных с элементом-владельцем пока Дети.ПолучитьЭлемент() =  1 цикл

нгр = ДатаГод(Дети.ДатаРождения);

нгт = ДатаГод(дТ); числоЛет = нгт нгр;

если  числоЛет >  18 тогда

// Проставляем пометку удаления без предупреждения Дети.Удалить(0);

конецЕсли;

если  числоЛет =  0 тогда

нмр  = ДатаМесяц(Дети.ДатаРождения); нмт = ДатаМесяц(дТ);

числоМес = нмт нмр;  если числоМес =  1 тогда

Дети.Возраст = "1  месяц"

иначеЕсли (числоМес  = 2) или (числоМес  = 3) или (числоМес  = 4) тогда

// Например, 3 месяца

Дети.Возраст  = строка(числоМес) + "  месяца"; иначе  // числоМес > 4 или числоМес = 0

// Например, 7 месяцев

Дети.Возраст  = строка(числоМес) + "  месяцев"; конецЕсли;

иначе // числоЛет > 1

если  числоЛет = 1  тогда Дети.Возраст  =  "1 год"

иначеЕсли (числоЛет = 2) или (числоЛет = 3) или (числоЛет = 4) тогда

// Например, 3 года

Дети.Возраст = строка(числоЛет) + " года"; иначе // числоЛет > 4

// Например, 7 лет

Дети.Возраст = строка(числоЛет) + " лет"; конецЕсли;

конецЕсли;

Дети.3аписать( );                      //             Не забываем сохранить данные конецЦикла;  // пока Дети.ПолучитьЭлемент() = 1

конецПроцедуры // ИзменитьВозраст

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

процедура ИзменитьВозраст(Дети, дТ) далее процедура ПриВыбореВладельца(влад) далее

процедура ПриОткрытии() перем  влад;

влад = ИспользоватьВладельца(); //         Получаем владельца при открытии

// Вычисляем и обновляем значение реквизита Возраст для записей справочника Дети,

// подчиненных владельцу влад

ПриВыбореВладельца(влад); конецПроцедуры // ПриОткрытии

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

// значение реквизита Возраст для записей справочника Дети, подчиненных владельцу влад

процедура ПриВыбореВладельца(влад)         //      Предопределенная процедура

перем Дети, дТ;                           //                Запускается при смене элемента-владельца дТ = ТекущаяДата();

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

// не может быть перепозиционирован

Дети  = СоздатьОбъект("Справочник.Дети"); Дети.ИспользоватьВладельца(влад);

// Встаем на первой, относящейся к элементу-владельцу записи справочника Дети

если Дети.ВыбратьЭлементы() = 1 тогда ИзменитьВозраст(Дети, дТ);

конецЕсли; Дети = 0;

конецПроцедуры // ПриВыбореВладельца

процедура ИзменитьВозраст(Дети, дТ)

// Текст процедуры см. выше конецПроцедуры // ИзменитьВозраст

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии