Вы находитесь на странице: 1из 683

Профессиональная

разработка в системе
«1С:Предприятие 8»

В двух томах

Том 2

Москва
«1С-Паблишинг»
2012
Электронная версия книги
«Профессиональная разработка в системе 1С:Предприятие 8»
(издание 2)
Том 2

© ООО «1С-Паблишинг», 2012

Материалы предназначены для личного индивидуального использования приобрета-


телем книги «Профессиональная разработка в системе 1С:Предприятие 8», 2 издание
(Москва, «1С-Паблишинг», ISBN 978-5-9677-1790-8, 2012).
Запрещено тиражирование, распространение материалов, предоставление доступа
по сети к материалам без письменного разрешения правообладателей.
Разрешено копирование фрагментов программного кода для использования в разра-
батываемых прикладных решениях.
Оглавление

Оглавление

Глава 13. Сложные периодические расчеты....................... 7 Глава 14. Бизнес-процессы.................................................. 57


Технология реализации расчетных задач............................................................................7 Первое знакомство...............................................................................................................58
Основные понятия............................................................................................................................7 Карта маршрута....................................................................................................................58
Планы видов расчета...........................................................................................................13 Точки маршрута....................................................................................................................60
Назначение планов видов расчета................................................................................................13 Точка старта, точка завершения....................................................................................................61
Свойства планов видов расчета....................................................................................................14 Точка действия................................................................................................................................61
Структура планов видов расчета...................................................................................................15 Точка условия..................................................................................................................................63
Проверки, выполняемые при записи вида расчета.....................................................................16 Точка выбора варианта..................................................................................................................64
Структура таблиц базы данных.....................................................................................................17 Точка разделения, слияния............................................................................................................65
Регистры расчета.................................................................................................................19 Точка обработки..............................................................................................................................65
Назначение регистров расчета......................................................................................................19 Точка вложенного бизнес-процесса..............................................................................................66
Свойства регистров расчета..........................................................................................................19 Состояния бизнес-процесса................................................................................................66
Структура регистров расчета.........................................................................................................21 Старт бизнес-процесса........................................................................................................67
Структура таблиц базы данных.....................................................................................................24 Программный старт бизнес-процесса...........................................................................................68
Настройка протяженных во времени расчетов..................................................................25 Интерактивный старт бизнес-процесса.........................................................................................69
Использование механизма вытеснения........................................................................................25 Интерактивная активация бизнес-процесса.................................................................................69
Использование графиков...............................................................................................................27 Старт бизнес-процесса как вложенного........................................................................................70
Сторнирование................................................................................................................................30 Старт бизнес-процесса с несколькими точками старта...............................................................72
Настройка зависимости по базовому периоду...................................................................32 Завершение бизнес-процесса.............................................................................................73
Настройка планов видов расчета и регистров расчета...............................................................32 Задачи...................................................................................................................................74
Технология формирования и расчета записей регистров расчета..................................37 Формирование задач......................................................................................................................74
Формирование записей регистра расчета....................................................................................37 Выполнение задач..........................................................................................................................75
Настройка алгоритмов расчета......................................................................................................38 Проверка выполнения....................................................................................................................77
Расчет записей регистра расчета..................................................................................................40 Форма списка задач........................................................................................................................77
Перерасчет записей регистров расчета.............................................................................46 Обратная связь...............................................................................................................................80
Объект конфигурации «Перерасчет»............................................................................................46 Примеры реализации бизнес-процессов............................................................................81
Измерения перерасчета.................................................................................................................47 Единый объект «Задача»...............................................................................................................81
Автоматическое формирование записей перерасчета Бизнес-процесс «Продажа товара»...............................................................................................85
при вводе вытесняющих расчетов................................................................................................48 Бизнес-процесс «Продажа товара с предоплатой».....................................................................89
Автоматическое формирование записей перерасчета при вводе прочих расчетов.................49 Бизнес-процесс «Поручение»........................................................................................................90
Особенности использования таблицы вытесняющих видов расчета........................................50 Бизнес-процесс «Обход»................................................................................................................94
Формирование записей перерасчета средствами встроенного языка.......................................51 Бизнес-процесс «Согласование»...................................................................................................96
Автоматическое удаление записей перерасчета.........................................................................52
Анализ данных таблицы перерасчета..........................................................................................52
Реализация перерасчета записей регистров расчета.................................................................53

Том 2
3
Оглавление

Глава 15. Анализ данных и прогнозирование................. 101 Параметры.....................................................................................................................................292


Макеты...........................................................................................................................................294
Общие положения..............................................................................................................101 Настройки отчета..........................................................................................................................303
Основные объекты механизма....................................................................................................102 Работа с системой компоновки средствами встроенного языка...............................................338
Типы анализа данных...................................................................................................................103
Модели прогноза...........................................................................................................................103 Глава 17. Средства графического
Тип анализа «Общая статистика».....................................................................................104 представления данных....................................... 343
Тип анализа «Поиск ассоциаций».....................................................................................106
Географические схемы......................................................................................................343
Типы отсечения правил................................................................................................................108
Основные понятия........................................................................................................................343
Тип анализа «Поиск последовательностей»....................................................................109
Основы работы с географическими схемами.............................................................................344
Тип анализа «Дерево решений»....................................................................................... 111 Работа с объектами географической схемы из встроенного языка.........................................345
Тип анализа «Кластеризация»..........................................................................................114 Диаграммы..........................................................................................................................354
Используемые метрики................................................................................................................ 116 Примеры работы с диаграммами................................................................................................355
Методы кластеризации . .............................................................................................................. 118 Диаграмма Ганта................................................................................................................358
Проведение прогнозов.......................................................................................................119 Примеры работы с диаграммой Ганта........................................................................................359
Модель прогноза...........................................................................................................................121 Графические схемы............................................................................................................363
Глава 16. Сложные аналитические отчеты ..................... 123 Основы работы с графической схемой.......................................................................................363
Примеры работы с графической схемой....................................................................................365
Устройство системы компоновки данных.........................................................................123 Табличный документ..........................................................................................................366
Схема компоновки данных...........................................................................................................124 Общие свойства табличного документа......................................................................................366
Пример изменения настроек........................................................................................................128 Области табличного документа...................................................................................................369
Примеры разработки отчетов............................................................................................131 Рисунки табличного документа....................................................................................................381
Исходные данные для примеров.................................................................................................131 Использование макетов табличных документов........................................................................388
Пример 1. Набор данных – запрос..............................................................................................131 Печать табличного документа.....................................................................................................397
Пример 2........................................................................................................................................141 Использование табличного документа в форме........................................................................401
Пример 3. Связь наборов данных...............................................................................................145
Пример 4. Связь таблиц внутри набора данных........................................................................148 Глава 18. Интеграция с другими
Пример 5. Набор данных – объединение...................................................................................152 информационными системами......................... 413
Пример 6. Автоматическое формирование отчета....................................................................155
Форматы файлов обмена...................................................................................................414
Пример 7........................................................................................................................................156
Работа с текстом...........................................................................................................................414
Пример 8 . .....................................................................................................................................161
Работа с форматированным документом...................................................................................419
Пример 9. Свободная структура таблицы отчета......................................................................168
Работа с DBF.................................................................................................................................420
Пример 10......................................................................................................................................171
Работа с XML-документами.........................................................................................................423
Пример 11......................................................................................................................................177
XDTO-сериализация.....................................................................................................................440
Пример 12......................................................................................................................................181
Пример реализации обмена при разной структуре объектов конфигурации...........................441
Пример 13......................................................................................................................................189
Работа с ZIP-архивами.................................................................................................................445
Пример 14......................................................................................................................................196
Пример 15......................................................................................................................................203
Использование интернет-технологий...............................................................................449
Пример 16......................................................................................................................................212 Работа с HTML..............................................................................................................................449
Пример 17......................................................................................................................................219 Использование FTP......................................................................................................................453
Пример 18. Работа с системой компоновки данных из встроенного языка.............................226 Работа с электронной почтой......................................................................................................454
Пример 19. Консоль системы компоновки данных.....................................................................233 Automation...........................................................................................................................458
Справочник разработчика..................................................................................................240 Automation Server..........................................................................................................................458
Общие возможности.....................................................................................................................240 Automation Client............................................................................................................................461
Поля...............................................................................................................................................278 Внешнее соединение.........................................................................................................461
Ресурсы.........................................................................................................................................290 Использование внешнего соединения для интеграции с интернет-приложением..................463

4 Профессиональная разработка в системе «1С:Предприятие 8»


Оглавление
ActiveDocument...................................................................................................................470 V8 List Form....................................................................................................................................534
Внешние компоненты.........................................................................................................471 V8 Item Form..................................................................................................................................545
Подключение внешнего компонента в толстом клиенте или на сервере V8 Report Form..............................................................................................................................549
(на примере Native API компонента)............................................................................................472 V8 Chart Form................................................................................................................................554
Подключение внешнего компонента в тонком клиенте или в веб-клиенте Доступ к данным через ADO.NET......................................................................................555
(на примере Native API компонента)............................................................................................473 Получение данных........................................................................................................................556
Web-сервисы.......................................................................................................................473 Добавление данных......................................................................................................................558
Предоставление функциональности через Web-сервисы.........................................................473 Изменение данных........................................................................................................................559
Работа с Web-сервисами сторонних поставщиков.....................................................................476 Удаление данных..........................................................................................................................560
Пример реализации механизма Web-сервиса............................................................................476 Web-сервисы.......................................................................................................................561
Обращение к Web-сервису из веб-формы..................................................................................563
Глава 19. Обмен данными................................................... 481 Вызов процедур, функций. Преобразование типов.........................................................563
Планы обмена.....................................................................................................................482 Настройка прав доступа.....................................................................................................565
Служба регистрации изменений..................................................................................................483 Идентификация пользователя...........................................................................................565
Инфраструктура сообщений........................................................................................................490 Файл Web.config............................................................................................................................565
Универсальный механизм обмена данными....................................................................492 Файл global.asax............................................................................................................................566
Использование возможностей работы с XML-документами.....................................................492 Форма, используемая для авторизации на основе форм..........................................................567
Пример реализации универсального обмена.............................................................................493 Работа с метаданными......................................................................................................567
Регистрация в произвольные узлы..............................................................................................503 Пул соединений..................................................................................................................568
Пример работы универсального обмена данными ...................................................................504 Полезные средства .NET Framework................................................................................569
Распределенные информационные базы........................................................................505 Объект Response..........................................................................................................................569
Общие принципы..........................................................................................................................505 Объект Request.............................................................................................................................570
Главный и подчиненный узлы......................................................................................................507 Объект Session..............................................................................................................................570
Сообщение обмена данными в распределенной информационной базе................................507 Подготовка веб-приложения к работе...............................................................................571
Создание узла распределенной информационной базы..........................................................508 Состав файлов..............................................................................................................................571
Запись и чтение сообщений обмена........................................................................................... 511
Параметры автоформ........................................................................................................571
Подготовка конфигурации к работе в распределенной информационной базе......................512
Форма списка (DefaultListForm)....................................................................................................572
Пример работы обмена данными в распределенной информационной базе . ......................513
Форма элемента объектной таблицы (DefaultObjectForm)........................................................572
Сценарии обмена данными в распределенной информационной базе...................................514
Форма записи регистра (DefaultRecordForm)..............................................................................573
Разрешение коллизий...................................................................................................................516
Форма строки табличной части (DefaultLineForm)......................................................................573
Восстановление узла распределенной информационной базы из резервной копии.............516
Особенности использования последовательности документов Глава 21. Поставка прикладных решений........................ 575
в распределенной информационной базе..................................................................................517
Использование транзакций при организации обмена.....................................................518 Механизм поставки и поддержки прикладных решений..................................................576
Методика включения в сообщение обмена дополнительной информации...................519 Изменение режима поддержки....................................................................................................578
Изменение правил поддержки.....................................................................................................579
Организация одностороннего обмена..............................................................................520
Поддержка на разных языках......................................................................................................581
Примеры реализации автоматического обмена данными..............................................521
Особенности работы с конфигурацией в хранилище,
Использование регламентных заданий......................................................................................521 если конфигурация стоит на поддержке.....................................................................................582
Использование объекта СОМСоединение..................................................................................522 Настройка поставки......................................................................................................................582
Обновление конфигурации, находящейся на поддержке..........................................................583
Глава 20. Web-расширение................................................. 523
Общие технологические сведения о поддержке........................................................................587
Основные положения.........................................................................................................524 Сценарии поддержки....................................................................................................................589
ADO.NET........................................................................................................................................525 Механизм создания комплектов поставки........................................................................592
ASP.NET.........................................................................................................................................526 Файл поставки...............................................................................................................................592
Конструкторы Web-расширения для веб-приложений....................................................533 Файл обновления..........................................................................................................................593

Том 2
5
Оглавление
Технологические особенности использования файлов поставки и обновления.....................594 Настройка приложения для работы в отладочном режиме......................................................642
Файл информационной базы.......................................................................................................595 Многоязычные прикладные решения...............................................................................646
Файл выгрузки информационной базы.......................................................................................595 Информационная база.................................................................................................................648
Шаблоны конфигураций...............................................................................................................595 Платформа «1С:Предприятие»...................................................................................................649
Манифест.......................................................................................................................................597 Конфигурация................................................................................................................................653
Удаленный каталог шаблонов.....................................................................................................600 Редактирование текстов интерфейса.........................................................................................657
Создание комплектов поставки....................................................................................................601
Типичные сценарии создания комплектов поставки..................................................................605 Приложение. Хранение данных......................................... 661
Приложение Autorun для создания пользовательской оболочки дисков поставки.......611 Размещение данных системы «1С:Предприятие»..........................................................661
Приложение SetupV8....................................................................................................................613 Информационные базы................................................................................................................661
Пример использования приложения Autorun..............................................................................614 Хранилище конфигурации............................................................................................................666
Создание файлов поставки и обновления из командной строки..............................................616 Журнал регистрации.....................................................................................................................666
Профайлы......................................................................................................................................667
Глава 22. Методика разработки.......................................... 619
Другие вспомогательные данные................................................................................................668
Жизненный цикл прикладного решения...........................................................................619 Временные данные.......................................................................................................................669
Проектирование............................................................................................................................619 Поля таблиц базы данных.................................................................................................670
Разработка.....................................................................................................................................620 Хранение значений полей примитивных и ссылочных типов...................................................670
Функциональное тестирование....................................................................................................620 Хранение значений полей составного типа................................................................................670
Нагрузочное тестирование...........................................................................................................620 Индексы таблиц базы данных...........................................................................................675
Внедрение.....................................................................................................................................621 Справочник....................................................................................................................................675
Сопровождение в процессе эксплуатации..................................................................................621 Документ........................................................................................................................................677
Выводы..........................................................................................................................................622 Журнал документов......................................................................................................................677
Проектирование структуры метаданных..........................................................................622 План видов характеристик...........................................................................................................677
Выбор между объектными и необъектными данными..............................................................622 План счетов...................................................................................................................................677
Анализ логики работы прикладных объектов с данными..........................................................623 План видов расчета......................................................................................................................678
Анализ производительности........................................................................................................623 План обмена..................................................................................................................................678
Анализ возможностей использования обмена данными...........................................................623 Табличная часть............................................................................................................................678
Анализ параллельности работы..................................................................................................624 Регистр сведений..........................................................................................................................678
Групповая разработка прикладных решений...................................................................624 Регистр накопления......................................................................................................................680
Используемая терминология.......................................................................................................624 Агрегаты регистра накопления....................................................................................................680
Общие сведения о хранилище конфигурации............................................................................625 Регистр бухгалтерии.....................................................................................................................680
Создание хранилища конфигурации...........................................................................................626 Регистр расчета............................................................................................................................681
Пользователи хранилища............................................................................................................626 Последовательность.....................................................................................................................681
Подключение к хранилищу...........................................................................................................627 Перечисление................................................................................................................................681
Отображение состояния объектов конфигурации......................................................................629 Бизнес-процесс.............................................................................................................................682
Просмотр состояния объектов.....................................................................................................629 Задача............................................................................................................................................682
Захват и помещение объектов в хранилище..............................................................................630 Таблицы регистрации изменений................................................................................................682
Администрирование хранилища..................................................................................................633 Таблица списка пользователей...................................................................................................683
Сравнение и сохранение текущей конфигурации хранилища..................................................634 Таблица истории работы пользователей...................................................................................683
Работа с версиями хранилища конфигурации...........................................................................634 Таблица хранилища системных настроек .................................................................................683
Отчеты по истории хранилища....................................................................................................635 Таблица хранилища настроек отчетов........................................................................................683
Варианты использования хранилища конфигурации................................................................636 Таблица хранилища настроек вариантов отчетов.....................................................................683
Работа с хранилищем конфигурации из командной строки......................................................639 Таблица хранилища общих настроек..........................................................................................683
Отладка прикладных решений..........................................................................................640 Таблица хранилища настроек данных форм..............................................................................683
Подключение предметов отладки................................................................................................641

6 Профессиональная разработка в системе «1С:Предприятие 8»


Оглавление

Глава 13. Сложные периодические расчеты

Помимо задач оперативного и бухгалтерского учета, платформа Пример, который будет рассматриваться в рамках данной главы, приво-
«1С:Предприятие» предоставляет широкие возможности для создания дится в демонстрационной конфигурации «Сложные периодические
решений, предполагающих выполнение сложных периодических расчетов. расчеты», которая находится на прилагаемом компакт-диске. В качестве
Наибольшее распространение механизмы периодических расчетов полу- примера выбрана задача по расчету зарплаты как наиболее часто реали-
чили в решениях по расчету заработной платы. Однако сфера применения зуемая на практике.
этих возможностей платформы значительно шире.
Задачи сложных периодических расчетов имеют ряд особенностей, отли- Технология реализации расчетных задач
чающих их от задач оперативного и бухгалтерского учета. Эти виды
учета отличаются как по предназначению, так и по основным методам,
используемым для их реализации. Так, оперативный учет служит
Основные понятия
для непрерывного учета состояния и движения средств в различных Вид расчета
аналитических разрезах. Реализация подобных задач предполагает четкую
привязку всех регистрируемых событий к непрерывной оси времени Одним из основных понятий механизма периодических расчетов явля-
(каждое событие имеет так называемый момент времени, то есть точку ется вид расчета. Любой расчет, выполняемый в системе, регистрируется
на оси времени). Задачи бухгалтерского учета в целом схожи с опера- с обязательным указанием вида расчета, под которым может пониматься
тивным учетом, но предполагают более сложную систему регистрации как способ расчета данной записи, так и дополнительные свойства,
событий с возможностью использования корреспонденции счетов. Бухгал- характеризующие сущность именно этого расчета. Например, для целей
терский учет также является по сути непрерывным. расчета зарплаты различными видами расчета могут быть оклад, надбавка
за вредность, оплата сверхурочных. В данном случае каждая из этих
Отличительной особенностью периодических расчетов является
записей имеет свой алгоритм расчета, поэтому для каждого вида начис-
отсутствие однозначной привязки событий к точке на оси времени. Регис-
ления сотрудникам вводится отдельный вид расчета. Тем не менее, оплата
трируемые события в этом виде учета имеют отношение не к моменту
дежурства, например, может иметь тот же алгоритм расчета, что и оклад,
времени, а к периоду в целом. При этом периодом расчета может быть
но при этом это будет отдельный вид расчета, так как у него другой смысл.
день, месяц, квартал или год в зависимости от специфики решаемой
В общем случае список видов расчета, используемых в системе, зависит
задачи. Так, если для регистрации факта поступления товара важен
от специфики решаемой задачи.
точный момент его прихода, то при начислении премии важен период
расчета (например, месяц), в котором она была начислена. Расчетные инструменты платформы «1С:Предприятие» устроены таким
образом, что пользователь может самостоятельно создавать и настраи-
Еще одним отличием периодических расчетов является протяжен-
вать виды расчета, которые ему необходимы для решения прикладной
ность некоторых регистрируемых событий во времени. Например, при
задачи, в режиме 1С:Предприятие. Для организации системы взаимосвя-
регистрации отпуска сотрудника указывается дата начала и дата окон-
занных видов расчета в платформе предусмотрен объект конфигурации
чания отпуска. В прочих видах учета регистрация подобных записей
План видов расчета. План видов расчета определяет структуру хранения
невозможна.
данных о видах расчета, используемых в прикладном решении для опре-
Таким образом, помимо задач расчета зарплаты, механизм периодических деленных целей. Разработчик может создать в конфигурации несколько
расчетов может быть использован и в других областях, предполага- планов видов расчета для различный целей, в каждый из которых пользова-
ющих периодическую регистрацию протяженных во времени событий, тель в режиме 1С:Предприятие сможет внести неограниченное количество
например, в задаче расчета аренды за помещения выставочного центра. видов расчета, а также настроить их взаимосвязь.

Том 2
7
Глава 13. Сложные периодические расчеты

Принципы регистрации записей и в отдельном независимом регистре расчета Регламентированные начис-


ления, предназначенном для учета начислений в рублях для целей
Все записи о расчетах регистрируются в системе в привязке к периоду регламентированного учета.
расчета и конкретному виду расчета. Для хранения записей о расчетах
в системе предусмотрен объект метаданных Регистр расчета. Каждый Записи в регистрах расчета могут быть определенным образом взаимо-
регистр расчета имеет определенную периодичность (день, месяц, связаны между собой. Вид этой взаимосвязи определяется настройками
квартал или год), рис.  13.1. В зависимости от периодичности записи используемых видов расчета. Взаимосвязь, установленная для видов
в этом регистре имеют соответствующий период регистрации (подробнее расчета, действует во всех регистрах, где эти виды расчета используются.
о периоде регистрации ниже). Структура регистров расчета будет подробно рассмотрена позднее.

Период регистрации
Все расчеты в системе фиксируются в привязке к периоду расчета,
в котором они зарегистрированы. Этот период называется периодом
регистрации расчета. В зависимости от специфики задачи расчеты могут
фиксироваться с периодичностью день, месяц, квартал и год. Период
регистрации всегда существует у любой записи о расчете. При этом запись
не может быть зарегистрирована сразу в нескольких периодах расчета.
Например, при ведении ежемесячных периодических расчетов записи
Рис. 13.1. Периодичность регистров расчета
о расчетах могут быть привязаны к периоду регистрации следующим
образом (рис. 13.3).
Все записи регистра расчета, помимо периода регистрации, содержат
информацию о виде расчета, примененном в данной записи. В одном
регистре расчета могут содержаться виды расчетов только из одного плана
видов расчетов. При этом регистров расчета, использующих один и тот
же план видов расчета, может быть несколько. Например, виды расчета
из плана видов расчета Начисления могут использоваться в двух разных
регистрах – Управленческие начисления и Регламентированные начисления
(рис. 13.2).

Рис. 13.3. Привязка записей расчета к периоду регистрации

В данном примере периодом регистрации оклада, начисленного в январе,


будет являться месяц январь. Важно понимать, что периодом регистрации
квартальной премии будет тот месяц, в котором она начислена (в данном
случае март), а не весь первый квартал.

Период действия
Записи о расчетах, зарегистрированные в системе, могут быть как протя-
Рис. 13.2. Использование видов расчета в разных регистрах расчета женными во времени, так и нет. Например, командировка является
протяженной во времени, так как для ее расчета важен период, в течение
В данном примере один и тот же план видов расчета Начисления исполь- которого сотрудник находился в отъезде (рис.  13.4). В то же время,
зуется как в регистре расчета Управленческие начисления для учета например, начисленный штраф не является протяженным во времени,
зарплаты работников в долларах для целей управленческого учета, так а относится в целом к периоду, в котором он был начислен. Интервал,

8 Профессиональная разработка в системе «1С:Предприятие 8»


Технология реализации расчетных задач

в течение которого длится протяженная во времени запись, называется


периодом действия этой записи.

Рис. 13.6. Период действия раньше периода регистрации

В этом случае периодом регистрации этой записи будет март, хотя расчет
Рис. 13.4. Записи расчета, протяженные во времени длился с 10 по 22 февраля.
Обратный случай возможен, например, когда начисление за предстоящую
Период действия представляет собой непрерывный интервал времени, в следующем месяце командировку производится текущим месяцем
определяемый датой начала периода и датой его окончания. В приве- (рис. 13.7).
денном примере периода действия записи о командировке – это интервал
с 8 по 24 февраля. Период действия одной записи регистра расчета может
лежать только в рамках одного периода расчетов. Если необходимо ввести
расчет, который длится в рамках нескольких расчетных периодов, его
нужно разбить на несколько записей (рис. 13.5).

Рис. 13.7. Период действия позже периода регистрации

Рис. 13.5. Ввод расчета, который длится в нескольких периодах В этом случае периодом регистрации этого начисления будет февраль,
а периодом действия – интервал с 9 по 25 марта.
Так, если установлена периодичность расчетов месяц, то нельзя ввести
командировку с периодом действия с 10 января по 15 февраля, так как Вытесняющие расчеты и фактический период действия
такой период не лежит в рамках одного месяца. Вместо этого вводятся две
записи, у одной из которых период действия с 10 по 31 января, у другой – Протяженные во времени записи регистров расчета могут конкурировать
с 1 по 15 февраля. между собой за период действия. Это означает, что они не могут действо-
вать одновременно. Такая конкуренция необходима, когда виды расчета
У протяженных во времени записей период действия может не прина-
являются по сути взаимоисключающими. Например, виды расчета
длежать периоду регистрации и лежать как в прошлом, так и в будущем
Оклад и Командировка не могут действовать в один и тот же момент,
относительно периода регистрации.
так как сотрудник не может одновременно работать на основном месте
Например, если работник болел в феврале, а оформленный больничный и находиться в командировке. При вводе записи о командировке на опре-
лист принес только в марте, то оплата больничного будет начислена деленный интервал времени система должна исключать действие оклада
в марте, так как за февраль зарплата уже рассчитана (рис. 13.6). в этом интервале. Такие виды расчетов, которые исключают одновременное

Том 2
9
Глава 13. Сложные периодические расчеты

действие записей других видов расчетов, называются вытесняющими


(рис. 13.8).

Рис. 13.8. Вытеснение по периоду действия

В данном случае у записей о командировке и окладе возникает конку-


ренция за период действия в интервале с 10.03 по 15.03 (т. е. в интервале
действия командировки). Как уже было отмечено, эти записи не могут
действовать одновременно, поэтому в указанном интервале происходит Рис. 13.9. Фактический период действия
вытеснение оклада командировкой. Таким образом, вид расчета Команди-
ровка по сути является вытесняющим по отношению к виду расчета Оклад. Важно учитывать, что вытеснение срабатывает только при вводе вытес-
Это означает, что записи с видом расчета Командировка будут вытеснять няющих расчетов текущим или будущим периодом. При вводе расчетов
записи с видом расчета Оклад. за предыдущий период (задним числом) механизм вытеснения
При вытеснении одного расчета другим период действия вытесняемого не действует. Это связано с тем, что записи, введенные в систему раньше
расчета не изменяется. Результат вытеснения влияет на так называемый (т. е. с меньшим периодом регистрации), имеют больший приоритет
фактический период действия вытесняемого расчета. Под фактическим в конкуренции за период действия, чем более поздние записи (с большим
периодом действия записи понимается совокупность интервалов времени периодом регистрации), причем это не зависит от настройки списка
в рамках периода действия, на протяжении которых расчет действует вытесняющих расчетов (рис. 13.10).
с учетом всех вытеснений. Если никаких вытеснений не происходило,
фактический период действия совпадает с периодом действия (рис. 13.9).
Таким образом, до вытеснений фактический период действия записи
об окладе содержал только один интервал, совпадающий с периодом
действия. В результате вытеснения период действия оклада не изменился,
а конкуренция выразилась в разбиении фактического периода действия
оклада на три интервала.

ПРИМЕЧАНИЕ

При формировании фактического периода действия принимаются


во внимание также сторно-записи, о которых будет сказано ниже. Рис. 13.10. Записи ранних периодов не вытесняются

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

10 Профессиональная разработка в системе «1С:Предприятие 8»


Технология реализации расчетных задач

действия больничного будет пустым, так как записи не могут действовать диться расчет начисления отпускных в соответствии с алгоритмом расчета.
одновременно, а вытеснения не происходит. Для того чтобы восстано- То есть расчетная база – это еще не результат расчета, а лишь исходные
вить фактический период действия больничного, применяется механизм данные, которые участвуют в алгоритме расчета. В данном случае пред-
сторнирования, который будет описан позже. положим, что отпускные рассчитываются как среднее арифметическое
заработков за 3 предыдущих месяца. В этом случае расчет отпуска произ-
Зависимость по базовому периоду водится следующим образом:
Результат расчета = База расчета / 3 = 33 000 / 3 = 11 000
В определенных случаях результат одного расчета может зависеть
от результата других расчетов, введенных в систему. Например, квар- Расчет по базе может применяться ко всем видам расчетов, независимо
тальная премия может зависеть от суммы начисленного за квартал от того, являются они протяженными во времени или нет. Например,
заработка по окладу. В этом случае говорят, что оклад входит в базу квартальная премия, которая не имеет периода действия, может иметь
расчета премии, а вид расчета Оклад является базовым по отношению базовый период (например, I квартал).
к виду расчета Квартальная премия. При этом один вид расчета может
иметь несколько базовых видов расчета, то есть зависеть одновременно Ведущие расчеты и перерасчет
от нескольких других расчетов. При расчете результата расчета по базе
анализируется сумма базовых видов расчета за определенный период, Ведущими называют виды расчетов, при вводе или изменении которых
который называется базовым периодом. Базовый период – это произ- необходимо перерассчитать результат уже существующих расчетов.
вольный непрерывный интервал дат, который может покрывать несколько Например, если работнику начислена премия за март в размере 10  %
расчетных периодов. Например, при расчете оплачиваемого отпуска, от заработка, то при вводе нового начисления в марте размер этой премии
как правило, производится расчет среднего заработка за 3 месяца, пред- теряет актуальность. Премию необходимо пересчитать, чтобы учесть
шествующих отпуску. Этот интервал и будет базовым периодом расчета новое начисление (рис. 13.12).
отпуска (рис. 13.11).

Рис. 13.12. Необходимость перерасчета при изменении базового вида расчета

В данном случае премия изначально была рассчитана как 10 % от суммы


оклада. При вводе за март надбавки в размере 3 000 рублей результат
Рис. 13.11. Базовый период расчета премии становится неверным, так как не учитывает этой надбавки.
Виды расчетов Оклад и Надбавка являются ведущими по отношению
В приведенном примере виды расчетов Оклад и Надбавка являются
к премии, так как влияют на ее расчет. В случае изменения этих расчетов
базовыми по отношению к отпуску. Если начисляется оплата отпуска
или ввода новых результат премии необходимо перерасcчитать.
за апрель, то базовым периодом этой записи будет интервал с 1 января
по 31 марта (3 целых месяца, предшествующие отпуску). В этом случае Под понятием перерасчет понимается повторный расчет результата
в базу расчета отпуска войдут все базовые начисления, входящие в базовый записи с учетом произошедших изменений. Система позволяет авто-
период записи об отпуске. В данном случае база расчета отпуска состав- матически отслеживать изменения расчетов, которые могут повлечь
ляет 33 000 рублей и состоит из суммы начислений по окладу за 3 месяца перерасчет других записей, и формировать список расчетов, которые необ-
и начисленной в феврале надбавки. Исходя из этой базы, будет произво- ходимо перерасcчитать. Для этого система при вводе расчета анализирует,

Том 2
11
Глава 13. Сложные периодические расчеты

по отношению к каким другим видам расчета данный вид расчета явля- видов расчета не могут действовать одновременно, то есть их фактические
ется ведущим. периоды действия не должны пересекаться. В результате фактический
По сути, все виды расчета, являющиеся базовыми по отношению к данному период действия больничного будет пустым. Тем не менее эта ситуация
виду расчета, должны быть одновременно и ведущими по отношению должна быть как-то учтена, поскольку в этом случае работнику начислен
к нему. Это связано с тем, что если данный вид расчета использует резуль- завышенный оклад за февраль. Для решения этой задачи необходимо:
таты базовых расчетов, то при изменении этой базы запись необходимо ■■ в текущем периоде регистрации отменить неправильно начисленную
перерасcчитать. В указанном случае оклад и надбавка составляют базу часть оклада;
расчета премии, поэтому логично, что при их изменении нужно заново ■■ позволить больничному иметь непустой фактический период
рассчитать премию. действия, чтобы правильное начисление могло вступить в силу.
В то же время ведущими расчетами могут быть не только базовые. Эта задача решается вводом в систему корректирующих записей, которые
Ведущими могут быть также расчеты, влияющие на результат данного называются сторно-записями. Процесс такой корректировки называется
вида расчета косвенно. Например, вид расчета Невыход, который вытес- сторнированием. Как было отмечено выше, при формировании факти-
няет оклад, косвенно влияет на расчет премии, так как при вводе невыхода ческого периода действия записи учитывается наличие сторно-записей
может измениться сумма оклада. В этом случае Невыход является ведущим по конкурирующим видам расчета. Ввод в систему таких записей
по отношению к премии. Такая же ситуация возникает при косвенной позволит больничному иметь непустой фактический период действия
зависимости по базе (рис. 13.13). на интервале действия сторно-записи (рис. 13.14).

Рис. 13.13. Ведущие виды расчета


Рис. 13.14. Сторно-записи
В данном случае командировка напрямую не входит в базу расчета
премии, но влияет на доплату за разъезды, которая, в свою очередь, В указанном примере изначально был начислен оклад в размере
входит в базу расчета премии. Таким образом, изменение суммы за коман- 10 000 рублей за февраль. В марте становится очевидным, что совершена
дировку косвенным образом повлияет на премию. И хотя сама премия ошибка, так как в середине месяца сотрудник болел. Если просто ввести
не рассчитывается на базе командировки, Командировка будет ведущим больничный за февраль с периодом регистрации март, он будет иметь
видом расчета по отношению к премии. пустой фактический период действия. Чтобы этого избежать, вводится
сторно-запись по окладу, которая решает две задачи:
■■ отменяет начисление оклада за период болезни (за этот период сотруд-
Сторнирование нику было ошибочно начислено 4 000 рублей по окладу);
Как уже отмечалось, записи с более поздним периодом регистрации ни ■■ позволяет больничному иметь непустой фактический период действия,
при каких обстоятельствах не могут вытеснить по периоду действия в результате чего сотруднику начисляется 3 000 рублей по больнич-
записи с более ранним периодом регистрации. Больничный за февраль, ному листу.
введенный в марте, не изменит фактического периода действия февраль- В результате этих действий общий результат записей становится верным.
ского оклада. При этом указанные записи в силу настройки вытесняющих Важно понимать, что периодом регистрации сторно-записи будет

12 Профессиональная разработка в системе «1С:Предприятие 8»


Планы видов расчета

тот же месяц, которым введен больничный (в данном случае март). Планы видов расчета
Иными словами, если в текущем периоде обнаружена ошибка и нужно
внести изменения в предыдущий период, то соответствующая коррек- Назначение планов видов расчета
тирующая запись будет зарегистрирована в текущем периоде. При этом
вид расчета сторно-записи такой же, как и в ошибочно введенной записи Планы видов расчета представляют собой прикладные объекты конфи-
прошлого периода (в данном случае Оклад). гурации, предназначенные для описания структур данных, в которых
хранятся однотипные виды расчета. Для создания и настройки этих
В этой связи стоит еще раз остановиться на принципах формирования
объектов предусмотрена отдельная ветка дерева конфигурации Планы
фактического периода действия записей. В данном случае при определении
видов расчета (рис. 13.16).
фактического периода действия больничного учитывался не только период
действия оклада, но и период действия сторно-записи. Таким образом,
при формировании фактического периода действия учитывается наличие
сторно-записей конкурирующих видов расчета.
Этот механизм можно пояснить на следующем примере (рис. 13.15).
Рис. 13.16. Планы видов расчета

Каждый план видов расчета определяет отдельную структуру данных, где


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

Рис. 13.15. Учет сторно-записей при формировании фактического периода действия ■■ предопределенный вид расчета не может быть удален в режиме
1С:Предприятие;
В данном случае больничный, имеющий более поздний период регистрации, ■■ в режиме 1С:Предприятие не могут быть удалены и изменены неко-
имел бы пустой фактический период действия на интервале пересечения торые свойства предопределенного вида расчета, заданные в режиме
с периодом действия дежурства (с 07.03 по 22.03). Однако наличие стор- Конфигуратор. Об этих свойствах будет подробнее рассказано ниже.
но-записи позволяет больничному действовать параллельно с дежурством
В конфигурации может быть создано неограниченное количество планов
на интервале действия сторно-записи (с 07.03 по 15.03). При этом на
видов расчета. Планы видов расчета могут различаться между собой
интервале с 16.03 по 22.03 фактический период действия больничного
по свойствам или по назначению использования.
будет по-прежнему прерываться, так как на этом интервале не действует
сторно-запись по дежурству. Поэтому для того, чтобы больничный мог В демонстрационной конфигурации «Сложные периодические расчеты»,
занять весь свой период действия, сторно-запись должна быть введена которая находится на прилагаемом компакт-диске, присутствуют 3 плана
с периодом действия 07.03–22.03, то есть на всем интервале пересечения видов расчета:
периодов действия дежурства и больничного. ■■ ОсновныеНачисления – в этом плане видов расчета хранятся виды
расчета, характеризующие начисления, которые являются протяжен-
подробнее
ными во времени, то есть имеют период действия;
Раздел «Сторнирование», стр. 30. ■■ ДополнительныеНачисления – виды расчетов, хранящиеся в этом плане
видов расчета, отражают начисления, не являющиеся протяженными
во времени;
■■ Удержания – в этом плане видов расчета хранятся виды расчетов, харак-
теризующие удержания из зарплаты работников.

Том 2
13
Глава 13. Сложные периодические расчеты

