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

0

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

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

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

сСотр_2.3аписать();

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

Остальные характеристики приказа определим  в соответствии с рис. 5.33.

Рис. 5.33. Свойства документа Приказа о приеме на работу

Откроем затем  форму  документа, вставим в  ее диалог реквизиты и  приведем  диалог к виду, представленному на рис. 5.34.

Рис. 5.34. Диалог формы Приказа о приеме на работу

Замечание.   При  добавлении  документа в  конфигурацию  1С  создаст  в  информационной базе  для  хранения  данных  шапки  документов  ПриказОПриеме  2  файла,  возможно DH4216.DBF и  DH4216.CDX. Если  бы  документ содержал вдобавок и табличную  часть, то  для  хранения  данных из  этой  части  1С  пополнил  бы  информационную базу еще двумя файлами  DT4216.DBF и DT4216.CDX.

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

С кнопкой ОК диалога документа связаны  команды

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

Они  реализуют  последовательность  методов

Записать();                                   //                     Запись документа

// Проведение документа. Вызывается  процедура ОбработкаПроведения модуля документа

Провести(); форма.Закрыть();

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

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

При  вводе нового  документа полезно  выполнять  начальную установку  даты  документа  и  даты  приема  на  работу.   Используем для  этого  предопределенную  процедуру ВводНового.

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

Формирование кода  выполним в  процедуре СоздатьКод, которую  свяжем  с  полем  Подразделение, задав для  него  в  окне  задания свойств  поля  на закладке  Дополнительно  формулу  СоздатьКод(). Тогда  процедура СоздатьКод будет вызываться каждый  раз при  изменении подразделения. Если  нужного подразделения  в  справочнике  Сотрудники_2 нет, то его придется ввести,  применив  форму  группы справочника (разд.  5.3.3.1).

Таким  образом, модуль  формы Приказа  о  приеме  на  работу  содержит  следующие процедуры и функции:

функция КонтрольФИО(место = 1) далее процедура УбратьПробелы() далее процедура ВНРег() далее

процедура СоздатьКод() далее

// Выполняет проверки вводимых данных процедура ПриЗаписи()

