Пример:
Процедура ОбработкаПроведения()
- ВыбратьСтроки(); 
- Пока (ПолучитьСтроку() > 0) Цикл - Регистр.НаличиеСотрудников.Должность = Долж; 
- Регистр.НаличиеСотрудников.Подразделение = Подр; 
- Регистр.НаличиеСотрудников.Количество = Количество; 
- Регистр.НаличиеСотрудников.СуммаОклада = СумОкл; 
- Регистр.НаличиеСотрудников.ДвижениеРасходВыполнить(); 
 
- КонецЦикла; 
КонецПроцедуры
Движение(<Измерен1>, <Измерен2>..., <Ресурс1> , <Ресурс2>...) – выполняет запись движения в оборотный регистр для текущего документа. Измерения регистра, по которым записывается движение передаются в параметрах <Измерен1>, <Измерен2>, .. Величины приращений ресурсов регистра передаются параметрами <Ресурс1>, <Ресурс2>... Данный метод доступен только в контексте Модуля документа в предопределенной процедуре ОбработкаПроведения(). Данный метод используется только для оборотных регистров.
Параметры:
<Измерен1 >, <Измерен2> – выражения со значениями измерений регистра.
<Ресурс1>, <Ресурс2> – выражения со значениями ресурсов регистра.
Пример:
Процедура ОбработкаПроведения();
- ВыбратьСтроки(); 
- Пока ПолучитьСтроку() > 0 Цикл - Регистр.ПриемСотрудников.Движение(Долж, Подр, Кол, СуммОкл); 
 
- КонецЦикла; 
КонецПроцедуры
ДвижениеВыполнить() – выполняет запись движения в регистр для текущего документа. Значения измерений регистра, по которым записывается движение, а также величины приращений ресурсов регистра определяются текущими значениями атрибутов регистра. Данный метод доступен только в контексте Модуля документа в предопределенной процедуре ОбработкаПроведения(). Данный метод используется только для оборотных регистров.
Пример:
Процедура ОбработкаПроведения();
- ВыбратьСтроки(); 
- Пока (ПолучитьСтроку() > 0) Цикл - Регистр.ПриемСотрудников.Склад = Склад; 
- Регистр.ПриемСотрудников.Товар = Товар; 
- Регистр.ПриемСотрудников.Оборот = Оборот; 
- Регистр.ПриемСотрудников.ДвижениеВыполнить(); 
 
- КонецЦикла; 
КонецПроцедуры
9.3 Применение регистров для ведения учета
Рассмотрим пример ведения оперативного учета с помощью регистров. Отмените проведение всех документов (приказов о приеме и увольнении). Откройте справочник сотрудники и, если там есть элементы, то удалите их.
Откройте документ ПриказОПриеме и установите опцию Оперативный учет, чтобы документ можно было использовать для работы с регистрами оперативного учета. Откройте модуль документа ПриказОПриеме. В процедуры ОбработкаПроведения() необходимо ввести изменения, то есть добавить добавление данных в регистр остатков НаличиеСотрудников и регистр оборотов ПриемСотрудников.
Процедура ОбработкаПроведения()
- Сотр=СоздатьОбъект("Справочник.Сотрудники"); 
- // делаем выборку по строкам документа 
- ВыбратьСтроки(); 
- // пока строки в документе есть 
- Пока ПолучитьСтроку()=1 Цикл - // сотрудник будет добавляться в группу, заданную 
- // полем подразделение 
- Сотр.ИспользоватьРодителя(Подразделение,0); 
- // создаем новый элемент справочника 
- Сотр.Новый(); 
- // заполняем поля 
- Сотр.Наименование=ФИО; 
- Сотр.Должности=Должность; 
- Сотр.Оклад=Оклад; 
- Сотр.ДатаПриема=ДатаПриема; 
- Сотр.ТипРаботника=Тип; 
- // записываем 
- Сотр.Записать(); 
- // заносим данных в регистр остатков 
- // задаем значения измерений 
- Регистр.НаличиеСотрудников.Должность=Должность; 
- Регистр.НаличиеСотрудников.Подразделение=Подразделение; 
- // задаем значения ресурсов 
- Регистр.НаличиеСотрудников.Количество=1; 
- Регистр.НаличиеСотрудников.СуммаОклада=Оклад; 
- // выполняем приход в регистр остатков 
- Регистр.НаличиеСотрудников.ДвижениеПриходВыполнить(); 
- // заносим данные в регистр оборота ПриемСотрудников 
- // задаем значения измерений 
- Регистр.ПриемСотрудников.Должность=Должность; 
- Регистр.ПриемСотрудников.Подразделение=Подразделение; 
- // задаем значения ресурсов 
- Регистр.ПриемСотрудников.Количество=1; 
- Регистр.ПриемСотрудников.СуммаОклада=Оклад; 
- // записываем движение в оборотный регистр 
- Регистр.ПриемСотрудников.ДвижениеВыполнить(); 
 