Таким образом, планы видов расчета ОсновныеНачисления и Дополни- Использование указанных выше свойств аналогично их роли при настройке
тельныеНачисления отличаются друг от друга по свойствам, а план видов справочников. Кроме этого, у плана видов расчета существуют специфи-
расчета Удержания отличается еще и назначением использования. ческие свойства, определяющие расчетные свойства соответствующих
видов расчета. К таким свойствам относятся:
Свойства планов видов расчета ■■ Использует период действия. Если в плане видов расчета установлено
свойство Использует период действия, то все виды расчета, хранящиеся
При создании и настройке плана видов расчета разработчик может влиять в данном плане, будут рассматриваться как протяженные во времени
на его свойства. Для каждого плана видов расчета задается его Имя, (рис.  13.19). Для таких видов расчета применима настройка вытес-
по которому можно обращаться к этому объекту конфигурации, и Синоним, нения по периоду действия. Планы видов расчета, использующие
а также Представление объекта, Представление списка и т. п. для представ- период действия, можно использовать в регистрах расчета с периодом
ления плана видов расчета в интерфейсе «1С:Предприятия» (рис. 13.17). действия (настройка регистров расчета будет рассмотрена позже).

Рис. 13.19. Период действия и зависимость от базы

Если свойство не установлено, все виды расчета данного плана видов


Рис. 13.17. Имя, синоним и представление объекта плана видов расчета расчета будут рассматриваться как непротяженные во времени, для них
нет смысла настраивать вытеснение. Такие планы видов расчета
При настройке необходимо указать длину кода и наименования видов не могут быть использованы в регистрах расчета с периодом дейс-
расчета, содержащихся в данном плане видов расчета (рис.  13.18). твия.
Кроме этого, указывается тип кода (строка или число) и основное пред-
ставление видов расчета данного плана видов расчета для пользователя: ■■ Зависимость от базы. Эта настройка определяет, будет ли в видах
в виде кода или в виде наименования. В зависимости от этой настройки расчета данного плана видов расчета использоваться зависимость
в режиме 1С:Предприятие будет отображаться код или наименование вида по базовому периоду. Если переключатель установлен в положение
расчета в полях, хранящих ссылку на этот вид расчета. Не зависит, то виды расчета данного плана видов расчета не смогут
зависеть по базовому периоду от других видов расчета.
Установка переключателя в положение Зависит по периоду действия или
Зависит по периоду регистрации позволит устанавливать в видах расчета
зависимость по базовому периоду. Различие этих двух вариантов зави-
симости будет рассмотрено позже. При этом любой вид расчета данного
плана видов расчета теоретически может зависеть по базовому периоду от
любых других видов расчета, в том числе из других планов видов расчета.
Рис. 13.18. Код и наименование плана видов расчета
Поэтому при настройке зависимости от базы необходимо указать, какие
виды расчета могут выступать базовыми для видов расчета данного

14 Профессиональная разработка в системе «1С:Предприятие 8»


Планы видов расчета

плана. При этом базовые виды расчета могут принадлежать данному Если свойство плана видов расчета Длина кода больше 0, все виды расчетов
плану счетов или другому плану счетов. этого плана видов расчета будут иметь предопределенный реквизит Код,
Например, виды расчета из плана видов расчета Дополнительные начис- тип кода будет установлен в зависимости от соответствующей настройки.
ления могут зависеть от любых видов расчета этого же плана видов
Если свойство Длина наименования больше 0, то у всех видов расчета будет
расчета, а также от плана видов расчета Основные начисления. В част- существовать предопределенный реквизит Наименование типа Строка.
ности, вид расчета Годовая премия может зависеть по базовому периоду Если у плана видов расчета установлено свойство Использует период дейс-
от оклада, принадлежащего плану видов расчета Основные начисления, твия и одновременно установлена зависимость от базы, у всех видов
и премии за месяц, принадлежащей плану видов расчета Дополнительные расчета данного плана видов расчета будет доступен предопределенный
начисления (рис. 13.20). реквизит ПериодДействияБазовый (Период действия является базовым пери-
одом) типа Булево. Установка этого свойства у вида расчета будет означать,
что при использовании механизма зависимости по базовому периоду
вместо базового периода записи с этим видом расчета будет использо-
ваться фактический период действия записи.
Для предопределенных видов расчета реквизиты Код, Наименование
и ПериодДействияБазовый можно указывать в конфигураторе (рис. 13.22).

Рис. 13.20. Зависимость от видов расчета других планов видов расчета

Структура планов видов расчета


Структура плана видов расчета может существенно меняться в зависи- Рис. 13.22. Создание предопределенного вида расчета
мости от его свойств. Общая структура плана видов расчета представлена
на рис. 13.21. При этом код и наименование предопределенных видов расчета поль-
зователь сможет изменить в режиме 1С:Предприятие, а признак Период
действия является базовым периодом будет доступен для изменения только
в конфигураторе.
Помимо указанных реквизитов, разработчик может добавлять в план
видов расчета произвольное количество других реквизитов любых типов.
Для всех видов расчета, в том числе предопределенных, дополнительные
реквизиты могут редактироваться только в режиме 1С:Предприятие.

Предопределенные табличные части


У всех планов видов расчета независимо от настройки существует предо-
пределенная табличная часть ВедущиеВидыРасчета. Эта табличная часть
позволяет для любого вида расчета данного плана видов расчета указать
список ведущих расчетов. При этом ведущие расчеты могут выбираться
из всех планов видов расчета конфигурации независимо от их настройки.
Например, для уже упоминавшейся годовой премии ведущими могут быть
виды расчета Оклад из основных и Премия за месяц из дополнительных
Рис. 13.21. Структура плана видов расчета
начислений.

Том 2
15
Глава 13. Сложные периодические расчеты

У планов видов расчета, использующих период действия, существует Проверки, выполняемые при записи вида расчета
также предопределенная табличная часть ВытесняющиеВидыРасчета,
в которой для каждого вида расчета задается список вытесняющих видов При записи вида расчета система производит ряд проверок на отсутс-
расчета. В качестве вытесняющих могут выступать только виды расчетов твие конфликтов при заполнении свойств и предопределенных табличных
данного плана видов расчета. частей.
Если у плана видов расчета установлена зависимость от базы, в его струк-
туре будет присутствовать еще одна предопределенная табличная часть Проверки в предопределенных видах расчета
БазовыеВидыРасчета, в которой для каждого вида расчета можно указать
Если вид расчета является предопределенным (введен в конфигураторе),
список базовых видов расчета. При этом в качестве базовых могут высту- то при записи объекта в режиме 1С:Предприятие система будет выполнять
пать только виды расчета тех планов видов расчета, которые отмечены следующие проверки:
в качестве базовых в свойствах данного плана видов расчета на закладке
Расчет. ■■ проверка изменения свойства ПометкаУдаления. Как уже отмечалось,
пользователь в режиме 1С:Предприятие не может интерактивно уста-
Все три предопределенные табличные части имеют единственный новить или снять пометку удаления с предопределенного вида расчета.
предопределенный реквизит (колонку) – ВидРасчета. Состав реквизитов Эти изменения доступны только средствами встроенного языка.
(колонок) предопределенных табличных частей не может быть изменен. При попытке изменить это свойство интерактивно будет выдано
Для предопределенных видов расчета эти табличные части могут быть предупреждение: «Пометка на удаление предопределенного вида
заполнены в режиме Конфигуратор, но только видами расчета, также расчета запрещена»;
являющимися предопределенными. Эта настройка производится
на соответствующих закладках формы предопределенного вида расчета ■■ проверка изменения свойства ПериодДействияБазовый. Для предопре-
(рис. 13.23). деленных видов расчета свойство Период действия является базовым
периодом может быть изменено только из конфигуратора либо
средствами встроенного языка. При попытке изменить его интер-
активно в режиме 1С:Предприятие будет выдано предупреждение:
«Изменены свойства предопределенного вида расчета»;
■■ проверка модификации предопределенных табличных частей. У предо-
пределенного вида расчета в режиме 1С:Предприятие не допускается
модификация или удаление строк табличных частей ведущих, вытесня-
ющих и базовых видов расчетов, заданных в конфигураторе. В режиме
1С:Предприятие можно добавлять новые строки в эти таблицы.
Рис. 13.23. Настройка базовых, вытесняющих и ведущих видов расчета

Чтобы добавить в одну из предопределенных табличных частей вид Проверки предопределенных табличных частей
расчета, не являющийся предопределенным, необходимо перейти в режим
1С:Предприятие. Во всех видах расчета (не только предопределенных) при записи
производятся следующие системные проверки табличных частей
Помимо предопределенных табличных частей разработчик может создать
ВедущиеВидыРасчета, БазовыеВидыРасчета и ВытесняющиеВидыРасчета.
произвольное количество дополнительных табличных частей с любым
составом реквизитов (колонок). Редактирование таких табличных частей, Проверка повторяющихся строк. В каждой из предопределенных
в том числе для предопределенных видов расчета, доступно только табличных частей производится проверка дублирующихся значений
в режиме 1С:Предприятие. колонки ВидРасчета. Недопустимо, например, в список базовых видов
расчета внести несколько раз один и тот же вид расчета. В этом случае
будет выдано предупреждение: «Дублирование базовых видов расчета».
Проверка «зацикливания» вытесняющих видов расчета. В таблице Вытес-
няющиеВидыРасчета производится проверка отсутствия конфликтов при
настройке вытеснения одного расчета другим. Если в списке вытесняющих
указан вид расчета, который прямо или косвенно вытесняется текущим

16 Профессиональная разработка в системе «1С:Предприятие 8»


Планы видов расчета

(записываемым) видом расчета, то механизм вытеснения по периоду случае при записи элемента возникнет ошибка: «Неполный список
действия не сможет сработать, так как непонятно, как будут конкуриро- вытесняющих расчетов» (рис. 13.26).
вать за период действия эти виды расчета.
Например, если для оклада указан вытесняющий вид расчета Команди-
ровка, то при попытке указать оклад как вытесняющий в командировке
возникнет ошибка: «Вытесняющий вид расчета вытесняется текущим!»
(рис. 13.24).

Рис. 13.26. Проверка полноты списка вытесняющих видов расчета

Таким образом, все виды расчетов, вытесняющие текущий косвенно, необ-


ходимо также включить в табличную часть ВытесняющиеВидыРасчета.
Проверка полноты списка ведущих расчетов. По аналогичной схеме
Рис. 13.24. Проверка «зацикливания» вытесняющих видов расчета проверяется табличная часть ВедущиеВидыРасчета. Если в табличной
части не указан вид расчета, который является ведущим косвенно (через
При этом проверяются табличные части всех видов расчета, являющихся влияние на другой вид расчета), то система выдаст ошибку: «Неполный
вытесняющими (в данном плане счетов), а не только тех, которые указаны список ведущих видов расчета». Так как ведущими могут быть виды
для данного вида расчета. Дело в том, что текущий вид расчета может расчета любого плана видов расчета, при проверке полноты списка будут
вытесняться не напрямую, а опосредованно, через другие виды расчета. анализироваться данные всех планов видов расчета конфигурации.
Например, вытеснение видов расчета может быть настроено так, как пока- Проверка правильного заполнения предопределенных табличных частей
зано на рис. 13.25. производится в момент записи вида расчета. При этом запись вида расчета
может быть инициирована в следующих случаях:
■■ при интерактивной записи вида расчета в режиме 1С:Предприятие;
■■ при записи вида расчета средствами встроенного языка (использо-
вание метода Записать() объекта ПланВидовРасчетаОбъект);
■■ при реструктуризации базы данных после изменения конфигурации.
Рис. 13.25. Проверка «зацикливания» вытесняющих видов расчета Так как для предопределенных видов расчета возможно редактирование
табличных частей в конфигураторе, при обновлении конфигурации
В данном случае система не позволит указать оклад в списке вытесняющих базы данных должна производиться проверка табличных частей всех
для командировки, так как сама командировка вытесняет оклад косвенно видов расчета. При этом учитываются не только предопределенные
через вытеснение вида расчета Дежурство. Таким образом, проверка строки этих таблиц, но и введенные в режиме 1С:Предприятие.
выполняется рекурсивно, и будет выявлена сколь угодно длинная цепочка
взаимного вытеснения.
Структура таблиц базы данных
Проверка полноты списка вытесняющих видов расчета. При записи вида
расчета система требует указания полного списка вытесняющих расчетов. Для каждого плана видов расчета в системе хранится основная таблица,
Это означает, что в списке должны присутствовать все виды расчета, а также отдельные таблицы на каждую табличную часть (как предопреде-
вытесняющие текущий не только напрямую, но и косвенно. ленную, так и добавленную разработчиком). Основная таблица содержит
все виды расчета данного плана видов расчета с указанием предопре-
Например, если в список вытесняющих для оклада включен вид расчета деленных свойств, а также реквизитов, добавленных разработчиком.
Дежурство, который, в свою очередь, вытесняется командировкой,
Основная таблица имеет структуру, представленную в табл. 13.1.
то система потребует включить в список еще и командировку. В противном

Том 2
17
Глава 13. Сложные периодические расчеты
Таблица 13.1. Структура основной таблицы плана видов расчета данная строка табличной части принадлежит, то есть внутренний иден-
тификатор этого вида расчета (здесь условно обозначен как наименование

ПериодДействияБазовый
со знаком *). Таким образом, все строки этой таблицы со ссылкой на оклад
представляют собой предопределенную табличную часть вида расчета

Предопределенный
Оклад. Строка табличной части не является ссылочным типом, поэтому

ПометкаУдаления
Наименование

собственной ссылки не имеет.

Реквизит N
Реквизит 1
Значение поля НомерСтроки формируется системой автоматически как
Ссылка

порядковый номер строки табличной части в рамках данной ссылки.


Код


В рамках одного вида расчета (ссылки) номера строк таблицы уникальны.
 * 00001 Оклад Ложь Ложь Ложь      
При помощи этого поля можно отличить одну строку табличной части
 * 00002 Командировка Ложь Ложь Ложь      
от другой. Кроме этого, номер строки определяет порядок следования
 * 00003 Сдельный Истина Ложь Истина      
строк в табличной части.
 * 00004 Больничный Ложь Ложь Ложь      
В поле ВидРасчета хранится ссылка на вид расчета (строку основной
Независимо от настройки плана видов расчета в основной таблице будут таблицы), выбранный в табличной части. Например, в приведенном
присутствовать поля Ссылка, Предопределенный и ПометкаУдаления. примере для вида расчета Оклад в качестве вытесняющих указаны
Поле Ссылка хранит внутренний уникальный идентификатор каждого виды расчета Больничный, Дежурство и Командировка. Тип поля ВидРас-
вида расчета в базе данных. В полях Предопределенный и ПометкаУда- чета для всех предопределенных табличных частей может быть разным.
ления, имеющих тип Булево, хранится информация о том, является ли Для таблицы ВытесняющиеВидыРасчета – это ссылка на текущий план
данный вид расчета предопределенным и помечен ли он на удаление. видов расчета; ВедущиеВидыРасчета – составной тип, включающий
ссылку на любой план видов расчета; БазовыеВидыРасчета – составной
Поля Код и Наименование присутствуют в таблице в том случае, если тип, определяемый настройками зависимости от базы текущего плана
в свойствах плана видов расчета для соответствующих полей установлена видов расчета.
ненулевая длина. Поле ПериодДействияБазовый присутствует в таблицах
тех планов видов расчета, которые используют период действия и зависят Поле Предопределенный хранит информацию о том, является ли данная
от базы. строка табличной части заданной предопределенно в конфигураторе.
Кроме этого, в основной таблице могут присутствовать дополнительные Таблица ВедущиеВидыРасчета формируется в базе данных для всех
поля любых типов для каждого реквизита, введенного разработчиком. планов видов расчета. Наличие таблиц для остальных предопределенных
табличных частей определяется настройками плана видов расчета,
Для каждой из предопределенных табличных частей в базе хранится отде- о которых было сказано выше.
льная таблица. Для всех предопределенных табличных частей структура
таблицы одинакова (на примере табличной части ВытесняющиеВидыРас- Таблицы для табличных частей плана видов расчета, введенных разработ-
чета), табл. 13.2. чиком, будут иметь структуру, показанную в табл. 13.3.

Таблица 13.2. Таблица предопределенной табличной части Таблица 13.3. Таблица табличной части плана видов расчета
«ВытесняющиеВидыРасчета»
Ссылка НомерСтроки Реквизит 1 … Реквизит N
Ссылка НомерСтроки ВидРасчета Предопределенный *Оклад 1      
*Оклад 1 *Больничный Ложь *Оклад 2      
*Оклад 2 *Дежурство Ложь *Дежурство 1      
*Оклад 3 *Командировка Ложь
*Дежурство 1 *Командировка Ложь Поля Ссылка и НомерСтроки будут присутствовать во всех таких таблицах
и выполнять такие же функции, как и для предопределенных табличных
Набор полей этих таблиц не зависит от настроек плана видов расчета частей. Кроме этого, для каждого реквизита табличной части, введен-
и одинаков для всех предопределенных табличных частей. В поле Ссылка ного разработчиком, в таблице будет предусмотрено соответствующее
хранится ссылка на вид расчета (строку основной таблицы), которому поле.

18 Профессиональная разработка в системе «1С:Предприятие 8»


Регистры расчета

Регистры расчета

Назначение регистров расчета


Регистры расчета – это прикладные объекты конфигурации, предназна-
ченные для периодической регистрации данных о произведенных расчетах
для определенных целей. Регистров расчета может быть неограниченное
количество. Для их создания и настройки предусмотрена отдельная ветка
дерева объектов конфигурации (рис. 13.27).

Рис. 13.27. Регистры расчета

Помимо собственно регистрации записей, регистры расчета обеспечи-


вают правильное отображение взаимосвязей расчетов, о которых шла
речь выше. Именно регистры расчета позволяют рассчитывать записи
по базе, производить вытеснение записей, формировать сторно-за-
писи. Кроме этого, регистры расчета обеспечивают учет протяженных Рис. 13.28. Свойства регистра расчета
во времени расчетов, хранят период действия и фактический период
действия записей. Для расчетов, зависящих от базового периода, регистр Свойство Период действия определяет, можно ли будет в данном регистре
расчета также хранит данные о базовом периоде. Иными словами, хотя учитывать записи, протяженные во времени. Установленное свойство
взаимозависимость видов расчета настраивается в планах видов расчета, Период действия позволяет для каждой записи хранить не только период
расчетные механизмы платформы заложены именно в регистры расчета. регистрации, но и период действия, отражающий протяженность этой
записи. Кроме этого, установка этого свойства означает, что в данном
регистре будет задействован механизм вытеснения и будет формиро-
Свойства регистров расчета ваться фактический период действия записей. Для того чтобы учитывать
Настройка свойств регистра расчета определяет его способность исполь- протяженные во времени записи, в плане видов расчета, используемом
зовать описанные выше расчетные механизмы платформы (рис. 13.28). в данном регистре, должно быть установлено свойство Использует период
действия.
Основная задача регистра расчетов – периодическая регистрация записей
о расчетах. Поэтому главными свойствами регистра являются его перио- Если свойство регистра расчета Период действия не установлено, то регис-
дичность, а также виды расчетов, которые в нем будут регистрироваться. трируемые записи не будут иметь периода действия и, соответственно,
протяженности во времени. В таком регистре не будет использоваться
Свойство Периодичность регистра расчетов определяет размерность пери-
механизм вытеснения. Тем не менее, в регистре без периода действия
одов, для которых будет вестись учет в этом регистре. При настройке
может быть назначен план видов расчета, использующий период дейс-
регистра доступны следующие виды периодичности: Год, Квартал, Месяц твия.
и День. Соответственно, записи в таком регистре будут фиксироваться
в привязке к конкретному году, кварталу, месяцу или дню. Периодич- Например, план видов расчета ОсновныеНачисления, использующий
ность регистра определяет вид периода регистрации записей и зависит период действия, может регистрироваться как в регистре, где будет проис-
от задачи, которую он решает. Для целей расчета зарплаты, как правило, ходить расчет зарплаты (в этом регистре период действия необходим для
применяют регистры с периодичностью Месяц. расчета), так и в регистре, где начисления учитываются для целей налого-
обложения (в этом регистре период действия не нужен), рис. 13.29.
В одном регистре расчета могут регистрироваться записи только с видами
В данном случае один и тот же вид расчета из плана видов расчета, исполь-
расчета из одного плана видов расчета. Используемый в данном регистре
зующего период действия, зарегистрирован в двух разных регистрах,
план видов расчета указывается в свойстве регистра План видов расчета.
в одном из которых период действия учитывается, в другом – нет, так как
При этом регистров, использующих один план видов расчета, может быть
в нем нет необходимости.
несколько.

Том 2
19
Глава 13. Сложные периодические расчеты

В приведенном примере график хранит количество рабочих часов


в рамках каждого календарного дня. В данном случае количество часов
и есть число, отражающее значимость каждого дня в периоде. Полные
рабочие дни имеют значимость 8 (рабочих часов), сокращенные дни – 6,
а выходные и праздничные дни имеют нулевую значимость.
График в системе должен быть создан разработчиком самостоятельно как
непериодический регистр сведений, у которого как минимум одно изме-
рение типа Дата и как минимум один ресурс типа Число (рис. 13.31).

Рис. 13.29. Использование плана видов расчета разными регистрами расчета


Рис. 13.31. График регистра расчета
Если в регистре будут учитываться записи, протяженные во времени,
то необходимо настроить для данного регистра свойство График. Разработчик может создавать и более сложную структуру регистра, но
При расчете записей, являющихся протяженными во времени, часто указанные измерение и ресурс там должны присутствовать обязательно.
значимость периода действия этих записей не является равномерной,
то есть отдельные его части имеют различную значимость. Для того чтобы привязать график к регистру расчета, необходимо в поле
График свойств регистра указать нужный регистр сведений. После этого
Например, если человек дежурил с 1 по 15 сентября, то этот интервал будет в поле Значение графика нужно указать ресурс этого регистра сведений,
периодом действия этой записи. Однако в рамках этого периода не все который является значением графика. В поле Дата графика указывается
дни могут являться одинаковыми. Например, человек работает различное измерение регистра, которое является датой графика. Необходимость
количество часов в разные дни, а в какие-то дни у него выходные. Нерав- указания этих полей связана с тем, что в регистре может быть более
номерность значимости периода описывается при помощи графика. одного измерения и более одного ресурса, поэтому поля даты и значения
График хранит определенное значение для каждой даты года. Соответс- графика должны быть указаны явно.
твенно, используя график, можно оценить значимость любого периода
(рис. 13.30). подробнее

Раздел «Настройка протяженных во времени расчетов», стр. 25.

Свойство регистра расчета Базовый период позволяет хранить в регистре


базовый период записей и, соответственно, использовать механизм зави-
симости по базовому периоду. Только для записей регистров расчета
с установленным свойством Базовый период возможно получение значения
базы. При этом свойство Базовый период устанавливается независимо
от свойства Зависимость от базы выбранного плана видов расчета.
Даже если в плане видов расчета установлена зависимость
от базы, в регистре свойство Базовый период может быть не установлено.
В этом случае в данном регистре использование зависимости по базовому
периоду будет недоступно.
Рис. 13.30. Неоднородность периода

20 Профессиональная разработка в системе «1С:Предприятие 8»


Регистры расчета

Структура регистров расчета В таких документах не хранятся данные, необходимые для формиро-
вания движений по регистру. Ввод записей производится напрямую
В зависимости от настроек регистра расчетов его структура будет в регистр, через вывод на форму документа таблицы с привязкой
различной. Общая схема структуры регистра расчета показана к набору записей этого регистра. В демонстрационной конфигурации
на рис. 13.32. «Сложные периодические расчеты», которая находится на прилагаемом
компакт-диске, таким документом является РучнойВводНачислений.
Типичным примером использования такого же принципа является
документ Операция в решениях по бухгалтерскому учету. При пометке
на удаление такого документа нельзя удалять записи из регистра, так
как их нельзя будет восстановить. Вместо этого у записей регистра
расчета, введенных этим документом, свойство Активность устанавли-
вается в значение Ложь. При этом записи не удаляются из базы данных,
но перестают влиять на учет. При необходимости снова задейство-
вать эти записи достаточно установить свойство Активность в значение
Истина. Именно это происходит при снятии пометки на удаление
с такого документа;
■■ Сторно – это признак типа Булево, который обозначает, является ли
данная запись сторно-записью. Сторно-записи записываются в регистр
со значением Истина в этом поле.
Если у регистра установлено свойство Период действия, то в структуре
появляются следующие предопределенные поля:
■■ ПериодДействияНачало – дата, обозначающая начало интервала периода
действия записи;
■■ ПериодДействияКонец – дата, обозначающая конец интервала периода
действия записи;
Рис. 13.32. Структура регистра расчета
■■ ПериодДействия – дата, отражающая период регистра расчета, в котором
действовала запись. Эта дата всегда имеет значение начала первого дня
Предопределенные поля соответствующего периода (по аналогии с полем ПериодРегистрации).
Таким образом, в простейшем регистре расчета без периода действия Примеры заполнения этих полей для регистров разной периодичности
и базового периода всегда будут присутствовать следующие поля: приведены на рис. 13.33.
Таким образом, запись с одним и тем же интервалом периода действия
■■ Регистратор – ссылка на документ, который ввел запись в регистр;
при записи в регистры разной периодичности будет иметь различное
■■ Период регистрации – период регистра расчета, к которому относится значение поля ПериодДействия. Это будет начало месяца в случае поме-
данная запись. Размер периода определяется периодичностью регистра сячного расчета, начало квартала при поквартальном расчете и т. д.
расчета;
У регистров, для которых установлено свойство Базовый период, в струк-
■■ Вид расчета – ссылка на вид расчета, используемый в данной записи; туре будут присутствовать следующие поля:
■■ Номер строки – порядковый номер записи в рамках данного регистратора.
■■ БазовыйПериодНачало – дата начала интервала базового периода;
В рамках одного документа-регистратора номера строк уникальны.
Таким образом, совокупность значений Регистратор и НомерСтроки ■■ БазовыйПериодКонец – дата окончания интервала базового периода.
позволяет идентифицировать конкретную запись регистра расчета;
■■ Активность – признак активности данной записи. Запись влияет на учет
только в том случае, если активность установлена в значение Истина.
Данное поле используется в документах прямой записи в регистр.

Том 2
21
Глава 13. Сложные периодические расчеты

Измерения регистров расчета


Ввод измерений регистров расчета позволяет обозначить объект учета
и расчета. При отсутствии измерений регистра расчетные механизмы
действуют в рамках всех записей. Например, в этом случае любая
запись о больничном приведет к вытеснению всех записей об окладе,
для которых произойдет пересечение периодов действия. В результате
добавления в регистр измерения ФизЛицо работа регистра изменится
следующим образом: при вводе больничного по сотруднику Иванов будут
вытеснены только записи об окладе по сотруднику Иванов за соответству-
ющий период действия. На рис. 13.34 представлен регистр без измерений,
где ссылка на сотрудника хранится в реквизите, а также регистр,
где ссылка на сотрудника хранится в измерении ФизЛицо. Сплошными
стрелками указано вытеснение записей.

Рис. 13.33. Пример заполнения полей «ПериодДействияНачало»,


«ПериодДействияКонец» и «ПериодДействия»

Поля, добавляемые при разработке


Для каждого регистра расчета необходимо продумать структуру изме-
рений, ресурсов и реквизитов, исходя из особенностей учетной задачи.
Регистр расчета может и не иметь ни измерений, ни ресурсов, ни рекви-
зитов. В этом случае в регистре можно вести периодический учет записей
с различными видами расчета без привязки к конкретным объектам Рис. 13.34. Использование измерений регистра расчета
(например, сотрудникам) и без сохранения числовых результатов расчетов
(например, суммы начисления). При этом в регистре можно использо- Такое же разделение произойдет и для механизма зависимости по базо-
вать период действия, будут работать механизмы вытеснения записей и вому периоду. Так, при расчете месячной премии конкретного сотрудника
перерасчетов, а также механизм зависимости по базовому периоду. При в базу расчета можно будет включить оклады только этого сотрудника
этом механизм зависимости по базовому периоду не позволит получить за базовый период расчета.
расчетную базу. Возможности регистра расчета в такой ситуации сильно
Измерения регистров расчета могут иметь произвольный тип. К форми-
ограничены, поэтому для решения прикладных задач, как правило, необ-
рованию структуры измерений нужно подходить аккуратно, так как
ходимо задать измерения, ресурсы и реквизиты регистра.
они имеют специфику, отличную, например, от регистров накопления.
Измерения регистров расчета не связаны с получением аналитики в опре-
деленных разрезах.

22 Профессиональная разработка в системе «1С:Предприятие 8»


Регистры расчета
ВНИМАНИЕ! В данном случае таблица регистра расчета дополнительных начислений
Например, если необходимо учитывать все начисления в разрезе будет соединена с таблицей регистра основных начислений для получения
статей затрат, не нужно добавлять измерение СтатьяЗатрат! Это при- базы. При этом помимо соединения по измерениям будет присутство-
ведет к нарушению учета, потому что, например, оклад со статьей вать соединение по периодам, но при изучении данного вопроса мы
затрат Основная з/п в этом случае не будет вытеснен командировкой его опускаем.
со статьей затрат Командировочные, так как у этих записей разные На больших объемах данных такое соединение может выполняться
значения измерений. Статья затрат в данном случае должна быть достаточно долго. Для того чтобы ускорить выполнение такого запроса,
реквизитом регистра расчета. необходимо создать индексы по полям, входящим в условие соединения,
в данном случае это измерения ФизЛицо и Организация. Если бы такое
Свойство «Базовое» измерения регистра расчета измерение было только одно, то эта проблема решалась бы установкой
свойства Индексирование у соответствующего измерения, однако в данном
Состав измерений регистра расчета имеет существенное значение при случае необходим составной индекс, включающий оба поля.
использовании механизма зависимости по базовому периоду. В разделе
Для оптимизации получения базы по двум и более измерениям предусмот-
«Настройка зависимости по базовому периоду» на стр. 32 будут подробно
рено свойство Базовое измерения регистра расчета. При установке этого
рассмотрены методы получения базы для записи регистра расчета.
свойства у измерений система создаст дополнительные индексы таблицы
При этом существует возможность получать базу с учетом значений регистра расчета следующей структуры (табл. 13.4).
определенных измерений регистра расчета. Это означает, что система
при получении базы будет связывать таблицу регистра расчета Таблица 13.4. Дополнительные индексы таблицы регистра расчета
вычисляемой записи с таблицами базовых регистров расчета, и в этих
связях будет использоваться соединение по измерениям текущего Состав индекса Пояснение
регистра. Например, при получении базы для премии системой может ПериодРегистрации +[БазовоеИзмерение1] + Если базовые измерения не заданы,
[БазовоеИзмерение2] +… то просто ПериодРегистрации
быть выполнено следующее соединение таблиц (рис. 13.35). [БазовоеИзмерение1] + [БазовоеИзмерение2] + Если базовые измерения не заданы,
ПериодРегистрации +… то отсутствует
ПериодДействия + Если базовые измерения не заданы,
[БазовоеИзмерение1] + [БазовоеИзмерение2] +… то просто ПериодДействия
[БазовоеИзмерение1] + [БазовоеИзмерение2] + Если базовые измерения не заданы,
ПериодДействия +… то отсутствует

При этом базовые измерения в индексе будут следовать в том порядке,


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

Ресурсы регистров расчета


Состав ресурсов регистра расчета влияет на возможность получения
расчетной базы по данному регистру для записей данного регистра
или других регистров. Например, если в регистре основных начис-
лений есть ресурс Результат, хранящий рассчитанную сумму начисления,
Рис. 13.35. Пример соединения таблиц при получении базы то для записей этого или другого регистра можно получить расчетную

Том 2
23
Глава 13. Сложные периодические расчеты

базу по этому полю, то есть сумму начислений всех записей по базовым Реквизиты регистров расчета
видам расчета за базовый период. Если числовой показатель необхо-
димо хранить в регистре, но в расчете по базе он не участвует, то такой Реквизиты регистра расчета – это произвольные дополнительные поля,
показатель должен быть введен в структуру регистра как реквизит. которые необходимо хранить в регистре. Эти данные могут исполь-
Например, поле Размер начисления, отражающее тариф, по которому был зоваться как при расчете записи, так и для формирования отчетов
рассчитан оклад или размер процента для начисления премии, не должно по регистру расчета. Например, реквизит РазмерНачисления участвует
вводиться в регистр как ресурс, так как получать базу по этому полю в формуле расчета записей, а реквизит СтатьяЗатрат может использо-
бессмысленно. ваться как группировка или отбор в отчете по начислениям. Добавление
в регистр нового реквизита не оказывает принципиального влияния на учет
Ресурсы регистров расчета всегда имеют тип Число (рис. 13.36). и работу данного регистра (за исключением случаев, когда реквизит связан
с графиком, см. раздел «Настройка протяженных во времени расчетов»
на стр. 25).

Структура таблиц базы данных


Данные каждого регистра расчета в базе данных хранятся в виде одной
основной таблицы. Структура таблицы определяется настройками
регистра. В зависимости от настроек таблица будет содержать предопре-
деленные поля, а также поля, добавленные разработчиком (табл.  13.5).
Какими настройками определяется существование в таблице этих полей,
а также их предназначение описано в разделе «Структура регистров
расчета» на стр. 21.

Таблица 13.5. Таблица регистра расчета

ПериодДействияНачало

БазовыйПериодНачало
ПериодДействияКонец

БазовыйПериодКонец
ПериодРегистрации

ПериодДействия
Номер строки
Регистратор

ВидРасчета

Активность

Сторно
Рис. 13.36. Ресурсы регистра расчета
01. 01. 01. 28.
В приведенном примере база расчета премии будет содержать данные 02. *Начисление 02. 02. 02.
по всем ресурсам регистра основных начислений. В данном случае 10 зарплаты № 1 1 Оклад 10 10 10     Истина Ложь
можно получить сумму базовых начислений (ресурс Результат) и общее 01. 01. 14. 24.
количество отработанных дней в зачет (ресурс Дни). В данном примере 02. *Начисление 02. 02. 02.
10 зарплаты № 1 2 Командировка 10 10 10     Истина Ложь
в ресурсе Дни сохраняется значение количества отработанных дней
01. 01. 01. 28.
для целей последующего расчета оплаты по среднему заработку. 02. *Начисление 02. 02. 02.
При расчете по среднему через механизм зависимости по базовому периоду 10 зарплаты № 1 3 Оклад 10 10 10     Истина Ложь
можно будет получить как данные о сумме заработка, так и о количестве 01. 01. 01. 31.
дней, засчитанных в отработанное время. 03. *Начисление 03. 03. 03.
10 зарплаты № 2 1 Оклад 10 10 10     Истина Ложь
01. 01. 01. 31. 01. 28.
03. *Начисление 03. 03. 03. 02. 02.
10 зарплаты № 2 2 Надбавка 10 10 10 10 10 Истина Ложь

24 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка протяженных во времени расчетов

В данной таблице поля ПериодРегистрации, Регистратор, НомерСтроки, Настройка протяженных во времени расчетов
ВидРасчета, Активность и Сторно присутствуют в таблице регистра неза-
висимо от его настроек. Поля ПериодДействия, ПериодДействияНачало, Использование механизма вытеснения
ПериодДействияКонец, БазовыйПериодНачало и БазовыйПериодКонец будут
присутствовать в таблице в зависимости от настроек, указанных выше. Настройка планов видов расчета и регистров расчета
Кроме указанных полей, в таблице присутствуют дополнительные поля
на каждое добавленное разработчиком измерение, ресурс и реквизит. Для организации учета протяженных во времени расчетов у плана
видов расчета должно быть установлено свойство Использует период
Важно помнить, что в полях ПериодРегистрации и ПериодДействия хранятся действия. Это позволит настраивать в видах расчета взаимное вытеснение
даты начала соответствующего расчетного периода. Это нужно учитывать путем заполнения предопределенной табличной части ВытесняющиеВи-
при построении отчетов. Например, при построении отчета по начис- дыРасчета.
лениям с условием по периоду действия с 03.02.2010 по 28.02.2010
в выборку не попадет ни одна запись, так как все записи, у которых период В используемом регистре расчета должно быть установлено свойство
действия приходится на февраль, будут в поле ПериодДействия содержать ПериодДействия, а также привязан график. При такой настройке все записи
значение 01.02.2010 00:00:00. регистра помимо периода регистрации будут хранить данные о периоде
действия, то есть о протяженности во времени.
Для регистров, использующих период действия, данные о фактическом
периоде действия записей не хранятся в основной таблице. Для хранения
этих данных для каждого такого регистра существует отдельная физи- Формирование фактического периода действия
ческая таблица следующей структуры (табл. 13.6). При формировании записи в регистре расчета, поддерживающем период
Таблица 13.6. Таблица фактического периода действия
действия, происходит анализ конкуренции за период действия вводимого
вида расчета с существующими в регистре записями. Результатом такой
Регистратор Номер строки Дата начала интервала Дата окончания интервала конкуренции будет изменение фактического периода действия вводимой
*Начисление зарплаты № 1 1 01.02.2010 13.02.2010 или существующих записей.
*Начисление зарплаты № 1 1 25.02.2010 28.02.2010
Понятие фактического периода действия применимо только к конк-
*Начисление зарплаты № 1 2 01.02.2010 28.02.2010
ретной записи регистра расчета. При этом данные о фактическом периоде
действия не хранятся в основной таблице регистра расчета, но могут
Названия полей приведены условно, так как таблица не предназначена для быть получены системными средствами, о которых речь пойдет ниже.
работы напрямую средствами встроенного языка. Заполнение таблицы Фактический период действия записи можно представить в виде
производится системой автоматически при записи в регистр расчета таблицы следующего вида (табл. 13.7).
с формированием фактического периода действия. Чтение данных
этой таблицы доступно в запросе через виртуальную таблицу Фактичес- Таблица 13.7. Фактический период действия
кийПериодДействия или специальными методами встроенного языка.
ДатаНачала ДатаОкончания
подробнее 01.02.2010 13.02.2010
18.02.2010 28.02.2010
Раздел «Использование механизма вытеснения», стр. 25.