если ((ПустоеЗначение(Подразделение) = 1) или (ПустоеЗначение(ФИО) = 1) или (ПустоеЗначение(Оклад) = 1) или (ПустоеЗначение(Образование) = 1) тогда

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

// Функция КонтрольФИО при таком вызове вернет 0, если в ФИО есть точки иначеЕсли КонтрольФИО(2) = 0 тогда

СтатусВозврата(0); конецЕсли;

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

// Подробный комментарий к функции и ее процедурам см.  в разд.  5.3.4.2 функция  КонтрольФИО(место = 1)

конецЕсли;

если Найти(ФИО,".") <>  0 тогда Предупреждение("Точки  в ФИО недопустимы."); возврат 0;

иначе                                            //                             Точек в  имени нет

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

конецФункции // КонтрольФИО

процедура  УбратьПробелы() перем  ФИО2, длина, поз, к;

// Удаляем возможные ведущие  и завершающие пробелы

// Вводим ФИО2, поскольку СокрЛП не меняет длину ФИО ФИО2  = СокрЛП(ФИО);

поз = Найти(ФИО2,  "  ");                          //                 Ищем два подряд идущих пробела

// Цикл продолжается, пока  в строке есть хотя бы одна  пара  подряд идущих пробелов пока поз > 0 цикл

пока (поз < длина) и (Сред(ФИО2, поз + к, 1) = " ") цикл к = к + 1;

конецЦикла; // пока  (поз  < длина)…

// Удаляем лишние пробелы и заменяем  старое значение ФИО на новое ФИО2 = Лев(ФИО2, поз) + Прав(ФИО2, длина поз к + 1);

поз  = Найти(ФИО2, "  ") ;                       //              Ищем 2 подряд идущих пробела конецЦикла; // пока  поз > 0

ФИО =                      ФИО2;                     //                          Результат конецПроцедуры // УбратьПробелы

// Преобразовывает ФИО так, что первые буквы каждого

// составляющего ФИО  слова прописные, а остальные строчные процедура  ВНРег()

перем  к, длина;

длина = стрДлина(ФИО);                    //                            Длина ФИО если длина = 0 тогда

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

ФИО  = Нрег(ФИО);                     //                         Первый шаг алгоритма

ФИО = Врег(Лев(ФИО, 1)) + Прав(ФИО, длина 1);

// Позиция пробела или нуль, если пробел не найден к = Найти(ФИО, " ");

пока к > 0 цикл

ФИО = Лев(ФИО, к 1) + "%" +

Врег(Сред(ФИО, к + 1, 1)) + Прав(ФИО, длина к 1); к Найти(ФИО, " ");

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

// Заменяем символы % точки на пробелы

ФИО = СтрЗаменить(ФИО,  "%", " ");

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

// Формирует и возвращает при добавлении новой записи код сотрудника

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

// Вызывается после выбора подразделения предприятия

// Алгоритм:

//1. Начало.

// 2. Прочитать кодПодр код подразделения и его уровень

//3. Найти максКод максимальное значение кода сотрудника, входящего в подразделение

// 4. Найти двеЦифр первые две цифры кода сотрудника по следующему правилу:

//       если уровень = 1, то

//          двеЦифр = кодПодр * 10

//       иначе

//          двеЦифр = кодПодр

//       конец если

// 5. Найти послЦифр цифры максКод, следующие после его первых двух цифр

// 6. Последующие цифры нового кода: послЦифр = послЦифр + 1

// 7. Новый код: Код = Число(Строка(двеЦифр) + Строка(послЦифр))

//8. Конец.

процедура СоздатьКод()

перем сСотр_2, кодПодр, уровень, максКод, двеЦифр, послЦифр; перем двеЦифрУмнНаК, к;

если ПустоеЗначение(Подразделение) = 1 тогда

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

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

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

// В справочнике Сотрудники_2 можно  в поле Подразделение выбрать как сотрудника,

// так и подразделение. В первом случае мы перейдем от сотрудника к подразделению,

// использовав атрибут Родитель. Во втором, если подразделение на следующем уровне

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

// подразделения придется продолжить

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

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

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

// Переходим от сотрудника к подразделению

// и устанавливаем на него позицию справочника Подразделение  =  сСотр_2.Родитель; сСотр_2.НайтиЭлемент(Подразделение);

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

сСотр_2.НайтиЭлемент(Подразделение); сСотр_2.ИспользоватьРодителя(сСотр_2.ТекущийЭлемент()); сСотр_2.ВыбратьЭлементы(1); //        Задаем  выборку с учетом иерархии

// Если на следующем уровне подразделение, то это не годится если сСотр_2.ПолучитьЭлемент() = 1 тогда

если сСотр_2.ЭтоГруппа() =  1 тогда

Подразделение = ПолучитьПустоеЗначение("Справочник.Сотрудники_2"); Предупреждение("Выбрано  подразделение не того уровня.");

возврат;

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

конецЕсли;

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

// сСотр_2.Код может  иметь символьный тип

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

двеЦифр = ?(уровень = 1, кодПодр  * 10, кодПодр);

// Найдем максКод  максимальный код  сотрудника  в пределах подразделения

// Осуществи это, перебирая  все элементы подразделения, что достигается

// в результате употребления метода ИспользоватьРодителя сСотр_2.ИспользоватьРодителя(Подразделение);

// Осуществим перебор в порядке возрастания  кодов элементов сСотр_2.ПорядокКодов();

сСотр_2.ВыбратьЭлементы();

// максКод останется  равным нулю, если  в группе нет элементов максКод = 0;

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

// сСотр_2.Код  может иметь символьный тип

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

// Ищем последующие цифры максКод  и затем  последующие цифры  кода

// нового  сотрудника.  Будем  умножать двеЦифр  на  10, пока  не  превысим максКод

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

По теме:

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