- КонецЦикла; 
КонецПроцедуры
Далее откройте документ ПриказОбУвольнении и установите опцию Оперативный учет, чтобы документ можно было использовать для работы с регистрами оперативного учета. Откройте модуль документа ПриказОбУвольнении. В процедуры ОбработкаПроведения() необходимо ввести изменения, то есть добавить добавление данных в регистр остатков НаличиеСотрудников и регистр оборотов УвольнениеСотрудников.
Процедура ОбработкаПроведения()
- Сотр=СоздатьОбъект("Справочник.Сотрудники"); 
- // делаем выборку по строкам документа 
- ВыбратьСтроки(); 
- // пока строки в документе есть 
- Пока ПолучитьСтроку()=1 Цикл - // ищем сотрудника в справочнике 
- Сотр.НайтиПоНаименованию(ФИО.Наименование,0,1); 
- Сотр.ДатаУвольнения=ДатаУвольнения; 
- // записываем 
- Сотр.Записать(); 
- // заносим данных в регистр остатков 
- // задаем значения измерений, так как ФИО элемент справочника 
- // Сотрудники доступ к нужным значениям можно получить 
- // через его реквизиты 
- Регистр.НаличиеСотрудников.Должность=ФИО.Должности; 
- Регистр.НаличиеСотрудников.Подразделение=ФИО.Родитель; 
- // задаем значения ресурсов 
- Регистр.НаличиеСотрудников.Количество=1; 
- Регистр.НаличиеСотрудников.СуммаОклада=ФИО.Оклад; 
- // выполняем приход в регистр остатков 
- Регистр.НаличиеСотрудников.ДвижениеРасходВыполнить(); 
- // заносим данные в регистр оборота УвольнениеСотрудников 
- // задаем значения измерений 
- Регистр.УвольнениеСотрудников.Должность=ФИО.Должности; 
- Регистр.УвольнениеСотрудников.Подразделение=ФИО.Родитель; 
- // задаем значения ресурсов 
- Регистр.УвольнениеСотрудников.Количество=1; 
- Регистр.УвольнениеСотрудников.СуммаОклада=ФИО.Оклад; 
- // записываем движение в оборотный регистр 
- Регистр.УвольнениеСотрудников.ДвижениеВыполнить(); 
 
- КонецЦикла; 
КонецПроцедуры
Сохраните конфигурацию и запустите 1С в режиме Предприятие. Откройте каждый документ типа ПриказОПриеме и ПриказОбУвольнении и заново перепроведите его, чтобы поместить данные в регистры. Закройте 1С: Предприятие.
Поработаем с регистром остатков НаличиеСотрудников, создав отчет, выдающий информацию о численности и сумма оклада сотрудников по должностям и подразделения, как на текущую дату (точку актуальности), так и на любую указанную дату. Создайте новый отчет ПоРегиструОстатков и включите его в меню под именем По наличию сотрудников. На форме диалога разместите следующие элементы (рисунок 9.3.1):
Рисунок 9.3.1
Установите следующие свойства элементов:
- переключатель Полный отчет: Идентификатор – Тип, Формула – ВыборТипа(), опция Первый в группе установлена; 
- Долж: Идентификатор – Долж, опция Сделать недоступным установлена, Тип – Справочник.Должности; 
- Подр: Идентификатор – Подр, опция Сделать недоступным установлена, Тип – Справочник.Сотрудники; Форма – ФормаСпискаГрупп; 
- первая кнопка Х (для очистки элемента Долж): Формула – Долж="", Подсказка – Очистить должность; 
- вторая кнопка Х (для очистки элемента Подр): Формула – Подр="", Подсказка – Очистить подразделение; 
- переключатель На точку актуальности: Идентификатор – НаДату, Формула – ВыборДаты(), опция Первый в группе установлена; 
- ВыбДата: Идентификатор – ВыбДата, опция Сделать недоступным установлена, Тип – Дата. 
В программном модуле запрограммируем процедуры Сформировать(), ВыборТипа(), ВыборДаты() и зададим начальные значения переменных:
Процедура Сформировать()
- // в окно сообщений выводится информация, 
- // поэтому очищаем его 
- ОчиститьОкноСообщений(); - Рег=СоздатьОбъект("Регистр.НаличиеСотрудников"); 
 