Значения полей Регистратор и Номер строки однозначно указывают Каждая строка этой таблицы представляет собой один интервал факти-
на запись основной таблицы, то есть запись регистра расчета. Для каждой ческого периода действия. При отсутствии вытесняющих записей
записи основной таблицы, то есть для каждой пары значений регистратора результатом формирования фактического периода действия будет одна
и номера строки, в таблице могут храниться несколько непересекающихся строка таблицы. Интервал, заданный в этой строке, будет совпадать с пери-
интервалов фактического периода действия, даты начала и окончания одом действия записи. При изменении фактического периода действия
которых хранятся в соответствующих полях таблицы. Если запись имеет в результате ввода вытесняющих записей содержимое таблицы меня-
пустой фактический период действия, в физической таблице даты начала ется, в ней остаются только интервалы, на которых запись не вытеснена
и окончания интервала фактического периода действия для такой записи другими записями. Пример изменения фактического периода действия
будут равны значению даты по умолчанию ('01.01.0001 00:00:00'). приведен на рис. 13.37.

Том 2
25
Глава 13. Сложные периодические расчеты

периода действия. Если фактический период действия записи задается


несколькими интервалами, то в виртуальной таблице такая запись будет
представлена несколькими строками (рис. 13.38).

Рис. 13.38. Фактический период действия

Рис. 13.37. Изменение фактического периода действия В каждой из этих строк все данные повторяют данные строки основной
таблицы, за исключением полей ПериодДействияНачало и ПериодДейст-
Таким образом, при вытеснении записи период действия не меняется, вияКонец, которые обозначают границы интервалов фактического периода
изменяется только состав таблицы фактического периода действия. действия.
При формировании фактического периода действия происходит анализ Пример запроса, который считает количество календарных дней факти-
конкуренции записей только в рамках данного регистра расчета. ческого периода действия каждой записи документа, представлен
Иными словами, запись регистра расчета может вытеснять только записи в листинге 13.1.
этого же регистра.
Листинг 13.1. Получение количества календарных дней
При анализе конкуренции видов расчета на пересечении периодов действия фактического периода действия запросом
учитывается период регистрации записей. Если запись с вытесняющим
видом расчета имеет более поздний период регистрации, чем запись Запрос = Новый Запрос;
Запрос.Текст = "
с вытесняемым видом расчета, механизм вытеснения работать не будет. |ВЫБРАТЬ
При этом конкурирующие записи все равно не могут иметь пересекаю- | ФактическийПериод.НомерСтроки,
щийся период действия, поэтому фактический период действия записи | СУММА(РАЗНОСТЬДАТ(ФактическийПериод.ПериодДействияНачало,
| КОНЕЦПЕРИОДА(ФактическийПериод.ПериодДействияКонец, ДЕНЬ),
с более поздним периодом регистрации будет пустым на интервале пере- | ДЕНЬ)) + 1 КАК КоличествоДней
сечения. При формировании фактического периода действия учитывается |ИЗ
наличие в анализируемом периоде сторно-записей по конкурирующим | РегистрРасчета.ОсновныеНачисленияРегл.ФактическийПериодДействия(
видам расчета. Если на интервале пересечения конкурирующих видов | Регистратор = &Регистратор) КАК ФактическийПериод
|
расчета присутствуют сторно-записи, то фактический период действия |СГРУППИРОВАТЬ ПО
записи с более поздним периодом регистрации будет непустым на интер- | ФактическийПериод.НомерСтроки";
вале периода действия сторно-записи конкурирующего вида расчета.
Запрос.УстановитьПараметр("Регистратор", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Получение фактического периода действия
Пока Выборка.Следующий() Цикл
при помощи запроса Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Количество дней фактического периода для строки
Для получения фактического периода действия при помощи запроса № " + Выборка.НомерСтроки + " : " + Выборка.КоличествоДней;
предусмотрена виртуальная таблица фактического периода действия. Сообщение.Сообщить();
Структура полей этой таблицы полностью идентична структуре основной КонецЦикла;
таблицы регистра расчета. Единственное ее отличие от основной таблицы
состоит в том, что поля ПериодДействияНачало и ПериодДействияКонец
обозначают не собственно период действия, а интервал фактического

26 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка протяженных во времени расчетов
ВНИМАНИЕ! Эти данные хранятся в системе в виде регистра сведений, созданного
В запросе при получении фактического периода действия использу- при разработке конфигурации. При этом дату графика платформа полу-
ется функция КонецПериода(). Но лучше сразу при записи движений чает из измерения, заданного в свойствах регистра расчета в поле Дата
в регистр расчета обеспечить попадание в регистр даты с «правильным» графика, а значение графика – из ресурса, указанного в поле Значение
(на конец дня) временем. Для этого при записи движений в регистр графика.
расчета нужно написать, например, Движение.ПериодДействияКонец =
КонецДня(ТекСтрокаНачисления.ДатаОкончания).
Рассмотрим использование данных графика на примере. Пусть в регистре
сведений ГрафикиРаботы хранятся следующие значения для календарных
подробнее дней февраля (табл. 13.9).
Этот фрагмент присутствует в обработке ДанныеРегистраРасчета Таблица 13.9. Календарный график февраля
в демонстрационной конфигурации «Сложные периодические
расчеты», которая находится на прилагаемом компакт-диске. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Необходимо очень внимательно подходить к установке параметров вирту-
Фактически этот график представляет собой пятидневный график работы
альных таблиц. Виртуальная таблица по сути представляет собой запрос,
с двумя выходными и праздником 23 февраля. Рабочие дни в качестве
который платформа самостоятельно строит по таблицам базы данных.
значения имеют 1, выходные и праздники – 0.
Виртуальная таблица фактического периода действия формируется
запросом по основной таблице регистра расчета и таблице фактического
периода действия. У этой таблицы присутствует единственный пара- Использование данных графика для расчета записей
метр Условие. Если его заполнить, можно передать определенное условие
Пример записи, расчет которой зависит от данных графика, – оклад
в запрос платформы, формирующий виртуальную таблицу.
по месячной тарифной ставке. Для расчета этой записи используется
В данном случае нас интересует фактический период действия только размер тарифа, а также данные о количестве рабочих дней в периоде
по движениям одного документа, поэтому в параметр Условие необходимо и количестве фактически отработанных дней в этом периоде. Роль графика
передать текст Регистратор = &Регистратор, после чего указать ссылку состоит в том, чтобы данные о фактически отработанных днях и норме
на документ как значение параметра Регистратор. В этом случае в вирту- дней могли быть получены системой автоматически.
альную таблицу попадет только фактический период действия для записей
Формула расчета результата начисления в данном случае выглядит следу-
этого документа. Если то же самое условие задать не в виртуальной
ющим образом:
таблице, а в самом запросе через конструкцию ГДЕ, то результат будет
аналогичным, но производительность существенно снизится, так как Результат = Тариф * Кол-во отработанных дней / Кол-во рабочих дней периода
сначала будет сформирована виртуальная таблица фактического периода Тариф может быть получен, например, из реквизита Размер регистра
действия для всех записей регистра расчета, а потом запрос отберет из них расчетов (например, 5  000 рублей). Для получения количества отрабо-
те, которые относятся к нужному документу. Таким образом, в запросе танных и рабочих дней будут необходимы данные графика. Количество
будет обработано большое количество лишней информации. рабочих дней можно получить, просуммировав значения графика
за период действия записи. Таким образом, если оклад назначен за месяц,
Использование графиков будут просуммированы значения графика за весь месяц. Количество
фактически отработанных часов может быть получено путем суммиро-
Протяженные во времени расчеты тесно связаны с данными графика, вания значений графика за все интервалы фактического периода действия
используемого в регистре расчета. Как уже отмечалось, данные графика данной записи (рис. 13.39).
содержат определенные значения для каждого календарного дня периода.
Полученные таким образом данные могут быть использованы в формуле
Регистр расчета рассматривает график как таблицу следующего вида
расчета оклада:
(табл. 13.8).
Результат = 5000 * 12 / 19 = 3157,89
Таблица 13.8. Таблица графика

Дата графика 01.02.2010 02.02.2010 03.02.2010 04.02.2010 … 28.02.2010


Значение графика 1 1 1 1

Том 2
27
Глава 13. Сложные периодические расчеты

дня этого периода. Иными словами, база расчета премии в данном случае
будет рассчитана системой следующим образом:
База расчета = Результат оклада * (Значения графика, попавшие в базовый
период / Значения графика за период действия оклада)

Рис. 13.39. Получение данных графика

Использование данных графика


для вычисления части записи
В определенных ситуациях для протяженных во времени записей возни- Рис. 13.41. Получение данных графика
кает необходимость вычислить значения ресурсов только части записи,
попавшей в определенный интервал. Такая задача, в частности, возни- Расчетная база премии по окладу в этом случае составит (рис. 13.41):
кает при частичном пересечении записью базового периода другой записи
База расчета = 10 000 * 11 / 19 = 5 789,47
(рис. 13.40).

Настройка использования нескольких графиков


в одном регистре расчета
Выше было описано, каким образом можно привязать данные графика,
хранящиеся в регистре сведений, к регистру расчета. Однако, как правило,
при расчете записей используются различные данные графика. Например,
один из сотрудников получает оклад по дням, и для его расчета нужен
график, где рабочие дни отмечены значением 1, как в приведенных выше
графиках. Другой сотрудник может получать оклад по часам, и для расчета
нужен график, значением которого является количество рабочих часов
в каждом календарном дне. Более того, сотрудники могут работать по
разным графикам работы. Например, бухгалтер работает по пятидневке,
а охранник – в режиме сутки через двое. Иными словами, для каждого
сотрудника необходимо задавать различное значение графика для одной
даты. При этом все эти начисления рассчитываются в одном регистре,
Рис. 13.40. Частичное пересечение с записью базового периода а система позволяет привязать к регистру только один график.
В данном случае вводится запись о премии на первую половину месяца. Для реализации хранения разных вариантов графика необходимо
Следовательно, начисленный за месяц оклад в размере 10 000 рублей попа- в соответствующем регистре сведений добавить новые измерения.
дает в базовый период премии только частично. Таким образом, регистр Так, для хранения различных графиков для целей расчета зарплаты
расчета должен включить в базу расчета премии только часть из начис- по дням или по часам можно ввести в регистр сведений новое изме-
ленных 10 000 рублей. Делить сумму по количеству календарных дней, рение ВидУчетаВремени, тип которого – перечисление ВидыУчетаВремени
в данном случае поровну, было бы некорректно, так как в первой поло- с двумя возможными значениями – ПоДням и ПоЧасам. В этом случае для
вине месяца могло быть больше рабочих дней, чем во второй. Поэтому для каждой даты графика можно будет указать два разных значения, каждое
вычисления части записи, попадающей в определенный период, исполь- из которых будет соответствовать определенному виду учета времени.
зуются данные графика, которые служат относительным весом каждого

28 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка протяженных во времени расчетов

Для того чтобы реализовать возможность хранения различных графиков В этом случае для расчета оклада сотруднику Иванов будет использован
работы (пятидневка, шестидневка и т. д.), можно добавить в регистр график работы Пятидневка с видом учета времени По дням, а сотруднику
сведений еще одно измерение ГрафикРаботы, имеющее тип Спра- Петров оклад будет рассчитан по часам по графику работы Сутки через
вочникСсылка.ГрафикиРаботы. Такая настройка позволит в режиме двое. Соответствующие графики будут получены системой из регистра
1С:Предприятие создавать неограниченное количество графиков работы сведений с отбором по указанным в записи значениям измерений
и вводить данные по ним в регистр сведений. Для каждого графика работы ГрафикРаботы и ВидУчетаВремени.
можно будет заполнить график как по дням, так и по часам. Эти данные Связь измерений и реквизитов регистра расчета с измерениями регистра
могут быть использованы в последующих расчетах. сведений производится через свойство Связь с графиком соответствующих
Структура регистра сведений после этих изменений показана полей регистра расчета (рис. 13.44).
на рис. 13.42.

Рис. 13.42. Структура регистра сведений «ГрафикиРаботы» Рис. 13.44. Связь измерения с графиком

Такая структура обеспечивает хранение в одном регистре сведений неогра- В данном примере для реквизита ГрафикРаботы регистра расчета
ниченного количества различных графиков. в свойстве Связь с графиком указано соответствующее измерение регистра
После разработки структуры регистра необходимо указать регистру сведений, в котором хранятся данные графика.
расчета, какой конкретно график должен быть использован для расчета
каждой записи. Для этого необходимо связать измерения или ресурсы Получение данных графика при помощи запроса
регистра расчета с измерениями регистра сведений графиков.
Иными словами, в каждой записи регистра расчета должна содержаться Для получения данных графика при помощи запроса используется вирту-
информация, необходимая для построения отборов по измерениям альная таблица данных графика регистра расчета. Эта виртуальная таблица
регистра сведений графиков. На основании данных записи регистра имеет единственный параметр – Условие, позволяющий передать произ-
расчета должен быть определен конкретный график работы. Например, вольное условие в запрос, который платформа формирует по таблицам
для регистра сведений приведенной выше структуры в регистре базы данных для получения виртуальной таблицы.
расчета должны фиксироваться данные о конкретном графике работы Виртуальная таблица данных графика расширяет структуру основной
и виде учета времени, которые должны быть использованы в данной
таблицы, добавляя для каждой ее строки данные графика за все возможные
записи. Для этого нужно добавить в структуру регистра расчета допол-
виды периодов (рис. 13.45).
нительные поля (измерения или реквизиты в зависимости от специфики
задачи), после чего связать эти поля с измерениями регистра сведений Количество строк в виртуальной таблице равно количеству записей
графиков (рис. 13.43). регистра расчета, удовлетворяющих условию, заданному в пара-
метре виртуальной таблицы. Первая часть полей виртуальной таблицы
данных графика полностью совпадает с полями основной таблицы
регистра. Дополнительные поля добавляются по числу ресурсов регистра
сведений графиков. На каждый ресурс в виртуальной таблице данных
графика будет добавлено 4 поля, в которых будут рассчитаны значения
графика по данному ресурсу за каждый из возможных периодов: период
действия, фактический период действия, базовый период и период
регистрации.
Рис. 13.43. Записи регистра расчета

Том 2
29
Глава 13. Сложные периодические расчеты

Сторнирование
Конкуренция с записями более раннего
периода регистрации
Возможность указать для записи период действия, отличный от периода
регистрации, существует только у регистров, поддерживающих период
действия. В этом случае, если у записи период действия раньше
периода регистрации (то есть запись зарегистрирована «с опозданием»),
эта запись может вступать в конкуренцию за период действия с запи-
сями более раннего периода регистрации. При этом механизм вытеснения
действовать не будет, так как запись имеет более поздний период регис-
трации, но конкуренция видов расчета останется. В результате у записи
с более поздним периодом регистрации может образоваться меньший
фактический период действия в силу того, что она не может действовать
одновременно с конкурирующими видами расчета.
Рис. 13.45. Виртуальная таблица «ДанныеГрафика» Например, больничный за март, введенный в апреле, вступает в конку-
ренцию с дежурством, зарегистрированным и действовавшим в марте.
Использование виртуальной таблицы данных графика позволяет получить В результате фактический период действия больничного будет меньше
данные графика не только по ресурсу регистра сведений, являющемуся периода действия, так как записи не могут пересекаться по фактическому
значением графика, но и по любым другим ресурсам этого регистра. периоду действия (рис. 13.46).
Виртуальная таблица также позволяет получить данные графика для
набора записей с произвольным условием, например, не принадлежащих
одному регистратору.
Ниже приведен текст модуля, позволяющий получить данные
графика за фактический период действия для всех записей документа
(листинг 13.2).

подробнее

Этот фрагмент присутствует в демоконфигурации в обработке


ДанныеРегистраРасчета.

Листинг 13.2. Получение данных графика запросом


Рис. 13.46. Конкуренция в прошлом периоде
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ В данном случае фактический период действия больничного на интервале
| ДанныеГрафика.НомерСтроки, с 15 по 22 марта будет пустым, так как этот интервал уже занят конкури-
| ДанныеГрафика.ЗначениеФактическийПериодДействия КАК Данные
|ИЗ рующим расчетом, введенным ранее.
| РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГрафика
| (Регистратор = &Регистратор) КАК ДанныеГрафика"; Наличие сторно-записи по виду расчета Дежурство позволит записи
Запрос.УстановитьПараметр("Регистратор", Ссылка); о больничном занять весь свой период действия. При формировании
Выборка = Запрос.Выполнить().Выбрать(); фактического периода действия больничного будет учтен период дейс-
Пока Выборка.Следующий() Цикл твия сторно-записи по дежурству (рис. 13.47).
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Данные графика по фактическому периоду
Таким образом, при формировании записей, которые вступают в конку-
для строки № " + Выборка.НомерСтроки + " : " + Выборка.Данные; ренцию с записями более раннего периода регистрации, необходимо
Сообщение.Сообщить(); ввести также сторно-записи по конкурирующим видам расчета, иначе
КонецЦикла;

30 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка протяженных во времени расчетов

фактический период действия будет пустым на интервалах пересечения но-записей. Таблица включает значение всех полей записей, для которых
периода действия конкурирующих записей. должны быть введены сторно-записи (кроме полей Регистратор и НомерС-
троки, которые не нужны для формирования сторно-записей), а также
дополнительные поля – период регистрации сторно-записи и даты начала
и окончания периода действия сторно-записи.
В приведенном примере для набора записей, состоящего из одной записи
о больничном, метод ПолучитьДополнение() вернет таблицу следующего
вида (табл. 13.10).

Таблица 13.10. Запись дополнения

Период Вид расчета Период … Период Период Период


регистрации действия регистрации действия действия
сторно начало сторно конец сторно
01.03.2010 Дежурство 01.03.2010 01.04.2010 15.03.2010 22.03.2010

Полученная таблица позволяет ввести необходимые сторно-записи без


дополнительных вычислений. Ниже приведен текст модуля, в котором
используется метод ПолучитьДополнение() и формируются сторно-записи
Рис. 13.47. Использование сторно-записей
в регистре расчета (листинг 13.3).

Формирование сторно-записей. Метод подробнее


«ПолучитьДополнение()» Пример использования данного метода можно также посмотреть в демо-
конфигурации в обработке ДанныеРегистраРасчета.
Сторно-записи, «прикрывающие» фактический период действия вводимой
записи с более поздним периодом регистрации, могут быть сформиро-
Листинг 13.3. Получение дополнения
ваны вручную стандартными методами формирования записей регистра
расчета. В этом случае разработчик должен самостоятельно предусмот- // Получить набор записей текущего документа.
реть алгоритм, по которому будут сформированы сторно-записи, исходя НаборЗаписей = РегистрыРасчета.ОсновныеНачисленияРегл.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка, Истина);
из первоначального набора записей. Это достаточно сложный путь, пред- НаборЗаписей.Прочитать();
полагающий самостоятельный анализ взаимодействия периодов действия
конкурирующих записей. // Получить таблицу сторно-записей для набора записей текущего документа.
ТаблицаСторно = НаборЗаписей.ПолучитьДополнение();
Вместо формирования собственных алгоритмов можно воспользоваться
методом ПолучитьДополнение() объекта РегистрРасчетаНаборЗаписей. // Сформировать сторно-записи в регистре расчета
Суть его состоит в том, что система самостоятельно анализирует Для Каждого СтрокаСторно из ТаблицаСторно Цикл
Запись = Движения.ОсновныеНачисленияРегл.Добавить();
возможные конфликты формируемого набора записей с записями, Запись.ВидРасчета = СтрокаСторно.ВидРасчета;
имеющими более ранний период регистрации. Если обнаруживается пере- Запись.ПериодРегистрации = СтрокаСторно.ПериодРегистрацииСторно;
сечение периодов действия с конкурирующими записями, на каждое такое Запись.ПериодДействияНачало = СтрокаСторно.ПериодДействияНачалоСторно;
Запись.ПериодДействияКонец = СтрокаСторно.ПериодДействияКонецСторно;
пересечение система предложит сформировать сторно-запись, которая
позволит вводимому набору записей сохранить фактический период // Заполнить измерения и реквизиты записи
действия. При этом система укажет, по каким видам расчета необходимо // ...
ввести сторно-записи и какой период действия они должны иметь.
Запись.Сторно = Истина;
Метод ПолучитьДополнение() применяется к набору записей регистра КонецЦикла;
расчета, поддерживающего период действия, и не требует указания пара-
метров. Данный метод возвращает значение типа ТаблицаЗначений, Таким образом, сторно-записи имеют те же значения полей, что
в котором содержатся все необходимые данные для формирования стор- и исходные записи, за исключением периода регистрации и периода

Том 2
31
Глава 13. Сложные периодические расчеты

действия. Сторно-записи отличаются от обычных записей значением


Истина в предопределенном поле Сторно. Так, сторно-запись по дежурству
будет выглядеть следующим образом (табл. 13.11).

Таблица 13.11. Сторно-запись по дежурству

Период Вид расчета Период действия начало Период действия конец … Сторно
регистрации
01.04.2010 Дежурство 15.03.2010 22.03.2010 Истина

Значения ресурсов сторно-записи не переносятся из исходной записи.


Сторно-записи должны рассчитываться в том же порядке, что и обычные
записи. Рис. 13.48. Зависимость от базы по периоду действия

подробнее Для базовых расчетов, имеющих период действия (в данном случае Оклад),
будет анализироваться пересечение их фактического периода действия
Раздел «Технология формирования и расчета записей регистров с базовым периодом премии. В данном случае оклад за январь и за апрель
расчета», стр. 37.
попадут в базовый период частично, а оклады на февраль и март – полно-
стью. Если расчет попал в базу частично, в расчетную базу попадет только
Настройка зависимости по базовому периоду часть значения ресурсов этой записи. При вычислении этой части будут
использованы данные графика записей об окладе.
Настройка планов видов расчета подробнее
и регистров расчета
Раздел «Настройка протяженных во времени расчетов», стр. 25.
Настройка зависимости от базы
Для базовых расчетов, не имеющих периода действия (в данном случае
Для возможности ввода и расчета записей, зависимых по базовому Премия за месяц), будет проанализировано попадание периода регистрации
периоду от других записей, необходимо настроить свойства соответству- в базовый период премии. Так как период регистрации – это фиксиро-
ющих планов видов расчета и регистров расчета. ванная дата начала расчетного периода, такая запись либо полностью
В плане видов расчета, виды расчета которого будут зависеть по базовому попадет в базовый период, либо не попадет совсем. В данном случае
периоду от других видов расчета, необходимо настроить зависимость премия за январь вообще не будет учтена при расчете базы, а премия
от базы. Для этого свойство Зависимость от базы плана видов расчета за апрель будет учтена полностью.
должно быть установлено в одно из значений Зависит по периоду действия Зависимость по периоду действия может быть установлена независимо
или Зависит по периоду регистрации. от того, использует ли данный план видов расчета период действия или
Зависимость по периоду действия предполагает анализ пересечения нет. В данном случае важен период действия не рассчитываемой записи,
фактического периода действия записей базовых видов расчета с базовым а базовых записей, на основании которых она рассчитывается. В приве-
периодом текущей записи. При такой зависимости возможно частичное денном примере премия не использует период действия, при этом она
попадание какой-либо записи в базу расчета текущей записи. Если у записи зависит по периоду действия от других записей, например, начисленных
по базовому виду расчета нет периода действия, то будет проанализи- окладов.
ровано попадание периода регистрации этой записи в базовый период В случае зависимости по периоду регистрации у базовой записи берется
текущей записи. ее период, отсчитываемый от значения поля ПериодРегистрации. Например,
Рассмотрим механизм зависимости от базы по периоду действия на примере при периодичности базового регистра Месяц будет анализироваться пере-
начисления премии за 3 месяца, у которой базовый период установлен сечение периода от даты ПериодРегистрации плюс месяц записей базовых
с 15.01.2010 по 15.04.2010 (рис. 13.48). В список базовых видов расчета видов расчета с базовым периодом текущей записи. Период действия
этой премии входят виды расчета Оклад и Премия за месяц. базовых записей в данном случае значения не имеет.

32 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка зависимости по базовому периоду

Такой формат зависимости часто используется при расчете удержаний,


так как удержания, как правило, рассчитываются с начисленных за период
сумм, независимо от того, когда они действовали. В таких случаях важен
период регистрации базовых записей, а не период действия.
Например, при расчете удержания по исполнительному листу за март будет
учтена оплата больничного, начисленная в марте, даже если работник
реально болел в феврале (рис. 13.49).

Рис. 13.49. Расчет удержания по исполнительному листу Рис. 13.50. Настройка зависимости по базовому периоду

В данном случае в базу расчета удержания попадет оклад за март, а также


Ввод записей, зависимых по базовому периоду
больничный за февраль, зарегистрированный в марте. При этом мартов-
ская надбавка, зарегистрированная в апреле, в базу расчета не попадет. Для того чтобы можно было рассчитать запись по базе других записей,
При настройке расчетов, зависимых от базы по периоду регистрации, у этой записи в регистре должен быть указан базовый период, либо у соот-
необходимо помнить, что период регистрации – это всегда дата начала ветствующего вида расчета должно быть установлено свойство Период
периода, поэтому базовый период должен заполняться с учетом этого. действия является базовым периодом. В противном случае базовый период
После настройки зависимости от базы необходимо указать, от каких видов будет пустым, и определить расчетную базу будет невозможно. Записи,
расчета могут зависеть по базовому периоду виды расчета текущего плана зависимые по базовому периоду, могут формироваться только в регистре
видов расчета. Для этого нужно указать список базовых планов видов расчета, у которого установлено свойство Базовый период.
расчета в свойствах текущего плана видов расчета. В результате этой Базовый период записи задается двумя датами БазовыйПериодНачало
настройки в любом виде расчета текущего плана видов расчета в табличной и БазовыйПериодКонец. В качестве базового периода можно указать произ-
части БазовыеВидыРасчета можно будет выбрать любой вид расчета отме- вольный интервал, в том числе перекрывающий несколько расчетных
ченных планов видов расчета. В данном случае расчет дополнительных периодов. Запись о премии за 3 месяца будет выглядеть следующим
начислений может базироваться на данных основных и дополнительных образом (табл. 13.12).
начислений. При такой настройке для вида расчета Премия за 3 месяца
в списке базовых можно будет указать оклад из основных начислений Таблица 13.12. Запись с указанием базового периода
и премию за месяц из дополнительных (рис. 13.50). Период Вид расчета … Базовый Базовый …
Указанная настройка плана видов расчета будет действовать во всех регис- регистрации период начало период конец
трах расчета, где участвует этот план видов расчета. В данном случае 01.05.2010 Премия за 3 месяца 15.01.2010 15.04.2010
рассчитывать премии от оклада можно будет как в регламентированном,
так и в управленческом учете. Более того, можно будет рассчитать, В базу расчета данной записи входят все записи любых регистров по видам
например, управленческую премию по окладам, начисленным в регла- расчета Оклад и Премия за месяц, у которых фактический период действия
ментированном учете. пересекает интервал с 15 января по 15 апреля.

Том 2
33
Глава 13. Сложные периодические расчеты

Наиболее сложным вариантом зависимости по базовому периоду явля- ются, только вместо свойств записи, определяющих базовый период,
ется установка у вида расчета свойства Период действия является базовым система использует фактический период действия записи. В зависимости
периодом. В этом случае в качестве базового периода система будет от варианта зависимости (по периоду действия или по периоду регист-
использовать фактический период действия записи с этим видом расчета. рации) система проанализирует пересечение соответственно периодов
Это свойство является предопределенным и может быть задано только действия или периодов регистрации базовых записей с фактическим
у видов расчета из плана видов расчета, использующего период действия, периодом действия текущей записи.
с установленным свойством Зависимость от базы по периоду действия или В записи, формируемой в регистре по виду расчета с установленным
по периоду регистрации. свойством Период действия является базовым периодом, поля БазовыйПери-
Рассмотрим действие этого свойства на примере вида расчета Надбавка одНачало и БазовыйПериодКонец не заполняются (табл. 13.13).
за вахту. Этот вид расчета предусматривает процентную надбавку
к окладу на период работы на вахте. При этом надбавка за вахту не начис- Таблица 13.13. Структура записи регистра расчета
ляется, если в это же время человек получает надбавку руководителю. Период Вид расчета … Базовый Базовый …
Таким образом, вид расчета Надбавка за вахту зависит по базовому периоду регистрации период начало период конец
от вида расчета Оклад. Кроме этого, надбавка за вахту вытесняется видом 01.03.2010 Надбавка за вахту
расчета Надбавка руководителю. То есть у вида расчета Надбавка за вахту
в списке базовых указан Оклад, а в списке вытесняющих – Надбавка
руководителю. Получение базы при помощи запроса
Для расчета этой надбавки необходимо рассчитать сумму оклада за факти- Для получения базы расчетов при помощи запроса используются вирту-
ческий период действия надбавки, так как нужно учитывать вытеснение альные таблицы регистров расчета, поддерживающих базовый период.
надбавкой руководителю. То есть базовым периодом надбавки должен У каждого регистра таких таблиц может быть несколько. Их число опре-
быть ее фактический период действия. Такой базовый период нельзя деляется количеством регистров расчета, использующих планы видов
задать только двумя датами БазовыйПериодНачало и БазовыйПериодКонец, расчета, которые являются базовыми по отношению к плану видов
так как фактический период действия может состоять из нескольких расчета данного регистра. Например, план видов расчета Дополнитель-
интервалов. Поэтому для вида расчета Надбавка за вахту необходимо уста- ныеНачисления зависит по базе от планов видов расчета ОсновныеНачис-
новить свойство Период действия является базовым периодом (рис. 13.51). ления и ДополнительныеНачисления. Эти планы видов расчета, в свою
очередь, используются в регистрах регламентированного и управленчес-
кого учета (рис. 13.52).

Рис. 13.51. Расчет надбавки за вахту

То есть база расчета надбавки за вахту будет получена только за те интер-


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

34 Профессиональная разработка в системе «1С:Предприятие 8»


Настройка зависимости по базовому периоду

Это означает, что любые записи регистра Дополнительные начисления (регл) Таблица 13.14. Структура массива
могут зависеть по базовому периоду от записей любого из четырех регис- «ФизЛицо»
тров. В этом случае у регистра Дополнительные начисления (регл) будет «Организация»
4 виртуальные таблицы базовых данных (рис. 13.53).
Названия измерений основного регистра указываются без указания
имени регистра, так как в данном случае понятно, что речь идет
об основном регистре.
ИзмеренияБазовогоРегистра – в этот параметр передается массив,
Рис. 13.53. Виртуальные таблицы базы
элементами которого являются названия измерений базового регистра,
соответствующие измерениям, переданным в параметр ИзмеренияОснов-
Имя виртуальной таблицы формируется по следующей схеме: ногоРегистра. Число элементов этого массива должно совпадать с числом
элементов массива измерений основного регистра. Важен также порядок
<ИмяОсновногоРегистра>.База<ИмяБазовогоРегистра>
следования измерений: он должен быть таким же, как и в массиве изме-
Таким образом, например, таблица ДополнительныеНачисленияРегл.Ба- рений основного регистра.
заОсновныеНачисленияРегл позволяет получить записи регистра Основные
По измерениям, указанным в параметре ИзмеренияБазовогоРегистра,
начисления (регл), входящие в базу расчета записей регистра Дополни-
будет произведен отбор записей в базовом регистре. При этом в качестве
тельные начисления (регл). Если необходимо получить базу по нескольким
значений отбора будут использованы значения соответствующих изме-
регистрам, нужно будет использовать в запросе несколько виртуальных рений основного регистра.
таблиц базовых данных.
Например, при получении базы по основным начислениям для премии,
Виртуальные таблицы базовых данных требуют указания параметров, начисленной сотруднику Иванов в организации Ромашка, в виртуальную
которые позволяют указать, какие именно данные в каких разрезах нужно таблицу базы попадут только базовые записи с аналогичными значениями
получить. измерений. Если названия измерений одинаковы, в параметры Измере-
ИзмеренияОсновногоРегистра – в этот параметр нужно передать массив, нияОсновногоРегистра и ИзмеренияБазовогоРегистра можно передать один
элементами которого являются строки с названиями измерений основного и тот же массив. Если названия различаются, нужно будет создать два
регистра, по которым нужно будет отбирать записи в базовых регистрах массива (рис. 13.55).
(рис. 13.54).

Рис. 13.55. Получение базы по основным начислениям

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

Том 2
35
Глава 13. Сложные периодические расчеты

Например, для получения базы в разрезе периода регистрации и вида не задан, то в таблице не будет других полей, и для каждой записи основ-
расчета в параметр Разрезы необходимо передать следующий массив ного регистра, удовлетворяющей условию, будет рассчитана база общей
(табл. 13.15). суммой по каждому ресурсу базового регистра. Если разрезы заданы,
то в виртуальной таблице будут присутствовать дополнительные поля
Таблица 13.15. Структура массива по числу элементов массива разрезов.
«ПериодРегистрации» Названия этих полей в виртуальной таблице базовых данных будут
«ВидРасчета» формироваться по схеме <ИмяПоля>Разрез. Так, если в параметр Разрезы
переданы значения ПериодРегистрации и ВидРасчета, то в виртуальной
Параметр Разрезы можно не указывать, в этом случае база будет полу- таблице будут доступны поля ПериодРегистрацииРазрез и ВидРасчета-
чена общей суммой по каждому ресурсу базового регистра. В массиве Разрез. Остальные поля, выводимые в конструкторе запроса, не будут
недопустимо указание измерений, которые переданы в параметр Измере- доступны, и при выборе таких полей запрос не будет выполнен.
нияБазовогоРегистра, так как в этом случае на эти измерения будет наложен Например, в запросе можно получить итоги по значениям разрезов
отбор, и получать по ним разрез не имеет смысла. и использовать его для построения отчета следующего вида по базовым
Условие – в этот параметр можно передать произвольное условие на записи начислениям для расчета отпуска (рис. 13.57).
основного регистра. База будет получена только для записей, удовлетворя-
ющих этому условию. В отличие от метода ПолучитьБазу(), условия могут
быть заданы произвольные. В запросе не обязательно отбирать данные
по регистратору, теоретически можно вообще не указывать условий, тогда
база будет получена для всех записей основного регистра.
Виртуальная таблица базовых данных расширяет данные основной
таблицы регистра расчета и имеет следующую структуру (рис. 13.56).

Рис. 13.57. Отчет по базовым начислениям

Ниже приведен текст запроса, который может служить основой для пост-
роения такого отчета (листинг 13.4).

подробнее

Этот фрагмент присутствует в демоконфигурации в обработке


ДанныеРегистраРасчета.

Листинг 13.4. Отчет по базовым начислениям

Запрос = Новый Запрос;


Рис. 13.56. Виртуальная таблица базы Запрос.Текст = "
|ВЫБРАТЬ
| База.ПериодРегистрацииРазрез КАК ПериодРегистрацииРазрез,
В виртуальной таблице базовых данных будут присутствовать все | База.ВидРасчетаРазрез,
данные основной таблицы основного регистра, а также отдельные поля | СУММА(База.РезультатБаза) КАК РезультатБаза
для получения базы по всем ресурсам базового регистра, названия которых |ИЗ
формируются по схеме <ИмяРесурса>База. Если параметр Разрезы | РегистрРасчета.ДополнительныеНачисленияРегл.
БазаОсновныеНачисленияРегл(

36 Профессиональная разработка в системе «1С:Предприятие 8»


Технология формирования и расчета записей регистров расчета
| &Измерения,
| &Измерения,
| &Разрезы,
| Регистратор = &Регистратор И НомерСтроки = &НомерСтроки) КАК База
|
|СГРУППИРОВАТЬ ПО
| База.ПериодРегистрацииРазрез,
| База.ВидРасчетаРазрез
|ИТОГИ
| СУММА(РезультатБаза)
| ПО
| ОБЩИЕ,
| ПериодРегистрацииРазрез";

// Сформировать массив измерений основного и базового регистров


Рис. 13.58. Документ «Начисление зарплаты»
// (названия измерений совпадают, поэтому используется один массив).
Измерения = Новый Массив(2);
Измерения[0] = "ФизЛицо"; В шапке документа пользователь должен указать организацию, по которой
Измерения[1] = "Организация"; будет производиться начисление, а также расчетный период, в который
// Сформировать массив разрезов.
должны попасть записи, то есть период регистрации. Для ввода записей
Разрезы = Новый Массив(2); в каждый из регистров расчета в документе предусмотрена отдельная
Разрезы[0] = "ПериодРегистрации"; табличная часть. Так, для ввода записей в регистр расчета ОсновныеНачис-
Разрезы[1] = "ВидРасчета"; ленияРегл предусмотрена закладка Основные начисления. На этой закладке
// Передать параметры в запрос. пользователь должен ввести начисления различным сотрудникам, указав
Запрос.УстановитьПараметр("Измерения", Измерения); физическое лицо, вид расчета, период действия записи и значения рекви-
Запрос.УстановитьПараметр("Разрезы", Разрезы); зитов регистра расчета. В данном случае пользователь должен указать
значения реквизитов Размер и Подразделение. В реквизите Размер указы-
// Запрос строится по конкретной записи документа
// с номером ТекущийНомерСтроки. вается размер начисления, который будет влиять на его расчет. Например,
Запрос.УстановитьПараметр("Регистратор", Ссылка); для оклада размером является тарифная ставка, для премии – коли-
Запрос.УстановитьПараметр("НомерСтроки", ВыбранныйНомерСтроки); чество процентов премии. Для некоторых видов расчета размер указывать
Результат = Запрос.Выполнить();
не нужно, так как он не влияет на расчет (например, сдельный заработок).
В реквизите Подразделение указывается подразделение, на затраты кото-
рого должно быть отнесено данное начисление.
Технология формирования и расчета записей Реквизит регистра ГрафикРаботы будет заполнен значением, указанным
в соответствующем реквизите выбранного физического лица. Это и будет
регистров расчета график работы, по которому должна рассчитываться данная запись.
Как правило, график работы у всех записей по одному сотруднику один
Формирование записей регистра расчета и тот же.
Регистры расчета не поддерживают независимого формирования записей В приведенном примере реквизиты регистра ВидУчетаВремени
без использования документа-регистратора. Поэтому ввод записей и СтатьяЗатрат не вводятся в документ напрямую, а указываются как
в регистр расчета должен быть организован с применением доку- реквизиты вида расчета. Ресурсы регистра расчета не всегда заполняются
ментов. В документе должны быть указаны все данные, необходимые из документа, они могут рассчитываться при проведении. Технология
для заполнения всех полей записи регистра расчета, кроме ресурсов. расчета записей будет подробно рассмотрена в следующем разделе.
Такой документ заполняется пользователем в режиме 1С:Предприятие
Для формирования записей регистра расчета используется метод
и формирует записи регистра расчета при проведении. В демонстрационной
Добавить() объекта РегистрРасчетаНаборЗаписей (листинг 13.5).
конфигурации «Сложные периодические расчеты», которая находится
на прилагаемом компакт-диске, для формирования записей в регистрах
расчета предусмотрен документ НачислениеЗарплаты (рис. 13.58).

