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

0

добавим в  модуль  двух имеющихся форм  списка  (разд.   5.3.3.2)  код  следующей  предопределенной процедуры:

процедура ПриНачалеРедактированияСтроки( ) если ПустоеЗначение(ПриказПрием) = 0 тогда

// Открываем форму документа ОткрытьФорму(ПриказПрием);

иначеЕсли РедактироватьВДиалоге()  = 0 тогда

// Открываем форму элемента справочника для редактирования текущей записи ОткрытьФорму(ТекущийЭлемент(),, 0);

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

Предупреждение("Редактировать в строке  формы списка справочника нельзя."); конецЕсли;

СтатусВозврата(0);

конецПроцедуры // ПриНачалеРедактированияСтроки

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

Замечания:

1.      Вызов СтатусВозврата(0);

в  предопределенной процедуре ПриНачалеРедактированияСтроки,  задающий  статус Отменить  Действие,  позволяет  не  переходить  в  режим редактирования  строки непосредственно в  форме   списка  справочника  Сотрудники_2,  если  в  диалоге открытой формы приказа о приеме нажать  Закрыть или если просто переместить  фокус на диалог формы списка справочника.

2.       При  отсутствии документа, если отменен режим редактирования в диалоге,  процедурой  ПриНачалеРедактированияСтроки  будет вызвана функция

ОткрытьФорму(ТекущийЭлемент());

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

Рис. 5.44. Задание идентификатора кнопки Очистить

Добавим соответствующий пункт в колонку Документы  меню интерфейса Ученик, установив  для команды  открытия документа  акселератор  Alt+7.  С  кнопками  диалога  и с графой  Сотрудник Приказа об изменении  оклада через их  свойство Формула  свяжем перечисленные в табл.  5.5 процедуры и команды.

Таблица. 5.5

Процедуры и команды, связанные в элементами  диалога документа

Кнопка

Процедура/команда

Сотрудник

ВыборОдного()

Подбор

Подбор()

Очистить

ОчиститьТабл()

Удалить

УдалитьСтрокуТабл()

ОК

#Записать?Провести?Закрыть

Закрыть

#3акрыть

5.8.4.2. МОДУЛЬ ФОРМЫ ДОКУМЕНТА

Содержит  следующие  процедуры:

процедура ВводНового(  )                          //                Задает  начальные значения  дат при  вводе ДатаДок = РабочаяДата();          //               нового документа

ДатаНовОклада = РабочаяДата();

// При вводе нового документа табличная  часть  пуста, поэтому делаем  кнопки

// Очистить, Удалить и ОК недоступными форма.Очистить.Доступность(0); форма.Удалить.Доступность(0); форма.ОК.Доступность(0);

конецПроцедуры // ВводНового

процедура  ПриОткрытии() Очистить0кноСообщений(); ПриЗаписиПерепроводить(1);

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

// Связана графой  Сотрудник табличной части документа

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

// После выбора заполняются поля  Сотрудник и Прежний  оклад

// Добавление строки происходит при нажатии на клавишу клавиатуры Ins процедура  ВыборОдного()

перем  сСотр_2, контПодбора;

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

// Дата для  периодического  реквизита Оклад  справочника Сотрудники_2 сСотр_2.ИспользоватьДату(РабочаяДата());

// Сотрудник и ПрежнийОклад реквизиты табличной части

// диалога формы рассматриваемого документа если сСотр_2.НайтиЭлемент(Сотрудник) = 1 тогда

ПрежнийОклад =  сСотр_2.Оклад; конецЕсли;

// При добавлении хотя бы одной строки следующие кнопки делаем доступными

если  КоличествоСтрок() > 0 тогда форма.Очистить.Доступность(1); форма.Удалить.Доступность(1); форма.ОК.Доступность(1);

конецЕсли;

конецПроцедуры // ВыборОдного

процедура ПриОкончанииРедактированияСтроки() перем старСтрока,  сотр;

// Проверяет введенную запись на уникальность

// Если она нарушена, введенная запись удаляется

старСтрока  = НомерСтроки;                 //           Запоминаем номер  введенной строки сотр  = Сотрудник;                             //                 и значение  графы Сотрудник  ВыбратьСтроки( );

пока ПолучитьСтроку() > 0 цикл

если  (Сотрудник = сотр)  и  (НомерСтроки  о  старСтрока) тогда Предупреждение("Сотрудник  уже  выбран."); УдалитьСтроку();

конецЕсли;

конецЦикла // пока

КОнецПроцедуры // ПриОкончанииРедактированияСтроки

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

// Открывает множественный подбор из справочника Сотрудники_2

// Каждый выбор элемента добавляет  строку  в табличную  часть  документа,

// заполняя в ней  поля  Сотрудник  и Прежний  оклад

// Добавление строки осуществляется предопределенной  процедурой

// ОбработкаПодбора модуля формы

процедура Подбора( )

перем  сСотр_2, контПодбора;

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

// Дата для периодического реквизита Оклад справочника Сотрудники_2 сСотр_2.ИспользоватьДату(РабочаяДата());

// Указываем явно имя основной формы списка для метода ОткрытьПодбор ОткрытьПодбор("Справочник.Сотрудники_2", "ФормаСписка", контПодбора); форма.Очистить.Доступность(1);

форма.Удалить. Доступность(1); форма.ОК.Доступность(1);