- // если нужны остатки не на точку актуальности (текущую дату), 
- // а на любую другую 
- Если НаДату=2 Тогда - // ставим признак временного расчета 
- Рег.ВременныйРасчет(1); 
- // рассчитать остатки регистра на указанную дату 
- РассчитатьРегистрыНа(ВыбДата); 
- // сообщить, что остатки на указанную дату, 
- // а не на точку актуальности 
- Сообщить("На "+Строка(ВыбДата)+":"); 
 
- КонецЕсли; 
- // Если выбран полный отчет по всем должностям и подразделениям 
- Если Тип=1 Тогда - // выбираем все остатки регистра 
- Рег.ВыбратьИтоги(); 
- // пока есть остатки 
- Пока Рег.ПолучитьИтог()=1 Цикл - // выдаем сообщения по всем должностям и подразделениям 
- // из атрибутов регистра - Сообщить("Должность " + Строка(Рег.Должность) + " в подразделении " + Строка(Рег.Подразделение) + " кол–во: " + Строка(Рег.Количество) + " сумма оклада: " + Строка(Рег.СуммаОклада)); 
 
 
- КонецЦикла; 
 
- Иначе 
- // если выбран отчет по условию - // если отчет по заданным должности и подразделению 
- Если (Долж.Выбран()=1) И (Подр.Выбран()=1) Тогда - // задаем значения измерений через атрибуты регистра 
- Рег.Должность = Долж; 
- Рег.Подразделение = Подр; 
- // получаем значения всех ресурсов по регистру 
- Рег.ОстаткиПолучить(); 
- // сообщаем количество человек и сумму оклада сотрудников 
- // указанной должности в указанном подразделении - Сообщить("Должность " + Строка(Рег.Должность) + " в подразделении " + Строка(Рег.Подразделение) + " кол–во: " + Строка(Рег.Количество) + " сумма оклада: " + Строка(Рег.СуммаОклада)); 
 
 
- // если отчет только по заданной должности 
- ИначеЕсли (Долж.Выбран()=1) И (Подр.Выбран()=0) Тогда - // сообщаем количество сотрудников заданной должности 
- // по всему предприятию и их сумму оклада - Сообщить("Должность " + Долж + " кол–во: " + Строка(Рег.СводныйОстаток(Долж,,"Количество")) + " сумма оклада: " + Строка(Рег.СводныйОстаток(Долж,,"СуммаОклада"))); 
 
 
- // если отчет только по заданному подразделению 
- ИначеЕсли (Долж.Выбран()=0) И (Подр.Выбран()=1) Тогда - // сообщаем количество сотрудников и сумму оклада 
- // в указанном подразделении - Сообщить("В подразделении " + Подр + " кол–во: " + Строка(Рег.СводныйОстаток(,Подр,"Количество")) + " сумма оклада: " + Строка(Рег.СводныйОстаток(,Подр,"СуммаОклада"))); 
 
 
- // если не выбраны ни должность, ни подразделение 
- // выдаем количество сотрудников и сумму оклада по всему предприятию 
- Иначе - Сообщить("Общее количество: " + Строка(Рег.СводныйОстаток(,,"Количество")) + " сумма оклада: " + Строка(Рег.СводныйОстаток(,,"СуммаОклада"))); 
 
- КонецЕсли; 
 
- КонецЕсли; 
КонецПроцедуры
// для переключателя тип отчета
Процедура ВыборТипа()
- Если Тип=1 Тогда - Форма.Долж.Доступность(0); 
- Форма.Подр.Доступность(0); 
 
- Иначе - Форма.Долж.Доступность(1); 
- Форма.Подр.Доступность(1); 
 
- КонецЕсли; 
КонецПроцедуры
// для переключателя на дату
Процедура ВыборДаты()
- Если НаДату=1 Тогда - Форма.ВыбДата.Доступность(0); 
 
- Иначе - Форма.ВыбДата.Доступность(1); 
 
- КонецЕсли; 
КонецПроцедуры
// начальные значения
Тип=1;
НаДату=1;
Сохраните конфигурацию и запустите 1С в режиме Предприятие. Попробуйте различные виды отчетов.
По оборотному регистру ПриемСотрудников создадим отчет о ОПриеме, используя запросы. Создайте новый отчет, включив его в меню под именем О приеме сотрудников, и на форме разместите следующие элементы (рисунок 9.3.2):
Рисунок 9.3.2