Том 2
37
Глава 13. Сложные периодические расчеты
Листинг 13.5. Формирование записей регистра расчета Настройка алгоритмов расчета
// Процедура добавляет запись в регистр основных начислений.
Процедура ДобавитьСтрокуОсновныхНачислений(ДанныеСтроки, НаборЗаписей) Настройка способов расчета
Движение = НаборЗаписей.Добавить(); Способ расчета ресурсов записи может быть различным в зависимости
от выбранного вида расчета и дополнительных реквизитов записи.
// Предопределенные поля. Как уже было отмечено, технология периодических расчетов в системе
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.ПериодДействияНачало = ДанныеСтроки.ДатаНачало; «1С:Предприятие» предоставляет пользователю возможность самостоя-
Движение.ПериодДействияКонец = ДанныеСтроки.ДатаКонец; тельно вводить новые виды расчета в режиме 1С:Предприятие. Поэтому
Движение.ВидРасчета = ДанныеСтроки.ВидРасчета; прописать в конфигураторе алгоритмы расчета каждого вида расчета
Движение.Сторно = ДанныеСтроки.Сторно; нельзя. Пользователю должна быть предоставлена возможность настроить
// Измерения. способ расчета того или иного вида расчета в режиме 1С:Предприятие.
Движение.ФизЛицо = ДанныеСтроки.ФизЛицо; Под способом расчета подразумевается алгоритм или формула,
Движение.Организация= Организация; по которой будут вычислены значения ресурсов записи регистра, исходя
// Ресурсы.
из параметров этой записи. При этом различные виды расчета могут иметь
Движение.Результат = ДанныеСтроки.Результат; один и тот же способ расчета. Например, виды расчета Премия и Надбавка
за вахту по сути имеют один и тот же способ расчета, предполагающий
// Реквизиты. умножение расчетной базы записей с этими видами расчета на опреде-
Движение.ГрафикРаботы = ДанныеСтроки.ФизЛицо.ГрафикРаботы;
Движение.Размер = ДанныеСтроки.Размер;
ленный процент.
Движение.ВидУчетаВремени = ДанныеСтроки.ВидРасчета.ВидУчетаВремени; Так как все способы расчета должны быть прописаны разработчиком,
Движение.Подразделение = ДанныеСтроки.Подразделение;
Движение.СтатьяЗатрат = ДанныеСтроки.ВидРасчета.СтатьяЗатрат;
их набор должен быть фиксированным и для их описания логичнее
всего использовать перечисление. В демонстрационной конфигурации
КонецПроцедуры // ДобавитьСтрокуОсновныхНачислений «Сложные периодические расчеты», которая находится на прилагаемом
компакт-диске, все доступные способы расчета описаны в перечислении
// Обработка проведения.
Процедура ОбработкаПроведения(Отказ) СпособыРасчета. При необходимости ввести в систему новый способ
расчета не обойтись без изменения конфигурации, так как алгоритм
Движения.ОсновныеНачисленияРегл.Записывать = Истина; расчета нужно будет прописать в модулях.
Движения.ДополнительныеНачисленияРегл.Записывать = Истина;
Для настройки способа расчета для видов расчета в режиме 1С:Предприятие
// Сформировать запрос по табличной части при помощи функции общего модуля. необходимо добавить в план видов расчета реквизит СпособРасчета,
ВыборкаОсновныеНачисления = ОбщегоНазначения. имеющий тип ПеречислениеСсылка.СпособыРасчета. В этом случае
СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект,
"ОсновныеНачисления").Выбрать(); в любом виде расчета данного плана видов расчета можно будет указать одно
из значений перечисления, определив тем самым способ расчета записей
// По каждой строке табличной части сформировать запись в регистр. с этим видом расчета. В демонстрационной конфигурации «Сложные
Пока ВыборкаОсновныеНачисления.Следующий() Цикл периодические расчеты», которая находится на прилагаемом компакт-
ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления,
Движения.ОсновныеНачисленияРегл); диске, предусмотрены следующие способы расчета (табл. 13.16).
КонецЦикла;
Таблица 13.16. Назначение видов расчета
// Запись дополнительных начислений в регистр.
ВыборкаДополнительныеНачисления = ОбщегоНазначения. Имя Алгоритм расчета Пример использования
СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, ПоМесячнойСтавке Результат = Размер * Используется для расчета окладов. В качестве
"ДополнительныеНачисления").Выбрать(); Отработанное время отработанного времени используются данные
/ Норматив рабочего графика работы за фактический период
Пока ВыборкаДополнительныеНачисления.Следующий() Цикл времени действия, норматив рабочего времени – данные
графика за период действия. В поле Размер
ДобавитьСтрокуДополнительныхНачислений(ВыборкаДополнительныеНачисления, указывается тарифная ставка
Движения.ДополнительныеНачисленияРегл); ПроцентомОтБазы Результат = Размер * Можно использовать для расчета премий. В поле
Расчетная база / 100 Размер указывается процент премии. Расчетная
КонецЦикла;
база складывается из суммы по ресурсу

Результат базовых записей за базовый период
КонецПроцедуры // ОбработкаПроведения

38 Профессиональная разработка в системе «1С:Предприятие 8»


Технология формирования и расчета записей регистров расчета

Имя Алгоритм расчета Пример использования неверным. В частности, надбавка руководителю будет равна 0, так как
ФиксированнойСуммой Результат = Размер Простейший способ, может использоваться на момент расчета в регистре не будет данных об окладе. При расчете
для начисления фиксированных надбавок записи по индексации заработка не будет учтена командировка, а надбавка
ПоСдельнойВыработке Результат = Сдельная Используется для начисления зарплаты руководителю будет учтена с неверной суммой.
выработка за период производственным рабочим. Сдельная
действия выработка собирается по регистру накопления Таким образом, для того чтобы определить, в каком порядке должны
СдельнаяВыработка за интервал периода
следовать записи, необходимо проанализировать взаимную зависи-
действия записи
мость по базовому периоду видов расчета, участвующих в этих записях.
Виды расчета Оклад и Командировка не являются зависимыми по базо-
Настройка приоритета видов расчета вому периоду (табличная часть БазовыеВидыРасчета не содержит строк),
поэтому они должны быть рассчитаны в первую очередь. Для их расчета не
При расчете нескольких записей в одном документе очень важен порядок требуется наличия в регистре других рассчитанных записей. Такие виды
расчета этих записей. Если рассчитывать записи в произвольном порядке, расчета можно назвать первичными, приоритет их расчета равен 1, то есть
то может получиться, что запись, зависимая по базовому периоду, будет они должны быть рассчитаны в первую очередь.
рассчитана раньше, чем базовая запись. Например, запись с видом расчета
Надбавка руководителю будет рассчитана раньше, чем запись с видом Вид расчета Надбавка руководителю является зависимым по базовому
расчета Оклад. В этом случае база этой надбавки будет равна 0, так как периоду, при этом в его табличной части БазовыеВидыРасчета содержатся
оклад еще не рассчитан и не записан в регистр. В результате часть записей только первичные виды расчета (в данном случае Оклад). Запись с таким
будет рассчитана неправильно. Для того чтобы такой набор записей был видом расчета можно записывать сразу после расчета первичных записей,
рассчитан правильно, необходимо рассчитывать эти записи в правильной так как в этот момент база их расчета сформирована полностью. Такие
последовательности. При этом разработчик должен самостоятельно проду- виды расчета можно назвать зависимыми от первого уровня, приоритет
мать механизм, который будет упорядочивать расчет записей регистра. их расчета равен 2 (то есть они рассчитываются во вторую очередь).
Рассмотрим принципы упорядочивания расчетов на примере следующего Наконец, вид расчета Индексация заработка в списке базовых видов расчета
набора записей, рассчитываемого в одном документе (рис. 13.59). содержит не только первичные виды расчета (Оклад, Командировка), но
и зависимые первого уровня (Надбавка руководителю). Поэтому эта запись
может быть рассчитана только после того, как рассчитаны первичные
записи и зависимые первого уровня. Такой вид расчета можно назвать
зависимым второго уровня, приоритет его расчета равен 3.
Таким образом, приоритет вида расчета определяется составом его
базовых видов расчета (рис. 13.60).

Рис. 13.59. Набор рассчитываемых записей

В данном примере производится расчет нескольких записей регистра


расчета. При этом существует зависимость по базовому периоду этих
записей между собой. В частности, Надбавка руководителю зависит по
базовому периоду от оклада, а вид расчета Индексация заработка зависит
от всех перечисленных видов расчета (Оклад, Командировка, Надбавка
руководителю), так как предполагает начисление доплаты в размере 10 %
от заработка.
Если рассчитывать эти записи в том порядке, который приведен на схеме,
результат расчета записей, зависимых по базовому периоду, будет Рис. 13.60. Приоритет видов расчета

Том 2
39
Глава 13. Сложные периодические расчеты

Если текущий вид расчета в списке базовых содержит хотя бы один вид водиться расчет. В этом случае результат расчета можно поместить
расчета, который является зависимым первого уровня, то такой вид расчета в табличную часть документа, для того чтобы пользователь мог скор-
является зависимым второго уровня и должен иметь меньший приоритет. ректировать его вручную. При проведении такого документа записи
Количество уровней зависимости теоретически неограниченно. регистра расчета будут сформированы с учетом ручных корректировок
Если применить полученные значения приоритета к исходному набору (рис. 13.62).
записей, результат их расчета окажется правильным (рис. 13.61).

Рис. 13.62. Формирование записей регистра расчета


Рис. 13.61. Приоритет расчета записей
В том и другом случае схема расчета модулей будет схожа (рис. 13.63).
Записи в рамках одного приоритета могут быть рассчитаны в произ-
вольном порядке. Так, оклад и командировка могут быть рассчитаны
в любой последовательности. После расчета записей каждого приоритета
полученные значения ресурсов должны быть записаны в регистр расчета
перед началом расчета следующих записей. Это связано с тем, что меха-
низм зависимости по базовому периоду реализован в регистре расчета.
Запись значений ресурсов в регистр формирует базу для расчета записей
со следующим приоритетом.
Настройка приоритета видов расчета должна быть доступна пользователю
в режиме 1С:Предприятие. Вид этой настройки разработчик определяет
самостоятельно. Например, можно добавить в план видов расчета реквизит
Приоритет, который будет иметь тип Число. В этом случае пользователь
должен указать приоритет видов расчета в этом реквизите. В дальнейшем
при расчете записей разработчик должен предусмотреть модуль расчета
таким образом, чтобы сначала были рассчитаны записи с видами расчета
приоритета 1, затем 2, 3, 4 и так далее.

Расчет записей регистра расчета


Расчет записей регистра расчета может производиться в любой момент,
определенный разработчиком. Например, расчет записей может произво- Рис. 13.63. Схема расчета
диться при проведении документа регистрации записей. В этом случае
значения ресурсов будут рассчитываться в момент проведения, и поль- Таким образом, расчет записей без проведения документа отличается
зователь не сможет вручную изменить результат расчетов. Также можно только наличием двух дополнительных этапов. Рассчитанные значения
инициировать расчет записей из формы документа. Для этого можно ресурсов необходимо поместить в табличную часть документа, в соот-
создать на форме кнопку Рассчитать, при нажатии которой будет произ- ветствующие поля, для того чтобы пользователь мог их изменить.

40 Профессиональная разработка в системе «1С:Предприятие 8»


Технология формирования и расчета записей регистров расчета

После этого необходимо удалить созданные в процессе расчета записи КонецЦикла;


регистров расчета, так как пользователь в данном случае не просил
// Расчет записей набора.
проводить документ. Тем не менее, расчет не может быть выполнен без // ...
временной записи данных в регистр расчета, так как все расчетные меха-
низмы платформы (вытеснение, зависимость по базовому периоду, расчет ЗафиксироватьТранзакцию();
по графику, перерасчет) применимы только к записям регистров расчета.
КонецПроцедуры // РассчитатьОсновныеНачисления
Если в документе настроен расчет записей без проведения, то в момент
проведения такого документа собственно расчета уже не происходит. При формировании набора записей значения ресурсов не играют роли,
В ресурсы регистра расчета попадают значения из табличной части доку- так как они будут в дальнейшем изменены при расчете. В том числе
мента, которые пользователь мог скорректировать после расчета. эти значения могут быть пустыми.
Рассмотрим основные этапы расчета записей более подробно. Далее будет
рассмотрен вариант расчета без проведения документа на примере Добавление в набор сторно-записей
регистра расчета ОсновныеНачисленияРегл. Все рассматриваемые проце-
дуры доступны в демоконфигурации в документе НачислениеЗарплаты, Если в рассчитываемом регистре установлено свойство Период действия,
а также в общих модулях Расчеты и ОбщегоНазначения. в сформированном наборе могут присутствовать записи, у которых период
действия принадлежит более раннему периоду, чем период регистрации.
Формирование набора записей по данным документа В этом случае они могут вступать в конкуренцию на этом периоде дейс-
твия с записями более раннего периода регистрации. Чтобы такие записи
Для расчета записей необходимо сначала сформировать набор этих записей могли иметь непустой фактический период действия, необходимо допол-
в регистре расчета. Это позволит использовать расчетные механизмы нить сформированный набор соответствующими сторно-записями.
платформы. Формирование записей при расчете аналогично рассмотрен-
ному выше модулю формирования записей при проведении. Однако если подробнее
при проведении в качестве набора записей выступали движения доку- Раздел «Сторнирование», стр. 30.
мента по регистру (Движения.ОсновыеНачисленияРегл), то при расчете без
проведения такой набор необходимо создать. Добавление сторно-записей происходит с использованием метода Полу-
Ниже приведен модуль, позволяющий сформировать набор записей читьДополнение() набора записей регистра. Ниже приведен текст
регистра расчета по данным документа (листинг 13.6). В тексте использу- модуля, позволяющий добавить в набор сторно-записи. Добавление
ется процедура ДобавитьСтрокуОсновныхНачислений(), описанная выше. записи происходит при помощи вызова процедуры ДобавитьСтро-
Этот модуль является начальным этапом процедуры РассчитатьОснов- куСторноОсновныхНачислений(), которая должна быть описана в про-
ныеНачисления(), которая вызывается при нажатии кнопки Рассчитать в цедуре РассчитатьОсновныеНачисления(). При этом для каждой сторно-
форме документа. записи необходимо добавить новую строку в табличную часть документа,
чтобы при проведении эта запись попала в регистр (листинг 13.7).
Листинг 13.6. Формирование набора записей регистра расчета
Листинг 13.7. Добавление сторно-записей
Процедура РассчитатьОсновныеНачисления() Экспорт
// Добавить сторно-записи в набор и в табличную часть.
// Расчет записей выполняется в транзакции. Процедура ДобавитьСтрокуСторноОсновныхНачислений(ДанныеСтроки,
НачатьТранзакцию(); НаборЗаписей, ТабличнаяЧасть = Неопределено)

// Создать набор записей регистра расчета Движение = НаборЗаписей.Добавить();


НаборОсновныеНачисления = РегистрыРасчета.ОсновныеНачисленияРегл.
СоздатьНаборЗаписей(); // Предопределенные поля.
НаборОсновныеНачисления.Отбор.Регистратор.Значение = Ссылка; Движение.ПериодРегистрации = ДанныеСтроки.ПериодРегистрацииСторно;
ВыборкаОсновныеНачисления = ОбщегоНазначения. Движение.ПериодДействияНачало = ДанныеСтроки.ПериодДействияНачалоСторно;
СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, Движение.ПериодДействияКонец = ДанныеСтроки.ПериодДействияКонецСторно;
"ОсновныеНачисления").Выбрать(); Движение.ВидРасчета = ДанныеСтроки.ВидРасчета;
Пока ВыборкаОсновныеНачисления.Следующий() Цикл Движение.Сторно = Истина;
ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления,
НаборОсновныеНачисления); // Измерения.

Том 2
41
Глава 13. Сложные периодические расчеты
Движение.ФизЛицо = ДанныеСтроки.ФизЛицо; Расчет набора записей в общем модуле
Движение.Организация = ДанныеСтроки.Организация;
Сформированный документом набор записей регистра расчета рекомен-
// Реквизиты.
Движение.ГрафикРаботы = ДанныеСтроки.ГрафикРаботы; дуется рассчитывать в процедурах общего модуля. Это связано с тем,
Движение.Размер = ДанныеСтроки.Размер; что формирование записей, как правило, происходит в нескольких доку-
Движение.ВидУчетаВремени = ДанныеСтроки.ВидУчетаВремени; ментах, тогда как модуль расчета этих записей один и тот же. Например,
Движение.Подразделение = ДанныеСтроки.Подразделение;
Движение.СтатьяЗатрат = ДанныеСтроки.СтатьяЗатрат;
оплата отпусков может вводиться отдельным документом конфигу-
рации, при этом записи об отпуске рассчитываются в общем порядке.
Если Не ТабличнаяЧасть = Неопределено Тогда Таким образом, функция документов в решениях по периодическим
расчетам сводится, как правило, к формированию первоначального набора
НоваяСтрока = ТабличнаяЧасть.Добавить();
НоваяСтрока.ФизЛицо = ДанныеСтроки.ФизЛицо; записей в регистре, а все сложные алгоритмы расчета должны быть распо-
НоваяСтрока.ВидРасчета = ДанныеСтроки.ВидРасчета; ложены в общем модуле как единые для всех документов.
НоваяСтрока.ДатаНачало = ДанныеСтроки.ПериодДействияНачалоСторно;
НоваяСтрока.ДатаКонец = ДанныеСтроки.ПериодДействияКонецСторно; Ниже приведен пример вызова процедуры общего модуля РассчитатьЗа-
НоваяСтрока.Размер = ДанныеСтроки.Размер; писиРегистраРасчета(), листинг  13.8. Сама процедура будет описана
НоваяСтрока.Подразделение = ДанныеСтроки.Подразделение; позже.
НоваяСтрока.Сторно = Истина;
КонецЕсли; Листинг 13.8. Пример процедуры «РассчитатьОсновныеНачисления()»
КонецПроцедуры // ДобавитьСтрокуСторноОсновныхНачислений Процедура РассчитатьОсновныеНачисления() Экспорт

// Процедура расчета основных начислений. // Расчет записей выполняется в транзакции.
Процедура РассчитатьОсновныеНачисления() Экспорт НачатьТранзакцию();
НачатьТранзакцию(); // Сформировать набор и добавить сторно-записи.
// …
// Сформировать набор записей.
// … // Передать набор записей в процедуру общего модуля для расчета.
Расчеты.РассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРегл",
// Сформировать таблицу сторно-записей. НаборОсновныеНачисления,
ТаблицаСторно = НаборОсновныеНачисления.ПолучитьДополнение(); ОсновныеНачисления);
// Добавить сторно-записи в набор. // Удалить движения по регистру.
Для Каждого СтрокаСторно из ТаблицаСторно Цикл НаборОсновныеНачисления.Очистить();
ДобавитьСтрокуСторноОсновныхНачислений(СтрокаСторно, НаборОсновныеНачисления.Записать();
НаборОсновныеНачисления,
ОсновныеНачисления); ЗафиксироватьТранзакцию();
КонецЦикла;
КонецПроцедуры // РассчитатьОсновныеНачисления
// …
ЗафиксироватьТранзакцию();
В качестве параметров в процедуру расчета в данном случае передается
КонецПроцедуры // РассчитатьОсновныеНачисления название регистра, набор записей для расчета, а также табличная часть
документа, в которую будут возвращены результаты расчетов. После полу-
При формировании сторно-записей данные всех измерений и реквизитов чения результатов расчетов происходит удаление записей регистра расчета,
записи указаны в строке дополнения. Также в этой строке содержатся так как документ рассчитывался без проведения.
данные о периоде регистрации и периоде действия сторно-записи. Ресурсы
Результаты расчетов помещаются в табличную часть, и пользователь может
сторно-записи не заполняются, так как запись будет рассчитана в общем
их скорректировать. Окончательные записи регистра расчета формиру-
порядке.
ются по табличной части документа при его проведении (рис. 13.64).

42 Профессиональная разработка в системе «1С:Предприятие 8»


Технология формирования и расчета записей регистров расчета

ного ввода и расчета записей без предварительной записи всего набора


результат расчета может оказаться неверным. Рассмотрим влияние этого
действия на следующем примере записей документа (рис. 13.66).

Рис. 13.64. Схема взаимодействия объектов

В процедуре общего модуля, выполняющей расчет записей переданного Рис. 13.66. Пример расчета записей регистра
набора, необходимо предусмотреть выполнение следующих действий
(рис. 13.65). При последовательной записи и расчете этих начислений результат расчета
оклада будет неверным, так как в момент расчета оклада записи о команди-
ровке еще не будет в регистре, соответственно, фактический период действия
оклада будет совпадать с периодом действия, и сотруднику будет начислен
полный тариф оклада. В момент записи командировки произойдет вытес-
нение, и фактический период действия оклада изменится, но на результат
его расчета это уже не повлияет, так как запись уже рассчитана.
Для формирования правильного фактического периода действия
с учетом всех вытеснений в рамках одного набора записей необходимо
предварительно записать весь набор в регистр. В момент записи срабо-
тает механизм вытеснения, и будет сформирован фактический период
действия каждой записи. В этом случае в момент расчета каждая запись
будет иметь правильный фактический период действия (рис. 13.67).

Рис. 13.65. Действия в процедуре общего модуля

Рассмотрим эти действия подробнее. В данном случае эти действия


выполняются в процедуре общего модуля Расчеты, которая называется
РассчитатьЗаписиРегистраРасчета().

Запись набора с формированием


фактического периода действия
Перед тем как рассчитывать записи каждого регистра расчета, в котором
документ создает движения, необходимо сформировать и записать в регистр
набор всех записей документа по этому регистру. Первоначальная запись
движений в регистр расчета необходима для формирования правильного
фактического периода действия этих записей. В случае последователь- Рис. 13.67. Формирование фактического периода действия

Том 2
43
Глава 13. Сложные периодические расчеты

Для того чтобы запись производилась с расчетом фактического периода // Получить массив видов расчета из набора записей.
действия и формированием записей перерасчетов, о которых будет ТаблицаВидовРасчета = НаборЗаписей.Выгрузить();
ТаблицаВидовРасчета.Свернуть("ВидРасчета");
сказано в следующем разделе, необходимо при вызове метода Записать() МассивВидовРасчета = ТаблицаВидовРасчета.ВыгрузитьКолонку("ВидРасчета");
набора записей регистра расчета во второй параметр метода (параметр
ТолькоЗапись) передать значение Ложь. При установке параметра // Запрос по приоритетам видов расчета.
ТолькоЗапись в значение Истина записи будут помещены в регистр Запрос = Новый Запрос;
без пересчета фактического периода действия (листинг 13.9). Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
Листинг 13.9. Пример расчета записей регистра | Приоритет
|ИЗ
Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, | ПланВидовРасчета." + ИмяПланаВидовРасчета + " КАК " +
ТабличнаяЧасть = Неопределено) Экспорт | ИмяПланаВидовРасчета + "
|ГДЕ
// Первоначальная запись набора с формированием фактического | Ссылка В (&МассивВидовРасчета)
// периода действия. |УПОРЯДОЧИТЬ ПО
НаборЗаписей.Записать(Истина, Ложь); | " + ИмяПланаВидовРасчета + ".Приоритет
|ИТОГИ ПО
// Расчет записей. | Приоритет";
// …
Запрос.УстановитьПараметр("МассивВидовРасчета", МассивВидовРасчета);
КонецПроцедуры ВыборкаПриоритетов = Запрос.Выполнить().
Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// Для каждого значения приоритета выполнить расчет записей.


Классификация записей по приоритету видов расчета Пока ВыборкаПриоритетов.Следующий() Цикл
РассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет,
Как уже отмечалось выше, расчет записей одного документа необходимо ТабличнаяЧасть);
производить в последовательности, определяемой приоритетом видов
расчета, участвующих в этих записях. Поэтому исходный набор записей // Записать набор в регистр для расчета записей следующего
должен быть разбит на несколько поднаборов, в каждом из которых будут // приоритета, фактический период действия не пересчитывается.
НаборЗаписей.Записать(Истина, Истина);
записи одного приоритета. Затем необходимо последовательно рассчи- КонецЦикла;
тать записи каждого из поднаборов, записав результат расчета в регистр.
Запись каждого рассчитанного поднабора необходима для формирования КонецПроцедуры
базы расчета следующих по приоритету поднаборов.
После расчета записей каждого приоритета необходимо перезаписать весь
Ниже приведен пример процедуры, которая классифицирует записи набор в регистр для образования базы расчета для записей следующего
исходного набора по приоритету видов расчета и для каждого уровня приоритета. При этом параметр ТолькоЗапись метода Записать() должен
приоритета вызывает процедуру расчета поднабора записей. В данном быть установлен в значение Истина, так как пересчитывать фактический
случае из набора записей выгружается массив видов расчета, после период действия уже не нужно, он был рассчитан при первоначальной
чего по этим видам расчета строится запрос с иерархией по приоритету записи.
(листинг 13.10).
ПРИМЕЧАНИЕ
Листинг 13.10. Расчет записей по приоритету видов расчета
После расчета записей последнего приоритета набор записей можно
Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, не перезаписывать, но только в том случае, если в документе после
ТабличнаяЧасть = Неопределено) Экспорт этого не будет производиться расчет записей другого регистра, который
может использовать данные текущего регистра как базу. Например,
НаборЗаписей.Записать(Истина, Ложь);
если после расчета регистра основных начислений в модуле будет сразу
// Определить название плана видов расчета для запроса. производиться расчет дополнительных начислений, то записи регистра
ИмяПланаВидовРасчета = основных начислений после расчета последнего приоритета должны
Метаданные.РегистрыРасчета[ИмяРегистра].ПланВидовРасчета.Имя; быть перезаписаны.

44 Профессиональная разработка в системе «1С:Предприятие 8»


Технология формирования и расчета записей регистров расчета

