ПОРЯДОК УДАЛЕНИЯ ЗАПИСЕЙ В ФОРМЕ СПИСКА
Рассмотрим подробнее процесс удаления записей.
Для удаления выбранного элемента нажмите иконку "і-. Физически, однако, элемент из справочника не удаляется, а лишь помечается как кандидат на удаление. При этом система позволяет выполнять его редактирование и выбор. Проставленная пометка об удалении снимается в результате повторного задействования той же иконки.
Если удаляется группа, то будут удалены (помечены для удаления) и все ее подчиненные, входящие в нее элементы. Снять же пометку удаления можно как с группы, так и со всех ее элементов.
При простановке пометки удаления система заносит в поле Ismark DBF-таблицы справочника символ * (табл. 5.2).
Таблица 5.2
фрагмент DBF-таблицы справочника Сотрудники_2 с помеченными записями |
|
Id |
Parentid |
Code |
Descr |
Isfolder |
Ismark |
Verstamp |
|
F |
7 |
203 |
Митина Ольга Владимировна |
2 |
|
6 |
|
М |
7 |
204 |
Удаляемый Сергей Николаевич |
2 |
* |
1 |
|
N |
7 |
205 |
Изымаемый Сергей Петрович |
2 |
* |
1 |
|
О |
7 |
206 |
Скрываемый Сергей Михайлович |
2 |
* |
1 |
|
Такая пометка является внутренней пометкой 1С и не позволяет осуществить физическое удаление записей DBF-файла, хранящих данные справочника.
Чтобы получить возможность удалять помеченные записи физически, добавим в меню интерфейса Ученик системную колонку Сервис, разместив в ней пункт &Удаление помеченных объектов (рис. 5.20). (Амперсант перед прописной буквой У обеспечивает интерактивный выбор пункта меню по этой букве.)
Е ‘Щз Сервис
0 ^Удаление помеченных объектов Е. ‘Щз Проба і- 0 Пуск 0 Открытъ Е ‘Щз Справочники 0 Константы 0 Сотрудники_2 0 Сотрудники
Рис. 5.20. Модифицированное меню интерфейса Ученик
Свойства нового пункта меню зададим в соответствии с рис. 5.21.
Общие I Параметры | Акселератор |
Нззваже; (^Удаление помечен Тип: |команаа
Объект. I Задача
w |
Команда: | Задача. УдалениеЛомеченныхОбъектов
Подсказка: (Удаление помеченных объектов
Рис. 5.21. Свойства пункта Удаление помеченных объектов
После сохранения конфигурации и загрузки 1С:Предприятия введем в справочник Сотрудники_2 новые записи, пометив их для удаления (рис. 5.22).
+ Jj Ссггруді**и_2 |
|
Кад |
Наименование |
Оклад |
|
2 |
02 Цех |
|
|
201 |
Абрамова Париса Сергеевна |
2.000 00 |
|
202 |
Куприкова Людмила Сергеевна |
2.100 00 |
|
203 |
Митина Ольга Владнг«іиробНб |
1.900 00 |
204 |
Удаляемый Сергей Николаевич |
3.450 00 |
|
205 |
Изымаемый Сергей Петрович |
2.350.00 |
|
206 |
Скрываемый Сергей Михайлович |
2.75000 |
|
Рис. 5.22. Три помеченные для удаление записи
Воспользовавшись затем новым пунктом меню, мы обнаружим, что его действие распространяется на все такие объекты системы, как Документы и Справочники. На первом этапе решения задачи об удалении помеченных объектов система находит эти объекты и выводит их список (рис. 5.23).
 |
Рис. 5.23. Список объектов для удаления |
В диалоге, содержащем этот список, следует нажать кнопку Контроль, чтобы определить объекты, которые можно удалить из базы, не нарушая ее целостности (рис. 5.24).
 |
Рис. 5.24. Результат контроля помеченных на удаление объектов |
Критерий выбора удаляемых объектов прост: объект можно удалить, если на него нет ссылок, и нет - в противном случае. Если есть необходимость максимально освободить систему от ненужных объектов, то следует поработать со ссылками, препятствующими удалению. Подход к каждой ссылке индивидуален. Удаление можно произвести программой, применив соответствующие методы для разных объектов.
Нажав кнопку Удалить, мы получим в окне сообщений текст об удаленных объектах, содержащий в том числе и информацию о нашем справочнике:
Удаленные записи:.
Справочник: Сотрудники_2 02 Цех/Удаляемый Сергей Николаевич Справочник: Сотрудники_2 02 Цех/Изымаемый Сергей Петрович Справочник: Сотрудники_2 02 Цех/Скрываемый Сергей Михайлович Справочник.Сотрудники_2: удалено объектов 3
После таких действий мы сделаем очередной шаг к физическому удалению записей, а точнее, пометим их для удаления так, как это принято в DBF-файлах. Визуально такая пометка отображается в первом столбце таблицы (такой столбец имеется и в табл. 5.2) и видна при открытии DBF-файла, например, в FoxPro. Приведем одну строчку таблицы с помеченными таким образом записями:
7 |
204 |
Удаляемый Сергей Николаевич |
2 * |
1 |
Замечание. Пометки удаления, проставляемые 1С в поле Ismark (см. табл. 5.2), в дальнейшем будем называть 1С-пометками удаления. Пометки удаления, которые 1С заносит в первый столбец DBF-файла, будем называть DBF-пометками удаления.
Только теперь можно перейти к физическому удалению помеченных записей. Для этого нужно закрыть 1С:Предприятие, открыть конфигуратор и вызвать, выполнив цепочку Администрирование - Тестирование и исправление ИБ, приведенный на рис. 5.25 диалог, активизировав в нем флаг Упаковка таблиц информационной базы.
Тестирование и исправление информационной базы
Выполняемые действия
Выло гнить
целостности
Настройся I
итогов
Пересчет
Помощь
(• Т вотирование и исправлеше Только тест?еоеаммв
Рис. 5.25. Запуск физического удаления помеченных записей
После выполнения упаковки произойдет физическое удаление помеченных записей. Восстановить удаленные таким образом записи нельзя.
Замечание. Встроенные процедуры НайтиПомеченныеНаУдаление и НайтиСсыл-ки, осуществляющие поиск помеченных для удаления записей и имеемых ими ссылок, а также процедура УдалитьОбъекты, удаляющая помеченные объекты (проставляющая DBF-пометки удаления), рассмотрены в разд. 5.15.
5.5.3. УПРАВЛЕНИЕ ЗАПИСЯМИ ИЗ ПРОГРАММЫ
Управлять записями справочников, то есть добавлять, удалять, редактировать, выбирать, искать и сортировать записи, можно, пользуясь имеющимися в 1С методами Для справочников. В этом разделе мы рассмотрим методы, имеющие отношение к добавлению, редактированию и удалению записей.
5.5.3.1. ДОБАВЛЕНИЕ ЗАПИСЕЙ
Новый элемент и группа добавляются в справочник соответственно методами Новый и НоваяГруппа. Они применимы только с переменными типа Справочник, определенными функцией СоздатьОбъект. Для записи нового элемента употребляется метод Записать.
Пример. В справочнике Сотрудники_2 создается группа 03 Цех, в которую заносится информация о сотруднике этого цеха.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, кодЦеха;
ОчиститьОкноСообщенийО; кодЦеха = 3;
// Определяем переменную сСотр_2 как объект типа Справочник с разновидностью
// типа Справочник.Сотрудники_2
сСотр_2 = СоздатъОбъект(''Справочник.Сотрудники_2'');
если сСотр_2.НайтиПоКоду(кодЦеха, 0) = 1 тогда
Предупрежденье Цех с кодом ” + кодЦеха + ” уже есть."); возврат; конецЕсли;
сСотр_2.НоваяГруппа(); // Создаем новую группу
сСотр_2.Код = кодЦеха; // и определяем ее реквизиты
сСотр_2.Наименование = "0" + Строка(кодЦеха) + ” Цех"; сСотр_2.3аписать(); // Записываем новую группу
// Текущим элементом является только что созданная группа 03 Цех // Чтобы занести сотрудника в эту группу, необходимо применить // метод ИспользоватьРодителя. Его параметром должно быть значение группы,
// имеющее тип Справочник, возвращаемое, например, методом ТекущийЭлемент // или задаваемое именем объекта-справочника сСотр_2.ИспользоватьРодителя(сСотр_2);
//или
// сСотр_2.ИспользоватьРодителя(сСотр_2.ТекущийЭлементО);
// Записываем периодический реквизит Оклад на рабочую дату // Этот оператор должен быть размещен до вызова метода Новый сСотр_2.ИспользоватьДату(РабочаяДата());
сСотр_2.Новый(); // Создаем новый элемент
// Атрибут Код, если его не определить, будет вычислен автоматически // Мы же определим код явно, равным, например, 301 сСотр_2.Код = Число(Строка(кодЦеха * 100)) + ”1”;
// Определяем иные реквизиты нового элемента сСотр_2.Наименование = "Безверхний Игорь Петрович”; сСотр_2.0клад = 3100;
сСотр_2.3аписать(); // Записываем новый элемент
// Просмотр результата
ОткрытьФорму(”Справочник.Сотрудники_2.ФормаСписка”);
конецПроцедуры
Результат приведен на рис. 5.26.
II Код 1И «именование |
ОдЯвД е| |
з|оэи« |
- j |
іИиЦ Безверхими Игорь Пе-’рооі'ч |
3.100 00 |
ЛІ___ |
|
- Сотруцники_2 ¦ Сз 01 Цех 02 Цех
^ 03 Цех
Рис. 5.26. Новое подразделение и новый сотрудник
5.5.3.2. ПЕРЕНОС ЗАПИСИ В ДРУГУЮ ГРУППУ
Если в приведенной в предшествующем разделе процедуре не вызывать метод Ис-пользоватьРодителя, то новый сотрудник попадет на верхний уровень (рис. 5.27). Чтобы переместить сотрудника в третий цех, следует выделить и сотрудника и группу,
обозначающую цех, так, как это показано на рис. 5.27, и воспользоваться иконкой или соответствующим пунктом меню в колонке Действия, или сочетанием клавиш
Ctrl+F5.
 |
Рис. 5.27. Перевод нового сотрудника в третий цех |
Программно перевод осуществляется в результате выполнения следующего кода:
процедура Выполнить() //Связана с кнопкой Пуск обработки Проба
перем сСотр_2, гр; // Переносит сотрудника в указанную группу
0,чиститьОкноСообщений();
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
// Находим группу, в которую переносится сотрудник если сСотр_2.НайтиПоКоду(3, 0) = 1 тогда
// Запоминаем ссылку на найденную группу гр = сСотр_2.ТекущийЭлемент();
// Находим сотрудника если сСотр_2.НайтиПоКоду(301, 0) = 1 тогда если сСотр_2.Родитель = гр тогда
Предупреждение(сСотр_2.Наименование + " уже работает в " + гр); возврат; конецЕсли;
// Меняем для нового сотрудника значение атрибута Родитель,
// присваивая ему значение переменной гр, имеющей тип Справочник сСотр_2.Родитель = гр;
сСотр_2.3аписать(); // Записываем измененный элемент
Предупреждение(сСотр_2.Наименование + " переведен в " + гр);
// Просмотр результата
ОткрытьФорму("Справочник.Сотрудники_2.ФормаСписка");
иначе
Предупреждение("Сотрудник не найден."); конецЕсли; иначе
Предупреждение('Труппа не найдена."); конецЕсли;
конецПроцедуры // Выполнить
Замечание. Поскольку в каждой группе код ее подчиненного элемента связан с кодом группы, то при переносе элемента из одной группы в другую необходимо соответствующим образом изменять код элемента. Алгоритм вычисления нового кода приведен в разд. 5.8.2.2. При интерактивном перемещении элемента из одной группы в другую его код следует модифицировать в предопределенной процедуре ПриПереносеЭлементаВДругуюГруппу модуля формы списка справочника. Порядок ее употребления рассмотрен в разд. 5.12.6.
5.5.3.3. РЕДАКТИРОВАНИЕ ЗАПИСЕЙ
Редактированию записи предшествует ее поиск, который может быть выполнен одним из четырех следующих методов: НайтиЭлемент, НайтиПоКоду, НайтиПоНаи-менованию и НайтиПоРеквизиту.
Изменение непериодического реквизита осуществляется либо в результате присваивания ему нового значения, либо методом УстановитьАтрибут. Изменение префикса кода осуществляется методом УстановитьНовыйКод; с числовым кодом применять эту функцию смысла не имеет.
Периодический реквизит также можно изменить простым присваиванием или методом УстановитьАтрибут. Однако предварительно до поиска элемента методом Ис-пользоватьДату нужно установить дату записи такого реквизита. Если в коде метод ИспользоватьДату ни разу для справочника не применялся, то для изменения значения периодического реквизита можно использовать метод Установить.
Пример. Изменяется фамилия сотрудника, код которого равен 203, и его оклад.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, новФИО;
ОчиститьОкноСообщенийО;
новФИО = "Костина Ольга Владимировна";
сСотр_2 = СоздатьО&ьект(''Справочник.Сотрудники_2'');
// Записываем периодический реквизит Оклад на рабочую дату сСотр_2.ИспользоватьДату(РабочаяДата());
// Ищем во всем справочнике
если сСотр_2.НайтиПоКоду(209, 0) = 1 тогда
если СокрЛП(сСотр_2.Наименование) = новФИО тогда Предупреждение("Старая и новая фамилии совпадают."); возврат;. конецЕсли;
сСотр_2.Наименование = новФИО; сСотр_2.0клад = 2900; // Новый оклад
сСотр_2.3аписать(); // Записываем изменения
иначе
Предупреждение("Сотрудник не найден."); конецЕсли;
// Просмотр результата
ОткрытьФорму("Справочник. Сотрудники_2. ФормаСписка"); конецПроцедуры // Выполнить
Тот же результат получим, заменив присваивания на метод УстановитьАтрибут:
сСотр_2.УстановитьАтрибут("Наименование", "Костина Ольга Владимировна"); сСотр_2.УстановитьАтрибут("Оклад", 2900);
Также вместо методов ИспользоватьДату и УстановитьАтрибут можно для периодического реквизита Оклад применить вызов
сСотр_2.0клад-Установить(РабочаяЦата(), 2900);
Замечание. Если не задана дата периодического реквизита, то возникнет ошибка, сопровождаемая сообщением
Не определена дата! Элемент не может быть записан!
5.5.3.4. УДАЛЕНИЕ ЗАПИСЕЙ
Запись можно снабдить пометкой для удаления, употребляемой в 1С или в DBF-файлах, применив метод Удалить соответственно с аргументом 0 или 1. Снять пометку 1С позволяет метод СнятьПометкуУдаления. Метод-функция ПометкаУдаления вернет 1, если элемент имеет 1С-пометку удаления, или 0 -в противном случае.
Пример. Помечается для удаления в смысле 1С группа 01 /1 и все ее подчиненные элементы. Затем снимается отметка об удалении с элемента этой группы, имеющего код 112.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2;
ОчиститьОкноСообщений();
сСотр_2 = СоздатьОбъект("Справочник.Сотруцники_2");
// Ищем во всем справочнике
если сСотр_2.НайтиПоНаименованию("01 /1", 0) = 1 тогда // Если выбрана кнопка "Да"
если Вопрос("Пометить для удаления группу", 4) = 6 тогда
сСотр_2.Удалить(0); // Помечаем всю группу
// Ищем во всем справочнике если сСотр_2.НайтиПоКоду(112, 0) = 1 тогда если сСотр_2.ПометкаУдаления() = 1 тогда сСотр_2. СнятьПометкуУдаления(); конецЕсли; иначе
Предупреждение("Сотрудник не найден."); конецЕсли; конецЕсли; иначе
Предупреждение("Подразделение не найдено."); конецЕсли;
// Просмотр результата
ОткрытьФорму("Справочник.Сотрудники_2.ФормаСписка"); конецПроцедуры // Выполнить
5.6. ПОЗИЦИЯ СПРАВОЧНИКА. ВЫБОР ДАННЫХ
Справочник, если число его записей больше нуля, может быть позиционирован либо перед своей первой записью, либо на записи, либо вслед за последней записью.
Сразу после создания справочника его позиция не определена. Позицию справочника меняют методы поиска данных, например НайтиЭлемент или НайтиПоКоду. Значение элемента в текущей позиции возвращает функция ТекущийЭлемент.
В процессе работы можно выбрать все или часть элементов справочника, открыв выборку методом ВыбратьЭлементы или ВыбратьЭлементыПоРеквизиту. В результате их применения справочник позиционируется на своей первой записи. Перемещение по записям осуществляется методом ПолучитьЭлемент.
Пример 1. Выводится список цехов предприятия.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2;
ОчистшъОкноСообщенийО;
сСотр_2 = СоздатьОбьект("Справочник.Сотрудники_2");
сСотр_2.ВыбратьЭлементы();
пока сСотр_2.ПолучитьЭлемент() = 1 цикл
если (сСотр_2.ЭтоГруппа() = 1) и (сСотр_2.Уровень() = 1) тогда Сообщить(сСотр_2. Наименование); конецЕсли; конецЦикла;
конецПроцедуры // Выполнить Результат:
01 Цех
02 Цех
03 Цех
Пример 2. Выводится список подразделений первого цеха предприятия.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2;
ОчиститьОкноСообщений();
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
// Если не найден первый цех (его код равен единице) если сСотр_2.НайтиПоКоду(1, 0) = 0 тогда
Предупреждение("Первый цех не найден."); возврат; конецЕсли;
// Ограничиваем выборку первым цехом сСотр_2.ИспользоватьРодш’еля(сСотр_2); с Сотр_2. ВыбратьЭлементы(); пока сСотр_2.ПолучшъЭлемент() = 1 цикл если сСотр_2.ЭтоГруппа() = 1 тогда Сообщить(сСотр_2.Наименование); конецЕсли; конецЦикла;
конецПроцедуры // Выполнить Результат:
01 / 1 02/2 03/3
Выбор по реквизиту методом ВыбратьЭлементыПоРеквизиту возможен только для непериодического_реквизита, если для него на закладке Дополнительные установлено, свойство Сортировка. (По умолчанию свойство Сортировка имеет реквизиты Код и Наименование.)
С перечисленными в этом разделе методами при выборе данных употребляются методы ОбратныйПорядок, ПорядокНаименований, ПорядокКодов, ВключатьПодчи-ненные, ИспользоватьРодителя, ИспользоватьВладельца и ИспользоватьДату.
5.7. ИЗМЕНЕНИЕ СТРУКТУРЫ И ФОРМ СПРАВОЧНИКА
Приспособим справочник Сотрудники_2 для хранения информации об образовании сотрудника. Для этого потребуется провести некоторую дополнительную работу -создать справочник Образование_2. Она необходима, поскольку встроенный справочник Образование имеет владельца - справочник Сотрудники.
Структуру справочника Образование_2 сделаем максимально простой, использовав в нем только установленные по умолчанию реквизиты Код и Наименование. Далее внесем в поле Наименование приведенные на рис. 5.28 записи.
 |
Рис. 5.28. Состав справочника Образование_2 |
Значения этих записей будем использовать для определения (еще несуществующего) реквизита Образование_2 справочника Сотрудники_2.
При создании справочника Образование_2 добавим команду его вызова в колонку Справочники меню интерфейса Ученик.
Переместимся вновь в конфигурацию и пополним справочник Сотрудники_2 реквизитом Образование_2, сделав его непериодическим, установив для него тип Справочники с разновидностью типа Образование_2 и задав свойство Сортировка (рис. 5.29).
55цие I Дополнительные I
Общие
. гг/ от- Г Использовать.
Неітт Г I Для элемента
Периодический ГГ. ""¦<
Сортировка 17 Г
Идентификатор I Образование ?»«ни* I Образование
Еомментарт*
Выбирается из справочника Образован Іип значения | Справочник.0бразоеание_2 3 Отбор по реквизиту W
а и
Рис. 5.29. Свойства реквизита Образование: а - общие; б - дополнительные
Изменим соответствующим образом и формы элемента и списка справочника (основную и для выбора), открыв их в конфигураторе, выбрав на панели инструментов Элементы диалога иконку и добавив в них реквизит Образование (рис. 5.30).
 |
Рис. 5.30. Форма элемента с добавленным полем Образование |
Сохраним конфигурацию, воспользуемся новой формой и отредактируем все элементы справочника Сотрудники_2, определив для них значение реквизита Образование. Для облегчения работы можно задать одинаковое значение этого реквизита всем сотрудникам, использовав следующий код:
// Все сотрудники после выполнения этой процедуры в поле Образование // будут иметь значение Высшее
процедура Выполнил^ ) // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, сОбр_2;
ОчиститьОкноСообщений();
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2"); сОбр_2 = СоздатьОбъект("Справочник.Образование_2"); если сОбр_2.НайтиПоНаименованию("Высшее") = 0 тогда Предупреждение("3начение не найдено."); возврат; конецЕсли;
с Сотр_2. ВыбратьЭлементы(); пока сСотр_2.ПолучитьЭлемент() > 0 цикл если сСотр_2.ЭтоГруппа() = 0 тогда
// Используем в правой части присваивания метод ТекущийЭлемент сСотр_2.0бразование = сОбр_2.ТекущийЭлемент(); сСотр_2.3аписать(); // Фиксируем изменения
конецЕсли; конецЦикла;
// Просмотр результата
ОткрытьФорму("Справочник.Сотрудники_2.ФормаСписка"); конецПроцедуры // Выполнить
Выполним теперь ручное редактирование значения реквизита Образование и изобразим измененный справочник на рис. 5.31.
- 2Л Сотраамикм_2 и CJ 01 Цех JJ 01 /1 Zl 01/2 Zi 01/3 1 * I 02 Цех til 03 Цех |
1 1 |
1 Наименование 10 к л ад |
Образование |
|
1 |
01 Цех |
|
|
|
13 |
01 /3 |
|
|
131 |
Васильева Епена Ивановна |
1.850.00 |
Начальное |
|
132 |
Смирнова Нина Федоровна |
1.900.00 |
Высшее |
2J |
133 |
Хохлов Евгеніи Ннголаевич |
1.900 00 |
Среднее |
|
I 1 1 |
|
|
|
Рис. 5.31. Пополненный справочник Сотрудники 2
Выберем теперь данные по реквизиту Образование.
процедура Выполнить() // Выбирает данные по реквизиту Образование
перем сСотр_2, сОбр_2; перем обр, флаг;
ОчиститьОкноСообщений();
сСотр_2 = СоздатьОбъект(''Справочник.Сотрудники_2''); сОбр_2 = СоздатьОбъект(''Справочник.Образование_2''); если сОбр_2.НайгиПоНаименованию("Высшее") = 0 тогда Предупреждение("3начение не найдено."); возврат; конецЕсли;
обр = сОбр_2.ТекущийЭлемент();
// Выбираем сотрудников, имеющих высшее образование, по порядку (без учета иерархии) флаг= сСотр_2.ВыбратъЭлементыПоРеквизиту(''Образование'', обр, 0, 0); если флаг = 0 тогда
Предупреждение("Нет выбранных сотрудников."); возврат; конецЕсли;
пока сСотр_2.ПолучитЪЭлемент() > 0 цикл
Сообщить(сСотр_2.Наименование + символТабуляции + сСотр_2.Код + символТабуляции + сСотр_2.Родитель + символТабуляции + сСотр_2.Образование); конецЦикла;конецПроцедуры // Выполнить
Результат: |
Абрамова Лариса Сергеевна |
201 |
02 Цех |
Высшее |
Агальцов Юрий Алексеевич |
111 |
01/1 |
Высшее |
Безверхний Игорь Петрович |
301 |
03 Цех |
Высшее |
Кузьмина Раиса Николаевна |
122 |
01/2 |
Высшее |
Смирнова Нина Федоровна |
132 |
01/3 |
Высшее |
|
Если перед вызовом метода ВыбратьЭлементыПоРеквизиту обратиться к методу ОбратныйПорядок с равным единице параметром:
сСотр_2.0братныйПорядок(1);
то результирующая выборка будет упорядочена в обратном порядке:
Смирнова Нина Федоровна |
132 |
01/3 |
Высшее |
Кузьмина Раиса Николаевна |
122 |
01/2 |
Высшее |
Безверхний Игорь Петрович |
301 |
03 Цех |
Высшее |
Агальцов Юрий Алексеевич |
111 |
01/1 |
Высшее |
Абрамова Лариса Сергеевна |
201 |
02 Цех |
Высшее |
Замечание. Попытка применить с методом ВыбратьЭлементыПоРеквизиту метод ПорядокКодов, предполагающий вывод данных по возрастанию значений атрибута Код, успехом не увенчалась.
5.8. УПРАВЛЕНИЕ ЗАПИСЯМИ СПРАВОЧНИКА ПРИ ПОМОЩИ ДОКУМЕНТОВ
5.8.1. НАЗНАЧЕНИЕ ДОКУМЕНТОВ
Процессы, протекающие на предприятии, регулируются документами. Так, прием на работу осуществляется на основании соответствующего приказа. Поступление ма териалов на склад фиксируется приходными ордерами, а их отпуск в производстве выполняется на основании требований-накладных и т. д.
Не меньшее, чем на реальном предприятии, значение придается документам и в 1С. Фактически они лежат в основе реализованных в 1С моделей - модели склада, бухгалтерского учета и др.
Кадровый учет и начисление заработной платы также основываются на документах: на приказах о приеме на работу, перемещении по служебной лестнице, об изменениях оклада, о премировании и др. Отсюда следует, что большинство изменений справочника Сотрудники_2, хранящего кадровые данные, должно осуществляться на основании соответствующих документов.
Создадим и мы документы, добавляющие данные в справочник Сотрудники_2 и изменяющие в нем данные об окладах работников предприятия. Понятно, такими документами могут быть Приказ о приеме на работу и Приказ об изменении оклада. Документы, попавшие в зону нашего внимания, учитывая скромный объем хранящейся в справочнике Сотрудники_2 информации, весьма просты, что вполне отвечает учебным целям.
Документ 1С состоит из формы и модуля документа. Форма документа, как и формы других объектов 1С, имеет диалог, модуль и таблицы. Диалог формы документа в общем случае содержит шапку и табличную часть. В модуле документа в общем случае создаются процедуры ОбработкаПроведения и ОбработкаУдалени-яПроведения, выполняющие предусмотренные при проведении и удалении документа действия. (Проведение документа - это процесс, приводящий к изменению связанных с документов объектов.) Так, проведение Приказа о приеме должно приводить к появлению в справочнике Сотрудники_2 новой записи, а проведение Приказа об изменении оклада - к изменению значений периодического реквизита Оклад справочника. Выпущенные документы будем сохранять в имеющемся в конфигурации Заработная плата и кадры журнале ПриказыКадровые.
Поскольку Приказ о приеме на работу касается одного человека, то в диалоге его формы табличная часть будет отсутствовать. Приказ об изменении окладов может распространяться на несколько сотрудников, ФИО и новые оклады которых фиксируются в табличной части диалога формы документа.
Чтобы установить связь между создаваемыми документами и записями справочника Сотрудники_2, добавим в справочник еще два реквизита - ПриказПрием и При-казОклад, присвоив им тип Документ. Теперь справочник Сотрудники_2 имеет приведенные на рис. 5.32 реквизиты, а также реквизиты Код и Наименование.
 |
Рис. 5.32. Реквизиты справочника Сотрудники_2 |
Такая связь позволит нам обращаться к созданным документам из формы списка справочника.
5.8.2. ПРИКАЗ О ПРИЕМЕ НА РАБОТУ
5.8.2.1. РЕКВИЗИТЫ И ФОРМА ДОКУМЕНТА
Начнем с Приказа о приеме. Откроем конфигурацию, выделим раздел Документы, нажмем на правую кнопку мыши и выберем пункт Новый документ.
Определим реквизиты шапки документа в соответствии с табл. 5.3.
Таблица 5.3
Реквизиты шапки Приказа о приеме на работу |
Реквизит |
Тип (разновидность типа) |
Длина.Точность |
Код |
Числовой |
5.0 |
ФИО |
Символьный |
30 |
Подразделение |
Справочник. Сотрудники_2 |
- |
Образование |
Справочник. Образование_2 |
- |
Оклад |
Числовой |
10.2 |
ДатаПриема |
Дата |
- |
Сотрудник |
Справочник. Сотрудники_2 |
- |
|
Замечания: |
1. Тип (разновидность типа) и характеристики типа (длина, точность) должны соответствовать аналогичным реквизитам справочника Сотрудники_2.
2. Код сотрудника формируется автоматически при добавлении новой записи. Редактированию значение кода не подлежит, поэтому в диалоге формы документа поле Код доступно только для чтения.
3. Реквизит Сотрудник введен в документ для установления связи документа с конкретной записью справочника Сотрудники_2. Для позиционирования справочника в режиме редактирования документа можно использовать вызов
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
сСотр_2.НайтиЭлемент(Сотрудник); // Сотрудник - реквизит документа // Устанавливаем значения реквизитов записи сСотр_2.Наименование = ФИО;
сСотр_2.3аписать();
Помимо перечисленных в табл. 5.3 полей в Приказе о приеме, как, впрочем, и во всех иных документах, присутствуют реквизиты (атрибуты) НомерДок и Да-таДок, хранящие соответственно номер и дату документа. Свойства этих реквизитов задаются системой и не могут быть изменены пользователем. Поскольку номер документа назначается автоматически, то запретим редактирование реквизита
: НомерДок. Дату нового документа будем по умолчанию устанавливать равной рабочей дате.
4.
Остальные характеристики приказа определим в соответствии с рис. 5.33.
Идентифшагор. |ПриказОПриеме
Журнал: IП риказыК здроеые ^ |
|Пр*жаэ о приеме на работу
Реквизиты таблеаюй части-[-—---
JJ
Ьомментарі* | Реквизиты пипки
лі
jJ
Jii
ФИО
Подразделение
Оклад
Образование
ДвтеЛрмема
Сотруотик
Новый I Изметчсть | Удалитъ |
Номер Н хлоратор:
Периодимость
17 Автоматическая нумерация
jJ
iiJ
Новь* I V. м -чИТУІ . УДгГч((- I |
І« Не назначен » |
Тип
Числовой |
Длеіа І5 -М |
1 По всем данного вша _^J |
Текстовый |
|
|
17 ^онтро/ь умсатъности
\?іёгі\
Г ±J---rr,-pr.
17 расчет
Г Операпввй учет |
17 Разрешить проведемте документа 17 Автоматическое удаление движем й Г” Автоматическая нумерация строк
Рис. 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) |
|
если место = 1 тогда |
// |
Вызов осуществляется из диалога |
УбратьПробелы();
ВНРег(); |
// |
Удаляет избыточные пробелы между словами |
конецЕсли; |
|
|
если Найти(ФИО,".") <> 0 тогда |
|
|
Предупреждение('Точки в ФИО недопустимы."); возврат 0;
иначе // Точек в имени нет
возврат 1; конецЕсли;
конецФункции // КонтрольФИО
процедура УбратьПробелы() перем ФИО2, длина, поз, к;
// Удаляем возможные ведущие и завершающие пробелы // Вводим ФИО2, поскольку СокрЛП не меняет длину ФИО ФИО2 = СокрЛП(ФИО);
поз = Найти(ФИО2, " "); // Ищем два подряд идущих пробела
// Цикл продолжается, пока в строке есть хотя бы одна пара подряд идущих пробелов пока поз > 0 цикл
длина = стрДлина(ФИО2); // Длина ФИО2
к =1; // Число лишних пробелов
пока (поз < длина) и (Сред(ФИО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;
двеЦифрУмнНаК = двеЦифр;
пока двеЦифрУмнНаК < максКод цикл
двеЦифрУмнНаК = двеЦифрУмнНаК * 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), и добавим колонку Журналы с пунктом Кадровые приказы, позволяющим при помощи команды
Журналы. ПриказыКадровые.Открыть
открыть журнал, хранящий созданные документы.
ffi 1=3 Сервис В Из Проба й Из Справочники В Из Документы I r~ S Приказоприеме \ !•••• 0 Изменение оклада
0 < новый...>
? Hi Журналы
0 Кадровые приказы
Рис. 5.35. Модифицированное меню интерфейса Ученик
Сохраним изменения, откроем 1 С: Предприятие и введем несколько документов.
5.8.2.4. ВЫЗОВ ДОКУМЕНТА ИЗ ФОРМЫ СПИСКА СПРАВОЧНИКА СОТРУДНИКИ_2
Пока что с записью справочника Сотрудники_2 может быть связан только один документ - Приказ о приеме на работу. Для его вызова из формы списка справочника добавим в модуль двух имеющихся форм списка (разд. 5.3.3.2) код следующей предопределенной процедуры:
процедура ПриНачалеРедактированияСтроки( ) если ПустоеЗначение(ПриказПрием) = 0 тогда // Открываем форму документа ОткрытьФорму(ПриказПрием); иначеЕсли РедактироватьВДиалоге() = 0 тогда
// Открываем форму элемента справочника для редактирования текущей записи ОткрытьФорму(ТекущийЭлемент(),, 0);
// Отказываемся от возможности редактирования в строке формы списка справочника иначе
Предупреждение(''Редактировать в строке формы списка справочника нельзя."); конецЕсли;
СтатусВозврата(0);
конецПроцедуры // ПриНачалеРедактированияСтроки
Чтобы этим кодом воспользоваться, надо после вызова справочника Сотрудни-ки_2, используя колонку Действия, убрать флаг с пункта Редактировать в диалоге. Теперь, остановившись на записи и дважды ударив по ней мышью, вы попадете в документ, с этой записью связанный, или, если такового не имеется, в форму элемента или группы справочника Сотрудники_2.
Замечания:
1. Вызов СтатусВозврата(0);
в предопределенной процедуре ПриНачалеРедактированияСтроки, задающий статус Отменить Действие, позволяет не переходить в режим редактирования строки непосредственно в форме списка справочника Сотрудники_2, если в диалоге открытой формы приказа о приеме нажать Закрыть или если просто переместить фокус на диалог формы списка справочника.
2. При отсутствии документа, если отменен режим редактирования в диалоге, процедурой ПриНачалеРедактированияСтроки будет вызвана функция
ОткрытьФорму(ТекущийЭлемент());
открывающая форму элемента или группы. При этом может возникнуть сообщение

Однако никаких препятствий для редактирования в форме элемента или группы выбранной записи не будет.
5.8.3. ЖУРНАЛ КАДРОВЫХ ПРИКАЗОВ
5.8.З.1. ФОРМА СПИСКА ЖУРНАЛА КАДРОВЫХ ПРИКАЗОВ
Журнал кадровых приказов с идентификатором ПриказыКадровые имеет приведенный на рис. 5.36 диалог формы списка, отображающий занесенные в журнал доку- \ менты.
|
Дата 1: Номер |
Документ |
Сотрудник |
Ж |
|
|
|
|
|
|
|
|
|
|
|
zi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Комментарий
<<СтрПолучитьСтрокуГГекущийДокумент.Комментар*Л. 1) ¦¦
Закрыт» I Действия.. | |
Рис. 5.36. Форма списка журнала кадровых приказов
Поскольку в журнале могут храниться приказы, порождаемые различными документами, имеющими реквизит Сотрудник, то необходимо указать все возможные значения этого реквизита. Выполним это для созданного нами документа Приказ-ОПриеме.
Откроем конфигурацию, доберемся до пункта Журналы документов, а затем до его подпункта ПриказыКадровые и ударим дважды мышью. Появившийся диалог (рис. 5.37) позволит нам осуществить намеченную цель.
Идентификатор: |ПрмказыКадроеые ?иж**#и: (Приказы кадровые
Комментарий:
 |
Новый |
Документы-:-
ИзмВШтРасп КаоровоеП еремещение П риказО П риемеН аРаботу П риказО 6У вольмении ПрмкаэП оП редприятио ПриказОПриеме И зменениеО клада
Иэмеытть |
 |
Рис. 5.37. Диалог задания свойств журнала кадровых приказов |
Умят\

Выберем в поле Графы запись Сотрудник и нажмем кнопку Изменить. Появившийся диалог приведем к виду, представленному на рис. 5.38, и дважды ударим по элементу Сотрудник в поле Возможные значения, или нажмем на Enter, или воспользуемся кнопкой
 |
Рис. 5.38. Добавление значения Документ.ПриказОПриеме. Сотрудник |
В результате в списке Выбранные значения появится элемент Доку-мент.ПриказОПриеме.Сотрудник. Теперь, если сохранить изменения, при записи документа ПриказОПриеме в графе Сотрудник диалога формы списка журнала кадровых перемещений будет отображаться значение реквизита Сотрудник этого документа (рис. 5.39).
 |
Рис. 5.39. Журнал кадровых приказов после ввода трех документов |
Галочка в первом столбце говорит о том, что документ проведен.
Первый документ, если открыть его для просмотра или редактирования, содержит данные, представленные на рис. 5.40.
 |
Рис. 5.40. Приказ номер 1 |
В справочнике Сотрудники_2 (в форме списка) он породит приведенную на рис. 5.41 запись, которую можно отредактировать как в форме элемента, так и в документе (см. разд. 5.8.2.4).
 |
Рис. 5.41. Проводка приказа номер 1 |
Замечания:
1. При удалении проведенного документа о приеме на работу обнуляется внесенное документом значение реквизита Оклад в соответствующей ему записи справочника Сотрудники_2. При перепроведении документа это значение восстанавливается. Автоматическое обнуление выполняется, так как периодический реквизит Оклад связывается с документом в процессе его проведения.
2. По умолчанию в журнале документов отображаются документы, даты которых находятся в пределах текущего месяца. Чтобы изменить временной диапазон журнала, называемый интервалом журнала, следует воспользоваться либо пунктом Интервал из колонки меню Действия, либо иконкой .*“*
панели инстру
ментов открьь того журнала. Программно интервал журнала задается методом Устано-витьИнтервал.
3. В программе журнал кадровых приказов можно открыть в результате следующего вызова:
ОткрытьФормуС'Журнал. ПриказыКадровые");
Содержание раздела