- •«Московский городской педагогический университет» Факультет прикладной информатики Кафедра прикладной информатики в управлении
- •Организационно-методические указания по подготовке и проведению занятия Рекомендации по подготовке к занятию
- •План работы
- •I. Основная часть
- •3.1. Общие сведения о системе 1с:Предприятие 8.1. Порядок создания информационной базы с пустой конфигурацией
- •3.2. Порядок работы с деревом конфигурации
- •3.3. Порядок работы с объектом конфигурации Справочник
- •3.3.1. Создание справочника "Клиенты"
- •3.3.2. Создание справочника "Сотрудники"
- •3.3.3. Создание справочника "Номенклатура"
- •3.3.4. Создание справочника "Склады"
- •3.4. Порядок работы с объектом конфигурации Документ
- •3.4.1. Создание документа " ПриходнаяНакладная "
- •3.4.2. Создание собственной формы документа "ПриходнаяНакладная"
- •3.4.3. Создание процедуры обработки события в модуле формы документа "ПриходнаяНакладная"
- •3.4.4. Создание документа "ОказаниеУслуги"
- •3.5. Порядок работы с объектом конфигурации Регистр накопления
- •3.5.1. Создание регистра накопления "Остатки Материалов"
- •3.5.2. Создание движений документа "ПриходнаяНакладная"
- •3.5.3. Создание движений документа "ОказаниеУслуги"
- •3.6. Порядок работы с объектом конфигурации Отчет
- •3.7. Порядок работы с объектом конфигурации Макет
- •3.7.1. Создание макета документа "Оказание услуги"
- •3.7.2. Редактирование макета документа "Оказание услуги"
- •3.7.3. Редактирование формы документа "Оказание услуги"
- •3.8. Порядок работы с объектом конфигурации Регистр сведений
- •3.8.1. Создание периодического регистра сведений Цены
- •3.8.2. Создание функции РозничнаяЦена()
- •3.8.3. Автоматическое заполнение цены в документе ОказаниеУслуги
- •3.9. Порядок работы с объектом конфигурации Перечисление
- •3.9.1. Реорганизация справочника "Номенклатура"
- •3.9.1. Изменение процедуры проведения документа "Оказание услуги"
- •3.10. Порядок проведения документа по нескольким регистрам
- •3.10.1. Создание регистра "Стоимость материалов"
- •3.10.2. Изменение процедуры проведения документа "ПриходнаяНакладная"
- •3.10.3. Изменение процедуры проведения документа "ОказаниеУслуги"
- •3.11. Порядок работы с объектом конфигурации Оборотный регистр накопления
- •3.11.1. Создание оборотного регистра накопления "Продажи"
- •3.11.2. Изменение процедуры проведения документа "Оказание услуги"
- •3.12. Порядок работы с объектом встроенного языка Запрос
- •3.12.1. Создание отчета "Реестр документов Оказание услуги"
- •3.12.2. Создание отчета "Рейтинг услуг"
- •3.12.3. Создание отчета "Выручка мастеров"
- •3.12.4. Создание отчета "Перечень услуг"
- •3.12.5. Создание отчета "Рейтинг клиентов"
- •3.12.6. Создание отчета "Универсальный"
- •3.12.7. Создание отчета "Универсальный 2"
- •3.13. Оптимизация документа "ОказаниеУслуги"
- •3.14. Порядок работы с объектом конфигурации План видов характеристик
- •3.14.1. Создание новых объектов конфигурации
- •3.14.2. Доработка справочника Номенклатура
- •3.14.3. Доработка справочника Варианты номенклатуры
- •3.14.4. Доработка регистра накопления ОстаткиМатериалов
- •3.14.5. Доработка документа ПриходнаяНакладная
- •3.14.6. Создание наборов свойств в справочнике Номенклатура
- •3.14.7. Создание отчета "Остатки материалов по свойствам"
- •3.15. Порядок организации и ведения бухгалтерского учета
- •3.15.1. Создание объекта конфигурации План видов характеристик ВидыСубконто
- •3.15.2. Порядок работы с объектом конфигурации План счетов
- •3.15.3. Порядок работы с объектом конфигурации Регистр бухгалтерии
- •3.15.4. Изменение движений документа ПриходнаяНакладная
- •3.15.5. Изменение движений документа ОказаниеУслуги
- •3.15.6. Создание отчета Оборотно-сальдовая ведомость
- •3.16. Порядок расчета заработной платы
- •3.16.1. Создание плана видов расчета ОсновныеНачисления
- •3.16.2. Порядок работы с объектом конфигурации Регистр расчета
- •3.16.3. Создание регистра расчета Начисления
- •3.16.4. Создание документа НачисленияСотрудникам
- •3.16.5. Создание отчета Перерасчет
- •3.16.6. Создание процедуры расчета записей регистра Начисления
- •3.16.7. Создание отчета Начисления сотрудникам
- •3.16.8. Выполнение перерасчета записей регистра расчета
- •3.16.9. Графическое представление начислений с помощью диаграммы Ганта
- •3.16.10. Создание отчета Диаграмма начислений
- •3.17. Создание документа ввода начальных остатков
- •3.18. Порядок работы с объектом конфигурации Подсистема
- •3.18.1. Создание подсистем Бухгалтерия, РасчетЗарплаты, УчетМатериаловИУслуг
- •3.19. Порядок работы с объектами конфигурации роль и интерфейс
- •3.19.1. Создание ролей
- •3.19.2. Создание интерфейсов
- •3.19.3. Администрирование работы пользователей
- •4. Практическая часть
- •4.1. Порядок проведения работы
- •4.2. Содержание отчета
- •4.3. Зачет по лабораторной работе
- •II. Перечень заданий для выполнения работы
3.16.5. Создание отчета Перерасчет
Создайте новый объект конфигурации Отчет. Назовите его Перерасчет и запустите конструктор основной схемы компоновки данных.
Добавьте Источник данных – запрос (НаборДанных1) и нажмите кнопку "Конструктор запроса". Из виртуальной таблицы перерасчета Начисления.Перерасчет выберите все поля: ОбъектПерерасчета, ВидРасчета и Сотрудник (рис. 254, 255).
Рис. 254. Таблица перерасчета
Рис. 255. Выбранные поля
Нажмите кнопку "ОK". Перейдите на закладку Настройки и добавьте группировку детальных записей (без указания группировочного поля). На закладке Выбранные поля выберите для вывода в отчет поля ОбъектПерерасчета, ВидРасчета и Сотрудник. На этом создание схемы компоновки данных закончено.
Запустите 1С:Предприятие в режиме отладки, сформируйте отчет Перерасчет и убедитесь, что пока он не содержит никаких данных.
Создайте новый документ Начисление сотрудникам №2, в котором начислите премию за март Гусакову и Деловому (рис. 256).
Рис. 256. Документ Начисления сотрудникам №2
Этим документом фиксируется тот факт, что сотрудникам Гусакову и Деловому нужно начислить премию по итогам работы за март. Поскольку размер премии пока неизвестен (он будет рассчитываться по некоторому алгоритму), поля Результат оставьте пустыми. Нажмем кнопку "OK".
Теперь снова откройте документ Начисление сотрудникам №1 и измените оклад Гусакова с 10000 на 7000. Нажмите кнопку "OK". Сформируйте отчет Перерасчет (рис. 257).
Рис. 257. Отчет Перерасчет
Перепроведите документ Начисления сотрудникам №2 и сформируйте отчет Перерасчет. Он снова не содержит никаких данных – система отметила тот факт, что пользователь "пересчитали" зависимые записи, и очистила таблицу перерасчета.
На этом примере была продемонстрирована работа механизма поддержки зависимости по базовому периоду у регистра расчета.
Теперь посмотрите, как работает механизм вытеснения по периоду действия. Для этого создайте документ Начисления сотрудникам №3 (рис. 258).
Рис. 258. Документ Начисления сотрудникам №3
Этим документом фиксируется тот факт, что Гусаков не выходил на работу с 1 по 10 марта. Очевидно, что в этом случае потребуется пересчитать его оплату по окладу и, как следствие, начисленную премию.
Нажмите кнопку "OK" и сформируйте отчет Перерасчет (рис. 259).
Рис. 259. Отчет Перерасчет
Как вы видите, в перерасчет попала запись о начислении оклада Гусакову. Это явилось результатом работы механизма вытеснения по периоду действия, ведь вид расчета Невыход вытесняет вид расчета Оклад.
Перепроведите документы Начисления сотрудникам №1 и №2 и убедитесь, что таблица перерасчета очистилась.
3.16.6. Создание процедуры расчета записей регистра Начисления
Откройте в конфигураторе текст обработчика проведения документа НачисленияСотрудникам и добавьте в него следующий текст на встроенном языке (добавляйте в соответствующие строки только те команды, которые выделены жирным шрифтом):
Процедура ОбработкаПроведения(Отказ, Режим)
…
// Записываем движения регистров
Движения.Начисления.Записать();
// Получим список всех сотрудников, содержащихся в документе
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НачисленияСотрудникамНачисления.Сотрудник
|ИЗ
| Документ.НачисленияСотрудникам.Начисления КАК НачисленияСотрудникамНачисления
|ГДЕ
| НачисленияСотрудникамНачисления.Ссылка = &ТекущийДокумент");
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
// Сформируем список сотрудников
ТаблЗнач = Запрос.Выполнить().Выгрузить();
МассивСотрудников = ТаблЗнач.ВыгрузитьКолонку("Сотрудник");
СписокСотрудников = Новый СписокЗначений;
СписокСотрудников.ЗагрузитьЗначения(МассивСотрудников);
РасчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.
ОсновныеНачисления. Оклад, СписокСотрудников);
Движения.Начисления.Записать( , Истина);
РасчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.
ОсновныеНачисления.Премия, СписокСотрудников);
Движения.Начисления.Записать( , Истина);
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Обратите внимание: при проведении документа сначала записываются движения, сформированные документом, в регистр, а затем этот набор записей регистра передаются в процедуру расчета. Сначала для расчета первичных записей (Оклад), а затем для расчета вторичных (Премия). Процедура расчета на основе описанных в ней алгоритмов и данных, содержащихся в записях регистра, должна сформировать значения ресурсов регистра. После того, как ресурсы будут рассчитаны, перезаписывается набор записей регистра без формирования записей перерасчета (второй параметр в методе Записать() – Истина).
Перед вызовом процедуры из общего модуля формируется список сотрудников, содержащихся в документе, чтобы передать его в вызываемую процедуру.
Теперь создайте в ветке Общие новый общий модуль ПроведениеРасчетов. Укажите, что он будет глобальный, установите соответствующий флажок. Добавьте в него заготовку процедуры РасчитатьНачисления:
Процедура РасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
КонецЕсли;
КонецПроцедуры
Алгоритм расчета начислений будет различным при расчете первичных и вторичных записей, и каждая из его частей будет находиться в своей ветке условия Если ...
При расчете первичных записей понадобятся данные графика из регистра расчета, поэтому добавьте в первую ветку условия запрос по виртуальной таблице регистра расчета РегистрРасчета.Начисления.ДанныеГрафика:
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
| НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.ДанныеГрафика(
| Регистратор = &Регистратор И
| ВидРасчета = &ВидРасчета И
| Сотрудник В (&СписокСотрудников))
| КАК НачисленияДанныеГрафика";
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
КонецЕсли;
КонецПроцедуры
В этом запросе из виртуальной таблицы данных графика регистра расчета выбирается значение графика для периода действия и для фактического периода действия. При задании параметров виртуальной таблицы выборка ограничивается регистратором, нужным видом расчета и списком сотрудников, по которым нужно получить значения графика.
Теперь добавьте обход переданного в процедуру набора записей и расчет записей, для которых получены значения графика:
…
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
Если ВыборкаРезультата.Норма = 0 тогда
Сообщить("Вид расчета: Оклад – Нет рабочих дней в заданном периоде",);
ЗаписьРегистра.Результат = 0;
Иначе
// Рассчитать оклад по фактическому периоду и исходным данным
ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные /ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
Сообщить("Выполнен расчет" + ЗаписьРегистра.Регистратор + " - "
+ ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник, );
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия
Тогда
КонецЕсли;
КонецПроцедуры
Для каждой записи из набора записей регистра расчета выбирается номер строки и по этому номеру ищется соответствующая запись в выборке из результата запроса. Если в результате запроса есть запись с таким номером строки, рассчитывается результат записи регистра расчета.
Добавьте текст запроса во вторую ветку условия Если … с той лишь разницей, что теперь будут формироваться значения базы, используя виртуальную таблицу регистра расчета РегистрРасчета.Начисления.БазаНачисления:
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияБазаНачисления.РезультатБаза КАК База,
| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.БазаНачисления(
| &ИзмеренияОсновного,
| &ИзмеренияБазового, ,
| Регистратор = &Регистратор И
| ВидРасчета = &ВидРасчета И
| Сотрудник В (&СписокСотрудников)) КАК НачисленияБазаНачисления";
Измер = Новый Массив(1);
Измер[0] = "Сотрудник";
Запрос.УстановитьПараметр("ИзмеренияОсновного", Измер);
Запрос.УстановитьПараметр("ИзмеренияБазового", Измер);
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
КонецЕсли;
КонецПроцедуры
В заключение осталось добавить во второе условие Если … обход набора записей регистра расчета и вычисление результата вторичных записей:
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
....
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10/100);
Сообщить("Выполнен расчет " + ЗаписьРегистра.Регистратор + " - "
+ ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник, );
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Сумму начисленной премии здесь рассчитывается как 10% от рассчитанной оплаты по окладу.
Запустите 1С:Предприятие в режиме отладки и проверьте правильность работы процедуры расчета.
Отмените проведение документа Начисления сотрудникам №3 и перепроведите документы Начисления сотрудникам №1 и №2. Регистр расчета Начисления должен выглядеть следующим образом (рис. 260):
Рис. 260. Записи регистра Начисления
Гусакову и Деловому начислена премия в размере 10% от суммы начисления по окладу.
Проведите документ Начисление сотрудникам №3, а затем №1 и №2. Состояние регистра изменится следующим образом (рис. 261):
В результате невыхода Гусакова на работу сумма оплаты по окладу будет уменьшена и соответствующим образом уменьшится начисленная ему премия.
Рис. 261. Записи регистра Начисления