Получение данных для расчета Запрос = Новый Запрос("


|ВЫБРАТЬ
Собственно процесс расчета записей каждого поднабора состоит | ДанныеГрафика.ЗначениеФактическийПериодДействия КАК ГрафикФакт,
| ДанныеГрафика.ЗначениеПериодДействия КАК ГрафикНорма
в получении всех необходимых данных для расчета каждой записи |ИЗ
и вычислении значений ресурсов этой записи по формуле, определя- | РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГрафика(
емой способом расчета данной записи. Например, для расчета записи | Регистратор = &Регистратор
| И НомерСтроки = &НомерСтроки)
об окладе нужно будет получить данные графика этой записи, для расчета КАК ДанныеГрафика");
премии необходимо будет рассчитать базу и так далее.
Запрос.УстановитьПараметр("Регистратор", Запись.Регистратор);
Ниже приведен пример процедуры, осуществляющей расчет набора Запрос.УстановитьПараметр("НомерСтроки", Запись.НомерСтроки);
записей одного приоритета. Для каждой записи при помощи функции
ПолучитьДанныеДляРасчета() возвращается структура данных, которая Выборка = Запрос.Выполнить().Выбрать();
передается в процедуру РассчитатьЗапись(), листинг  13.11. Процедура
Если Выборка.Следующий() Тогда
РассчитатьЗапись() будет описана позже. СтруктураДанных.Вставить("ОтработаноВремени", Выборка.ГрафикФакт);
СтруктураДанных.Вставить("НормаВремени", Выборка.ГрафикНорма);
Листинг 13.11. Расчет набора записей одного приоритета Иначе
СтруктураДанных.Вставить("ОтработаноВремени", 0);
Процедура РассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено) СтруктураДанных.Вставить("НормаВремени", 0);
КонецЕсли;
Для каждого Запись из НаборЗаписей Цикл
Если Запись.ВидРасчета.Приоритет = Приоритет Тогда ИначеЕсли
СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда
// Получить данные для расчета записи.
ДанныеДляРасчета = ПолучитьДанныеДляРасчета(Запись); Запрос = Новый Запрос("
|ВЫБРАТЬ
// Вызвать процедуру расчета записи. | База.РезультатБаза
РассчитатьЗапись(Запись, ДанныеДляРасчета); |ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.БазаОсновныеНачисленияРегл(
// Возвратить результат расчета в табличную часть документа. | &Измерения, &Измерения, ,
Если Не ТабличнаяЧасть = Неопределено Тогда | Регистратор = &Регистратор
СтрокаТабличнойЧасти = ТабличнаяЧасть.Получить(Запись.НомерСтроки-1); | И НомерСтроки = &НомерСтроки)
СтрокаТабличнойЧасти.Результат = Запись.Результат; КАК База");
КонецЕсли;
КонецЕсли; Измерения = Новый Массив(2);
КонецЦикла; Измерения[0] = "ФизЛицо";
Измерения[1] = "Организация";
КонецПроцедуры
Запрос.УстановитьПараметр("Регистратор", Запись.Регистратор);
В функции ПолучитьДанныеДляРасчета() должны быть прописаны алго- Запрос.УстановитьПараметр("НомерСтроки", Запись.НомерСтроки);
ритмы, при помощи которых можно получить данные для расчета записи Запрос.УстановитьПараметр("Измерения", Измерения);
с любым способом расчета, существующим в конфигурации. Ниже Выборка = Запрос.Выполнить().Выбрать();
приведен пример функции, которая получает данные для трех способов
расчета (листинг 13.12). Если Выборка.Следующий() Тогда
СтруктураДанных.Вставить("База", Выборка.РезультатБаза);
Листинг 13.12. Получение данных для трех видов расчета Иначе
СтруктураДанных.Вставить("База", 0);
Функция ПолучитьДанныеДляРасчета(Запись) КонецЕсли;

СпособРасчета = Запись.ВидРасчета.СпособРасчета; ИначеЕсли


СтруктураДанных = Новый Структура; СпособРасчета = Перечисления.СпособыРасчета.ПоСдельнойВыработке Тогда
Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда
// Получить данные регистра накопления
// Получить данные графика. // фактическая выработка за период действия записи.
Запрос = Новый Запрос("

Том 2
45
Глава 13. Сложные периодические расчеты
|ВЫБРАТЬ Листинг 13.13. Процедура расчета записей
| СУММА(СдельнаяВыработкаОбороты.ВыработкаОборот) КАК ВыработкаОборот
|ИЗ Процедура РассчитатьЗапись(Запись, ДанныеДляРасчета)
| РегистрНакопления.СдельнаяВыработка.Обороты(
| &ДатаНачало, &ДатаКонец, , СпособРасчета = Запись.ВидРасчета.СпособРасчета;
| Организация = &Организация И ФизЛицо = &ФизЛицо) Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда
| КАК СдельнаяВыработкаОбороты"); Если Не ДанныеДляРасчета.НормаВремени = 0 Тогда
Результат = Запись.Размер * ДанныеДляРасчета.ОтработаноВремени /
Запрос.УстановитьПараметр("ДатаНачало", ДанныеДляРасчета.НормаВремени;
НачалоДня(Запись.ПериодДействияНачало)); Иначе
Запрос.УстановитьПараметр("ДатаКонец", Результат = 0;
КонецДня(Запись.ПериодДействияКонец)); КонецЕсли;
Запрос.УстановитьПараметр("ФизЛицо", Запись.ФизЛицо);
Запрос.УстановитьПараметр("Организация", Запись.Организация); ИначеЕсли
СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда
Выборка = Запрос.Выполнить().Выбрать(); Результат = Запись.Размер * ДанныеДляРасчета.База / 100;

Если Выборка.Следующий() Тогда ИначеЕсли


СтруктураДанных.Вставить("Выработка", Выборка.ВыработкаОборот); СпособРасчета = Перечисления.СпособыРасчета.ФиксированнойСуммой Тогда
Иначе Результат = Запись.Размер;
СтруктураДанных.Вставить("Выработка", 0);
КонецЕсли; ИначеЕсли
СпособРасчета = Перечисления.СпособыРасчета.ПоСдельнойВыработке Тогда
КонецЕсли; Результат = ДанныеДляРасчета.Выработка;
КонецЕсли;
Возврат СтруктураДанных;
Запись.Результат = Результат * ?(Запись.Сторно, -1, 1);
КонецФункции // ПолучитьДанныеДляРасчета
КонецПроцедуры // Рассчитать запись
В данном случае для расчета записей со способом ПоМесячнойСтавке
система получит данные графика за период действия и фактический При расчете записей следует учитывать, что сторно-записи рассчиты-
период действия, для способа ПроцентомОтБазы будет получена расчетная ваются в общем порядке. Поэтому в ресурсы сторно-записи должно
база записи, а для способа ПоСдельнойВыработке будут рассчитаны попадать отрицательное значение результата расчета. Например, сторно-
обороты по соответствующему регистру накопления за интервал периода запись отменяет начисленный оклад за период 5 дней. При расчете такой
действия записи. Способ расчета ФиксированнойСуммой не требует полу- записи по формуле система получит сумму оклада за 5 дней, например
чения данных. 1200 руб. В ресурс сторно-записи в этом случае должно быть записано
значение -1200.
Функция ПолучитьДанныеДляРасчета() возвращает структуру, содер-
жащую различные поля в зависимости от способа расчета, применяемого
в данной записи. Перерасчет записей регистров расчета

Расчет значений ресурсов записи Объект конфигурации «Перерасчет»


После того как данные для расчета получены, необходимо прописать Платформа позволяет автоматически отслеживать влияние ввода и изме-
в модуле формулу для заполнения реквизитов каждой записи в соответствии нения записей регистра расчета на другие записи регистров расчета.
со способом расчета. В данном случае эту функцию выполняет процедура Например, при изменении записи об окладе может потерять актуальность
РассчитатьЗапись(). В процедуре РассчитатьЗапись() для каждого возмож- запись о начисленной премии. Автоматическое отслеживание записей,
ного способа расчета описывается формула, позволяющая из реквизитов потерявших актуальность в результате изменения или ввода других
записи и полученных данных рассчитать значения ресурсов этой записи записей в регистры расчета, производится при помощи механизма пере-
(листинг 13.13). расчетов.
Перерасчет в системе представляет собой отдельную физическую таблицу.
В таблице хранится информация о записях конкретного регистра расчета,

46 Профессиональная разработка в системе «1С:Предприятие 8»


Перерасчет записей регистров расчета

которые необходимо перерассчитать. В конфигурации можно создавать попадет запись о тех надбавках и премиях, которые в результате этого
несколько таблиц перерасчета для различных регистров расчета, в том потеряли актуальность (рис. 13.69).
числе несколько таких таблиц может быть у одного регистра расчета.
Для создания и настройки объектов Перерасчет предусмотрена отдельная
ветка в объекте конфигурации Регистр расчета (рис. 13.68).

Рис. 13.68. Перерасчеты

Таблица перерасчета, создаваемая внутри определенного регистра расчета


в дереве объектов конфигурации, будет хранить информацию о записях Рис. 13.69. Формирование записей перерасчета
только этого регистра расчета. При этом физически таблица перерасчета
представляет собой отдельную таблицу базы данных, никак не связанную Так как ведущими могут выступать виды расчета любых планов видов
с регистром расчета. расчета конфигурации, при вводе записи в один регистр расчета могут
При создании в рамках регистра расчета таблицы перерасчета без допол- возникать записи в таблицах перерасчета нескольких регистров. В данном
нительных настроек эта таблица будет иметь следующую структуру случае при вводе оклада в регистр Основные начисления (регл) формиру-
(табл. 13.17). ются записи в таблицах перерасчетов регистров Основные начисления
(регл) и Дополнительные начисления (регл).
Таблица 13.17. Структура таблицы перерасчета Порядок заполнения таблицы перерасчета будет подробнее рассмотрен
ОбъектПерерасчета ВидРасчета позже. Важно понимать, что записи перерасчета имеют рекомендательный
*Начисление зарплаты № 1 *Надбавка руководителю характер, то есть платформа лишь сигнализирует, что определенные
*Начисление зарплаты № 1 *Надбавка за вахту записи потеряли актуальность. Собственно алгоритм перерасчета записей
*Начисление зарплаты № 2 *Надбавка руководителю разработчик должен предусмотреть самостоятельно.

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


ОбъектПерерасчета хранится ссылка на документ, который необходимо
перерассчитать, а в колонке ВидРасчета – ссылка на вид расчета, записи В приведенном выше примере при изменении оклада в таблицу перерасчета
по которому потеряли актуальность. попадает информация о том, в каких документах нужно перерассчи-
тать записи с определенными видами расчета. При этом зачастую эти
В приведенном примере из таблицы перерасчета можно сделать вывод данные недостаточно информативны, так как в таблице не указано, записи
о том, что в документе Начисление зарплаты № 1 необходимо перерассчи- с какими значениями измерений необходимо перерассчитать. В частности,
тать записи с видами расчета Надбавка руководителю и Надбавка за вахту, при изменении оклада только одному сотруднику в одной организации
а в документе Начисление зарплаты № 2 – только записи с видом расчета в таблице перерасчета возникнут записи обо всех документах, в которых
Надбавка руководителю.
были начислены премии и надбавки для всех сотрудников всех органи-
Формирование записей таблицы перерасчета происходит при записи заций. В этом случае, если таблица перерасчета имеет приведенную выше
в регистр расчета данных по видам расчета, которые являются ведущими структуру, придется перерассчитывать все указанные записи.
по отношению к другим видам расчета. Например, в списке ведущих для Для того чтобы в таблице перерасчета хранилась информация о значении
таких видов расчета, как Надбавка руководителю и Премия за месяц, содер- измерений регистра расчета, данные по которым необходимо перерас-
жится вид расчета Оклад. Это означает, что при вводе или изменении считать, предусмотрена возможность настройки измерений перерасчета.
записи об окладе в таблицы перерасчета соответствующих регистров

Том 2
47
Глава 13. Сложные периодические расчеты

При добавлении в перерасчет измерений, в таблицу перерасчета добавля-


ются новые колонки. Например, если в перерасчет основных начислений
добавить два измерения – ФизЛицо и Организация, таблица перерасчета
примет следующий вид (табл. 13.18).

Таблица 13.18. Таблица записей перерасчета

ОбъектПерерасчета ВидРасчета ФизЛицо Организация


*Начисление зарплаты № 1 *Надбавка руководителю *Иванов *Ромашка
*Начисление зарплаты № 1 *Надбавка за вахту *Иванов *Ромашка
*Начисление зарплаты № 2 *Надбавка руководителю *Кузнецова *Ромашка

Данная таблица более информативна, так как в ней специфицированы


конкретные сотрудники организаций, для которых необходимо выполнить
перерасчет записей указанных видов расчета в указанных документах.
При вводе записи об окладе по конкретному сотруднику в таблицу пере-
расчета данной структуры попадут не все записи по зависимым видам
расчета, а только записи по этому сотруднику.
Фактически при анализе существования зависимых записей, которые
необходимо перерассчитать, платформа будет анализировать данные
регистров с отбором по конкретным значениям измерений. При этом Рис. 13.70. Настройка измерений перерасчета
структура регистра, в который вводится ведущая запись, может отличаться
от структуры зависимого регистра. Поэтому при настройке измерений Перерасчет может действовать и в рамках одного регистра. Например,
перерасчета необходимо указать связь измерений регистра, для которого при изменении оклада нужно перерассчитать надбавку руководителю,
будут формироваться записи перерасчета, с данными ведущих регистров. которая учитывается в том же регистре. В этом случае необходимо
Ведущими регистрами являются регистры расчета, при вводе или изме- в свойстве Данные ведущих регистров указать связь соответствующего
нении записей которых необходимо создавать записи перерасчета измерения регистра с самим собой.
для текущего регистра.
Настройка такой связи производится через свойства измерения перерас- Автоматическое формирование записей
чета (рис. 13.70). перерасчета при вводе вытесняющих расчетов
В свойстве Измерение регистра указывается измерение текущего регистра,
на которое будет установлен отбор при анализе существования зависимых Как уже отмечалось, платформа может создавать записи таблиц перерас-
записей. четов автоматически. В частности, анализ необходимости формирования
записей перерасчетов производится системой в момент записи набора
В свойстве Данные ведущих регистров перечисляются измерения или записей регистра расчета, содержащего виды расчета, которые являются
реквизиты ведущих регистров, в которых хранится значение, по кото- вытесняющими по отношению к другим видам расчета. Если при вводе
рому должен быть установлен этот отбор. Если измерение или реквизит набора происходит вытеснение каких-либо записей регистра расчета,
какого-либо регистра не будут указаны в этом свойстве, то при вводе информация об этих записях будет автоматически записана в таблицу
записей в этот регистр не будет происходить формирование записей пере- перерасчета.
расчета для текущего регистра. Например, если в измерении ФизЛицо
перерасчета регистра Дополнительные начисления (регл) не указана ссылка Например, при вводе Командировки, которая вытесняет существующий
на соответствующее измерение регистра Основные начисления (упр), Оклад, запись об Окладе попадет в таблицу перерасчета.
то при вводе оклада для управленческого учета записи перерасчета Механизм формирования записей перерасчетов при вводе вытесняющих
регламентированных премий созданы не будут. расчетов действует независимо от того, включены ли соответствующие
виды расчета в список ведущих по отношению к текущему виду расчета.

48 Профессиональная разработка в системе «1С:Предприятие 8»


Перерасчет записей регистров расчета

Тем не менее в определенных случаях есть смысл включить вытесняющий Зависимость по базовому периоду
расчет в список ведущих. Такие случаи будут рассмотрены в разделе
«Особенности использования таблицы вытесняющих видов расчета» При анализе существования зависимых записей учитывается, попадает ли
на стр. 50. ведущая запись в базовый период зависимой. Запись о перерасчете будет
формироваться только в том случае, если ведущая запись пересекает
базовый период зависимой. Например, при вводе оклада за март в таблицу
Автоматическое формирование записей перерасчета попадут только те премии, базовый период которых пересе-
перерасчета при вводе прочих расчетов кает март (рис. 13.71).
Необходимость в формировании записей перерасчетов возникает не только
в случае вытеснения. В частности, при вводе или изменении записей
с базовыми видами расчета необходимо перерассчитать записи, которые
от них зависят по базовому периоду. Например, при изменении Оклада
необходимо сформировать запись перерасчета по Премии.
Для того чтобы записи перерасчетов, не связанные с вытеснением, сформи-
ровались автоматически, должны быть выполнены следующие условия.

Зависимость видов расчета


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

Связь измерений и реквизитов


через измерения перерасчета
Если у перерасчета есть измерения, формирование записей этого перерас-
чета будет производиться только в случае ввода или изменения записей
тех регистров, измерения или реквизиты которых указаны в свойстве
Данные ведущих регистров измерений перерасчета. При этом в текущем
регистре будет установлен отбор по значениям соответствующих полей
ведущих регистров. Рис. 13.71. Формирование записей перерасчета
Например, при вводе Оклада сотруднику Иванов в регистре дополни-
тельных начислений будут анализироваться только записи по сотруднику При этом учитывается способ зависимости от базы, настроенный в плане
Иванов. При отсутствии измерения перерасчета для соответствующей видов расчета зависимого регистра: зависимость по периоду действия или
таблицы выполнение этого условия проверяться не будет. по периоду регистрации.

Том 2
49
Глава 13. Сложные периодические расчеты
подробнее Несмотря на то, что зависимость отражена правильно, при такой настройке
Раздел «Настройка зависимости по базовому периоду», стр. 32. перерасчет записей приходится выполнять в два этапа. Первый раз таблица
перерасчета анализируется после изменения Невыхода, после чего произ-
При выполнении всех трех указанных условий записи таблиц перерас- водится перерасчет Оклада. Затем необходимо повторно анализировать
четов будут формироваться платформой автоматически. таблицу перерасчета, после чего перерассчитывать Премию (рис. 13.73).

Особенности использования таблицы


вытесняющих видов расчета
Таким образом, при заполнении табличной части ведущих видов расчета
необходимо учитывать следующие общие правила:
■■ вытесняющие виды расчета в список ведущих включать не обяза-
тельно, так как автоматическое формирование записей перерасчета Рис. 13.73. Последовательность перерасчета записей
по вытесняемым записям произойдет и без этого;
■■ базовые виды расчета рекомендуется включить в список ведущих, Для того чтобы избежать необходимости поэтапного перерасчета, следует
в противном случае при изменении записи с базовым видом расчета настроить зависимость таким образом, чтобы запись о перерасчете Премии
текущая запись не попадет в таблицу перерасчетов автоматически. возникала сразу при изменении Невыхода, без промежуточного перерас-
чета Оклада. Для этого достаточно включить Невыход в список ведущих
Однако в определенных случаях есть смысл включить в список ведущих видов расчета по отношению к Премии (рис. 13.74).
в том числе и вытесняющие виды расчета. Рассмотрим следующий
пример зависимости видов расчета (рис. 13.72).

Рис. 13.74. Пример зависимости видов расчета

Рис. 13.72. Пример зависимости видов расчета


В результате этого перерасчет можно будет выполнить за один раз, так как
В данном случае вид расчета Невыход является вытесняющим по отно- при изменении Невыхода в таблицу перерасчета одновременно попадут
шению к виду расчета Оклад, а Оклад, в свою очередь, является базовым Оклад и Премия. Необходимо учитывать, что перерасчет записей об Окладе
по отношению к виду расчета Премия. При такой зависимости включать и Премии в данном случае должен быть выполнен в правильной последо-
Невыход в список ведущих для Оклада необязательно, так как перерасчет вательности: сначала Оклад, затем Премия (рис. 13.75).
сработает в любом случае. А вот сам Оклад необходимо включить в список
ведущих для Премии, иначе запись о перерасчете Премии не будет создана
автоматически при изменении Оклада.
Настройки, указанной на схеме, в принципе достаточно для правильной
работы начислений. При вводе или изменении Невыхода будет создана
запись о необходимости перерасчета Оклада. После перерасчета Оклада
и записи его в регистр система просигнализирует, что теперь возникла
необходимость перерасчета Премии, так как Оклад является ведущим
по отношению к Премии. Рис. 13.75. Последовательность перерасчета записей

50 Профессиональная разработка в системе «1С:Предприятие 8»


Перерасчет записей регистров расчета

Формирование записей перерасчета Листинг 13.14. Формирование записей перерасчета

средствами встроенного языка Процедура СформироватьЗаписиПерерасчета()

Во всех случаях, когда выполнить указанные выше условия не пред- // Запрос по записям регистра расчета.
ставляется возможным, записи таблиц перерасчета при необходимости Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗЛИЧНЫЕ
должны быть сформированы средствами встроенного языка. Такая необ- | СдельнаяВыработка.ФизЛицо,
ходимость может возникнуть, например, если в регистре не используется | СдельнаяВыработка.Организация,
базовый период. В этом случае таблица перерасчета данного регистра не | ОсновныеНачисленияРегл.Регистратор,
| ОсновныеНачисленияРегл.ВидРасчета
будет формироваться автоматически. Также ручное формирование записей |ИЗ
перерасчета может потребоваться в случае, когда необходимо отслежи- | РегистрНакопления.СдельнаяВыработка КАК СдельнаяВыработка
вать изменения данных, хранящихся не в регистре расчета, а, например, | ЛЕВОЕ СОЕДИНЕНИЕ
в регистре накопления. В этом случае при вводе данных в регистр накоп- | РегистрРасчета.ОсновныеНачисленияРегл КАК ОсновныеНачисленияРегл
| ПО СдельнаяВыработка.ФизЛицо = ОсновныеНачисленияРегл.ФизЛицо
ления разработчик может предусмотреть ввод данных о перерасчете | И СдельнаяВыработка.Организация = ОсновныеНачисленияРегл.Организация
записей регистра расчета средствами встроенного языка. | И (СдельнаяВыработка.Период МЕЖДУ
| ОсновныеНачисленияРегл.ПериодДействияНачало
В частности, в демонстрационной конфигурации «Сложные периоди- | И ОсновныеНачисленияРегл.ПериодДействияКонец)
ческие расчеты», которая находится на прилагаемом компакт-диске, |ГДЕ
способ расчета ПоСдельнойВыработке предполагает расчет начислений на | ОсновныеНачисленияРегл.ВидРасчета = &ВидРасчета
| И СдельнаяВыработка.Регистратор = &Регистратор
основе данных регистра накопления СдельнаяВыработка. При изменении |ИТОГИ ПО
данных этого регистра за определенный период может возникать необходи- | Регистратор");
мость перерасчета уже рассчитанных начислений по сдельному заработку.
В этом случае записи перерасчета должны быть сформированы в соот- Запрос.УстановитьПараметр("ВидРасчета",
ПланыВидовРасчета.ОсновныеНачисления.Сдельный);
ветствующую таблицу средствами встроенного языка в момент изменения Запрос.УстановитьПараметр("Регистратор", Ссылка);
данных регистра накопления СдельнаяВыработка.
ВыборкаДокументов = Запрос.Выполнить().
Формирование записей таблицы перерасчета происходит с использо- Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ванием метода СоздатьНаборЗаписей() объекта ПерерасчетМенеджер.
Создаваемый набор записей должен всегда содержать отбор по полю // Получение объекта ПерерасчетМенеджер.
ОбъектПерерасчета. Для записи созданного набора применяется метод Перерасчет = РегистрыРасчета.ОсновныеНачисленияРегл.
Перерасчеты.ПерерасчетОсновныхНачислений;
Записать() объекта ПерерасчетНаборЗаписей. В качестве параметра
указывается значение типа Булево. Если будет передано значение Истина, Пока ВыборкаДокументов.Следующий() Цикл
перед записью набора будут удалены записи таблицы, удовлетворяющие
// Создание набора записей.
установленному отбору. Установка параметра в значение Ложь позволит НаборЗаписей = Перерасчет.СоздатьНаборЗаписей();
добавить созданные записи в таблицу без замещения существующих. НаборЗаписей.Отбор.ОбъектПерерасчета.Значение = ВыборкаДокументов.Регистратор;

Ниже приведен пример модуля, формирующего записи таблицы перерас- Выборка = ВыборкаДокументов.Выбрать();
чета основных начислений (листинг 13.14). В запросе выбираются записи // Создание записей перерасчета.
регистра расчета основных начислений с предопределенным видом Пока Выборка.Следующий() Цикл
расчета Сдельный, период действия которых содержит дату движения Запись = НаборЗаписей.Добавить();
Запись.ВидРасчета = Выборка.ВидРасчета;
по регистру накопления. В результате для каждого сотрудника каждой Запись.Организация = Выборка.Организация;
организации запрос возвращает значение документа, который произвел Запись.ФизЛицо = Выборка.ФизЛицо;
данную запись о сдельном заработке в регистр. Данная процедура вызы- КонецЦикла;
вается сразу после формирования движений по регистру накопления. // Запись в таблицу без замещения.
НаборЗаписей.Записать(Ложь);
подробнее
КонецЦикла;
Фрагмент доступен в демоконфигурации, в модуле документа Регист-
рацияСдельнойВыработки. КонецПроцедуры

Том 2
51
Глава 13. Сложные периодические расчеты

Автоматическое удаление записей перерасчета Выбрав в списке нужных сотрудников, пользователь может нажать кнопку
Выполнить перерасчет и инициировать перерасчет записей по соответству-
Записи автоматически удаляются платформой из таблицы перерасчета ющим сотрудникам. Ниже приведен текст модуля, заполняющий список
только в том случае, если из регистра расчета удалена запись, которую физических лиц, а также таблицу записей по выбранному сотруднику
необходимо перерассчитать. При этом необходимо учитывать, что удаление (листинг 13.15).
записей регистра расчета происходит не только при отмене проведения
соответствующего документа, но и при его повторном расчете. Расчет подробнее
документа предполагает, что записи формируются и рассчитываются
заново, при этом предыдущие записи документа удаляются. Полностью данная обработка представлена в демонстрационной кон-
фигурации «Сложные периодические расчеты», которая находится
Собственно при перерасчете записей регистра расчета платформа авто- на прилагаемом компакт-диске.
матически не удалит записи из таблицы перерасчета, так как при
перерасчете не происходит удаления записи, меняются лишь значения
Листинг 13.15. Заполнение списка сотрудников и заполнение таблицы записей
ее ресурсов. Поэтому при формировании процедуры перерасчета разра- по выбранному сотруднику
ботчик должен предусмотреть удаление записей перерасчета средствами
встроенного языка. Пример такой процедуры будет рассмотрен в разделе // Заполнение списка физлиц для перерасчета по выбранной организации.
«Реализация перерасчета записей регистров расчета» на стр. 53. Процедура ЗаполнитьФизлицаПоОрганизации()

Запрос = Новый Запрос;


Анализ данных таблицы перерасчета

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.Текст = "
Данные таблицы перерасчета недоступны пользователю для интерак- |ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПерерасчетОсновныхНачислений.ФизЛицо,
тивного просмотра и изменения в режиме 1С:Предприятие. Поэтому | ИСТИНА КАК Пометка
для возможности интерактивной работы пользователя с этими данными |ИЗ
следует предусмотреть соответствующий отчет или обработку. Например, | РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК ПерерасчетОсновныхНачислений
это может быть обработка, в которой выведены данные о записях перерас- |ГДЕ
чета по конкретной организации в следующем виде (рис. 13.76). | ПерерасчетОсновныхНачислений.Организация = &Организация
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПерерасчетДополнительныхНачислений.ФизЛицо,
| ИСТИНА
|ИЗ
| РегистрРасчета.ДополнительныеНачисленияРегл.
| ПерерасчетДополнительныхНачислений
| КАК ПерерасчетДополнительныхНачислений
|ГДЕ
| ПерерасчетДополнительныхНачислений.Организация = &Организация";

ТаблицаФизлиц = Запрос.Выполнить().Выгрузить();
ТаблицаФизлиц.Свернуть("Физлицо");
МассивФизлиц = ТаблицаФизлиц.ВыгрузитьКолонку("ФизЛицо");
Физлица.ЗагрузитьЗначения(МассивФизлиц);

КонецПроцедуры
Рис. 13.76. Обработка «Перерасчет зарплаты»
// Заполнить таблицу записей по выбранному физлицу.
Данная обработка в верхнем списке отображает список сотрудников Процедура ЗаполнитьЗаписиПоФизлицу(ФизЛицо)
организации, по которым необходимо выполнить перерасчет записей. Запрос = Новый Запрос;
В нижней таблице приводится подробная информация о записях по теку- Запрос.УстановитьПараметр("ФизЛицо", ФизЛицо);
щему сотруднику с указанием документа и вида расчета. Запрос.Текст = "

52 Профессиональная разработка в системе «1С:Предприятие 8»


Перерасчет записей регистров расчета
|ВЫБРАТЬ РАЗЛИЧНЫЕ КонецЕсли;
| ПерерасчетОсновныхНачислений.ОбъектПерерасчета, КонецЦикла;
| ПерерасчетОсновныхНачислений.ВидРасчета
|ИЗ Запрос = Новый Запрос;
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений Запрос.УстановитьПараметр("ФизЛица", СписокФизлиц);
| КАК ПерерасчетОсновныхНачислений Запрос.Текст = "
|ГДЕ |ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПерерасчетОсновныхНачислений.ФизЛицо = &ФизЛицо | ПерерасчетОсновныхНачислений.ОбъектПерерасчета
| |ИЗ
|ОБЪЕДИНИТЬ | РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| | КАК ПерерасчетОсновныхНачислений
|ВЫБРАТЬ РАЗЛИЧНЫЕ |ГДЕ
| ПерерасчетДополнительныхНачислений.ОбъектПерерасчета, | ПерерасчетОсновныхНачислений.ФизЛицо В (&ФизЛица)
| ПерерасчетДополнительныхНачислений.ВидРасчета |
|ИЗ |ОБЪЕДИНИТЬ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений |
| КАК ПерерасчетДополнительныхНачислений |ВЫБРАТЬ РАЗЛИЧНЫЕ
|ГДЕ | ПерерасчетДополнительныхНачислений.ОбъектПерерасчета
| ПерерасчетДополнительныхНачислений.ФизЛицо = &ФизЛицо"; |ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
Результат = Запрос.Выполнить(); | КАК ПерерасчетДополнительныхНачислений
Выборка = Результат.Выбрать(); |ГДЕ
|ПерерасчетДополнительныхНачислений.ФизЛицо В (&ФизЛица)";
ЗаписиПоФизЛицу.Очистить();
Пока Выборка.Следующий() Цикл ВыборкаДокументов = Запрос.Выполнить().Выбрать();
НоваяСтрока = ЗаписиПоФизЛицу.Добавить();
НоваяСтрока.ОбъектПерерасчета = Выборка.ОбъектПерерасчета; // Выборка по документам, требующим перерасчета.
НоваяСтрока.ВидРасчета = Выборка.ВидРасчета; Пока ВыборкаДокументов.Следующий() Цикл
КонецЦикла;
// Получить объект.
КонецПроцедуры ДокументОбъект = ВыборкаДокументов.ОбъектПерерасчета.ПолучитьОбъект();

Процедура инициации перерасчета состоит в вызове соответствующей // Вызвать процедуру перерасчета.


Попытка
экспортной процедуры документа, записи которого должны быть перерас- ДокументОбъект.Перерассчитать(СписокФизлиц);
считаны. Сама процедура описана в следующем разделе. Ниже приведен Исключение
текст модуля, вызывающего процедуру перерасчета документов с пере- Сообщение = Новый СообщениеПользователю();
дачей списка сотрудников, по которым должен быть выполнен перерасчет. Сообщение.Текст = "Документ не может быть перерассчитан!"
+ ВыборкаДокументов.ОбъектПерерасчета;
Для этого при помощи запроса строится выборка документов из таблиц Сообщение.Сообщить();
перерасчета по выбранному списку сотрудников (листинг 13.16). КонецПопытки;
КонецЦикла;
Листинг 13.16. Пример вызова процедуры перерасчета
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПерерасчет(Команда)
Реализация перерасчета записей регистров расчета
ПерерасчетДокументов();
Как уже отмечалось, записи перерасчета имеют рекомендательный
КонецПроцедуры характер, поэтому алгоритм собственно перерасчета записей регистра
&НаСервере расчета, то есть изменения значения ресурсов этих записей, разработчик
Процедура ПерерасчетДокументов() должен предусмотреть самостоятельно. Алгоритм перерасчета записей
по сути не отличается от алгоритма их расчета, описанного в разделе
СписокФизлиц = Новый СписокЗначений;
Для каждого Элемент из ФизЛица Цикл
«Технология формирования и расчета записей регистров расчета» на стр.
Если Элемент.Пометка Тогда 37. Специфика перерасчета состоит в его выборочной работе, перерасчет
СписокФизлиц.Добавить(Элемент.Значение); не предполагает, что все записи документа будут рассчитаны заново.

Том 2
53
Глава 13. Сложные периодические расчеты

В частности, если в документе начислены премии нескольким тысячам |


сотрудников, то при изменении оклада только одного из них в процессе | ОБЪЕДИНИТЬ ВСЕ
|
перерасчета премий не должны быть заново рассчитаны все записи. | ВЫБРАТЬ ПЕРВЫЕ 1
Модуль перерасчета должен быть настроен таким образом, чтобы были | Перерасчет.ФизЛицо
выборочно изменены значения ресурсов только тех записей, которые | ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
пользователь попросил перерассчитать. | КАК Перерасчет
В процессе перерасчета не происходит создания новых записей регистров | ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет");
расчета или удаления существующих. При получении от пользователя
команды о перерасчете записей по конкретным значениям измерений Запрос.УстановитьПараметр("Регистратор", Регистратор);
система должна произвести следующие действия (рис. 13.77). Если Запрос.Выполнить().Пустой() Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;

КонецФункции // НеобходимостьПерерасчета

Данная функция возвращает значение Истина, если хотя бы в одной


из таблиц перерасчета есть хотя бы одна запись по данному документу.
Если таких записей нет, то функция вернет значение Ложь, и перерассчи-
тывать записи этого документа не нужно.

подробнее

Рис. 13.77. Действия, которые необходимо выполнить по команде пользователя Функция приведена в демоконфигурации, в общем модуле Расчеты.

Перед началом перерасчета нужно проанализировать его необходимость. Собственно перерасчет записей, как и их расчет, рекомендуется выполнять
Это связано с тем, что с того момента, когда пользователь получил инфор- в процедуре общего модуля по тем же причинам, что и расчет. Процедура
мацию о наличии записей в таблице перерасчета, до момента, когда он перерасчета отличается от процедуры расчета только тем, что в расчете
инициировал процедуру, данные регистра могли измениться, и необходи- участвуют не все записи документа, а только удовлетворяющие усло-
мость в перерасчете могла отпасть. Например, за это время выполнить виям проводимого перерасчета. Например, только записи по конкретным
перерасчет мог успеть другой пользователь. Необходимость перерас- сотрудникам и конкретным видам расчета.
чета может быть проверена, например, с использованием такой функции Наконец, после того как нужные записи перерассчитаны, необхо-
(листинг 13.17). димо средствами встроенного языка удалить соответствующие записи
Листинг 13.17. Проверка необходимости перерасчета
из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать
// Проверяет необходимость выполнения перерасчета документа.
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
в модуле этого документа как экспортную процедуру. В этом случае
она может быть вызвана из других модулей, в том числе из обработки
Запрос = Новый Запрос( перерасчета, описанной в предыдущем разделе. В качестве параметров
"ВЫБРАТЬ ПЕРВЫЕ 1 в процедуру должна передаваться информация о том, какие именно записи
| Перерасчет.ФизЛицо
|ИЗ документа необходимо перерассчитать. Ниже приведен пример такой
| (ВЫБРАТЬ ПЕРВЫЕ 1 процедуры, где в качестве параметра используется список сотрудников,
| Перерасчет.ФизЛицо КАК ФизЛицо по которым необходимо выполнить перерасчет (листинг 13.18).
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор

54 Профессиональная разработка в системе «1С:Предприятие 8»


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

Том 2
55
Глава 13. Сложные периодические расчеты
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет";

Запрос.УстановитьПараметр("СписокФизлиц", Физлица);
Запрос.УстановитьПараметр("Регистратор", Регистратор);

ВыборкаПриоритетов = Запрос.Выполнить().
Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// Для каждого значения приоритета выполняется расчет записей.


Пока ВыборкаПриоритетов.Следующий() Цикл
ПерерассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет,
ТабличнаяЧасть, Физлица);

// Записать набор в регистр для расчета записей следующего


// приоритета, фактический период действия не пересчитывается.
НаборЗаписей.Записать(Истина, Истина);
КонецЦикла;

КонецПроцедуры

56 Профессиональная разработка в системе «1С:Предприятие 8»


Перерасчет записей регистров расчета

Глава 14. Бизнес-процессы

С точки зрения автоматизации деятельность любой организации, пред- Набрать менеджеров по выписке счетов… Но если сотрудники склада
приятия представляет собой набор совершаемых сотрудниками операций. не будут справляться с задачей своевременной подготовки товара
Очень часто эти операции не существуют по отдельности, а являются к отгрузке, это также может привести к плачевному результату. Что же
логическим следствием выполнения предыдущих действий (операций), делать? Спросить у персонала?
т. е. являются элементом какой-либо технологической цепочки. Простым Ответить на этот вопрос практически невозможно, если при решении
примером такой цепочки может являться процесс получения денег подот- задачи использовать данные только об отдельно осуществляемых опера-
четным лицом. В нем можно выделить следующие этапы: циях. Эти операции необходимо рассматривать как этапы единой цепочки
■■ заявка на получение денежных средств; действий. Только при рассмотрении данного процесса как единого целого
■■ рассмотрение заявки руководителем подразделения (на предмет необ- можно определить узкий (и потенциально опасный) участок.
ходимости); С другой стороны, в реальной жизни не бывает простых процессов.
■■ рассмотрение заявки главным бухгалтером (на предмет наличия Обычно этапы, из которых они состоят, конкретные исполнители этих
денежных средств); этапов определяются в ходе выполнения процесса и зависят от множества
■■ выдача кассиром денежных средств; факторов. При отражении в учете таких сложных цепочек перед сотруд-
ником (который ведет учет) может встать довольно сложная задача:
■■ отчет об израсходованных средствах (авансовый отчет). какие документы использовать, в какой последовательности их вводить
Главный бухгалтер не будет рассматривать возможность выдачи денежных и как. Любая программа (конфигурация) дает пользователю определенную
средств без наличия визы руководителя подразделения, кассир не будет свободу действий по отражению той или иной отдельно взятой операции,
выдавать деньги без указания главного бухгалтера, или если денег но с точки зрения всего процесса может оказаться, что существует только
попросту нет и т. д. один-единственный правильный вариант. Чтобы не ошибиться, сотрудник
Другим примером может являться операция продажи товара оптовому должен в полном объеме представлять особенности отражаемого процесса
покупателю. В данной операции можно выделить следующие этапы: и особенности работы конфигурации, в которой ведется учет. Что при
наличии большого количества таких цепочек (и определенной текучке
■■ выписка заказа покупателя, в кадрах) не всегда достижимо.
■■ получение оплаты за товар, Кроме этого, конкретный исполнитель иногда (можно сказать, что и чаще
■■ сборка заказа на складе, всего) и не должен знать всю цепочку, он отвечает только за ее конк-
■■ отгрузка товара. ретный участок. Не зная всей картины, он по определению не может
принять оптимального (верного) решения. Как говорится, как он может
В контексте последней цепочки представим одну из задач, которая может
думать, не зная всех входных условий процесса? Получается, что при
возникнуть перед руководством организации, предприятия.
таком варианте организации работы конечного пользователя должен
Компания стремительно набирает обороты (огромное спасибо сотруд- быть кто-то (или что-то), кто подсказывал бы пользователю, что именно
никам отдела рекламы). Для того чтобы рост организации в какой-то сейчас нужно сделать именно так и никак иначе. Возложить эту операцию
момент не остановился, необходимо заранее подумать о своевре- на человека? (См. абзац выше…)
менном наборе (и обучении) сотрудников, расширении штата. И вот он
Идеальным вариантом (для учета сложных процессов) является переход
сам вопрос: «Кого набирать?». Набрать сотрудников в отдел рекламы…
от учета «от документа» (когда пользователь должен знать, какие доку-
Но если не хватает персонала на выписке счетов, то это может привести
менты, в какой последовательности, с какими особенностями он должен
не к росту, а, наоборот, к падению оборотов компании (за организацией
завести) к процессному учету (когда сам программный комплекс будет
может закрепиться репутация «не желающих даже счет выписать»).

Том 2
57
Глава 14. Бизнес-процессы

подсказывать пользователю, что он сейчас должен сделать). В соответс- которого она создана, этапе этого бизнес-процесса. Кроме этого, задача
твии с логикой процесса, особенностями его старта определяется текущий может содержать данные о пользователе, который должен ее выполнить,
этап, по возможности определяется исполнитель, особенности отражения либо какие-то другие характеристики такого пользователя, такие как
операции и т. п. должность, принадлежность к подразделению и т. п.
Для ведения учета (и автоматизации) цепочек действий в конфигурациях Например, после выписки счета может создаваться задача Оплата товара.
«1С:Предприятия» могут использоваться такие объекты, как бизнес-про- При поступлении денежных средств от покупателя данная задача считается
цессы и задачи. выполненной, и в соответствии с картой бизнес-процесса производится
создание следующей задачи Подготовка к отгрузке (осуществляется переход
к следующему этапу). Во вновь созданной задаче может быть указано, что
Первое знакомство она должна быть выполнена пользователем с ролью Кладовщик.
Бизнес-процессы в «1С:Предприятии» позволяют объединить отдельные
операции в цепочки взаимосвязанных действий, приводящих к дости- Карта маршрута
жению конкретной цели. Они позволяют формализовать процедуры
обработки тех или иных событий, возникающих в деятельности органи- Для редактирования карты маршрута необходимо на закладке Прочее
зации, и обеспечить участие в них исполнителей. окна редактирования бизнес-процесса нажать кнопку Карта маршрута
Цепочки взаимосвязанных действий бизнес-процесса представляются (рис. 14.1).
с помощью карты маршрута бизнес-процесса. Карта маршрута описы-
вает логику бизнес-процесса и весь его жизненный цикл от точки старта
до точки завершения. Она реализована в виде схематического изображения
последовательности прохождения взаимосвязанных точек маршрута.
Точка маршрута отражает определенный этап жизненного цикла бизнес-
процесса и обычно связана с выполнением какой-либо операции (ручной
или автоматической).
Задачи в «1С:Предприятии» соответствуют пользовательским заданиям
(что должен сделать определенный пользователь). Выполнение задачи
приводит к продвижению бизнес-процесса от одной точки к другой.
Сами задачи могут создаваться как бизнес-процессом (в соответствии
с картой маршрута), так и программно.
Опишем цепочку продажи товара с точки зрения введенных терминов.
Цепочка действий, выполняемая по одному выписанному счету, будет
являться элементом (экземпляром) бизнес-процесса. Можно провести
аналогию со справочником. Как справочник Номенклатура хранит данные
обо всей номенклатуре (соответствующий объект конфигурации опре-
деляет состав реквизитов, табличных частей, формы справочника),
а отдельный элемент хранит данные о каком-либо одном товаре
(но в соответствии со структурой, определенной для всего справочника),
так и элемент бизнес-процесса содержит данные об отдельно взятом Рис. 14.1. Редактирование карты маршрута
процессе (начатом с выписки конкретного счета), но состав этапов, логика
их прохождения определяются в соответствии с объектом конфигурации После открытия окна карты маршрута для ее создания, корректировки
Бизнес-процесс. можно использовать панель Вставка элементов схемы, в которой опреде-
При переходе к очередному этапу в рамках какого-либо процесса будет лены все возможные точки маршрута, кнопки вставки декораций, линий
создаваться Задача. Задача содержит данные о бизнес-процессе, в рамках (рис. 14.2).

58 Профессиональная разработка в системе «1С:Предприятие 8»


Карта маршрута

Рис. 14.2. Панель «Вставка элементов схемы»

Панель по умолчанию размещается в нижней части окна конфигуратора,


но, как и любая панель инструментов, может быть размещена в любом
его месте.
При определении карты маршрута допускается использование следующих
видов маршрутизации:
■■ Жесткая – линейная, без каких-либо ветвлений;
■■ Свободная – адресаты точки карты маршрута бизнес-процесса не уста-
новлены и определяются программно или интерактивно в течение
жизненного цикла бизнес-процесса;
■■ Условная – карта маршрута предусматривает проверку условий Рис. 14.4. Карта маршрута бизнес-процесса с условной маршрутизацией

и переход по соответствующим ветвям. Переходы могут быть как


Данный бизнес-процесс реализует механизм согласования какого-либо
бинарными (условие), так и множественными (выбор варианта);
документа. После отработки задачи Утверждение в зависимости от резуль-
■■ Параллельная – карта маршрута предусматривает разделение бизнес- тата (проверяемого в точке условия «Утвержден?») производится либо
процесса на параллельные ветви с возможностью последующего завершение бизнес-процесса, либо переход к доработке документа
слияния (ожидания). Продвижение бизнес-процесса по каждой с последующим возвратом на утверждение.
из параллельных ветвей происходит независимо по мере выполнения
соответствующих задач. К условному виду маршрутизации данная карта относится из-за отсутствия
параллельных (сходящихся) ветвей. К параллельному виду маршрути-
На рис.  14.3 приведен пример карты маршрута с жесткой маршрутиза- зации можно отнести карту следующего вида (рис. 14.5).
цией.

Рис. 14.3. Пример карты маршрута с жесткой маршрутизацией

В данном бизнес-процессе этапы расположены жестко друг за другом,


задачи создаются, выполняются строго в соответствии с их порядком
в карте маршрута.
На рис.  14.4 приведен пример карты маршрута с условной маршрутиза-
цией. Рис. 14.5. Пример карты маршрута бизнес-процесса с параллельной маршрутизацией

Том 2
59
Глава 14. Бизнес-процессы

В данном бизнес-процессе считается, что после выписки счета его оплата


и подготовка к отгрузке (сборка заказа) могут выполняться параллельно,
но отгрузка возможна только после выполнения обеих задач (и оплаты,
и подготовки отгрузки).
Чаще всего в реальных бизнес-процессах встречаются смешанные виды
маршрутизации (и условная, и параллельная и т. п.).
При работе с бизнес-процессами существует возможность отображения
карты маршрута в пользовательском режиме. При этом в ней будет отра-
жаться текущее состояние бизнес-процесса.
Для этой цели в форме бизнес-процесса можно создать реквизит формы
КартаМаршрута типа ГрафическаяСхема, перетащить его на форму
или создать поле формы вида Поле графической схемы, связанное с рекви-
зитом КартаМаршрута. Затем при создании формы бизнес-процесса можно
получать карту маршрута бизнес-процесса, отражающую его текущее
состояние, методом ПолучитьКартуМаршрута(). Для этого в обработчике
события формы бизнес-процесса ПриЧтенииНаСервере нужно поместить
следующий фрагмент кода (листинг 14.1).

Листинг 14.1. Пример отображения карты маршрута

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
КартаМаршрута = ТекущийОбъект.ПолучитьКартуМаршрута();
КонецПроцедуры Рис. 14.6. Пример отображения карты маршрута

В результате, например, можно увидеть следующую картину (рис. 14.6).


Пройденные точки маршрута отмечаются штриховкой, текущая точка Точки маршрута
(точки) отмечается красной пунктирной линией (точка, для которой
Процесс определения карты маршрута (логики поведения бизнес-
существуют невыполненные задачи).
процесса) состоит в нанесении на карту точек маршрута, определении
При необходимости просмотра карты маршрута в других формах связей между ними, определении обработчиков событий, специфических
(не в форме самого бизнес-процесса) можно использовать следующий для каждой точки.
фрагмент кода (листинг 14.2).
Существует несколько точек маршрута:
Листинг 14.2. Пример отображения карты маршрута в форме обработки ■■ точка старта,
// БП – Ссылка на интересующий бизнес-процесс. ■■ точка завершения,
БизнесПроцессОбъект = БП.ПолучитьОбъект(); ■■ точка действия,
КартаМаршрута = БизнесПроцессОбъект.ПолучитьКартуМаршрута();
■■ точка условия,
Результат будет таким же, как и в предыдущем случае. ■■ точка выбора варианта,
Подробнее ■■ точка разделения,
■■ точка слияния,
Приведенный пример можно посмотреть в демонстрационной конфи-
гурации «Бизнес-процессы», прилагающейся к книге на компакт-диске, ■■ точка обработки,
в обработке РаботаСБП. ■■ точка вложенного бизнес-процесса.

60 Профессиональная разработка в системе «1С:Предприятие 8»


Точки маршрута

У точек некоторых видов есть специфические свойства и события.


Например, свойство Групповая есть только у точки действия, а событие
ПроверкаУсловия – только у точки условного перехода.
Также следует отметить, что по умолчанию (если иное поведение бизнес-
процесса не описано программно) создание задачи (задач) происходит
только при переходе на такие точки маршрута, как точка действия и точка
вложенного бизнес-процесса. В остальных точках может производиться
какая-либо обработка данных: проверка условия, выбор варианта продви-
жения по карте, обработка каких-либо объектов системы и т. п.
Рассмотрим точки маршрута подробнее.

Точка старта, точка завершения


Схематическое изображение данных точек показано на рис. 14.7.

Рис. 14.7. Точка старта и точка завершения

С точки старта бизнес-процесс стартует, в точке завершения (если иное Рис. 14.8. Карта бизнес-процесса продажи товара с демонстрацией
не определено программно) он завершается. У бизнес-процесса может
быть определено несколько точек старта и (или) несколько точек завер-
Точка действия
шения. Карта бизнес-процесса может иметь следующий вид (рис. 14.8).
Предположим, что старт бизнес-процесса осуществляется оператором, Точка действия является одной из точек, при переходе на которую созда-
принимающим заявки по телефону. В ходе разговора с потенциальным ется задача или несколько задач (если иное поведение не было определено
клиентом он выясняет, интересует ли клиента предпродажная демонс- программно). Допустим вариант, что при переходе на данную точку не будет
трация изделия (клиент уже может быть знаком с данной продукцией создана ни одна задача. Эти и другие механизмы, связанные с определе-
и вследствие этого откажется от демонстрации). нием обработчиков событий данной точки маршрута, рассматриваются
в разделах, связанных с формированием и выполнением задач.
В зависимости от варианта ответа клиента выбирается та или иная точка
старта бизнес-процесса. Если после демонстрации клиент решает купить Схематическое представление точки действия на карте маршрута имеет
товар, выполняется цепочка действий, ответственных за продажу. следующий вид (рис. 14.9).
Завершение бизнес-процесса производится либо при покупке товара
(продажа состоялась), либо при отказе после демонстрации.

Подробнее

Особенности работы с данными точками (их событиями) описаны Рис. 14.9. Точка действия
в разделах «Старт бизнес-процесса», стр.  67 и «Завершение бизнес-
процесса», стр. 73. Как уже сказано выше, обычно при переходе на точку действия произ-
водится формирование задачи (или нескольких задач). Одним из важных
моментов, которому уделяется внимание (при создании задач), является
определение их исполнителей. За данный механизм отвечает так называ-
емая система адресации бизнес-процессов.

Том 2
61
Глава 14. Бизнес-процессы

Можно выделить два вида адресации (адресной маршрутизации), реали- Привязка системы адресации (регистра сведений) к бизнес-процессу
зованной в платформе: осуществляется через объект Задача (при конфигурировании бизнес-
■■ Персональная – пользователь (исполнитель) определяется в явном процесса в нем указывается ссылка на объект конфигурации Задача).
виде; В самой задаче на закладке свойств Адресация определяется ссылка
на используемый регистр сведений, и кроме этого необходимо определить
■■ Ролевая – исполнитель определяется исходя из назначенных ему
ролей, принадлежности к подразделению, а также других реквизитов используемые реквизиты адресации (рис. 14.11).
адресации.
Примером персональной адресации может являться указание, что данная
задача должна выполняться таким-то пользователем системы. При исполь-
зовании ролевой адресации может указываться, что задача должна быть
выполнена пользователем с ролью Кладовщик, работающим в подразде-
лении Оптовый склад.
Данные, используемые системой адресации, хранятся в регистре сведений.
Каждое измерение такого регистра определяет возможный адресный
разрез. Одно из измерений обычно связывают с персональной адресацией.
Пример структуры такого регистра сведений приведен на рис. 14.10.

Рис. 14.11. Установка свойств задачи

В качестве основного реквизита адресации обычно выбирают реквизит


адресации, отвечающий за персональную адресацию.
В свойство Текущий исполнитель выбирается параметр сеанса, содер-
жащий текущего пользователя (обычно значение в данный параметр
сеанса записывается при запуске «1С:Предприятия», исходя из данных
Рис. 14.10. Структура регистра сведений авторизации).
При определении реквизита адресации указывается его тип и произво-
Имея такой регистр, конкретную задачу можно адресовать либо отде- дится привязка к измерению выбранного регистра сведений (рис. 14.12).
льному сотруднику (измерение Сотрудник), либо сразу нескольким
сотрудникам, имеющим одинаковую роль (измерение РольИсполнителя), Исходя из этого, при самостоятельном определении задачи (а именно
либо сразу нескольким сотрудникам, относящимся к одному и тому же свойств, связанных с адресацией) необходимо придерживаться следую-
подразделению (измерение Подразделение). щего порядка действий:
В табл. 14.1 приведен пример заполнения регистра сведений. 1. Выбрать ссылку на регистр сведений.
2. Добавить реквизиты адресации.
Таблица 14.1. Пример заполнения регистра сведений
3. Выбрать основной реквизит адресации.
Сотрудник Роль исполнителя Подразделение
Иванов Отдел продаж
Для описания способа адресации в каждой точке действия карты марш-
Петров Бухгалтер Администрация
рута можно использовать свойства группы Адресация (рис. 14.13).
Сидоров Кладовщик Оптовый склад
Федоров Руководитель отдела Отдел продаж

62 Профессиональная разработка в системе «1С:Предприятие 8»


Точки маршрута

будут сформированы две задачи с соответствующими значениями рекви-


зитов адресации (табл. 14.3).

Рис. 14.14. Свойства точки маршрута бизнес-процесса

Таблица 14.2. Данные регистра сведений

Сотрудник Роль исполнителя Подразделение


Иванов Отдел продаж
Петров Бухгалтер Администрация
Сидоров Кладовщик Оптовый склад
Федоров Руководитель отдела Отдел продаж

Таблица 14.3. Значения реквизитов адресации


Рис. 14.12. Свойства реквизита адресации
Сотрудник Роль исполнителя Подразделение
Иванов Отдел продаж
Федоров Руководитель отдела Отдел продаж

Точка условия
Рис. 14.13. Свойства точки действия карты маршрута бизнес-процесса
Для реализации условного ветвления бизнес-процесса используется точка
В этой группе каждому определенному в задаче реквизиту адре- условного перехода. Точка условия обозначается в карте маршрута следу-
сации соответствует свойство. На этапе конфигурирования в них уже ющим образом (рис. 14.15).
можно устанавливать необходимые значения. Однако следует помнить,
что для того, чтобы именно в режиме Конфигуратор (создание, редактиро-
вание карты маршрута) можно было выбирать необходимые значения, они
должны быть определены как предопределенные.
Если в группе свойств Адресация точки действия установлены значения,
показанные на рис. 14.13, то при переходе бизнес-процесса к данной
точке будет создана одна задача (если иного не определено программно).
В соответствующих ее реквизитах адресации будут автоматически запи-
саны указанные при конфигурировании значения (РольИсполнителя =
Кладовщик и Подразделение = ОтделПродаж).
При отметке свойства Групповая в данной точке будет создаваться столько
задач, сколько записей в регистре сведений, ответственном за адресацию,
будет найдено с установленными значениями реквизитов адресации.
Например, если настройка группы свойств Адресация будет выглядеть так,
как показано на рис.  14.14, а регистр сведений будет заполнен данными
согласно табл.  14.2, то при переходе бизнес-процесса к данной задаче
Рис. 14.15. Точка условия

Том 2
63
Глава 14. Бизнес-процессы

Важной особенностью этой точки является обработчик проверки условия, В точке условия «Скидка по счету выше стандартной?» проверяется тот
наличие которого обязательно и контролируется при проверке карты факт, чтобы в табличной части документа Счет (ссылка на него опреде-
маршрута перед сохранением бизнес-процесса (листинг 14.3). лена в реквизите бизнес-процесса Счет) не было скидки, превышающей
значение, хранимое в константе (листинг 14.4).
Листинг 14.3. Синтаксис обработчика «ПроверкаУсловия»
Листинг 14.4. Пример обработчика события «ПроверкаУсловия»
ПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат);
Процедура УсловиеОграниченияСкидкиПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
В обработчике в параметре Результат (Истина, Ложь) возвращается
результат проверки условия. Если в параметре возвращается Истина, // Определяем значение функции по умолчанию.
СкидкаБольшеОбычной = Ложь;
то бизнес-процесс пойдет по той ветви, которая на карте обозначена
особым образом (точкой – см. рис. 14.16). По умолчанию эта ветвь назы- ОбычнаяСкидка = Константы.ОбычнаяСкидка.Получить();
вается Да и находится справа.
// Проверяем, что скидка не превышает обычную.
По умолчанию параметр Результат устанавливается равным значению Для Каждого Элемент Из Счет.Состав Цикл
Ложь. Это говорит о том, что если определить данный обработчик Если Элемент.Скидка > ОбычнаяСкидка Тогда
пустым (не содержащим внутри код на встроенном языке), то бизнес-про- СкидкаБольшеОбычной = Истина;
Прервать;
цесс пойдет по ветви, не отмеченной точкой (по умолчанию – это ветвь КонецЕсли;
Нет точки условия). КонецЦикла;

Приведем пример обработчика события ПроверкаУсловия для карты Результат = СкидкаБольшеОбычной;
маршрута со следующей схемой (рис. 14.16).
КонецПроцедуры;

Не стоит путать значение по умолчанию, устанавливаемое обработ-


чиком события, и функциональность переменной СкидкаБольшеОбычной.
С помощью указанной переменной реализуется следующий алгоритм:
«Если найдено превышение, то оставшиеся строки табличной части
не перебираются».

Точка выбора варианта


Для реализации многовариантного выбора можно использовать несколько
последовательно соединенных точек условного перехода, однако удобнее
для этого применять точку выбора варианта.
Точка выбора варианта обозначается в карте маршрута следующим
образом (рис. 14.17).

Рис. 14.16. Пример карты маршрута


Рис. 14.17. Точка выбора варианта
Подробнее

Приведенный пример (листинг  14.4) можно посмотреть в демонстра- Для определения нужного количества вариантов можно использовать
ционной конфигурации «Бизнес-процессы», прилагающейся к книге пункты контекстного меню точки выбора Добавить вариант, Удалить
на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара. вариант. Настройка имени варианта производится в свойствах варианта,
в нижней его части (группа свойств Вариант), рис. 14.18.

64 Профессиональная разработка в системе «1С:Предприятие 8»


Точки маршрута

Рис. 14.18. Свойства точки выбора варианта


Рис. 14.20. Использование точек разделения и слияния
Важной особенностью этой точки является обработчик выбора вари-
анта, наличие которого обязательно и контролируется при проверке карты В приведенном выше примере, пока не будут выполнены обе задачи –
маршрута перед сохранением бизнес-процесса (листинг 14.5). и оплата товара, и подготовка к отгрузке, бизнес-процесс не пойдет дальше
точки слияния. В ней бизнес-процесс ожидает закрытия всех сходящихся
Листинг 14.5. Синтаксис обработчика события «ОбработкаВыбораВарианта» в ней веток.
ОбработкаВыбораВарианта(ТочкаВыбораВарианта, Результат);
Разделение может быть и без слияния. В этом случае бизнес-про-
цесс будет иметь несколько параллельных ветвей до своего завершения
В переменную Результат должен быть записан один из определенных (в нем будет несколько точек завершения).
в точке маршрута вариантов. Для этой цели может использоваться следу-
ющий фрагмент кода (листинг 14.6). Точка обработки
Листинг 14.6. Пример установки значения параметра «Результат» Точка обработки предназначена для выполнения автоматических дейс-
Результат = ТочкаВыбораВарианта.Варианты.Наличная;
твий. Схематическое изображение точки на карте маршрута следующее
(рис. 14.21).
Если в процедуре-обработчике выбора варианта не установить какое-либо
значение параметра Результат, то это приведет к ошибке и откату тран-
закции, в рамках которой выполнялся выбор варианта.
Рис. 14.21. Точка обработки
Точка разделения, слияния
Совершаемые в данном случае действия определяются в обработчике
Для разделения бизнес-процесса на несколько параллельно (одновре- события Обработка (листинг 14.7).
менно и независимо) исполняемых ветвей используется точка разделения.
Точка разделения имеет один вход и неограниченное количество выходов Листинг 14.7. Синтаксис обработчика события «Обработка»
(рис. 14.19). Обработка(ТочкаМаршрутаБизнесПроцесса);

В данном обработчике события могут определяться различные регламен-


тные или другие операции, связанные с обработкой данных, выполняемые
Рис. 14.19. Точка разделения и точка слияния над объектами базы данных, если их выполнение необходимо для даль-
нейшего продвижения бизнес-процесса.
Для синхронизации разделенных ранее ветвей используется точка слияния.
Бизнес-процесс не будет выполняться дальше точки слияния, пока все Обработка проводится в автоматическом режиме и не приводит (в общем
входящие в нее ветви не будут пройдены. Таким образом, точка слияния случае) к созданию задач.
является этапом бизнес-процесса, на котором должны быть завершены После завершения обработчика бизнес-процесс переходит к следующей
все задачи по разделенным ранее веткам (рис. 14.20). точке маршрута в соответствии с картой.

Том 2
65
Глава 14. Бизнес-процессы

Точка вложенного бизнес-процесса выполнить метод Старт() приведет к ошибке (бизнес-процесс уже стар-
тован).
Точка позволяет запустить вложенные бизнес-процессы. Схематическое
представление на карте маршрута имеет следующий вид (рис. 14.22). Прямая установка свойства Стартован может использоваться в бизнес-
процессах со свободной маршрутизацией. Это может позволить
произвольным образом создавать задачи (с произвольной привязкой
их к точкам маршрута карты бизнес-процесса).
Если у бизнес-процесса, по которому уже существуют какие-либо задачи,
Рис. 14.22. Точка вложенного бизнес-процесса установить данное свойство в значение Ложь, а потом выполнить старт
бизнес-процесса, то он распараллелится. С одной стороны бизнес-процесс
При переходе бизнес-процесса на данную точку маршрута формируется продолжит продвижение в соответствии с существовавшими до сброса
ведущая задача. Для этой ведущей задачи создается и стартует другой свойства задачами, с другой стороны запустится его повторное прохож-
бизнес-процесс, который и является вложенным для данного бизнес-про- дение с самой начальной точки схемы бизнес-процесса. Рассмотрим
цесса. После завершения вложенного бизнес-процесса ведущая задача пример поведения бизнес-процесса, обладающего следующей схемой
считается выполненной и осуществляется переход к следующей точке (рис. 14.23).
по карте маршрута данного бизнес-процесса. В общем случае может
создаваться не одна, а несколько ведущих задач, для каждой из которых
создается и стартует собственный вложенный бизнес-процесс.
Одно из важных свойств данной точки – это свойство БизнесПроцесс.
Оно содержит ссылку на вид вложенного бизнес-процесса.

подробнее

Пример использования данной точки маршрута приводится в разделе


«Бизнес-процесс «Обход»», стр. 94.

Состояния бизнес-процесса
Рис. 14.23. Карта маршрута бизнес-процесса
Бизнес-процесс может находиться в одном из трех состояний:
■■ Не стартован – нет ни одной задачи, связанной с данным бизнес- Процесс рассматривается с учетом того, что не определено ни одного
процессом. Такое состояние устанавливается, если создать и записать обработчика событий, который меняет стандартный порядок формиро-
бизнес-процесс без вызова метода Старт(); вания и завершения задач.
■■ Стартован – существует хотя бы одна задача, связанная с данным Последовательность интерактивных действий и реакция системы на эти
бизнес-процессом; действия приведены в табл. 14.4.
■■ Завершен – у бизнес-процесса установлено свойство Завершен. Таблица 14.4. Последовательность интерактивных действий и реакция системы
Наличие или отсутствие связанных с данным бизнес-процессом задач
никак не влияет на это состояние. Интерактивные действия Реакция системы

Состояние бизнес-процесса отражается с помощью одноименных свойств Старт бизнес-процесса Создание задачи
Выписка счета
(Стартован, Завершен). Данные свойства имеют тип значения Булево
Выполнение задачи Выписка счета Создание задачи Оплата
и могут устанавливаться как интерактивно, так и программно. Следует товара
помнить, что «самостоятельная» запись значений в данные свойства имеет Установка у бизнес-процесса свойства Стартован в значение Ложь
определенные особенности. Старт бизнес-процесса (например, по кнопке Старт) Создание задачи
Выписка счета
При записи в свойство Стартован значения Истина старт бизнес-процесса
не производится (не создается ни одной задачи). Попытка после этого

66 Профессиональная разработка в системе «1С:Предприятие 8»


Состояния бизнес-процесса

К этому моменту в бизнес-процессе существуют две невыполненные отсутствия невыполненных задач. Это свойство можно установить и само-
задачи: стоятельно. Если у завершенного бизнес-процесса в свойство Завершен
■■ оплата товара (от первого старта), записать значение Ложь и создать невыполненную задачу (либо отме-
нить статус выполненной у ранее существовавшей), то бизнес-процесс
■■ выписка счета (от второго старта). продолжит свою работу в соответствии с его схемой.
Дальнейшая последовательность действий представлена в табл. 14.5.
Если у незавершенного бизнес-процесса в это свойство записать значение
Таблица 14.5. Последовательность интерактивных действий и реакция системы Истина, то бизнес-процесс будет считаться завершенным и выполнение
какой-либо его задачи не приведет к созданию новой в соответствии
Интерактивные действия Реакция системы со схемой бизнес-процесса.
Выполнение задачи Оплата товара Не приводит к созданию задачи, система будет
ожидать, когда параллельный процесс догонит ранее При необходимости полностью завершить бизнес-процесс рекоменду-
стартовавший ется, помимо записи значения Истина в свойство Завершен, получать
Выполнение задачи Выписка счета Создание задачи Оплата товара все невыполненные задачи данного бизнес-процесса и устанавливать
Выполнение задачи Оплата товара Создание задачи Отгрузка товара для них статус выполненных.
Выполнение задачи Отгрузка товара Завершение бизнес-процесса
Визуально (например, в форме списка) бизнес-процессы в разных состоя-
ниях имеют разные значки (иконки), рис. 14.25.
Особый интерес представляет тот факт, что при выполнении задачи
Оплата товара (созданной первой) не производится создание следу-
ющей по схеме задачи (Отгрузка товара). Можно сказать, что фактически
бизнес-процесс выполнялся по следующей схеме (рис. 14.24).

Рис. 14.25. Пиктограммы бизнес-процессов

Нестартованный бизнес-процесс имеет серую иконку, в стартованном


она красная, в завершенном – зеленая.

Старт бизнес-процесса
Жизненный цикл бизнес-процесса начинается с его старта. В карте бизнес-
процесса место старта отражается с помощью точки старта (рис. 14.26).

Рис. 14.26. Точка старта бизнес-процесса


Рис. 14.24. Фактическая схема выполнения бизнес-процесса

Даже если бы после рестарта бизнес-процесса стали бы исполняться У данной точки маршрута можно определить обработчик события
задачи второй ветки, то, дойдя до точки слияния бизнеса-процесса для ПередСтартом. У данной процедуры два параметра. Первый параметр – это
создания задачи Отгрузка товара, он ожидал бы выполнения задачи Оплата точка маршрута, с которой произошел вызов обработчика (у бизнес-про-
товара первой ветви. цесса может быть несколько точек старта), второй параметр – Отказ.
При записи в переменную Отказ значения Истина будет произведен отказ
Свойство Завершен устанавливается системой автоматически в значение от старта бизнес-процесса.
Истина при переходе бизнес-процесса на точку завершения при условии

Том 2
67
Глава 14. Бизнес-процессы

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


необходимые для старта бизнес-процесса, создавать «сопутствующие» Приведенный пример (листинг  14.8) можно посмотреть в демонстра-
объекты, ссылки на которые нужно хранить в самом бизнес-процессе. ционной конфигурации «Бизнес-процессы», прилагающейся к книге
Пример обработчика данного события для бизнес-процесса Продажа на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара.
товара (считаем, что в бизнес-процессе должны храниться ссылки
на документы Счет и Расходная накладная) приведен в листинге 14.8. Сам старт бизнес-процесса может производиться по-разному:
■■ программный старт бизнес-процесса (из кода на встроенном языке);
Листинг 14.8. Пример обработчика события «ПередСтартом»
■■ интерактивный старт (нажатие кнопки Старт формы бизнес-процесса)
Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) и т. п.;
// Признак, определяющий, изменялся ли бизнес-процесс в данном обработчике.
НужноЗаписать = Ложь; ■■ старт бизнес-процесса как вложенного.
При использовании любого из перечисленных вариантов бизнес-про-
// Если реквизит бизнес-процесса "Счет" содержит пустую ссылку,
// создадим документ и запишем ссылку на него. цесс может иметь несколько точек старта (но в любом случае необходимо
Если Счет.Пустая() Тогда будет уточнять, какая из точек используется).