конецПроцедуры // Подбор

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

// полей Сотрудник и Прежний оклад процедура  ОбработкаПодбора(текЭл,  конт)

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

пока ПолучитьСтроку() > 0 цикл

если Сотрудник = текЭл тогда Предупреждение("Сотрудник уже  выбран.");  возврат;

конецЕсли;

конецЦикла; // пока

НоваяСтрока();           //                Добавляем  строку  в табличную  часть документа Сотрудник = текЭл;

ПрежнийОклад конт.Оклад;        //    конт контекст формы  списка справочника конецПроцедуры // ОбработкаПодбора

// Удаляет  все строки табличной  части. Связана  с кнопкой Очистить диалога формы приказа процедура  ОчиститьТабл()

если КоличествоСтрок() = 0 тогда Предупреждение("Нет строк  для  удаления.");  возврат;

конецЕсли;

если  Вопрос("Очистить  таблицу документа?", "Да+Нет") = "Да"  тогда УдалитьСтроки();

// Поскольку  в приказе нет сотрудников, следующие кнопки делаем недоступными форма.Очистить.Доступность(0);

форма.Удалить.Доступность(0); форма.ОК.Доступность(0);

конецЕсли;

конецПроцедуры // ОчиститьТабл

// Удаляет текущую строку табличной части документа

// Связана с кнопкой Очистить диалога формы приказа процедура   УдалитьСтрокуТабл()

если КоличествоСтрок() = 0 тогда Предупреждение("Нет строк для удаления."); возврат;

конецЕсли;

если Вопрос("Удалить текущую строку?", "Да+Нет") = "Да" тогда УдалитьСтроку();

если КоличествоСтрок() = 0 тогда

// Поскольку  в приказе не осталось сотрудников,

// следующие кнопки делаем недоступными форма.Очистить.Доступность(0); форма.Удалить.Доступность(0); форма.ОК.Доступность(0);

конецЕсли; конецЕсли;

конецПроцедуры // УдалитьСтрокуТабл

// Предопределенная процедура.  Осуществляет контроль введенных данных процедура ПриЗаписи( )

если (ПустоеЗначение(ДатаНовОклада) = 1) тогда Предупреждение("Определите дату  нового  оклада."); СтатусВозврата(0);                    //              Не записываем данные

// Перемещаемся на элемент диалога ДатаНовОклада

Активизировать("ДатаНовОклада",  1); возврат;

конецЕсли;

если КоличествоСтрок() = 0 тогда Предупреждение("Список сотрудников пуст.");

СтатусВозврата(0);                     //              Запрещаем запись документа

возврат; конецЕсли;

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

// и отличается ли он от прежнего оклада ВыбратьСтроки();

пока ПолучитьСтроку() > 0 цикл если НовыйОклад = 0 тогда

Предупреждение("Сотруднику " + Сотрудник  + " не установлен оклад."); СтатусВозврата(0);                  //                  Запрещаем  запись документа возврат;

конецЕсли;

если НовыйОклад = ПрежнийОклад тогда

Предупреждение("Новый и прежний оклады сотрудника " + РазделительСтрок + Сотрудник +" одинаковы.");

СтатусВозврата(0);                 //              Запрещаем  запись документа возврат;

конецЕсли;

конецЦикла; // пока конецПроцедуры // ПриЗаписи

5.8.4.3.      МОДУЛЬ    ДОКУМЕНТА

Содержит  предопределенную  процедуру  ОбработкаПроведения.  Проведение  или перепроведение проведенного документа выполняется каждый раз при его записи.

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

// Устанавливает значения периодического атрибута Оклад для всех попавших  в приказ

// сотрудников, а также значение реквизита справочника ПриказОклад

процедура ОбработкаПроведения() перем сСотр_2;

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

// Дата для периодического реквизита Оклад справочника Сотрудники_2 сСотр_2.ИспользоватьДату(РабочаяДата());

ВыбратьСтроки();

пока ПолучитьСтроку() > 0 цикл

если сСотр_2.НайтиЭлемент(Сотрудник) = 0 тогда Предупреждение("Сотрудник " + Сотрудник + РазделительСтрок +

" в справочнике Сотрудники_2 не найден."); продолжить;

конецЕсли;

// Устанавливаем связь документа с записью справочника Сотрудники_2 сСотр_2.ПриказОклад = ТекущийДокумент();

сСотр_2.3аписать();                 //           Сохраняем изменения

// Записываем периодический реквизит Оклад с привязкой к документу УстановитьРеквизитСправочника(Сотрудник, "Оклад", НовыйОклад, ДатаНовОклада);

конецЦикла; // пока

// Ограничиваем время показа окна с предупреждением тремя секундами

// См. также замечание 1 к процедурам ОбработкаПроведения

// и ОбработкаУдаленияПроведения в разд. 5.8.2.3

если Проведен() = 0 тогда                 //          Если документ проводится впервые Предупреждение("Документ проведен.", 3);

иначе

Предупреждение("Документ перепроведен.",  3); конецЕсли;

конецПроцедуры // ОбработкаПроведения

5.9 .   О Т Б О Р   И   Ф И Л Ь Т Р А Ц И Я  Д А Н Н Ы Х

С П Р А В О Ч Н И К А

Применяется для  вывода в  форме   списка  справочника  данных, удовлетворяющих некоторым условиям.

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

По теме:

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