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

0

к=1 ;

двеЦифрУмнНаК = двеЦифр;

пока  двеЦифрУмнНаК < максКод цикл двеЦифрУмнНаК = двеЦифрУмнНаК * 10;

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

// Последующие цифры кода  нового сотрудника

послЦифр = ?(максКод = 0, 1, максКод двеЦифрУмнНаК /10 + 1);

// Итак, код нового сотрудника

Код = Число(Строка(двеЦифр) + Строка(послЦифр)); конецПроцедуры // СоздатьКод

// ВводНового предопределенная процедура, вызываемая, если  присутствует

// в коде  модуля  формы, при вводе нового документа. Используем ее для начальной

// установки даты  нового документа и даты  приема на работу процедура  ВводНового()

ДатаДок = РабочаяДата();

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

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

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

Замечания:

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

// Если выбран сотрудник

если Подразделение.ЭтоГруппа() = 0 тогда

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

// Далее см. процедуру СоздатьКод

// Проверим, что на следующем уровне подразделения

// Если на следующем уровне подразделение, то это не годиться иначе

конецЕсли;

// Далее см. процедуру СоздатьКод

Более  совершенный способ   выбора  подразделения по  справочнику  Сотрудники_2 мы рассмотрим  в разд.  7.4.3  при  разработке документа Табель.

2.      Хотя реквизит Код справочника Сотрудники_2 имеет числовой тип, вызов сообщить(ТипЗначенияСтр(сСотр_2 .Код));

напечатает в  строке   сообщений  слово  Строка.  Поэтому в  процедуре  СоздатьКод вместо операторов  присваивания

кодПодр  = сСотр_2.Код; максКод  = сСотр_2.Код;

употреблены  операторы

кодПодр = ?(ТипЗначения(сСотр_2.Код) = 2, Число(сСотр_2.Код), сСотр_2.Код); максКод = ?(ТипЗначения(сСотр_2.Код) = 2, Число(сСотр_2.Код), сСотр_2.Код);

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

кодПодр = 1 * сСотр_2.Код; максКод = 1 * сСотр_2.Код;

5.8.2.3.     МОДУЛЬ  ДОКУМЕНТА.   ПРОВЕДЕНИЕ  И     УДАЛЕНИЕ ДОКУМЕНТА

При  проведении  документа  вызывается  создаваемая   программистом  предопределенная  процедура модуля  документа  ОбработкаПроведения. В ней  для  нашего   случая учитываются следующие  состояния  документа:

1)      проводится новый  документ;

2)       проводится документ, с которого снята  пометка удаления (при  простановке пометки  удаления документ  становится непроведенным).  Такой  документ  может  иметь соответствующую  ему запись в  справочнике Сотрудники_2;

3)       перепроводится ранее проведенный документ.

Удаление  непроведенного документа  о  приеме  на  работу  при  отсутствии  на  него ссылок в  других объектах  можно  выполнить методом

Удалить(1);

сразу  проставляющим  DBF-пометку об  удалении. При  упаковке  базы  документ  будет удален из нее физически.

Удаление проведенного документа   более сложный  процесс.  Здесь  возможны варианты:

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

2)      такие ссылки имеются, например в журнале расчетов Заработная  плата.

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

Код модуля документа с учетом вышеприведенного комментария может быть таким:

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

// в справочнике Сотрудники_2, связывает запись справочника с документом, а

// документ с соответствующей записью справочника Сотрудники_2 процедура ОбработкаПроведения()

перем сСотр_2, гр, флаг, флаг2;

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

// Храним в гр подразделение, куда принимается или переводится сотрудник сСотр_2.НайтиЭлемент(Подразделение);

гр = сСотр_2.ТекущийЭлемент(); флаг = Проведен();

// Находим в справочнике Сотрудники_2 запись, с которой связан данный приказ

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

если флаг + флаг2 = 0 тогда                  .     //   Если документ не проведен

сСотр_2.Новый();                       //              и не снимается пометка на удаления

конецЕсли;

сСотр_2.Родитель = гр;                    //            Фиксируем подразделение (родителя)

// Определяем и сохраняем непериодические реквизиты сСотр_2.Наименование =  ФИО;

сСотр_2.Код = Код; сСотр_2.Образование  = Образование; сСотр_2.ПриказПрием =  ТекущийДокумент(); сСотр_2.3аписать();

// Устанавливаем связь документа с записью справочника Сотрудники_2

Сотрудник  = сСотр_2.ТекущийЭлемент();

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

// Снимем, если она есть, пометку удаления записи о сотруднике

// в справочнике Сотрудники_2. Такая  пометка может появиться при удалении

// документа, породившего эту запись (ом. процедуру ОбработкаУдаленияПроведения) если (флаг2 = 1) и (сСотр_2.ПометкаУдаления() = 1) тогда

сСотр_2,СнятьПометкуУдаления(); конецЕсли;

если флаг = 0 тогда                       //              Если документ не проведен

// Ограничиваем время показа окна с предупреждением тремя секундами Предупреждение("Документ проведен.", 3);

иначе

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

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

// Вызывается при удалении документа или при исполнении метода СделатьНеПроведенным процедура ОбработкаУдапенияПроведения()

перем сСотр_2, флаг;

сСотр_2  =  СоздатьОбъект("Справочник.Сотрудники_2"); флаг = сСотр_2.НайтиЭлемент(Сотрудник);

если флаг = 1 тогда

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

конецЕсли;

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

Замечания:

1.      Предопределенные  процедуры модуля   документа  ОбработкаПроведения и  ОбработкаУдаленияПроведения    1С   выполняет    с   использованием   транзакций   (разд.  8.4.3), во время которых  блокируются  DBF-таблицы, в транзакциях  участвующие. При  многопользовательском режиме  работы   блокировка  порождает  конфликтные  ситуации: иной  пользователь  не  может  проводить или  удалять  аналогичные  документы.  Чтобы  снизить вероятность  конфликтов, в  процедуры  ОбработкаПроведения и ОбработкаУдаленияПроведения  не  следует  включать  вызовы процедур, приостанавливающих  вычисления, например, такой, как  Предупреждение, заменяя ее на вызов процедуры Сообщение.

2.       Реквизит приказа  о  приеме Сотрудник  после  проведения документа позволяет  непосредственно обращаться к  созданной им  в  справочнике  Сотрудники_2  записи, например, так:

док = СоздатьОбъект("Документ.ПриказОПриеме"); флаг = док.НайтиПоНомеру(2, Дата(0));

если флаг = 1 тогда

//док.Сотрудник.Образование значение реквизита Образование в справочнике

// Сотрудники_2 для сотрудника, проведенного приказом № 2

Сообщить(док.Сотрудник.Образование);              //        Напечатает Высшее  иначе

Предупреждение("Приказ № 2 не найден."); конецЕсли;

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

Документы.ПриказОПриеме.Ввести и Документы.ИзменениеОклада.Ввести

в   колонку  Документы  меню   интерфейса   Ученик,  связав   их  соответственно   с   акселераторами  Alt+б  и  Alt+7  (рис. 5.35), и  добавим колонку Журналы с  пунктом Кадровые приказы, позволяющим  при помощи команды

Журналы.ПриказыКадровые.Открыть

открыть журнал, хранящий  созданные документы.

Рис. 5.35. Модифицированное меню интерфейса Ученик

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

5.8.2.4.     ВЫЗОВ ДОКУМЕНТА   ИЗ     ФОРМЫ   СПИСКА СПРАВОЧНИКА          СОТРУДНИКИ_2

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

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

По теме:

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