СчетОбъект = Документы.Счет.СоздатьДокумент();
СчетОбъект.Дата = ТекущаяДата();
СчетОбъект.Записать(); Программный старт бизнес-процесса

Счет = СчетОбъект.Ссылка; Для реализации старта бизнес-процесса из встроенного языка может
// Бизнес-процесс изменен (реквизит "Счет"). использоваться следующий фрагмент кода (листинг 14.9).
НужноЗаписать = Истина;
Листинг 14.9. Пример программного старта бизнес-процесса
КонецЕсли;
БП = БизнесПроцессы.ПродажаТовара.СоздатьБизнесПроцесс();
// Если реквизит бизнес-процесса "РасходнаяНакладная"
// содержит пустую ссылку, создадим документ и запишем ссылку на него.
Если РасходнаяНакладная.Пустая() Тогда // Дата должна быть определена явным образом.
БП.Дата = ТекущаяДата();
РасходнаяНакладнаяОбъект = Документы.РасходнаяНакладная.СоздатьДокумент();
РасходнаяНакладнаяОбъект.Дата = ТекущаяДата(); // Перед стартом бизнес-процесс должен быть обязательно записан.
РасходнаяНакладнаяОбъект.Записать(); БП.Записать();
БП.Старт();
РасходнаяНакладная = РасходнаяНакладнаяОбъект.Ссылка;

НужноЗаписать = Истина; В этом случае происходят следующие действия (рис. 14.27).

КонецЕсли;

Если НужноЗаписать Тогда
Записать();
КонецЕсли;

Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Старт бизнес-процесса: " + """" +
ЭтотОбъект.Метаданные().Синоним + """";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецПроцедуры

Это событие происходит на сервере, поэтому в нем невозможно открыть


различные диалоговые окна. Если перед стартом бизнес-процесса
требуется организовать диалог с пользователем, то можно это сделать
в обработчике клиентского события ПередСтартом формы бизнес-
процесса, которое вызывается перед событием ПередСтартом точки
Рис. 14.27. Действия, выполняемые при программном старте бизнес-процесса
Старт бизнес-процесса.

68 Профессиональная разработка в системе «1С:Предприятие 8»


Старт бизнес-процесса

Интерактивный старт бизнес-процесса


Пользователь может произвести запуск бизнес-процесса интерактивно.
Возможны следующие варианты.
Пользователь создает новый бизнес-процесс. В форме нового бизнес-про-
цесса нажимается кнопка Стартовать и закрыть.
Пользователь может после создания бизнес-процесса только записать
его. Далее в форме самого бизнес-процесса, используя кнопку Старт
или соответствующую команду меню Все действия, произвести его старт
(рис. 14.28).

Рис. 14.29. Интерактивная активация бизнес-процесса

При этом активируется текущая невыполненная задача (помеченная


красной пунктирной рамкой) для пользователя, выполнившего активацию
бизнес-процесса. Если процесс активирован пользователем, для которого
не предназначена текущая задача, то ничего не происходит.
Активация текущей задачи приводит к открытию формы этой задачи либо
(если это специально оговорено, как показано в листинге 14.10) форм
сопутствующих объектов конфигурации.
При активации задачи вызывается обработчик события ОбработкаПолуче-
нияФормы, размещенный в модуле менеджера задачи. Данный обработчик
Рис. 14.28. Интерактивный старт бизнес-процесса используется для переопределения открываемой формы.
Например, когда пользователь захочет активизировать задачу Получение
наличной оплаты, то будет крайне полезно, чтобы открылась не форма
Интерактивная активация бизнес-процесса задачи, а форма счета (для того, чтобы на его основании ввести расходную
Пользователь может активировать бизнес-процесс, используя кнопку накладную) и т. п. (листинг 14.10).
Активировать или соответствующую команду меню Все действия в форме
Листинг 14.10. Обработчик события «ОбработкаПолученияФормы»
бизнес-процесса. Активацию бизнес-процесса можно производить
не только для только что стартовавших процессов, но и для любых Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
незавершенных (по которым существуют невыполненные задачи), ДополнительнаяИнформация, СтандартнаяОбработка)

рис. 14.29. Если ВидФормы = "ФормаОбъекта" Тогда
ЗадачаСсылка = Параметры.Ключ;

Том 2
69
Глава 14. Бизнес-процессы
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Листинг 14.11. Обработчик события «ОбработкаПолученияФормы»
...
Если ЗадачаОбъект.ТочкаМаршрута = Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты Тогда ДополнительнаяИнформация, СтандартнаяОбработка)
ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта";
Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; Если ВидФормы = "ФормаОбъекта" Тогда
СтандартнаяОбработка = Ложь; ЗадачаСсылка = Параметры.Ключ;
КонецЕсли; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
...
КонецЕсли; // Регистр сведений "Просмотр задач" используется для регистрации
// данных по текущим (невыполненным) задачам.
КонецПроцедуры НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Задача.Значение = ЗадачаСсылка;
НаборЗаписей.Отбор.Задача.Использование = Истина;
Обработчик события ОбработкаПолученияФормы вызывается при от-
крытии любых форм задачи. Поэтому сначала проверяется, что откры- // В параметре "Текущий исполнитель" находится ссылка на текущего
вается форма объекта задачи (параметр ВидФормы = "ФормаОбъекта"). // пользователя; этот параметр сеанса выбран в свойство
// "Текущий Исполнитель" соответствующей задачи.
Ссылка на задачу передается в структуре параметров открываемой НаборЗаписей.Отбор.Сотрудник.Значение = ПараметрыСеанса.ТекущийИсполнитель;
формы (Параметры.Ключ). НаборЗаписей.Отбор.Сотрудник.Использование = Истина;

В процедуре обработчика переопределяется параметр ВыбраннаяФорма НаборЗаписей.Прочитать();
(тем самым указывается форма, которая должна быть открыта вместо
Если НаборЗаписей.Количество() = 0 Тогда
формы задачи) и параметр Ключ коллекции параметров открываемой
формы (т. е. вместо ссылки на задачу параметр Ключ будет содержать // В набор записей добавляем новую запись,
ссылку на счет, являющийся реквизитом бизнес-процесса, породившего // характеризующую активизированную задачу.
задачу). НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Задача = ЗадачаСсылка;
В результате будет открыта форма счета, форма задачи при этом открыта НоваяЗапись.Сотрудник = ПараметрыСеанса.ТекущийИсполнитель;

не будет, т. к. параметр СтандартнаяОбработка устанавливается в значение Попытка
Ложь. НаборЗаписей.Записать();
Исключение
Данный обработчик также можно использовать для регистрации задач Сообщение = Новый СообщениеПользователю();
в других объектах (например, произвести запись открываемой задачи Сообщение.Текст = ОписаниеОшибки();
в регистр сведений). Сообщение.Сообщить();
КонецПопытки;
Представим себе, что какой-либо пользователь (группа пользователей) КонецЕсли;
...
решает задачи, которые могут формироваться в контексте большого КонецЕсли;
количества бизнес-процессов. Заставлять таких пользователей посто-
янно просматривать все бизнес-процессы (задачи) не стоит. Им можно КонецПроцедуры
упростить процесс работы, создав «специализированные рабочие места» – подробнее
обработки.
Приведенные примеры (листинги  14.10. 14.11) можно посмотреть
Механизм работы таких обработок заключается в том, что при активации в демонстрационной конфигурации «Бизнес-процессы», прилагаю-
задач данные о задаче и текущем пользователе записываются в регистр щейся к книге на компакт-диске, в модуле менеджера задачи Задача.
сведений, содержимое которого и отображает соответствующее «рабочее
место пользователя».
Старт бизнес-процесса как вложенного
Пример подобного обработчика события приводится в листинге 14.11.
При определении карты маршрута можно предусматривать старт
вложенных бизнес-процессов. В этом случае основной бизнес-процесс
ждет завершения вложенного бизнес-процесса и только после этого пере-
ходит к следующей точке маршрута. На карте маршрута такая точка
маршрута определяется с помощью следующего элемента (рис. 14.30).

70 Профессиональная разработка в системе «1С:Предприятие 8»


Старт бизнес-процесса

лены бизнес-процессы в массив, то стандартная механика генерации


бизнес-процессов будет отменена.
Затем происходит формирование массива задач, при котором могут
Рис. 14.30. Вложенный бизнес-процесс использоваться два обработчика событий: Перед созданием задач
и При создании задач. Порядок работы с этими обработчиками более
Одной из важных характеристик (свойств) данной точки маршрута явля- подробно рассматривается в разделе «Задачи», стр. 74.
ется ссылка на запускаемый бизнес-процесс (свойство БизнесПроцесс).
Кроме этого, есть возможность определить ряд обработчиков событий. При формировании массива задач у точки маршрута сначала вызыва-
Рассмотрим порядок вызова части из них (последовательность действий ется обработчик ПередСозданиемЗадач(). В него передается пустой, еще
представлена на рис. 14.31). не сформированный массив задач. Если параметр СтандартнаяОбработка
установлен в Ложь, то обработчик может использоваться для создания
собственного массива задач. Если стандартная обработка не изменена,
то сформированный массив задач будет очищен и заполнен задачами,
исходя из поведения системы по умолчанию.
В обработчике ПриСозданииЗадач() можно донастроить сформированные
задачи и добавить к ним новые, в случае необходимости.
Далее происходит запись сформированных задач, после чего по каждой из
них создается вложенный бизнес-процесс установленного в точке марш-
рута типа. У созданных бизнес-процессов устанавливается дата и ссылка
на ведущую задачу.
Затем происходит вызов обработчика ПриСозданииВложенныхБиз-
несПроцессов().Обработчик этого события может донастроить вручную
(в обработчике ПередСозданиемВложенныхБизнесПроцессов()) или авто-
матически сформированные бизнес-процессы (их количество равно
количеству задач после обработчика ПриСозданииЗадач()) или удалить
некоторые из них, а также добавить к ним новые бизнес-процессы.
После завершения обработчика будет осуществлена запись и старт сфор-
мированных бизнес-процессов.
Обработчик события Перед созданием вложенных бизнес-процессов
рекомендуется использовать для определения массива бизнес-процессов
по своему усмотрению. Если в этом обработчике событий сформиро-
вать массив бизнес-процессов, но при этом параметр Отказ оставить
в значении Истина, созданные в обработчике бизнес-процессы будут
сброшены, и сработает стандартный механизм формирования бизнес-про-
цессов. Если параметр Отказ установить в значение Ложь, но при этом
массив сформированных бизнес-процессов не будет содержать ни одного
элемента, то ведущая задача будет считаться выполненной, и, если все
задачи в данной точке маршрута выполнены, будет произведен переход
Рис. 14.31. Вызов событий при старте вложенного бизнес-процесса бизнес-процесса к следующей точке маршрута.
Пример соответствующего обработчика события (в нем прину-
Сначала у точки вложенного бизнес-процесса происходит вызов обра-
дительно создается один вложенный бизнес-процесс) приведен
ботчика ПередСозданиемВложенныхБизнесПроцессов(), в котором можно
в листинге 14.12.
добавить свои бизнес-процессы в массив формируемых бизнес-процессов
(по умолчанию в обработчик массив приходит пустым). Если были добав-

Том 2
71
Глава 14. Бизнес-процессы
Листинг 14.12. Пример обработчика события
«ПередСозданиемВложенныхБизнесПроцессов»
Старт бизнес-процесса
с несколькими точками старта
Процедура ОбходПередСозданиемВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса,
ФормируемыеБизнесПроцессы, Отказ) Наличие нескольких точек старта предполагает, что выбор конкретной
БП = БизнесПроцессы.Поручение.СоздатьБизнесПроцесс(); точки для старта определяется внешними по отношению к бизнес-про-
БП.Дата = ТекущаяДата(); цессу условиями.
БП.Автор = ПараметрыСеанса.ТекущийИсполнитель;
БП.Записать(); Если же бизнес-процесс обладает всей необходимой информацией, чтобы
ФормируемыеБизнесПроцессы.Добавить(БП);
Отказ = Ложь; при старте самостоятельно принять решение о выборе того или иного
маршрута, то достаточно одной точки старта, следом за которой будет
КонецПроцедуры
идти точка проверки условия или точка выбора варианта.
После того как массив вложенных бизнес-процессов сформирован Если бизнес-процесс имеет несколько точек старта, то при вызове метода
(в обработчике события Перед созданием вложенных бизнес-процессов Старт() необходимо указать конкретную точку, в противном случае будет
или штатным образом), вызывается обработчик события При создании выдано сообщение об ошибке.
вложенных бизнес-процессов. Его рекомендуется использовать для коррек-
тировки (добавления, частичного удаления) массива сформированных Поэтому при создании бизнес-процесса с несколькими точками старта
вложенных бизнес-процессов. Если данный массив в результате таких необходимо:
изменений не будет содержать ни одного элемента (и иное не предусмот- ■■ переопределить команду Старт в форме списка и в форме объекта
рено в обработчике события При создании вложенных бизнес-процессов), бизнес-процесса,
то соответствующая ведущая задача будет считаться выполненной. ■■ переопределить кнопку Старт в форме объекта бизнес-процесса.
Предположим, что в исходном бизнес-процессе определена табличная Смысл всех модификаций, которые необходимо произвести, заключается
часть Участники. В точке вложенного бизнес-процесса необходимо уточ-
в том, что при выполнении метода Старт() в него в качестве параметра
нить ряд характеристик (свойств) созданных вложенных процессов.
необходимо передать точку старта бизнес-процесса.
Для этого используется обработчик события При создании вложенных
бизнес-процессов (листинг 14.13). Примером бизнес-процесса с несколькими точками старта может быть
торговля товаром, для которого возможна предварительная демонстрация
Листинг 14.13. Пример обработчика события (на дому, рабочем месте потенциального клиента). Заявка либо на покупку,
«ПриСозданииВложенныхБизнесПроцессов»
либо на демонстрацию поступает к оператору (сотруднику компании).
Процедура ОбходПриСозданииВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, После опроса клиента он выясняет, какой из вариантов предпочтителен
ФормируемыеБизнесПроцессы, Отказ) потенциальному покупателю. Если выбирается предварительная демонс-

// Обходим табличную часть. трация, то после ее окончания менеджер по продажам уточняет желание
Для Каждого Элемент Из Участники Цикл клиента приобрести товар. Если клиент согласен, выполняется ветка

// Обходим массив бизнес-процессов. бизнес-процесса, связанная с продажей товара. Карта такого бизнес-про-
Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл цесса может выглядеть следующим образом (рис. 14.32).

// Настраиваем вложенный бизнес-процесс. Если данный бизнес-процесс является вложенным для других бизнес-
Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель;
Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда процессов, то в соответствующих точках маршрута нужно прописать
Процесс.Тема = Процесс.ВедущаяЗадача.Наименование; обработчик При создании вложенных бизнес-процессов так, чтобы запи-
Иначе сывать и стартовать с нужной точки все бизнес-процессы из массива
Процесс.Тема = Элемент.НаименованиеЗадачи;
КонецЕсли; сформированных (листинг 14.14).
Процесс.Исполнитель = Элемент.Сотрудник;
Процесс.ИсполнительРоль = Элемент.РольИсполнителя; В остальном использование бизнес-процессов с несколькими точками
Процесс.ИсполнительОтдел = Элемент.Подразделение; старта ничем не отличается от обычных бизнес-процессов.
Процесс.Записать();
КонецЦикла;
КонецЦикла;

КонецПроцедуры

72 Профессиональная разработка в системе «1С:Предприятие 8»


Завершение бизнес-процесса

Завершение бизнес-процесса
Завершение является последним этапом в жизненном цикле бизнес-про-
цесса. Бизнес-процесс автоматически становится завершенным (свойству
Завершен устанавливается значение Истина) при достижении точки завер-
шения и при отсутствии невыполненных задач по этому бизнес-процессу.
У бизнес-процесса может быть несколько точек завершения. В карте
бизнес-процесса они отмечаются с помощью элемента «точка завер-
шения» (рис. 14.33).

Рис. 14.33. Точка завершения бизнес-процесса

При переходе на точку завершения вызывается обработчик При завер-


шении. Если установить Отказ (параметр процедуры-обработчика)
равным Истине, например если не выполнены все необходимые условия
завершения бизнес-процесса, то обработка прерывается. Задача по точке
маршрута, выполнение которой привело к переходу на точку завершения,
при этом остается невыполненной.
Рассмотрим следующую ситуацию. Существует бизнес-процесс, который
отслеживает процесс согласования и выдачи денежных средств под отчет.
При завершении бизнес-процесса (переход к этой точке осуществля-
Рис. 14.32. Пример бизнес-процесса продажи товара с предварительной демонстрацией
ется после ввода очередного авансового отчета) необходимо проверить,
что подотчетник полностью отчитался за полученные им средства.
Листинг 14.14. Пример обработчика события
«ПриСозданииВложенныхБизнесПроцессов» Такую проверку можно разместить в обработчике события При завер-
шении точки завершения бизнес-процесса (листинг 14.15).
Процедура ОбходПриСозданииВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса,
ФормируемыеБизнесПроцессы, Отказ)
Листинг 14.15. Пример обработчика события «ПриЗавершении»
// Обходим табличную часть.
Для Каждого Элемент Из Участники Цикл Процедура ПодотчетникПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)

