Пример:
Процедура ОбработкаПроведения()
ВыбратьСтроки();
Пока (ПолучитьСтроку() > 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