// Обходим массив бизнес-процессов. // РКО – реквизит бизнес-процесса, содержащий ссылку
Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл // на документ "Расходный кассовый ордер"
// Исполнитель – реквизит бизнес-процесса, содержащий ссылку
// Настраиваем вложенный бизнес-процесс. // на подотчетника.
Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если Не обДолгПодотчетника(РКО,Исполнитель) = 0 Тогда
Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда
Процесс.Тема = Процесс.ВедущаяЗадача.Наименование; Сообщение = Новый СообщениеПользователю();
Иначе Сообщение.Текст = "Есть долг! Бизнес-процесс: " +
Процесс.Тема = Элемент.НаименованиеЗадачи; ЭтотОбъект.Метаданные().Синоним + " не завершен";
КонецЕсли; Сообщение.Сообщить();
Процесс.Исполнитель = Элемент.Сотрудник; Отказ = Истина;
Процесс.ИсполнительРоль = Элемент.РольИсполнителя; КонецЕсли;
Процесс.ИсполнительОтдел = Элемент.Подразделение;
Процесс.Записать(); КонецПроцедуры
// Явное указание точки старта.
Процесс.Старт(БизнесПроцессы.ДемонстрацияИПродажа.ТочкиМаршрута. Если у бизнес-процесса установлено свойство ВедущаяЗадача, т. е.
СтартДемонстрации); он является вложенным, то при своем завершении он помечает эту задачу
КонецЦикла;
как выполненную. Это, в свою очередь, приводит к продвижению основ-
КонецЦикла; ного бизнес-процесса дальше по маршруту.
КонецПроцедуры

Том 2
73
Глава 14. Бизнес-процессы

Установка свойству Завершен значения Истина (средствами встроен- ■■ Номер (числовой или строковый);
ного языка или интерактивно) может использоваться для прерывания ■■ Наименование (тип Строка);
хода бизнес-процесса или для исключения его из списка активных (неза-
■■ Выполнена (тип Булево);
вершенных) бизнес-процессов. При этом никакие обработчики, кроме
ПередЗаписью и ПриЗаписи, не вызываются. Выполнение ведущей задачи ■■ БизнесПроцесс (ссылка на любой бизнес-процесс);
при этом не производится. ■■ ТочкаМаршрута (ссылка на точку маршрута бизнес-процесса).
Кроме этого, в объекте конфигурации Задача могут определяться некие
Задачи общие моменты (свойства), касающиеся «пользовательского задания»,
которые в общем случае не зависят от бизнес-процесса и его теку-
При продвижении бизнес-процесса по карте маршрута в определенных щего состояния (один объект конфигурации Задача может быть связан
его точках, а именно при переходе на точку действия или вложенный с несколькими объектами конфигурации БизнесПроцесс).
бизнес-процесс, могут создаваться задачи. Упрощенно их можно назвать Например, в каждой задаче должны храниться данные о пользователе,
пользовательскими заданиями, которые должны быть кем-то выполнены. выполнившем ее. С этой целью можно определить реквизит задачи
Каждая задача (конкретный элемент) существует в контексте какого-либо Исполнитель. Можно определить ряд других реквизитов: ДатаВыпол-
экземпляра (элемента) бизнес-процесса и какой-либо его точки маршрута нения, ДатаАвтовыполнения (для реализации стратегии «время вышло,
(в задаче содержатся ссылки на перечисленные объекты). Создать задачу, значит, задача выполнена») и т. д. При необходимости хранения списков
не связав ее с каким-либо бизнес-процессом и точкой этого бизнес-про- можно определить любое количество табличных частей с произвольным
цесса, нельзя. составом.
Связь бизнес-процесса (как объекта конфигурации) с соответству-
ющей задачей устанавливается при конфигурировании бизнес-процесса Формирование задач
(в свойствах бизнес-процесса указывается объект конфигурации Задача),
рис. 14.34. При прохождении маршрута бизнес-процесс на точках действия или точках
вложенных бизнес-процессов может создавать одну или несколько задач.
Несколько задач будут сформированы в том случае, если у точки марш-
рута установлен признак Групповая либо задачи формируются программно
(в соответствующих обработчиках событий). Если в точке маршрута уста-
новлен признак Групповая, бизнес-процесс отбирает в регистре сведений,
ответственном за адресацию, все записи, соответствующие установ-
ленным в данной точке реквизитам адресации, и для каждой из них
формирует свою задачу.
Рассмотрим последовательность действий, порядок следования обрабаты-
ваемых событий, возникающих при формировании задач (рис. 14.35).
Обработчик события Перед созданием задач может использоваться
для создания собственного набора задач. Причем можно создавать как
одну задачу, так и несколько, вне зависимости от установленного в свойс-
твах точки маршрута признака Групповая. Если при создании собственного
массива задач в параметр процедуры Стандартная обработка не записать
Рис. 14.34. Свойства бизнес-процесса значение Ложь, то созданный массив очистится и заполнится задачами,
исходя из поведения системы по умолчанию (так, как если бы этот обра-
Можно сказать, что у задачи существуют следующие предопределенные ботчик определен не был).
свойства: Пример обработчика события ПередСозданиемЗадач приведен в листинге
■■ ПометкаУдаления; 14.16.
■■ Дата (тип Дата, состав даты Дата и время);

74 Профессиональная разработка в системе «1С:Предприятие 8»


Задачи
■■ реквизиты адресации задачи устанавливаются равными реквизитам
адресации соответствующей точки маршрута.
При возникновении необходимости определения других свойств задачи
либо для корректировки состава массива задач может использоваться
обработчик события При создании задач (листинг 14.17).

Листинг 14.17. Пример обработчика события «ПриСозданииЗадач»

Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)

Склад = Справочники.Подразделения.НайтиПоНаименованию(РасходнаяНакладная.Склад);

Если Не Склад.Пустая() Тогда
Для Каждого Задача Из ФормируемыеЗадачи Цикл
Задача.Подразделение = Склад;
КонецЦикла;
КонецЕсли;

КонецПроцедуры

Следует отметить, что допускается создание новых задач и в обработчике


события При создании задач. В этом случае обработчик события Перед
созданием задач может содержать одну строку (листинг 14.18).

Листинг 14.18. Пример обработчика события «ПередСозданиемЗадач»

Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи,


СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Рис. 14.35. Последовательность вызова событий при формировании задач КонецПроцедуры

Листинг 14.16. Пример обработчика события «ПередСозданиемЗадач»


Выполнение задач
Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи,
СтандартнаяОбработка) Выполнение задач может производиться как интерактивно (с по-
мощью основных интерфейсных возможностей «1С:Предприятия»),
Задача = Задачи.Задача.СоздатьЗадачу();
Задача.Дата = ТекущаяДата();
так и программно.
Задача.БизнесПроцесс = Ссылка; Под интерактивным выполнением задач будем понимать выполнение
Задача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.Отгрузка; задачи, вызванной либо нажатием кнопки Выполнено или Выполнено,
Задача.Наименование = "Формирование расходной накладной";
ФормируемыеЗадачи.Добавить(Задача); закрыть в форме задачи, либо выполнением соответствующей команды
СтандартнаяОбработка = Ложь; меню Все действия в форме задачи (рис. 14.36).
КонецПроцедуры
Программное выполнение задач возможно с помощью метода Выпол-
нитьЗадачу(), который существует у объекта ЗадачаОбъект.<Имя>.
При формировании задач стандартным образом для них автоматически Необходимо обратить внимание на тот факт, что у задачи есть свойство
определяются следующие свойства: Выполнена (тип Булево). В данное свойство можно установить значение
■■ наименование устанавливается равным наименованию соответству- Истина как программно, так и в форме задачи (если данное свойство
ющей точки маршрута, например Выписка счета; представлено в диалоге формы задачи с помощью соответствующего
элемента управления). Но данное действие не приведет к вызову специ-
■■ ссылка на экземпляр бизнес-процесса, породившего эту задачу; фических обработчиков событий (Перед выполнением и При выполнении)
■■ ссылка на точку маршрута бизнес-процесса; и, в случае выполнения всех задач в точке маршрута, к продвижению
к следующей точке по карте маршрута бизнес-процесса.

Том 2
75
Глава 14. Бизнес-процессы

обработка выполнения прекращается, и задача не помечается как выпол-


ненная.

Рис. 14.36. Интерактивное выполнение задачи


Рис. 14.38. Обработчики событий, вызываемые в процессе записи объекта задачи

Выборка всех активных (невыполненных) задач и прямая установка


в свойство Выполнена значения Истина рекомендуются при необходи- Рассматривая различные варианты выполнения задач, следует отме-
мости принудительного завершения бизнес-процесса. тить, что выполнение метода ВыполнитьЗадачу() или команды Выполнено
в форме задачи приводит к выполнению цепочки, находящейся в рамках
Порядок действий системы, последовательность вызываемых обработ- транзакции (см. рис. 14.37).
чиков событий при выполнении задачи представлены на рис. 14.37.
Обработчик события Перед выполнением задачи часто используется
для заполнения реквизитов задачи, характеризующих ее выполнение
(например, производится запись исполнителя и т. п.).
Пример реализации обработчика события ПередВыполнением приведен
в листинге 14.19.

Листинг 14.19. Пример обработчика события «ПередВыполнением»

Процедура ПередВыполнением(Отказ)

// ДатаВыполнения и Исполнитель – реквизиты задачи.


Если ДатаВыполнения = '00010101' Тогда
ДатаВыполнения = ТекущаяДата();
КонецЕсли;

Если Исполнитель.Пустая() Тогда
Исполнитель = ПараметрыСеанса.ТекущийИсполнитель;
КонецЕсли;

КонецПроцедуры

Обработчик события При выполнении задачи может использоваться


Рис. 14.37. Последовательность вызова событий при выполнении задачи для регистрации факта выполнения задачи в других объектах конфи-
гурации. Например, таким объектом может быть регистр сведений,
Следует отметить, что в рамках пункта «Запись объекта задачи» вызыва- используемый при создании планировщиков – автоматизированных
ется еще ряд обработчиков событий, показанных далее (рис. 14.38). рабочих мест пользователей.
Если хоть в одном из обработчиков (связанных с выполнением задачи) Пример реализации обработчика события ПриВыполнении приведен
параметр Отказ установлен равным значению Истина, то дальнейшая в листинге 14.20.

76 Профессиональная разработка в системе «1С:Предприятие 8»


Задачи
Листинг 14.20. Пример обработчика события «ПриВыполнении»

Процедура ПриВыполнении(Отказ)

Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Задача выполнена: " + """" + Наименование + """";
Сообщение.Сообщить();

// Просмотр задач – регистр сведений, предназначенный


// для отражения невыполненных задач
// разных бизнес-процессов.
НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Задача.Значение = Ссылка;
НаборЗаписей.Отбор.Задача.Использование = Истина;

Попытка

// Попытка записать пустой набор записей.


НаборЗаписей.Записать(Истина);
Исключение
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
Рис. 14.39. Последовательность действий при вызове метода «ПроверитьВыполнение()»
КонецПроцедуры

В этом обработчике данные о выполненной задаче удаляются из регистра Параметр Результат обработчика события и у задачи, и у точки маршрута
сведений путем записи пустого набора записей с отбором по задаче. по умолчанию имеет значение Ложь.
Если в обработчике события задачи записать в параметр Результат значение
Ложь или если этот обработчик оставить пустым, то обработка метода
Проверка выполнения прекращается (вызов обработчика точки маршрута не производится), и он
Выполнение задач осуществляется не только пользователями, но и автома- возвращает значение Ложь.
тизированными процедурами. Мало того, в бизнес-процессе может быть Если обработчик ОбработкаПроверкиВыполнения(Результат) в модуле
предусмотрен этап, который выполняется не строго в цепочке бизнес- задачи отсутствует или возвращает Истину, то исполнение переходит
процесса (может быть выполнен раньше). В этом случае при переходе в одноименный обработчик точки маршрута. В случае автоматического
на какую-либо точку маршрута необходимо произвести соответству- выполнения задачи и проверки ее выполнения этот обработчик должен
ющую проверку: если действие выполнено, то выполнить и задачу, если обязательно присутствовать в модуле бизнес-процесса и хотя бы формально
нет, то инициировать выполнение действия и т. п. Например, если задача возвращать Истину, иначе задача выполнена не будет (листинг 14.22).
предусматривает проведение документа, то автоматическая процедура
слежения за такими задачами может определять, что нужный документ Листинг 14.22. Обработчик «ОбработкаПроверкиВыполнения()» точки маршрута
уже проведен, и помечать задачу как выполненную путем вызова у нее
Процедура ОтгрузкаОбработкаПроверкиВыполнения(ТочкаМаршрутаБизнесПроцесса,
метода ВыполнитьЗадачу(). Задача, Результат)
Для организации такого рода автоматизированных процедур предназначен Результат = Истина;
метод ПроверитьВыполнение() у задачи и соответствующие ему обработ- КонецПроцедуры
чики у задачи и точки маршрута (листинг 14.21).
Форма списка задач
Листинг 14.21. Пример использования метода «ПроверитьВыполнение()»
Для работы со списком задач пользователи могут использовать форму
Если Задача.ПроверитьВыполнение() Тогда
Задача.ВыполнитьЗадачу(); списка задач. Как и любая форма списка, она построена с помощью дина-
КонецЕсли; мического списка. Поскольку динамический список использует систему
компоновки данных, то разработчик может настроить группировку, отбор,
При вызове метода ПроверитьВыполнение() выполняется следующая порядок и условное оформление списка. Например, можно задать отбор
последовательность действий (рис. 14.39). в списке задач, в результате действия которого в списке отображаются
только невыполненные задачи.

Том 2
77
Глава 14. Бизнес-процессы

Для этого в конфигураторе, в форме списка задач, нужно открыть


палитру свойств основного реквизита формы типа ДинамическийСписок
и нажать гиперссылку Открыть (рис. 14.40).

Рис. 14.41. Свойства основного реквизита формы типа «ДинамическийСписок»

Можно также установить это свойство программно, например,


при создании формы списка или при выполнении соответствующей
команды (листинг 14.23).

Листинг 14.23. Программная установка свойства «ОсновнаяТаблица»

Список.ОсновнаяТаблица = "Задача.Задача.ЗадачиПоИсполнителю";

При отображении задач по исполнителю активно используются настройки


объекта конфигурации Задача, размещенные на закладке Адресация.
Предположим, что существует список задач (несколько экземпляров,
а не несколько объектов конфигурации) с разными значениями рекви-
зитов адресации.
При открытии формы списка (рассматривается поведение по умолчанию)
из параметра сеанса, указанного в свойстве задачи Текущий исполнитель,
Рис. 14.40. Настройка отбора в динамическом списке выбирается его значение.
Из регистра сведений выбираются записи, у которых в измерении,
На приведенном рисунке создается отбор динамического списка
выбранном в качестве основного реквизита адресации, находится
по условию Выполнена = Ложь. Таким образом, при открытии списка
задач будут показаны только те задачи, у которых свойство Выполнена значение, взятое из параметра сеанса, либо пустая ссылка.
имеет значение Ложь. Далее все задачи проверяются на непротиворечивость значений остальных
Пользователь также может произвести аналогичную настройку списка реквизитов адресации и измерений регистра сведений.
в режиме 1С:Предприятие, выполнив команду Все действия  Настроить Данный алгоритм можно представить в виде следующей схемы
список… Например, пользователь может удалить отбор и задать условное (рис. 14.42).
оформление списка, чтобы невыполненные задачи выделялись особым
цветом. Процесс определения основного реквизита адресации из остальных
реквизитов адресации называется разыменованием.
Часто при конфигурировании формы списка задач требуется установить
отбор, чтобы при открытии списка задач текущий исполнитель видел Для примера рассмотрим следующую ситуацию.
только свои задачи. Для этого в свойствах динамического списка уста- Структура регистра сведений, отвечающего за адресацию, представлена
навливается соответствующее свойство ОсновнаяТаблица в значение в табл. 14.6.
Задача.Задача.ЗадачиПоИсполнителю (рис. 14.41).

78 Профессиональная разработка в системе «1С:Предприятие 8»


Задачи
Таблица 14.8. Свойства объекта «Задача»

Реквизиты адресации Тип реквизита


Сотрудник СправочникСсылка.Сотрудники
РольИсполнителя СправочникСсылка.РолиИсполнителей
Подразделение СправочникСсылка.Подразделения

Есть следующий список задач (приводятся только значения их реквизитов


адресации), табл. 14.9.

Таблица 14.9. Список задач

№ Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение


1 Отдел продаж
2 Руководитель отдела Отдел продаж
3 Бухгалтер
4 Федоров Руководитель отдела Отдел продаж
5 Иванов

Если в параметре сеанса будет ссылка на пользователя Петров, то, несмотря


на тот факт, что нет ни одной задачи, в которой нужное значение было бы
Рис. 14.42. Алгоритм отображения задач по исполнителю в основном реквизите адресации задач, список задач для данного испол-
нителя будет содержать одну строку (табл. 14.10).
Таблица 14.6. Структура регистра сведений
Таблица 14.10. Список задач для пользователя «Петров»
Измерение Тип измерения
Сотрудник СправочникСсылка.Сотрудники № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение
РольИсполнителя СправочникСсылка.РолиИсполнителей 3 Бухгалтер
Подразделение СправочникСсылка.Подразделения
Фактически среди задач отбираются те, у которых в реквизите адресации
Заполнение регистра данными показано в табл. 14.7. Роль исполнителя установлено значение Бухгалтер, а в остальных рекви-
зитах адресации находятся пустые ссылки.
Таблица 14.7. Данные, содержащиеся в регистре сведений
Если в параметре сеанса будет записана ссылка на элемент справочника,
Сотрудник Роль исполнителя Подразделение представляющего пользователя Федоров, то перечень задач будет следу-
Иванов Отдел продаж ющим (табл. 14.11).
Петров Бухгалтер
Сидоров Кладовщик Оптовый склад Таблица 14.11. Список задач для пользователя «Федоров»
Федоров Отдел продаж
№ Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение
Федоров Руководитель отдела Отдел продаж
1 Отдел продаж
Степанов Кладовщик Оптовый склад
2 Руководитель отдела Отдел продаж
4 Федоров Руководитель отдела Отдел продаж
Объект конфигурации Задача имеет имя Задача, и для него заданы следу-
ющие свойства (табл. 14.8).
В данном случае в список задач попадают те из них, которые в основном
реквизите адресации содержат ссылку на сотрудника Федоров. Если в рекви-
зите адресации находится пустая ссылка, то тогда в подразделении
указывается Отдел продаж и в роли исполнителя либо пустая ссылка, либо

Том 2
79
Глава 14. Бизнес-процессы

значение Руководитель отдела (в регистре адресации на данного сотруд- Бывают ситуации, когда критерий выполнения задачи не простой,
ника существуют две записи). а составной (требуется создание ряда документов, окончание выполнения
Для сотрудника Иванов список задач будет следующим (табл. 14.12). каких-либо механизмов). В этом случае предпочтительным вариантом
(в общем случае) является распараллеливание участков карты бизнес-
Таблица 14.12. Список задач для сотрудника «Иванов» процесса и реализация механизма обратной связи с использованием
механизма оповещения.
№ Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение
1 Отдел продаж Рассмотрим пример реализации механизма обратной связи с использова-
5 Иванов нием механизма оповещения.
Постановка задачи. В карте маршрута существует точка действия Выдача
наличных денег (с именем ОформлениеВыплаты), при переходе на нее созда-
Обратная связь ется задача. При активации этой задачи создается документ Расходный
кассовый ордер. Документ заполняется на основании данных бизнес-
Для эффективного использования механизма бизнес-процессов возни- процесса. Кассир как исполнитель должен только сохранить и провести
кает необходимость автоматически выполнять соответствующие задачи документ, чтобы данная задача считалась выполненной.
при выполнении требуемых операций с другими объектами информаци- Как это организовать?
онной базы. Например, при активизации задачи Выплата денежных средств
лучше открыть форму нового документа Расходный кассовый ордер Предположим, что в бизнес-процессе определен реквизит РКО, содер-
(для этой цели используется обработчик менеджера задачи ОбработкаПо- жащий ссылку на оформляемый документ.
лученияФормы). В модуле формы документа Расходный кассовый ордер (отслеживаем
интерактивные действия пользователя) в обработчике события После
подробнее записи определяем следующую строку (листинг 14.24).
Об открытии форм сопутствующих объектов конфигурации при акти-
вации задачи рассказывается в разделе «Интерактивная активация Листинг 14.24. Вызов метода «Оповестить()»
бизнес-процесса», стр. 69. &НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
При проведении документа бизнес-процесс должен понять, что задача Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
выполнена, и продолжить движение по карте маршрута. Такой механизм Оповестить("ЗаписьРасходногоКассовогоОрдера", , Объект.Ссылка);
КонецЕсли;
и называется обратной связью. КонецПроцедуры
Обратная связь может настраиваться несколькими способами. Какой
способ выбрать, зачастую зависит от особенностей прикладной задачи. В модуле управляемого приложения определяем процедуру, которая будет
Но, несмотря на это, можно выделить два основных варианта органи- являться обработчиком при оповещении (листинг 14.25).
зации обратной связи:
Листинг 14.25. Процедура «ОбработчикОповещения»
■■ использование обработчиков ожидания,
Процедура ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт
■■ использование механизма оповещения.
РаботаСБизнесПроцессами.ВыполнитьЗадачуПоДокументу(ИмяСобытия, Источник);
Строить механизм обратной связи на обработчиках ожидания (возмож-
ности процедур вызываться через установленные промежутки времени) КонецПроцедуры
лучше всего, когда критерий выполнения не находится в информационной
базе «1С:Предприятия». В этом случае можно периодически выполнять Из обработчика оповещения вызывается процедура серверного общего
запрос и в случае получения нужного признака программно выполнять модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер
задачу. и Вызов сервера), которая выполнит все необходимые проверки и выполнит
задачу (листинг 14.26).
Реализовывать обратную связь на механизме оповещения лучше всего
в том случае, когда выполнение задачи связано с каким-либо действием
над объектом базы данных.

80 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов
Листинг 14.26. Процедура серверного общего модуля То, что процедура ОбработчикОповещения() будет являться обработчиком
Процедура ВыполнитьЗадачуПоДокументу(ИмяСобытия, ДокументСсылка) Экспорт
оповещения, определяется выполнением следующей строки кода, разме-
щенной в обработчике события При начале работы системы в модуле
Если ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера" Тогда управляемого приложения (листинг 14.27).
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Парам", ДокументСсылка); Листинг 14.27. Подключение обработчика оповещения
Запрос.Текст =
"ВЫБРАТЬ ПодключитьОбработчикОповещения("ОбработчикОповещения");
| Задача.Ссылка
|ИЗ
| Задача.Задача.ЗадачиПоИсполнителю КАК Задача
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.ВыдачаДенегПодотчетнику Примеры реализации бизнес-процессов
| КАК ВыдачаДенегПодотчетнику
| ПО Задача.БизнесПроцесс = ВыдачаДенегПодотчетнику.Ссылка В данном разделе разберем реализацию ряда бизнес-процессов. Следует
|ГДЕ
| Задача.Выполнена = ЛОЖЬ
воспринимать их как примеры (не претендующие на истину в последней
| И ВыдачаДенегПодотчетнику.РКО = &Парам"; инстанции), иллюстрирующие механизмы бизнес-процессов.

Выборка = Запрос.Выполнить().Выбрать(); подробнее
Пока Выборка.Следующий() Цикл
ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Познакомиться с различными примерами реализации бизнес-процессов
Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы. можно в демонстрационной конфигурации «Бизнес-процессы», прила-
ВыдачаДенегПодотчетнику.ТочкиМаршрута. гающейся к книге на компакт-диске.
ОформлениеВыплаты Тогда
Если ТекущаяЗадача.ПроверитьВыполнение() Тогда


ТекущаяЗадача.ВыполнитьЗадачу();
КонецЕсли;
Единый объект «Задача»
КонецЕсли; Во всех рассматриваемых бизнес-процессах будет использоваться один
КонецЦикла;
КонецЕсли; // ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера" объект конфигурации Задача и, соответственно, один регистр сведений
РегистрАдресации, отвечающий за адресацию.
КонецПроцедуры
Этот регистр сведений будет иметь следующий состав измерений
В первую очередь в данном обработчике проверяется имя обрабатывае- (табл. 14.13).
мого события (в общем случае их может быть больше одного).
Таблица 14.13. Измерения регистра сведений
После этого выполняется запрос. В выборку результатов запроса попадают
(в общем случае) все невыполненные задачи бизнес-процесса, значение Измерение Тип измерения
реквизита РКО которого совпадает со значением, переданным в пара- Сотрудник СправочникСсылка.Сотрудники
метр запроса (значение берется из параметра обработчика оповещения). РольИсполнителя СправочникСсылка.РолиИсполнителей
Поэтому при работе с полученной выборкой необходимо проверять прина- Подразделение СправочникСсылка.Подразделения
длежность задачи интересующей нас точке маршрута.
Регистр имеет следующее наполнение (табл. 14.14).
При прохождении всех условий методом ПроверитьВыполнение() прове-
ряются условия выполнения найденной задачи. В случае положительного Таблица 14.14. Данные регистра сведений
результата выполняется метод задачи ВыполнитьЗадачу() (приводит
к отметке задачи как выполненной и продвижению бизнес-процесса Сотрудник Роль исполнителя Подразделение
к следующей точке по карте бизнес-процесса). Следует заметить, что если Иванов Отдел продаж
обработчики события ОбработкаПроверкиВыполнения и у точки марш- Петров Бухгалтер
рута, и у самой задачи отсутствуют, то метод ПроверитьВыполнение() Сидоров Кладовщик Оптовый склад
вернет Ложь. Поэтому должен существовать хотя бы один обработчик Федоров Отдел продаж
события ОбработкаПроверкиВыполнения, в котором, хотя бы формально, Федоров Руководитель отдела Отдел продаж
параметр Результат устанавливается в значение Истина. Степанов Кладовщик Оптовый склад

Том 2
81
Глава 14. Бизнес-процессы

Объект конфигурации Задача имеет имя Задача и следующие реквизиты Данный обработчик события определяет, что при выполнении задачи
(табл. 14.15). (программном или интерактивном) в ней сохраняется время выполнения
и исполнитель.
Таблица 14.15. Реквизиты объекта конфигурации «Задача»
Для удобства работы пользователей со списком задач существует форма
Реквизиты адресации Тип реквизита списка с именем ФормаСпискаПоИсполнителю. В свойствах основного
Сотрудник СправочникСсылка.Сотрудники реквизита формы, содержащего динамический список задач, свойство
РольИсполнителя СправочникСсылка.РолиИсполнителей ОсновнаяТаблица установлено в значение Задача.Задача.ЗадачиПоИспол-
Подразделение СправочникСсылка.Подразделения нителю (рис. 14.43).
КонтрольныйСрок Дата (состав Дата и Время)
ДатаВыполнения Дата (состав Дата и Время)
Исполнитель СправочникСсылка.Сотрудники
Приоритет Число
ДатаАвтоВыполнения Дата (состав Дата и Время)

В качестве основного реквизита адресации выбран реквизит адресации


Сотрудник.
В свойство Текущий исполнитель выбран параметр сеанса ТекущийИсполни-
тель (тип СправочникСсылка.Сотрудники).
Данный параметр сеанса инициализируется в обработчике события ПриУс-
тановкеПараметровСеанса модуля сеанса (листинг 14.28).
Рис. 14.43. Свойства основного реквизита формы типа «ДинамическийСписок»
Листинг 14.28. Заполнение параметра сеанса «ТекущийИсполнитель»

Процедура УстановкаПараметровСеанса() Выбор этой виртуальной таблицы позволяет без каких-либо допол-
ПараметрыСеанса.ТекущийИсполнитель = нительных действий показать только те задачи, которые адресованы
Справочники.Сотрудники.НайтиПоНаименованию(ИмяПользователя()); пользователю, авторизовавшемуся в данном сеансе «1С:Предприятия».
КонецПроцедуры
Для удобства отображения списка задач в режиме 1С:Предприятие в палитре
Считается, что имя пользователя, указываемое при входе в систему, совпа- свойств динамического списка можно настроить некоторые его свойства.
дает с наименованием элемента справочника Сотрудники. В окне настройки списка (гиперссылка Открыть), на закладке Настройки 
Для заполнения ряда реквизитов задачи в модуле объекта Задача определен Порядок задана настройка сортировки динамического списка по убыванию
следующий обработчик события ПередВыполнением (листинг 14.29). поля Дата (рис. 14.44).
Листинг 14.29. Обработчик события «ПередВыполнением»

Процедура ПередВыполнением(Отказ)

// Проверка даты на пустое значение.
Если ДатаВыполнения = '00010101' Тогда
ДатаВыполнения = ТекущаяДата();
КонецЕсли;

// Если исполнитель до начала выполнения не определен,


// он записывается из параметра сеанса.
// В этом случае записывается пользователь, в контексте которого запущено
// "1С:Предприятие".
Если Исполнитель.Пустая() Тогда
Исполнитель = ПараметрыСеанса.ТекущийИсполнитель;
КонецЕсли;

КонецПроцедуры
Рис. 14.44. Настройка сортировки динамического списка

82 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

Свойства таблицы формы, отображающей данные динамического В первой процедуре (листинг  14.30) реквизит формы Пользователь
списка, установлены следующим образом – АвтоОбновление = Истина инициализируется значением из параметра сеанса.
и ПериодАвтоОбновления = 5 (рис. 14.45). Во второй процедуре (листинг  14.31) при изменении значения в поле
ввода, связанном с реквизитом формы Пользователь, новое значение
устанавливается в качестве параметра запроса методом Устано-
витьЗначениеПараметра() коллекции параметров динамического
списка (Список.Параметры). В коллекции параметров есть параметр
Исполнитель, и он передается как параметр запроса в виртуальную
таблицу Задача.Задача.ЗадачиПоИсполнителю, служащую источником
данных для динамического списка. Это приводит к тому, что в списке
отображаются задачи только по выбранному исполнителю (рис. 14.46).

Рис. 14.45. Свойства таблицы формы, отображающей список задач

Теперь рассмотрим возможность организации просмотра списка задач


Рис. 14.46. Список задач по выбранному пользователю
для разных пользователей. Вообще говоря, такая возможность должна
предоставляться только администратору, но для упрощения примера этот Запустив «1С:Предприятие», мы можем убедиться, что задачи в списке
момент опущен. задач отобраны по указанному в форме списка исполнителю и отсор-
Для демонстрации этой возможности в форме списка существует тированы по убыванию колонки Дата. Также можно создать отбор
реквизит Пользователь (тип СправочникСсылка.Сотрудники), связанный по невыполненным задачам (Выполнена = Ложь), как показано в разделе
через свойство ПутьКДанным с одноименным элементом формы вида Поле «Форма списка задач» на стр.  77, можно просматривать значения
ввода. реквизитов адресации, реквизитов задачи.
В палитре свойств динамического списка установлено свойство Произ- В ряде случаев этого может быть недостаточно. Например, необходимо
вольныйЗапрос. отслеживать, была ли хоть раз выполнена активация задачи (была ли хоть
В модуле формы определены обработчики событий ПриСозданииНаСер- раз предпринята попытка открыть форму задачи или форму сопутству-
вере формы (листинг 14.30) и ПриИзменении поля ввода (листинг 14.31).
ющих объектов конфигурации).
Для решения этой задачи можно использовать регистр сведений
Листинг 14.30. Обработчик события «ПриСозданииНаСервере» формы списка ПросмотрЗадач (табл. 14.16).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Таблица 14.16. Структура регистра «ПросмотрЗадач»
Пользователь = ПараметрыСеанса.ТекущийИсполнитель; Измерение Тип измерения
КонецПроцедуры Задача ЗадачаСсылка.Задача
Сотрудник СправочникСсылка. Сотрудники
Листинг 14.31. Обработчик события «ПриИзменении» поля ввода

// Процедура-обработчик изменения поля ввода "Пользователь". Ресурсов и реквизитов у данного регистра сведений нет.
&НаКлиенте
Процедура ПользовательПриИзменении(Элемент) Сама идея механизма довольно проста: при активации задачи в регистр
сведений будут записываться данные о задаче и ее текущем исполни-
Список.Параметры.УстановитьЗначениеПараметра("Исполнитель", Пользователь);
теле. При выполнении задачи данные о ней будут удаляться из регистра
КонецПроцедуры сведений.

Том 2
83
Глава 14. Бизнес-процессы

Это можно реализовать с помощью обработчиков событий ОбработкаПо- Листинг 14.33. Обработчик события «ПриВыполнении»
лученияФормы модуля менеджера задачи (листинг 14.32) и ПриВыполнении
Процедура ПриВыполнении(Отказ)
(листинг 14.33) модуля объекта Задача.
Сообщение = Новый СообщениеПользователю();
Листинг 14.32. Обработчик события «ОбработкаПолученияФормы» Сообщение.Текст = "Задача выполнена: " + """" + Наименование + """";
Сообщение.Сообщить();
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
ДополнительнаяИнформация, СтандартнаяОбработка) НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Задача.Значение = Ссылка;
Если ВидФормы = "ФормаОбъекта" Тогда НаборЗаписей.Отбор.Задача.Использование = Истина;
ЗадачаСсылка = Параметры.Ключ;
Попытка
// Регистр сведений "Просмотр задач" используется для регистрации
// данных по текущим (не выполненным) задачам. // Пытаемся записать пустой набор записей в регистр,
НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); // фактически удаляем из него данные о задаче, если они там были.
НаборЗаписей.Отбор.Задача.Значение = ЗадачаСсылка; НаборЗаписей.Записать(Истина);
НаборЗаписей.Отбор.Задача.Использование = Истина; Исключение
Сообщение.Текст = ОписаниеОшибки();
// В параметре "Текущий исполнитель" находится ссылка на текущего Сообщение.Сообщить();
// пользователя; этот параметр сеанса выбран в свойство КонецПопытки;
// "Текущий Исполнитель" соответствующей задачи.
НаборЗаписей.Отбор.Сотрудник.Значение = ПараметрыСеанса.ТекущийИсполнитель; КонецПроцедуры
НаборЗаписей.Отбор.Сотрудник.Использование = Истина;
Одно дело – записать (и вовремя удалить) данные в регистр сведений,
НаборЗаписей.Прочитать();

другое дело – это организовать для пользователя удобный механизм
Если НаборЗаписей.Количество() = 0 Тогда просмотра этих данных. Например, как сделать так, чтобы ни разу
не активированные пользователем задачи выделялись бы жирным
// В набор записей добавляем новую запись, шрифтом? Для решения этой задачи вернемся к форме списка.
// характеризующую активизированную задачу.
НоваяЗапись = НаборЗаписей.Добавить(); Сначала в произвольный запрос для динамического списка добавляется
НоваяЗапись.Задача = ЗадачаСсылка; таблица регистра сведений ПросмотрЗадач.
НоваяЗапись.Сотрудник = ПараметрыСеанса.ТекущийИсполнитель;
В палитре свойств динамического списка, нажав гиперссылку Открыть,
Попытка можно увидеть и отредактировать текст запроса, который выполняется
НаборЗаписей.Записать();
Исключение при формировании динамического списка (рис. 14.47).
Сообщение = Новый СообщениеПользователю(); В запросе виртуальная таблица Задача.Задача.ЗадачиПоИсполнителю левым
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить(); соединением связывается с таблицей регистра сведений ПросмотрЗадач,
КонецПопытки; отобранной по текущему пользователю (поле Сотрудник = Пользователь).
КонецЕсли;
То есть в результате выполнения запроса в список задач попадут все
КонецЕсли; задачи по исполнителю, но у задач, не найденных в регистре сведений,
в поле Задача будет значение Null.
КонецПроцедуры
В обработчик события ПриСозданииНаСервере добавляется строка для
Обработчик события ОбработкаПолученияФормы вызывается при акти- передачи параметра Сотрудник в запрос (листинг 14.34).
вации задачи, а также при открытии любых форм задачи. Поэтому
сначала проверяется, что открывается форма объекта задачи (параметр Листинг 14.34. Обработчик события «ПриСозданииНаСервере» формы списка
ВидФормы = "ФормаОбъекта"). Ссылка на задачу передается в структуре &НаСервере
параметров открываемой формы (Параметры.Ключ). Затем данные о задаче Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
и ее текущем исполнителе заносятся в регистр сведений ПросмотрЗадач.
Пользователь = ПараметрыСеанса.ТекущийИсполнитель;
В обработчике ПриВыполнении данные о выполненной задаче удаляются Список.Параметры.УстановитьЗначениеПараметра("Сотрудник", Пользователь);
из регистра сведений путем записи пустого набора записей с отбором
по задаче (листинг 14.33). КонецПроцедуры

84 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

Рис. 14.49. Список задач в режиме «1С:Предприятие»

Выполнив команду Все действия  Настроить список…, пользователь может


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

Бизнес-процесс «Продажа товара»


Данный бизнес-процесс позволяет отследить всю последовательность
действий: с выписки счета менеджером, получения оплаты бухгалтером
и до отгрузки товара кладовщиком. При этом проверяется скидка, установ-
Рис. 14.47. Текст запроса для динамического списка
ленная менеджером. Если она превышает некий предел, установленный
для фирмы, то такой счет предварительно идет на утверждение к руково-
В окне настройки списка на закладке Настройки  Условное оформление
дителю отдела.
задается условное оформление динамического списка (рис. 14.48).
У бизнес-процесса определено два реквизита:
■■ Счет (ссылка на документ);
■■ РасходнаяНакладная (ссылка на документ).
Карта маршрута бизнес-процесса имеет следующий вид (рис. 14.50).

Рис. 14.48. Настройка условного оформления динамического списка

Во втором элементе отбора условного оформления динамического


списка выбираются записи, у которых поле Задача (из регистра сведений
ПросмотрЗадач) не определено (ВидСравненияКомпоновкиДанных.НеЗа-
полнено).
Поскольку в списке задач оформляется полностью вся строка, оформля-
емые поля в настройках условного оформления не заданы.
В результате в режиме 1С:Предприятие список задач будет выглядеть
следующим образом (рис. 14.49). Рис. 14.50. Карта маршрута бизнес-процесса

Том 2
85
Глава 14. Бизнес-процессы

Перед тем как перейти к рассмотрению внутренних механизмов данного Листинг 14.38. Процедура серверного общего модуля
бизнес-процесса, следует обратить внимание на тот факт, что для Процедура ВыполнитьЗадачуПоДокументу(ИмяСобытия, ДокументСсылка) Экспорт
более удобной работы пользователей с задачами данного бизнес-про- Если ИмяСобытия = "ЗаписьРасходнойНакладной" Тогда
цесса необходимо организовывать так называемый механизм обратной Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Парам", ДокументСсылка);
связи. При активации задач будут открываться формы других объектов Запрос.Текст =
(документов Счет, Расходная накладная), а при их проведении и записи "ВЫБРАТЬ
| Задача.Ссылка
соответствующие им задачи будут выполняться. |ИЗ
| БизнесПроцесс.ПродажаТовара КАК ПродажаТовара
Для этой цели необходимо внести изменения в сами документы. | ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача.ЗадачиПоИсполнителю КАК Задача
Например, в обработчик события ПослеЗаписи основной формы документа | ПО ПродажаТовара.Ссылка = Задача.БизнесПроцесс
Счет можно поместить следующую строку кода (листинг 14.35). |ГДЕ
| (Задача.Выполнена = ЛОЖЬ) И
| ПродажаТовара.РасходнаяНакладная = &Парам";
Листинг 14.35. Вызов метода «Оповестить()»
Выборка = Запрос.Выполнить().Выбрать();
&НаКлиенте Пока Выборка.Следующий() Цикл
Процедура ПослеЗаписи(ПараметрыЗаписи) ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект();
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Если ТекущаяЗадача.ТочкаМаршрута =
Оповестить("ЗаписьСчета", , Объект.Ссылка); БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.Отгрузка Тогда
Если ТекущаяЗадача.ПроверитьВыполнение() Тогда
КонецЕсли; ТекущаяЗадача.ВыполнитьЗадачу();
КонецПроцедуры КонецЕсли;
КонецЕсли;
В одноименный обработчик формы документа Расходная накладная КонецЦикла;
КонецЕсли; // ИмяСобытия = "ЗаписьРасходнойНакладной"
можно добавить аналогичную строку, но с другим именем события
(листинг 14.36). Если ИмяСобытия = "ЗаписьСчета" Тогда
Запрос = Новый Запрос;
Листинг 14.36. Вызов метода «Оповестить()»
Запрос.УстановитьПараметр("Парам", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
&НаКлиенте | Задача.Ссылка
Процедура ПослеЗаписи(ПараметрыЗаписи) |ИЗ
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда | БизнесПроцесс.ПродажаТовара КАК ПродажаТовара
Оповестить("ЗаписьРасходнойНакладной", , Объект.Ссылка); | ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача.ЗадачиПоИсполнителю КАК Задача
КонецЕсли; | ПО ПродажаТовара.Ссылка = Задача.БизнесПроцесс
КонецПроцедуры |ГДЕ
| (Задача.Выполнена = ЛОЖЬ) И
| ПродажаТовара.Счет = &Парам";
В модуле управляемого приложения следует определить процедуру,
которая будет являться обработчиком при оповещении (листинг 14.37). Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект();
Листинг 14.37. Процедура «ОбработчикОповещения» Если
ТекущаяЗадача.ТочкаМаршрута =
Процедура ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ВыпискаСчета
ИЛИ
РаботаСБизнесПроцессами.ВыполнитьЗадачуПоДокументу(ИмяСобытия, Источник); ТекущаяЗадача.ТочкаМаршрута =
БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты
КонецПроцедуры ИЛИ
ТекущаяЗадача.ТочкаМаршрута =
БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.УтверждениеСчета
Из обработчика оповещения вызывается процедура серверного общего Тогда
модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер Если ТекущаяЗадача.ПроверитьВыполнение() Тогда
ТекущаяЗадача.ВыполнитьЗадачу();
и Вызов сервера), который выполнит все необходимые проверки КонецЕсли;
и выполнит задачу (листинг 14.38). КонецЕсли;
КонецЦикла;
КонецЕсли; // ИмяСобытия = "ЗаписьСчета"

КонецПроцедуры

86 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

Остается в обработчике события При начале работы системы в модуле В этом обработчике производится проверка на заполненность реквизитов
управляемого приложения назначить вышеописанную процедуру обра- Счет и РасходнаяНакладная. Если реквизиты содержат пустые ссылки,
ботчиком оповещения. Сделать это можно с помощью строки следующего то тогда создаются документы соответствующих видов и ссылки на них
вида (листинг 14.39). записываются в бизнес-процессе.

Листинг 14.39. Подключение обработчика оповещения


После старта бизнес-процесс переходит к точке действия Выписать счет
(имя точки действия ВыпискаСчета). В этой точке установлено значение
ПодключитьОбработчикОповещения("ОбработчикОповещения"); реквизита адресации Подразделение в значение ОтделПродаж. В результате
при переходе к этой точке маршрута создается задача с установленным
В итоге получается, что при записи какого-либо документа он опове- реквизитом адресации Подразделение.
щает об этом систему. В обработчике оповещения производится поиск
соответствующей задачи, и, если обработчик события ОбработкаПровер- В случае, если соответствующая задача активирована, необходимо
киВыполнения соответствующей точки маршрута возвращает значение открыть форму счета, связанную через бизнес-процесс с соответству-
Истина, она выполняется. ющей задачей.
В дальнейшем (в данном разделе), когда будем говорить о выполнении Для этого в обработчик события ОбработкаПолученияФормы модуля
задачи, при активации которой открывались формы документов (а форма менеджера задачи нужно добавить следующий фрагмент кода
самой задачи нет), будет подразумеваться вышеописанный механизм. (листинг 14.41).
Вернемся к бизнес-процессу. Листинг 14.41. Обработчик события «ОбработкаПолученияФормы»
При запуске (старте) бизнес-процесса выполняется следующее событие Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
(листинг 14.40). ДополнительнаяИнформация, СтандартнаяОбработка)

Листинг 14.40. Обработчик события «ПередСтартом» Если ВидФормы = "ФормаОбъекта" Тогда
ЗадачаСсылка = Параметры.Ключ;
Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
...
НужноЗаписать = Ложь; Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.
Если Счет.Пустая() Тогда ПродажаТовара.ТочкиМаршрута.ВыпискаСчета Тогда
СчетОбъект = Документы.Счет.СоздатьДокумент(); ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта";
СчетОбъект.Дата = ТекущаяДата(); Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет;
СчетОбъект.Записать(); СтандартнаяОбработка = Ложь;
Счет = СчетОбъект.Ссылка; КонецЕсли;
НужноЗаписать = Истина; ...
КонецЕсли; КонецЕсли;

Если РасходнаяНакладная.Пустая() Тогда КонецПроцедуры
РасходнаяНакладнаяОбъект = Документы.РасходнаяНакладная.СоздатьДокумент();
РасходнаяНакладнаяОбъект.Дата = ТекущаяДата(); В процедуре обработчика переопределяется параметр ВыбраннаяФорма
РасходнаяНакладнаяОбъект.Записать(); (тем самым указывается форма, которая должна быть открыта вместо
РасходнаяНакладная = РасходнаяНакладнаяОбъект.Ссылка;
НужноЗаписать = Истина; формы задачи) и параметр Ключ коллекции параметров открываемой
КонецЕсли; формы (т. е. вместо ссылки на задачу параметр Ключ будет содержать
ссылку на счет, являющийся реквизитом бизнес-процесса, породившего
Если НужноЗаписать Тогда
Записать();
задачу).
КонецЕсли; Результатом будет открытие формы счета, форма задачи при этом открыта

Сообщение = Новый СообщениеПользователю();
не будет (СтандартнаяОбработка = Ложь).
Сообщение.Текст = "Старт бизнес-процесса: " + """" + ЭтотОбъект.Метаданные().Синоним + """"; При попытке выполнения задачи точки маршрута Выписать счет срабаты-
Сообщение.Сообщить();
вает следующий обработчик события точки маршрута (листинг 14.42).
КонецПроцедуры // СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ)

Том 2
87
Глава 14. Бизнес-процессы
Листинг 14.42. Обработчик события «ПередВыполнением» Листинг 14.44. Обработчик события «ОбработкаПолученияФормы»

Процедура ВыпискаСчетаПередВыполнением(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,


ДополнительнаяИнформация, СтандартнаяОбработка)
Если Счет.Состав.Количество() = 0 Тогда
Отказ = Истина; Если ВидФормы = "ФормаОбъекта" Тогда
КонецЕсли; ЗадачаСсылка = Параметры.Ключ;
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
КонецПроцедуры ...
Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.
В процедуре проверяется количество строк табличной части документа ПродажаТовара.ТочкиМаршрута.УтверждениеСчета Тогда
Счет. Если количество строк табличной части равно нулю, задача не будет ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта";
выполнена и бизнес-процесс не пойдет дальше по карте маршрута. Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет;
СтандартнаяОбработка = Ложь;
При выполнении задачи точки маршрута Выписать счет бизнес-процесс КонецЕсли;
переходит к точке условия Скидка по счету выше стандартной? (имя точки ...
действия УсловиеОграниченияСкидки). Обработчик проверки условия КонецЕсли;
имеет следующий вид (листинг 14.43). КонецПроцедуры

Листинг 14.43. Обработчик события «ПроверкаУсловия» При его выполнении открывается форма счета, а форма задачи не откры-
// Процедура обработчик события "ПроверкаУсловия" вается.
// точки маршрута "УсловиеОграниченияСкидки".
Процедура УсловиеОграниченияСкидкиПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) После выполнения текущей задачи бизнес-процесс переходит к точке
условия Счет утвержден? (имя точки действия УсловиеУтверждения). Обра-
СкидкаБольшеОбычной = Ложь; ботчик проверки условия имеет следующий вид (листинг 14.45).
ОбычнаяСкидка = Константы.ОбычнаяСкидка.Получить();

// Проверяем, что скидка не превышает обычную. Листинг 14.45. Обработчик события «ПроверкаУсловия»
Для Каждого Элемент Из Счет.Состав Цикл
Если Элемент.Скидка > ОбычнаяСкидка Тогда Процедура УсловиеУтвержденияПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
СкидкаБольшеОбычной = Истина;
Прервать; // Проверяем, что скидки согласованы.
КонецЕсли; Результат = Счет.СкидкаСогласована;
КонецЦикла;
Результат = СкидкаБольшеОбычной; КонецПроцедуры

КонецПроцедуры Признаком утверждения счета является отметка в документе Счет
флажка СкидкаСогласована (запись в соответствующий реквизит значения
Если скидка хотя бы в одной строке табличной части документа больше
Истина).
величины, определенной в константе, то в параметр процедуры Результат
записывается значение Истина и бизнес-процесс идет по ветви Да Обратите внимание, что на карте маршрута бизнес-процесса у данной
(на утверждение скидки). точки условия ветви Да и Нет направлены в противоположную сторону.
В этом случае бизнес-процесс продвигается до точки Утвердить счет В стандартном варианте по умолчанию ветка Нет находится слева.
(имя точки действия УтверждениеСчета), в которой происходит создание Поэтому, чтобы бизнес-процесс правильно реагировал на выполнение/
задачи с установленным реквизитом адресации РольИсполнителя невыполнение условия, в данном случае необходимо поменять местами
в значение РуководительОтдела, Подразделение в ОтделПродаж (соот- ветви Да и Нет, перетащив их мышью на карте маршрута.
ветствующие значения определены в свойствах группы Адресация точки Если в параметр Результат записано значение Ложь, бизнес-процесс пере-
действия). Следует отметить, что в соответствии с такими значениями ходит к точке завершения Отмена и бизнес-процесс завершается.
реквизитов адресации данная задача (в форме списка ФормаСпискаПоИс-
полнителю) будет отображаться только для пользователя Федоров. В другом случае бизнес-процесс переходит к точке карты маршрута Полу-
чить наличную оплату (имя точки действия ПолучениеОплаты). К этой же
При активации созданной задачи выполняется следующий код обра-
точке маршрута бизнес-процесс перейдет в случае, если скидка в счете
ботчика события ОбработкаПолученияФормы модуля менеджера задачи
не превышает порогового значения. Эта точка является точкой действия,
(листинг 14.44).

88 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

поэтому при переходе к ней создается задача с установленным рекви- В справочнике Подразделения ищется значение, равное по наименованию
зитом адресации РольИсполнителя в значение Бухгалтер (в соответствии складу из документа Расходная накладная. В случае успеха (найденная
с наполнением регистра сведений, ответственным за адресацию, данная ссылка не пустая) полученное значение записывается в реквизит адре-
задача будет присутствовать для пользователя Петров). сации задачи Подразделение.
При активации созданной задачи выполняется следующий код обра- При активации задачи открывается форма расходной накладной.
ботчика события ОбработкаПолученияФормы модуля менеджера задачи Для этого в обработчик события ОбработкаПолученияФормы модуля менед-
(листинг 14.46). жера задачи нужно добавить следующий фрагмент кода (листинг 14.48).
Листинг 14.46. Обработчик события «ОбработкаПолученияФормы» Листинг 14.48. Обработчик события «ОбработкаПолученияФормы»
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
ДополнительнаяИнформация, СтандартнаяОбработка) ДополнительнаяИнформация, СтандартнаяОбработка)

Если ВидФормы = "ФормаОбъекта" Тогда
Если ВидФормы = "ФормаОбъекта" Тогда
ЗадачаСсылка = Параметры.Ключ;
ЗадачаСсылка = Параметры.Ключ;
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
... ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. ...
ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты Тогда Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.
ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; ПродажаТовара.ТочкиМаршрута.Отгрузка Тогда
Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; ВыбраннаяФорма = "Документ.РасходнаяНакладная.ФормаОбъекта";
СтандартнаяОбработка = Ложь; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.РасходнаяНакладная;
КонецЕсли; СтандартнаяОбработка = Ложь;
... КонецЕсли;
КонецЕсли; ...
КонецЕсли;
КонецПроцедуры
КонецПроцедуры
Откроется форма документа Счет (ссылка на который хранится в бизнес-
процессе), форма задачи открыта не будет. Кладовщик уточняет перечень отгружаемых товарных позиций и выпол-
няет задачу.
После выполнения данной задачи (приема оплаты) бизнес-процесс
перейдет к следующей точке карты маршрута Отгрузить товар со склада После выполнения текущей задачи бизнес-процесс переходит к точке
(имя точки действия Отгрузка). В данной точке свойство (группы свойств Нормальное завершение и завершается.
Адресация) РольИсполнителя установлено в значение Кладовщик.
Для данной точки определено два обработчика событий: ПриСозданииЗадач Бизнес-процесс «Продажа товара с предоплатой»
в модуле объекта бизнес-процесса (листинг  14.47) и ОбработкаПолу-
ченияФормы в модуле менеджера задачи (листинг 14.48). Один из них Автоматизируемый бизнес-процесс очень похож на ранее рассмотренный
срабатывает при создании задачи. (бизнес-процесс Продажа товара, стр.  85). Но есть одна отличительная
особенность: во взаиморасчетах между покупателем и продавцом
Листинг 14.47. Обработчик события «ПриСозданииЗадач» возможны случаи предоплаты. Применительно к ранее рассмотрен-
Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи,
ному бизнес-процессу это означает, что при переходе к точке маршрута
Отказ) Получение наличной оплаты в случае достаточности средств «на балансе
покупателя» эта точка маршрута должна быть пройдена автоматически.
Склад = Справочники.Подразделения.НайтиПоНаименованию(РасходнаяНакладная.Склад);
Карта бизнес-процесса такая же, как и в предыдущем случае. Рассмотрим
Если Не Склад.Пустая() Тогда один из вариантов учета данной специфической особенности.
Для Каждого Задача Из ФормируемыеЗадачи Цикл
Задача.Подразделение = Склад; Достаточно следующим образом определить обработчик события
КонецЦикла; Перед созданием задач точки маршрута Получение наличной оплаты
КонецЕсли; (листинг 14.49).

КонецПроцедуры

Том 2
89
Глава 14. Бизнес-процессы
Листинг 14.49. Обработчик события «ПередСозданиемЗадач»
Реквизит Тип
Процедура ПолучениеОплатыПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ТекстПоручения Строка
ФормируемыеЗадачи, СтандартнаяОбработка) ОтчетОВыполнении Строка
ОтчетОКонтроле Строка
// С помощью реализованной в общем модуле функции получаем ПараллельныйКонтроль Булево
// сумму возможного аванса.
СостояниеВзаиморасчетов = ПолучитьСостояниеВзаиморасчетов(Счет.Контрагент); ДатаВыполнения Дата
ДатаКонтроля Дата
СуммаПоДокументу = Счет.Состав.Итог("Сумма"); КонтрольныйСрок Дата
Если СостояниеВзаиморасчетов > СуммаПоДокументу Тогда ОтметкаОВыполнении Булево
ЗафиксироватьОплату(Счет);
ОтметкаОСнятииСКонтроля Булево
СтандартнаяОбработка = Ложь;
КонецЕсли;
Карта бизнес-процесса имеет следующий вид (рис. 14.51).
КонецПроцедуры

Смысл механизма заключается в том, что при выполнении данного обра-


ботчика проверяется наличие предоплаты. Если суммы предоплаты
достаточно для оплаты данного счета, параметр СтандартнаяОбработка
устанавливается в значение Ложь. Это приводит к тому, что штатный
механизм формирования задач не срабатывает. А так как в данном обра-
ботчике массив задач не формировался (и обработчик При создании задач
для данной точки также не определялся), это приводит к тому, что не
создается ни одной задачи и бизнес-процесс автоматически переходит к
следующей точке бизнес-процесса.
Следует обратить внимание, что попытка реализации данного процесса
приведет к изменению текста процедуры – обработчика оповещения.

Бизнес-процесс «Поручение»
Данный процесс автоматизирует последовательность выдачи поручений
(на проведение какого-либо действия). Например, кто-то должен заказать
авиабилеты для директора (поездки в командировку), кто-то этот процесс
должен проконтролировать и т. п.
Рис. 14.51. Карта маршрута бизнес-процесса
У бизнес-процесса определены следующие реквизиты (табл. 14.17).
У данного бизнес-процесса определены две точки старта. Попытка запус-
Таблица 14.17. Реквизиты бизнес-процесса «Поручение» тить процесс штатными средствами приведет к ошибке (не определена
Реквизит Тип
точка старта). Забегая вперед, скажем, что данный бизнес-процесс будет
Автор СправочникСсылка.Сотрудники
использоваться как вложенный (в этом случае и будет использоваться
Исполнитель СправочникСсылка.Сотрудники точка старта СтартБезАвтора). Самостоятельный старт будет происходить
ИсполнительРоль СправочникСсылка.РолиИсполнителей с точки Старт. Как другую особенность данного бизнес-процесса можно
ИсполнительОтдел СправочникСсылка.Подразделения отметить тот факт, что во всех точках действия не определено ни одно
Контролер СправочникСсылка.Сотрудники из свойств, ответственных за адресацию (эти свойства определяются
КонтролерРоль СправочникСсылка.РолиИсполнителей программно).
КонтролерОтдел СправочникСсылка.Подразделения Старт бизнес-процесса можно реализовывать разными способами.
Приоритет Число
Рассмотрим вариант, когда в модуле общей команды определяется проце-
Тема Строка
дура (листинг 14.50).

90 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов
Листинг 14.50. Процедура, выполняющая старт бизнес-процесса В качестве значения реквизита адресации задачи устанавливается значение
Процедура АктивироватьБП() Экспорт
из реквизита бизнес-процесса Автор. Стандартный механизм создания
задач отключается.
БизнесПроцесс = БизнесПроцессы.Поручение.СоздатьБизнесПроцесс();
БизнесПроцесс.Дата = ТекущаяДата(); При активации данной задачи выполняется следующий код обработ-
БизнесПроцесс.Записать(); чика события ОбработкаПолученияФормы модуля менеджера задачи
БизнесПроцесс.Старт(БизнесПроцессы.Поручение.ТочкиМаршрута.Старт); (листинг 14.53).
КонецПроцедуры
Листинг 14.53. Обработчик события «ОбработкаПолученияФормы»
В самой процедуре уточняется точка старта, и бизнес-процесс стартует
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
с этой точки. ДополнительнаяИнформация, СтандартнаяОбработка)
При старте выполняется следующий обработчик точки старта бизнес-про-
Если ВидФормы = "ФормаОбъекта" Тогда
цесса (листинг 14.51). ЗадачаСсылка = Параметры.Ключ;
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
Листинг 14.51. Обработчик события «ПередСтартом» ...
Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.
Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Поручение.ТочкиМаршрута.ВыдатьПоручение Тогда
ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения";
Автор = ПараметрыСеанса.ТекущийИсполнитель; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс;
КонтрольныйСрок = КонецНедели(ТекущаяДата()); Параметры.Вставить("Задача", ЗадачаСсылка);
Записать();
СтандартнаяОбработка = Ложь;

Сообщение = Новый СообщениеПользователю(); КонецЕсли;
Сообщение.Текст = "Старт бизнес-процесса: " + """" + ЭтотОбъект.Метаданные().Синоним + """"; ...
Сообщение.Сообщить(); КонецЕсли;

КонецПроцедуры КонецПроцедуры

В нем в реквизит бизнес-процесса Автор записывается значение из пара- При активации задачи открывается форма бизнес-процесса ФормаПо-
метра сеанса, содержащего текущего пользователя (элемент справочника). ручения – специфическая форма бизнес-процесса, в которой каждый
Устанавливается контрольный срок исполнения. из участников процесса может оставлять какие-либо отметки, замечания.
После старта бизнес-процесс переходит к точке действия Выдать пору- В ней реализовано разграничение прав доступа к различным полям (рекви-
чение. Следует отметить, что в данной точке отключен механизм создания зитам бизнес-процесса) в зависимости от роли сотрудника. Например,
задач по умолчанию. В ней определен обработчик события Перед созда- исполнитель не может исправить текст поручения и т. п.
нием задач (листинг 14.52). При создании формы на сервере в реквизит формы ТекущаяЗадача в пара-
метре формы передается текущая (активируемая) задача (листинг 14.54).
Листинг 14.52. Обработчик события «ПередСозданиемЗадач»

Процедура ВыдатьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, Листинг 14.54. Обработчик события формы «ПриСозданииНаСервере»


ФормируемыеЗадачи, СтандартнаяОбработка)
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Задача = Задачи.Задача.СоздатьЗадачу();
Задача.БизнесПроцесс = Ссылка; ТекущаяЗадача = Параметры.Задача;
Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Если ТекущаяЗадача.Выполнена Тогда
Задача.Дата = ТекущаяДата(); Элементы.ВыполнитьЗадачу.Доступность = Ложь;
Задача.Сотрудник = Автор; КонецЕсли;
Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи;
Если Не ПустаяСтрока(Тема) Тогда КонецПроцедуры
Задача.Наименование = Задача.Наименование + ": " + Тема;
КонецЕсли; Поскольку в бизнес-процессах Поручение и Согласование при активации
ФормируемыеЗадачи.Добавить(Задача);
СтандартнаяОбработка = Ложь; задачи вместо формы задачи открываются специализированные формы
бизнес-процессов, для выполнения этой задачи в формах существует
КонецПроцедуры команда ВыполнитьЗадачу и соответствующая ей кнопка. Эта кнопка

Том 2
91
Глава 14. Бизнес-процессы

доступна в случае, если задача не выполнена. При ее нажатии задача бизнес-процесса ПараллельныйКонтроль (установленным интерактивно).
выполняется (листинг 14.55). Обработчик проверки условия содержит фактически одну строку
(листинг 14.57).
Листинг 14.55. Выполнение текущей задачи
Листинг 14.57. Обработчик события «ПроверкаУсловия»
Процедура ВыполнитьТекущуюЗадачу()
Результат = ПараллельныйКонтроль;
// Если ТекущаяЗадача.ПроверитьВыполнение() Тогда
ТекущаяЗадача.ПолучитьОбъект().ВыполнитьЗадачу();
// КонецЕсли;
Предположим (для начала), что был выбран вариант с параллельным
контролем (т. е. контролер может установить отметку об успешности/
КонецПроцедуры неуспешности результатов исполнения раньше, чем сам исполнитель
зарегистрирует факт исполнения). При таком варианте бизнес-процесс
При необходимости перед выполнением задачи можно проверить условия распараллеливается и одновременно переходит к точкам действия Выпол-
ее выполнения методом ПроверитьВыполнение(). нить поручение и Контроль исполнения. В каждой из них формирование
В дальнейшем этот механизм выполнения задач будет использоваться задач производится программно в обработчике события Перед созданием
в других задачах бизнес-процессов Поручение и Согласование. задач. Текст обработчика для точки действия Выполнить поручение имеет
следующий вид (листинг 14.58).
Перед выполнением задачи Выдача поручений, созданной в точке Выдать
поручение, необходимо проверить: не пустой ли текст поручения, Листинг 14.58. Обработчик события «ПередСозданиемЗадач»
определен ли его исполнитель. Данные проверки выполняются в обра-
ботчике события Перед выполнением. Текст обработчика приведен ниже Процедура ВыполнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса,
ФормируемыеЗадачи, СтандартнаяОбработка)
(листинг 14.56).
Задача = Задачи.Задача.СоздатьЗадачу();
Листинг 14.56. Обработчик события «ПередВыполнением» Задача.БизнесПроцесс = Ссылка;
Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса;
Процедура ВыдатьПоручениеПередВыполнением(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) Задача.Дата = ТекущаяДата();
Задача.Приоритет = Приоритет;
Отказ = Ложь; Задача.КонтрольныйСрок = КонтрольныйСрок;

// Проверяется заполнение хотя бы одного реквизита, Если Не Исполнитель.Пустая() Тогда
// который будет использоваться в качестве значений Задача.Сотрудник = Исполнитель;
// реквизита адресации задачи. КонецЕсли;
Если Исполнитель.Пустая()
И Если Не ИсполнительРоль.Пустая() Тогда
ИсполнительРоль.Пустая() Задача.РольИсполнителя = ИсполнительРоль;
И КонецЕсли;
ИсполнительОтдел.Пустая() Тогда
Если Не ИсполнительОтдел.Пустая() Тогда
Отказ = Истина; Задача.Подразделение = ИсполнительОтдел;
КонецЕсли; КонецЕсли;

Если ПустаяСтрока(ТекстПоручения) Тогда Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи;
Отказ = Истина;
КонецЕсли; Если Не ПустаяСтрока(Тема) Тогда
Задача.Наименование = Задача.Наименование + ": " + Тема;
КонецПроцедуры КонецЕсли;

В идеальном случае такую же проверку необходимо было бы реализовать ФормируемыеЗадачи.Добавить(Задача);
и для сотрудника, осуществляющего контроль исполнения поручения.
СтандартнаяОбработка = Ложь;
После выполнения задачи бизнес-процесс переходит к точке проверки
условия. В ней производится выбор варианта выполнения бизнес-про- КонецПроцедуры
цесса. Выбор осуществляется в соответствии со значением реквизита

92 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

В качестве значений реквизитов адресации задачи устанавливаются Рассмотрим поведение бизнес-процесса в случае, когда в точке проверки
значения из соответствующих реквизитов бизнес-процессов. Обработчик условия Параллельный контроль? выполнение бизнес-процесса пойдет
события Перед созданием задач для точки действия Контроль исполнения по ветви Нет.
имеет такой же код, за исключением того, что реквизиты адресации В соответствии с картой маршрута бизнес-процесс переходит к точке
задачи заполняются значениями реквизитов бизнес-процесса, связанных действия Выполнить поручение (2).
с сотрудником, выполняющим контроль.
Обработчик события Перед созданием задач для точки действия Выпол-
При активации данной задачи выполняется следующий код обработ- нить поручение используется такой же, как и у точки Выполнить поручение
чика события ОбработкаПолученияФормы модуля менеджера задачи при выполнении параллельного контроля (листинг 14.60).
(листинг 14.59).
Листинг 14.60. Обработчик события «ПередСозданиемЗадач»
Листинг 14.59. Обработчик события «ОбработкаПолученияФормы»
Процедура ВыполнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса,
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ФормируемыеЗадачи, СтандартнаяОбработка)
ДополнительнаяИнформация, СтандартнаяОбработка)
Задача = Задачи.Задача.СоздатьЗадачу();
Если ВидФормы = "ФормаОбъекта" Тогда Задача.БизнесПроцесс = Ссылка;
ЗадачаСсылка = Параметры.Ключ; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса;
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Задача.Дата = ТекущаяДата();
... Задача.Приоритет = Приоритет;
Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. Задача.КонтрольныйСрок = КонтрольныйСрок;
Поручение.ТочкиМаршрута.ВыполнитьПоручение Или
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. Если Не Исполнитель.Пустая() Тогда
Поручение.ТочкиМаршрута.ВыполнитьПоручение2 Или Задача.Сотрудник = Исполнитель;
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. КонецЕсли;
Поручение.ТочкиМаршрута.КонтрольИсполнения Или
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. Если Не ИсполнительРоль.Пустая() Тогда
Поручение.ТочкиМаршрута.КонтрольИсполнения2 Тогда Задача.РольИсполнителя = ИсполнительРоль;
ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения"; КонецЕсли;
Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс;
Параметры.Вставить("Задача",ЗадачаСсылка); Если Не ИсполнительОтдел.Пустая() Тогда
СтандартнаяОбработка = Ложь; Задача.Подразделение = ИсполнительОтдел;
КонецЕсли; КонецЕсли;
...
КонецЕсли; Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи;

КонецПроцедуры Если Не ПустаяСтрока(Тема) Тогда


Задача.Наименование = Задача.Наименование + ": " + Тема;
Ее выполнение приводит к открытию формы ФормаПоручения, форма КонецЕсли;
задачи при этом не открывается.
ФормируемыеЗадачи.Добавить(Задача);
Выполнение задачи осуществляется с помощью ссылки на задачу
в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как СтандартнаяОбработка = Ложь;
описано на стр. 91. КонецПроцедуры
После того как обе задачи будут выполнены, бизнес-процесс пройдет
точку слияния и перейдет к точке проверки условия Снято с контроля? В качестве значений реквизитов адресации задачи устанавливаются
В обработчике проверки условия проверяется значение реквизита Отмет- значения из соответствующих реквизитов бизнес-процессов.
каОСнятииСКонтроля (устанавливается интерактивно в форме ФормаПору- При активации вызывается та же процедура, что определена
чения сотрудником, осуществляющим контроль, и означает, что поручение для точки Выполнить поручение при выполнении параллельного контроля
выполнено). Если поручение не выполнено, производится возврат к точке (листинг 14.61).
проверки условия Параллельный контроль? В другом случае бизнес-про-
цесс завершается (осуществляется переход к точке завершения).

Том 2
93
Глава 14. Бизнес-процессы
Листинг 14.61. Обработчик события «ОбработкаПолученияФормы» содержат пустые ссылки, бизнес-процесс переходит по ветви Нет к своему
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,
завершению. Если выполнение пошло по ветви Да, в соответствии с картой
ДополнительнаяИнформация, СтандартнаяОбработка) бизнес-процесса производится переход к точке действия Контроль испол-
нения. Обработчики событий у данной точки описаны таким же образом,
Если ВидФормы = "ФормаОбъекта" Тогда
ЗадачаСсылка = Параметры.Ключ;
как и в точке Контроль исполнения при параллельном варианте проведения
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); контроля.
...
Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. После выполнения задачи, созданной в точке маршрута Контроль испол-
Поручение.ТочкиМаршрута.ВыполнитьПоручение Или нения, бизнес-процесс переходит к точке проверки условия Снято
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. с контроля? В случае успешного выполнения поручения (критерии были
Поручение.ТочкиМаршрута.ВыполнитьПоручение2 Или
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. описаны ранее) бизнес-процесс завершается.
Поручение.ТочкиМаршрута.КонтрольИсполнения Или
ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.
Поручение.ТочкиМаршрута.КонтрольИсполнения2 Тогда Бизнес-процесс «Обход»
ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения";
Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Данный бизнес-процесс позволяет выдавать последовательные поручения
Параметры.Вставить("Задача",ЗадачаСсылка); (выполняемые друг за другом). Первоначально должен выполнить пору-
СтандартнаяОбработка = Ложь;
КонецЕсли; чение сотрудник, значащийся первым в списке, потом второй и т. д.
... Карта бизнес-процесса имеет следующий вид (рис. 14.52).
КонецЕсли;

КонецПроцедуры

Ее выполнение приводит к открытию формы ФормаПоручения, форма


задачи при этом не открывается.
Выполнение задачи осуществляется с помощью ссылки на задачу
в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как
описано на стр. 91.
После выполнения задачи бизнес-процесс переходит к точке проверки
условия Нужен контроль? Обработчик проверки условия содержит следу-
ющий текст (листинг 14.62).

Листинг 14.62. Обработчик события «ПроверкаУсловия» Рис. 14.52. Карта маршрута бизнес-процесса

Процедура НуженКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)


Следует обратить внимание на тот факт, что в данной карте нет ни одной
Результат = Истина; точки действия, но есть точка вложенного бизнес-процесса. В свойстве
Если Контролер.Пустая() БизнесПроцесс данной точки выбрано значение Поручение.
И
КонтролерРоль.Пустая() У бизнес-процесса определена табличная часть Участники со следующим
И составом реквизитов табличной части (табл. 14.18).
КонтролерОтдел.Пустая() Тогда

Результат = Ложь; Таблица 14.18. Реквизиты табличной части бизнес-процесса
КонецЕсли;
Реквизит табличной части Тип
КонецПроцедуры Сотрудник СправочникСсылка.Сотрудники
РольИсполнителя СправочникСсылка.РолиИсполнителей
В процедуре производится проверка на заполненность какого-либо Подразделение СправочникСсылка.Подразделения
реквизита, значение которого может использоваться в качестве значения НаименованиеЗадачи Строка
реквизитов адресации задачи. Если все соответствующие реквизиты ПризнакОбхода Булево

94 Профессиональная разработка в системе «1С:Предприятие 8»


Примеры реализации бизнес-процессов

В точке старта обработчик события Перед стартом не определен, поэтому Для текущей строки табличной части (со значением признака,
после старта бизнес-процесс без предварительной обработки переходит равным Ложь) настраиваем полученный через параметр бизнес-про-
к точке вложенного бизнес-процесса. В данной точке определен обра- цесс. После этого стартуем его, и при этом выбирается точка старта
ботчик события При создании вложенных бизнес-процессов. Текст СтартБезАвтора бизнес-процесса Поручение. Реквизит табличной части
обработчика приведен в листинге 14.63. ПризнакОбхода устанавливается в значение Истина. Далее производим
выход из процедуры-обработчика.
Листинг 14.63. Обработчик события «ПриСозданииВложенныхБизнесПроцессов»
Исходя из заполняемых у вложенного бизнес-процесса свойств, можно
Процедура ОбходПриСозданииВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, с уверенностью сказать, что именно при такой настройке бизнес-процесса
ФормируемыеБизнесПроцессы, Отказ)
из всей определенной для вложенного бизнес-процесса карты маршрута
Для Каждого Элемент Из Участники Цикл будет использоваться следующий фрагмент (рис. 14.53).
Если Не Элемент.ПризнакОбхода Тогда
Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл

// Настраиваем вложенный бизнес-процесс.
Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель;

Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда
Процесс.Тема = Процесс.ВедущаяЗадача.Наименование;
Иначе
Процесс.Тема = Элемент.НаименованиеЗадачи;
КонецЕсли;

Процесс.Исполнитель = Элемент.Сотрудник;
Процесс.ИсполнительРоль = Элемент.РольИсполнителя;
Процесс.ИсполнительОтдел = Элемент.Подразделение;
Процесс.ПараллельныйКонтроль = Ложь;
Процесс.Записать();
Процесс.Старт(БизнесПроцессы.Поручение.ТочкиМаршрута.СтартБезАвтора);
Элемент.ПризнакОбхода = Истина;
КонецЦикла;

Записать();
Возврат; Рис. 14.53. Карта маршрута бизнес-процесса
КонецЕсли;
КонецЦикла; После завершения вложенного бизнес-процесса ведущая задача (поро-
дившая бизнес-процесс) завершается, и осуществляется переход к точке
КонецПроцедуры
проверки условия Обошли весь список? (с именем УсловиеОбхода).
При переходе к точке вложенного бизнес-процесса системой создается Обработчик проверки условия имеет следующий вид (листинг 14.64).
одна задача (иного не было определено программно). На каждую задачу
(у нас она одна) создается вложенный бизнес-процесс. У создан- Листинг 14.64. Обработчик события «ПроверкаУсловия»
ного бизнес-процесса в свойство ВедущаяЗадача записывается ссылка
Процедура УсловиеОбходаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
на задачу, ее породившую. После этого производится вызов обработчика
события При создании вложенных бизнес-процессов. Через параметр Для Каждого Элемент Из Участники Цикл
ФормируемыеБизнесПроцессы передается массив сформированных Если Не Элемент.ПризнакОбхода Тогда
Результат = Ложь;
вложенных бизнес-процессов (в нашем случае один элемент). Возврат;
После этого производится обход табличной части бизнес-процесса. КонецЕсли;
КонецЦикла;
Ищется строка, в которой реквизит табличной части ПризнакОбхода
установлен в значение Ложь (обхода данной задачи еще не было). Результат = Истина;
Следует отметить, что могут использоваться и другие данные по адре-
сации (не обязательно явно указывать сотрудника). КонецПроцедуры

Том 2
95
Глава 14. Бизнес-процессы

В обработчике проверяется, есть в табличной части строки, в которых Таблица 14.19. Реквизиты бизнес-процесса
признак обхода установлен в значение Ложь. Если таких строк нет, Реквизит Тип
то производится завершение бизнес-процесса, в противном случае ДокументНаСогласование ДокументСсылка
осуществляется переход на точку вложенного бизнес-процесса. Инициатор СправочникСсылка.Сотрудники
Обобщенно вышеописанный алгоритм можно представить в виде следу- КонтрольныйСрок Дата
ющей схемы (рис. 14.54). Важное Булево
Согласовано Булево
ОбработатьРецензии Булево
ПовторноеСогласование Булево
Пояснение Строка

Определена табличная часть Рецензии (для указания списка рецензентов


и получения рецензий), табл. 14.20.

Таблица 14.20. Реквизиты табличной части бизнес-процесса

Реквизит табличной части Тип


Рецензент СправочникСсылка.Сотрудники
РольИсполнителя СправочникСсылка.РолиИсполнителей
Подразделение СправочникСсылка.Подразделения