От экспертов «1С‑Рарус»: Оптимизация производительности 1С:Документооборота. Часть 1
От экспертов «1С‑Рарус»: Оптимизация производительности 1С:Документооборота. Часть 1

От экспертов «1С‑Рарус»: Оптимизация производительности 1С:Документооборота. Часть 1

25.04.2024
194 мин
1445

Оглавление

  1. Устраняем замедление при работе пользователя в 1С:ДО с одновременными правами доступа основного сотрудника и сотрудника по совместительству
    1. Роли и дескрипторы доступа
    2. Право по касанию в 1С:Документообороте
    3. Как дескрипторы используются в шаблонах ограничения доступа?
    4. Используем функционал замещения сотрудника для устранения подтормаживания
  2. Ускорение работы АРМ «Задачи мне» с помощью повторного использования возвращаемых значений
  3. Дополнительная настройка производительности 1С:ДО
    1. Механизм реанимации «безуспешных» задач
    2. Отложенное обновление прав доступа
    3. Корректировки параметров выполнения регламентных заданий
    4. Периодический контроль очереди в регистрах
  4. Библиотека интеграции с «1С:Документооборот» (обмен данными)
    1. Общая информация про библиотеку интеграции «1С:Документооборот» (БИД)
    2. Отправка данных из базы 1С:ERP УХ в 1С:ДО
    3. Отправка данных из базы «1С:Документооборот» в 1С:ERP УХ
  5. Заключение
  6. Дополнительные материалы

1. Устраняем замедление при работе пользователя в 1С:ДО с одновременными правами доступа основного сотрудника и сотрудника по совместительству

К нам обратился клиент с жалобой, что подтормаживает открытие АРМ «Задачи мне», АРМ «Задачи подчиненных» и списки документов. Клиент использует конфигурацию «1С:Документоборот КОРП, версия 3» (3.0.7.28, версия платформы 8.3.22.2283). В системе работает 2 000 пользователей.

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

Скриншот АРМ «Задачи мне» из демо базы

Скриншот АРМ «Задачи мне» из демо базы (рис. 01)

Скриншот АРМ «Задачи подчиненных» из демо базы

Скриншот АРМ «Задачи подчиненных» из демо базы (рис. 02)

Скриншот списка справочника «Документы предприятия» из демо базы

Скриншот списка справочника «Документы предприятия» из демо базы (рис. 03)
Пользователь является руководителем и имеет доступ к задачам подчиненных. На данном проекте у таких пользователей в системе заведены несколько записей в справочнике сотрудник. У каждого такого сотрудника свои роли доступа.

Роли и дескрипторы доступа

Немного расскажем, как работают роли доступа. Вся система расчета прав «1С:Документооборота» (1С:ДО) построена на дескрипторах доступа.

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

Что такое дескриптор в «1С:Документообороте» по информации из ИТС?

(its.1c.ru/db/pubdocflow300quest/content/296/hdoc)

В первых версиях программы «1С:Документооборот»:

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

В актуальной версии «1С:Документооборот 3»:

  • Используется стандартная подсистема «1С:Предприятия» — «Управление доступом».
  • Расчет прав доступа происходит:
    • Либо сразу при записи.
    • Либо в режиме «Отложенного обновления доступа».
  • Решается проблема медленного чтения списков при сложных запросах к данным с ограниченным доступом.

Вся система прав построена на так называемых «дескрипторах доступа»:

  • Дескриптор — это специальный объект, содержащий ключевые поля, от которых зависит доступ к объектам данных.
  • Эти данные объединены в дескриптор по идентичным ключевым полям (организация, гриф доступа, вид документа, папка и другие).
  • Права доступа рассчитываются и создаются не для каждого объекта данных, а для дескриптора доступа.
  • Число дескрипторов на порядки меньше, чем число объектов данных.
  • В зависимости от настроек, их число может быть в 100–10 000 раз меньше, чем число самих объектов.

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

Схема работы дескриптора в ограничениях доступа (рис. 04)

В «1С:Документообороте» дескриптор — это справочник «Дескриптор доступа объектов», который объединяет объекты и права доступа пользователей.

Пример дескриптора — три вкладки ниже.

 

Форма справочника «Дескриптор доступа объектов», Ключевые поля

Форма справочника «Дескриптор доступа объектов», Ключевые поля (рис. 05)

На вкладке «Дескриптор» следующие реквизиты:

  • Объект данных — метаданные «Справочник.ДокументыПредприятия».
  • Вид объекта — элемент из справочника «Виды документов».
  • Гриф доступа — что такое «гриф доступа» и зачем он нужен см. на ИТС (its.1c.ru/db/pubdocflow300quest/content/21/hdoc).
  • Организация — элемент из справочника «Организации».

 

Форма справочника «Дескриптор доступа объектов», Права доступа

Форма справочника «Дескриптор доступа объектов», Права доступа (рис. 06)

На вкладке «Права доступа» отображен список сотрудников с типом доступа, данные получены из РС «Права по дескрипторам доступа объектов».

 

Форма справочника «Дескриптор доступа объектов», Объекты

Форма справочника «Дескриптор доступа объектов», Объекты (рис. 07)

На вкладке «Объекты» отображены объекты для данного дескриптора.

 

Как мы видим на данном примере, один дескриптор из демонстрационной базы объединил в себе 9 сотрудников и 17 объектов.

А вот пример реального дескриптора из рабочей базы. Он объединяет 390 сотрудников и 1736 объектов:

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

Скрин реального дескриптора из рабочей базы (рис. 08)

Преимущества работы ролей доступа через дескрипторы:

  • Повышение производительности при работе со списками объектов.
  • Упрощение администрирования прав доступа.
  • Повышение безопасности системы.

Недостатки:

  • Необходимость более тщательного планирования системы прав доступа.
  • Некоторое увеличение сложности настройки системы*.
* «1С Документооборот» имеет более сложную систему прав доступа по сравнению с 1С:ERP. В 1С:ERP права доступа основаны на ролях (в профилях и группах доступа). В 1С:ДО помимо ролей используются такие настройки доступа: граф доступа, группы доступа по контрагентам, доступ по виду документа, доступ по рабочим группам, расширение прав руководителей (доступ к подчиненным) и др.

Для того чтобы посмотреть, какие права доступа к документу назначены в соответствии с дескриптором, пользователь может открыть карточку документа и перейти по кнопке ЕщеДокумент → команда Права доступа (см. its.1c.ru/db/pubdocflow300quest#content:295:hdoc):

Контекстное меню формы спр. «Документы предприятия»

Контекстное меню формы спр. «Документы предприятия» (рис. 09)

Открыв форму мы видим две вкладки. На первой список сотрудников с типом доступа:

Общая форма «Документооборот права доступа по объекту», вкладка «Права»

Общая форма «Документооборот права доступа по объекту», вкладка «Права» (рис. 10)

На второй вкладке мы видим список дескрипторов, связанных с данным объектом:

Общая форма «Документооборот права доступа по объекту», вкладка «Дескрипторы»

Общая форма «Документооборот права доступа по объекту», вкладка «Дескрипторы» (рис. 11)

Право по касанию в 1С:Документообороте

Право по касанию — это принцип предоставления доступа к информации, основанный на взаимодействии пользователя с документом.

Суть:

  • Пользователи автоматически получают права на чтение и изменение дополнительных связанных документов, если они участвуют в определенных бизнес-процессах.
  • Это упрощает работу, устраняя необходимость в ручном назначении прав для каждого документа.

Пример:

  • Сотрудник получает задачу по договору.
  • Автоматически он получает права на:
    • Чтение дополнительных соглашений к этому договору.
    • Просмотр других задач, связанных с этим же договором.

Настройка:

  • Права по касанию включены по умолчанию в редакции 3.0.
  • Настройки можно изменить:
    • Ограничить доступ к конфиденциальным документам.
    • Предоставить дополнительные права определенным группам пользователей.

Преимущества:

  • Экономия времени: не нужно вручную настраивать права.
  • Удобство: пользователи имеют доступ к необходимой информации.
  • Повышение безопасности.

Дополнительно про права доступа можно узнать здесь:

  1. ИТС, Настройка прав доступа, its.1c.ru/db/doccorp21#content:791:hdoc.
  2. Канал на ютубе «1С:Документооборота»: Настройка прав доступа в «1С:Документообороте». Частые вопросы пользователей:

Как дескрипторы используются в шаблонах ограничения доступа?

Ниже шаблон RLS:

// Примеры использования шаблона:
//	#ПоДескрипторуОбъекта("", "")
//	#ПоДескрипторуОбъекта("Изменение", "")
//	#ПоДескрипторуОбъекта("", "Документ")
//	#ПоДескрипторуОбъекта("ИзменениеИлиДобавление", "Мероприятие")
//	#ПоДескрипторуОбъекта("ИзменениеИлиДобавление", "Мероприятие", "БезРуководителейИДелегатов")

#Если &ДокументооборотИспользоватьОграниченияПравДоступа #Тогда
	
	ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
	
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДескрипторыДляОбъектов КАК ДескрипторыДляОбъектов
	#Если "#Параметр(2)" = "" #Тогда
		ПО ТекущаяТаблица.Ссылка = ДескрипторыДляОбъектов.Объект
	#Иначе
		ПО ТекущаяТаблица.#Параметр(2) = ДескрипторыДляОбъектов.Объект
	#КонецЕсли
	
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПраваПоДескрипторамДоступаОбъектов КАК ПраваПоДескрипторамДоступаОбъектов
	ПО ДескрипторыДляОбъектов.Дескриптор = ПраваПоДескрипторамДоступаОбъектов.Дескриптор
	
	ГДЕ ПраваПоДескрипторамДоступаОбъектов.Сотрудник В (&СотрудникиПользователя)
	
	#Если "#Параметр(1)" = "Изменение" #Тогда
		И ПраваПоДескрипторамДоступаОбъектов.Изменение
	#ИначеЕсли "#Параметр(1)" = "ИзменениеИлиДобавление" #Тогда
		И (ПраваПоДескрипторамДоступаОбъектов.Изменение
			ИЛИ ПраваПоДескрипторамДоступаОбъектов.Добавление)
	#КонецЕсли
	
	#Если "#Параметр(3)" = "БезРуководителейИДелегатов" #Тогда
		И ПраваПоДескрипторамДоступаОбъектов.ОбъектОснование = НЕОПРЕДЕЛЕНО
	#КонецЕсли
	
#КонецЕсли

В запросе RLS участвуют три таблицы:

  1. Текущая таблица — это данные (объекты), к которым происходит запрос, например, от пользователя к списку документов.
  2. РС «Права по дескрипторам доступа объектов» — Связь дескриптора и сотрудника.
  3. РС «Дескрипторы для объектов» — Связь дескриптора и объекта.

И один параметр: &СотрудникиПользователей — сюда передаются все сотрудники пользователя.

Задача дескрипторов — уменьшить количество записей в запросах путем объединения схожих прав доступа по объектам и сотрудникам. Однако, так как в РС «Права по дескрипторам доступа объектов» связь хранится в разрезе сотрудников, то количество записей будет увеличиваться пропорционально количеству сотрудников пользователя, даже если у этих сотрудников пользователя есть пересечение доступов между объектами.

Используем функционал замещения сотрудника для устранения подтормаживания

Гипотеза: из опыта предыдущих внедрений и согласно идеям изложенным в статье выше мы предположили, что подтормаживание связано с ролевой системой и решили поэкспериментировать с дескрипторами.

Суть идеи: в 1С:ДО есть функционал замещения сотрудника, поэтому можно попробовать уменьшить количество дескрипторов за счет объединения доступов основного сотрудника и сотрудников по совместительству, затем передать в RLS значение только основного сотрудника. Предполагаем, что за счет уменьшения количества дескрипторов, запросы по RLS начнут отрабатывать быстрее.

Действия по шагам:

  1. Сделать при помощи типового механизма «замещение» сотрудников по совместительству на основного сотрудника. В системе создаются доп. дескрипторы доступа по основному сотруднику, взяв права доступа из сотрудников по совместительству, где общее количество дескрипторов основного сотрудника по итогу выходит меньше, чем количество в сумме отдельных дескрипторов по всем сотрудникам.

    В подсистеме «Совместная работа» → Замещающие → Создать.

    Форма элемента справочника «Замещающие и помощники»

    Форма элемента справочника «Замещающие и помощники» (рис. 12)
  2. Выполнить регламентное задание «Обновление прав доступа (долгое)» для пересчета прав доступа по дескрипторам. Что такое обновление прав доступа смотрите в статье ниже.
  3. Скорректировать параметры запроса RLS для пользователей, у которых настроено замещение неосновных сотрудников: вместо передачи в запрос всех сотрудников пользователя, передавать только значение основного сотрудника.

    Примечание: для сотрудников, у которых не настроено замещение не основных сотрудников, остается типовой функционал.

Что получаем: уменьшается время получения результатов запроса по ролям доступа, за счет уменьшения таблицы РС «ПраваПоДескрипторамДоступаОбъектов» в запросе RLS (рис. 13). Данный запрос отрабатывает каждый раз при работе со списком и элементам справочников документов предприятия, задач и других объектов, завязанных на правах доступа по дескрипторам, что в целом дает прирост при работе в системе.

Количество записей в регистрах до и после замещения сотрудника на нашем примере:

Метаданные До замещения
(Основной сотрудник + по совместительству)
После замещения
(Только основной с правами на сотрудников по совместительству)
РС ПраваПоДескрипторамДоступаОбъектов (ППДДО)
33 370 14 727
РС ППДДО внутреннее соединение РС «Декскрипторы для объектов»
13 244 132 7 763 395

Как это выглядит на уровне планов запроса?

Текст запроса на SQL можно посмотреть здесь.

Открытие списка документов без доработки:

План запросов без замещения сотрудника

План запросов без замещения сотрудника (рис. 13)
  • InfoR9162 — РС «Права по дескрипторам доступа объектов», параметры несколько сотрудников (красный периметр) и соединяется с таблицей InfoRg7120 (зеленый прямоугольник).
  • InfoRg7120 — РС «Дескрипторы для объектов», далее идет соединение с таблицей.
  • InfoRg6909 — РС «Данные документов предприятия».

Открытие списка документов с доработкой:

План запросов с замещением сотрудника

План запросов с замещением сотрудника (рис. 14)

Текст запроса этого плана можно посмотреть здесь, отличия в 50 строке (в передаваемом списке сотрудников).

Как мы видим количество получаемых данных из РС «Права по дескрипторам доступа объектов» уменьшилось (красный периметр), в результате уменьшилось и время с 0,459 сек до 0,005 сек (зелёный периметр).

Гипотеза: после оптимизации изменился план запросов, а именно работа по таблице InfoR9162. Как мы выше писали с доработкой отправляется только одно значение параметра &СотрудникиПользователей вместо списка сотрудников. Скорее всего это послужило причиной для построителя планов запроса SQL отказаться от операции индексирования и сортировки, на которые уходило 0,454 сек.

Про особенности использования группового оператора вхождения можно почитать на ИТС (its.1c.ru/db/metod8dev/content/2499/hdoc):

Графическое отображение разницы в 50 строке двух запросов

Графическое отображение разницы в 50 строке двух запросов (рис. 15)

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

Посмотрим полностью на план запроса при обращение к списку справочника «Документы предприятия».

До оптимизации общее время было 1,295 сек:

Полная схема плана запроса без замещения сотрудника

Полная схема плана запроса без замещения сотрудника (рис. 16)

С оптимизацией общее время стало 0,351 сек.

Полная схема плана запроса с замещением сотрудника

Полная схема плана запроса с замещением сотрудника (рис. 17)

Итог: мы получили 0,94 сек прироста при запросе к списку справочника «Документы предприятия». На первый взгляд прирост чуть меньше одной секунды выглядит малорезультативным. Но как мы знаем, RLS участвует всегда при обращении пользователями с ограниченными правами к данным, что добавляет данное время к любым обращения пользователя к базе данных.

Замеры мы делали на сервере разработке на копии базы без конкуренции на данные регистры. К сожалению, замеры на рабочей базе нам не удалось сделать. Как мы писали выше, в базе работает 2 000 пользователей и данные регистры используются высокоинтенсивно, что может вызвать конкуренцию и, как следствие, увеличение времени выполнения запросов RLS при ожиданиях на дисках и/или другом оборудовании.

Со слов пользователя: пропали неожиданные подвисание при открытии и перелистывании списка документов и задач.

Описанное в первой главе статьи решение может давать прирост производительности, если у вас используются неосновные сотрудники и их более двух на физ. лицо. Рассмотрим далее ещё несколько кейсов повышения производительности 1С:ДО.

2. Ускорение работы АРМ «Задачи мне» с помощью повторного использования возвращаемых значений

Расскажем еще один случай по «1С:Документооборот». Жалоба от пользователя на долгое открытие АРМ «Задачи мне».

Мы сделали первичный замер производительности и увидели несколько узких мест в коде:

  1. Многократный вызов ГруппировкаПо[вид группировки] по группировкам для каждой элемента группировки в АРМ Задачи:

    Многократный вызов ГруппировкаПо[вид группировки] по группировкам для каждой элемента группировки в АРМ Задачи

    (рис. 18)
  2. Многократный вызов функции в менеджере объекта ПользователиСлужебный.СвойстваНеуказанногоПользователя():

    Многократный вызов функции в менеджере объекта ПользователиСлужебный.СвойстваНеуказанногоПользователя()

    (рис. 19)

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

Исключительная блокировка не устанавливается, т. к. элемент уже существует. При 448 циклах уходит более 30 секунд на проверки и блокировки.

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

Пример варианта решения:

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

Пример кода, вынесенного в общий модуль с повторным использованием (рис. 20)

Установлен параметр повторного использования на период времени сеанса

Установлен параметр повторного использования на период времени сеанса (рис. 21)

Метод повторного использования позволил ускорить открытие формы задач «Задачи мне», как минимум, на 30 секунд.

Также о методе повторного использования возвращаемых значений можете узнать больше на ресурсе ИТС:

  1. its.1c.ru/db/v8324doc/bookmark/dev/ti000000181,
  2. its.1c.ru/db/v8std/content/459/hdoc,
  3. its.1c.ru/db/v8std/content/724/hdoc.

3. Дополнительная настройка производительности 1С:ДО

Механизм реанимации «безуспешных» задач

«1С:Документооборот» использует систему связанных регламентных заданий. Например, когда пользователь согласует задачу, система не сразу создает новые задачи для других участников бизнес-процесса. Сначала задание попадает в справочник «Очередь заданий документооборота», а затем по регламенту эти задания обрабатываются.

Существует множество видов заданий:

  • Задания для уведомлений (по почте, пуш).
  • Задания для обработки очередей (Диспетчер обработки очереди заданий, Запуск обработки заданий).
  • Обмены с интеграционными системами.
  • Создание новых задач по бизнес-процессу.
  • Обновление кэширующих данных.
  • Различные регламентные задания по контролю (приближение окончания сроков действия, сроков, указанных в заявках на оплату, сроков контроля и прочих).
  • и т. п.
Подробнее о регламентных заданиях в «1С:Документооборот» можно почитать на its.1c.ru/db/doc30#content:279:hdoc.

Эти задания не всегда могут быть выполнены в порядке очереди по следующим причинам:

  • Объект заблокирован пользователем (например, при интерактивной работе пользователя с задачей).
  • Превышено время ожидания на блокировках.
  • Высокая нагрузка может быть вызвана пересечением пространств (например, массовое уведомление), а также высокой нагрузкой на оборудование.

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

Решение: выполнять неуспешные задания в течение дня в менее нагруженное время (в данном случае, ночью), предварительно сбросив счетчик неудачных попыток выполнения в 0.

Решение по шагам

1. Сброс ошибок в ночное время:

  • Справочник «Очередь заданий документооборота».
  • РС «Очередь обновления кэширующих данных».

Форма списка справочника «Очередь заданий документооборота»

Форма списка справочника «Очередь заданий документооборота» (рис. 22)

Форма списка РС «Очередь обновления кэширующих данных»

Форма списка РС «Очередь обновления кэширующих данных» (рис. 23)

2. Запуск регламентных заданий по обработке очереди заданий.

Разработать рег. задание, которое будет сбрасывать ошибки и попытки. Пример кода:

Процедура СброситьПопытки() Экспорт 
	
	Отказ = Ложь;
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
			Метаданные.РегламентныеЗадания.СброситьПопытки, Отказ);

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

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

		КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Регламентное задание.Сбросить попытки.Сброс попыток очереди обновления'", КодОсновногоЯзыка),
								 УровеньВажностиСобытия, , , ТекстСообщения); 
	КонецПопытки;		
	
КонецПроцедуры

Отложенное обновление прав доступа

Как мы писали ранее, расчет прав доступа в «1С:Документообороте» — это отдельный сложный процесс. В отличие от других систем, например, 1С:ERP, где права доступа основаны на ролях (в профилях и группах доступа) и большая часть прав доступна сразу после применения настроек, в 1С:ДО требуется производить расчёт прав доступа. Для этого используется механизм отложенного обновления прав доступа.

Что об этом говорит ИТС
(its.1c.ru/db/updinfo#content:1558:hdoc:issogl2_1.13_обновление_прав_доступа):

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

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

Что произойдет — система немедленно запустит перерасчет прав доступа для:

  • Корневой папки (от которой идет корректировка).
  • Всех дочерних папок.
  • Всех данных, содержащиеся в этих папках.

Последствия:

  • Процесс может занять длительное время.
  • Вы не сможете продолжить работу с программой до завершения пересчета, а это может занять очень длительное время.

Теперь сравним с включенным отложенным обновлением.

Что произойдет:

  • Система сразу обновит права доступа только к корневой папке.
  • Задание на перерасчет прав доступа дочерних папок будет помещено в очередь.

Преимущества:

  • Работа в программе не прерывается.
  • Перерасчет происходит в фоновом режиме.

Форма списка РС «Очередь обновления прав доступа»

Форма списка РС «Очередь обновления прав доступа» (рис. 24)

Виды очередей на обновление прав доступа

В повседневной работе формируется оперативная очередь, которая обрабатывается за считанные секунды. В «долгую» очередь попадают задания, чтобы не мешать оперативной очереди, которые потенциально могут обрабатываться от 10 секунд и более до нескольких часов.

«Оперативная» очередь:

  • Для задания отрабатывающих до 10 секунд.
  • Обрабатывается регламентным заданием «Обновление прав доступа (оперативное)».

«Долгая» очередь:

  • Для задания отрабатывающих более 10 секунд.
  • Обрабатывается регламентным заданием «Обновление прав доступа (долгое)».

Обе очереди обрабатываются разными регламентными заданиями и не мешают друг другу.

Примеры процедур и функций, которые добавляют задания в очередь:

Процедура/Функция Описание

ОбновитьПраваВсехДанных()

Тип очереди: Долгая

Обновляет сведения о правах доступа всех данных информационной базы

ОпределитьПраваОбъектовТаблицы()

Тип очереди: Долгая

Определяет права доступа для всех объектов указанной таблицы

ОпределитьПраваОбъектовТаблицыДляЛокальныхАдминистраторов()

Тип очереди: Долгая

Определяет права для локальных администраторов, подробнее см. its.1c.ru/db/doc30/content/232/hdoc.

РассчитатьПраваОбъектовТаблицы()

Тип очереди: Долгая

Определяет права доступа для всех объектов указанной таблицы.

ОбновитьПраваВсехРазрезовДоступа()

Тип очереди: Долгая

Обновляет сведения о правах доступа всех разрезов доступа — организаций, видов документов и т. д.

АктуализироватьПраваСотрудниковПоСоставуСубъектов()

Тип очереди: Долгая

Обновляет права дескрипторов, доступных сотрудникам, в части руководителей и делегатов.
// Параметры:
// СотрудникиОтбор — Сотрудник, Массив — сотрудники, по правам которых будут отобраны дескрипторы

АктуализироватьПраваСотрудниковПодразделенийПоССПД()

Тип очереди: Долгая

Обновляет права дескрипторов, доступных сотрудникам подразделения, в части руководителей и делегатов.
// Параметры:
// Подразделения — Массив — подразделения, по правам сотрудников которых будут отобраны дескрипторы

ОбновитьПраваПоСоставуКонтейнеров()

Тип очереди: Долгая

Пересчитывает права, зависящие от состава переданных контейнеров.
// Параметры:
// ИзмененныеКонтейнеры — Массив — массив контейнеров

ОбновитьПраваПоЗначениюРазрезаДоступа()

Тип очереди: Долгая

Обновляет права всех дескрипторов, которые содержат ссылку на значение разреза доступа.

ПереопределитьДескрипторыЗависимыхОбъектов()

Тип очереди: Долгая

Переопределяет дескрипторы объектов, зависимых от данного.
// Параметры:
// ОбъектВладелец — Ссылка — ссылка на объект, зависимые объекты которого нужно обработать

ОбновитьПраваПоКонтрагенту()

Тип очереди: Долгая

Обновляет права документов с указанным контрагентом.

ОбновитьПраваПоПапке()

Тип очереди: Оперативная

Обновляет права всех дескрипторов, которые имеют ссылку на переданную папку.

ОтключитьДескрипторыЛокАдминистраторов()

Тип очереди: Долгая

Удаляет связи между объектами и дескрипторами лок. администраторов.

ОбновитьРолиПользователей()

Тип очереди: Оперативная

Обновляет список ролей пользователей информационной базы по их текущим принадлежностям к группам доступа.

Пользователи с ролью «ПолныеПрава» игнорируется.

// Параметры:
Пользователи — СправочникСсылка.Пользователи,
СправочникСсылка.ВнешниеПользователи.

// Массив значений указанных выше типов.

  • Неопределено — обновить роли всех пользователей.
  • Тип по которому будет найден объект метаданных: если будет найден Справочник.ВнешниеПользователи, то будут обновлены роли всех внешних пользователей, иначе будут обновлены роли всех пользователей.

ОбновитьПрава(ДескрипторСсылка, ПротоколРасчетаПрав = Неопределено, Немедленно = Неопределено)

Тип очереди: Оперативная/Долгая

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

// Параметры:

  • ДескрипторСсылка — Ссылка — дескриптор
  • ПротоколРасчетаПрав — Массив — протокол расчета, который будет показан пользователю

Приоритет — тип очереди (задается в параметре).

ОбновитьПрава()

Тип очереди: Оперативная/Долгая

Обновляет права по указанному дескриптору доступа.

Приоритет — тип очереди (задается в параметре).

Регламентное задание «Обновление прав доступа долгое» (рекомендация) — по умолчанию запуск каждые 10 сек.

В нашем внедрении «1С:Документооборота» полный пересчет прав доступа достаточен только раз в сутки. Так как процесс вычисления прав по дескрипторам трудоемкий и занимает более 3–4 часов. Это создает высокую нагрузку на сервер и может влиять на работу пользователей.

Решение

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

Преимущества:

  • Снижение нагрузки на сервер в активный период работы системы.
  • Снижение задержек и блокировок в работе системы в рабочее время.
  • Повышение производительности системы в течение дня.

Как сделать:

  1. Настройте регламентное задание «Обновление прав доступа (долгое)» на запуск в ночное (нерабочее) время.

    Для этого перейдите в Настройки → Поддержка и обслуживание → Регламентные и фоновые задания → Обновление прав доступа (долгое) → Настроить расписание.

  2. Протестируйте работу регламентного задания в тестовой среде.
  3. Внесите изменения в продуктовую среду.
Важно: стоит учесть, что новые права доступа вступают в силу только после отработки регламента «Обновления прав доступа». Желательно предупредить об этом клиента и показать возможность точечного обновление прав доступа по требованию пользователя.

Точечное обновление прав доступа

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

Но если у вас есть понимание работы с правам доступа в «1С:Документообороте», то в системе предоставляется возможность запуска обновления прав точечно. Для этого перейдите в форму списка РС «Очередь обновления прав доступа»: Настройки → Права доступа → Управление расчетом прав:

Форма списка РС «Очередь обновления прав доступа»

Форма списка РС «Очередь обновления прав доступа» (рис. 25)

Для точечного обновления прав доступа выделите нужные строки и обновите права при помощи команды Обработать → Выбранные.

Окно сообщения, при включенном регламенте «обновление прав доступа»

Окно сообщения, при включенном регламенте «обновление прав доступа» (рис. 26)

При включенном регламенте «Обновление прав доступа (долгое)» — ручной вариант запуска обработки прав доступа запрещен.

Чтобы запустить в ручном режиме пересчет прав доступа, необходимо временно отключить использование регламентного задания:

Выключение регламент Обновление прав доступа долгое

Выключение регламент Обновление прав доступа долгое (рис. 27)

Также есть еще один инструмент — обработка «Обновление прав доступа»: Функции для тех. специалиста → Обновление прав доступа (Обработки). Ниже преставлены скриншоты:

Страница выбора варианта выбора обновления прав доступа

Страница выбора варианта выбора обновления прав доступа (рис. 28)

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

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

Отборы по выбранным объектам

Отборы по выбранным объектам (рис. 30)

Количество объектов и расчетное время обновления прав доступа

Количество объектов и расчетное время обновления прав доступа (рис. 31)

При помощи данной обработки можно создать задание на полный пересчет прав доступа или выборочно указать объекты, по которым необходимо сделать пересчет прав доступа.

Подробнее про работу с данной обработкой смотрите на ИТС: its.1c.ru/db/updinfo#content:1558:hdoc:issogl2_1.13_обновление_прав_доступа.

Корректировки параметров выполнения регламентных заданий

Ниже рекомендации не универсального характера. Для каждого параметра указано, по какой причине мы сделали изменения. Для «Что сделано» указаны значения полученные опытным путем на одном из наших внедрений.

Параметр «Число потоков выполнения коротких заданий»

Что сделано: значение по умолчанию 5 было заменено в нашем внедрении на 7 потоков (увеличена интенсивность).

Почему: реальная очередь в пиковой нагрузке в справочнике «Очередь Заданий Документооборота» была большой. Путем экспериментов было выбрано новое оптимальное количество потоков, соответствующее нагрузке на оборудование.

Число потоков выполнения длительных заданий на сервере

Что сделано: значение по умолчанию 2 было заменено на 4 (увеличена интенсивность).

Почему: реальная очередь в пиковой нагрузке в справочнике «Очередь Заданий Документооборота» была большой. Путем экспериментов было выбрано новое значение, соответствующее возможностям оборудования.

Регламентное задание «Обмен данными с интегрированными системами»

Что сделано: изменено с 300 секунд по умолчанию, на каждые 30 секунд.

Почему: в нашем внедрении требовалось иметь быстрый возврат статусов документов, поэтому частота запусков была увеличена.

Регламентное задание: «Извлечение текста»

Извлекает текст из файлов популярных форматов для дальнейшего использования в полнотекстовом поиске.

Что сделано: было 85 секунд, стало 850 секунд.

Почему: в 1С:Документообороте большое количество регламентных заданий при частом запуске которых возникает высокая нагрузка на оборудование. В консоли администрирования увидели, что данный регламент долго выполяняется, потребляет повышенное количество процессорного времени и памяти.*

Регламентное задание: «Обновление индекса ППД»

Обновляет дополнительный индексный файл полнотекстового поиска. Если отключить данное регламентное задание, поиск новых объектов с помощью полнотекстового поиска будет невозможен.

Что сделали: было 60 секунд, стало 600 секунд.

Почему: в консоли администрирования увидели, что данный регламент долго выполяняется, потребляет повышенное количество процессорного времени и памяти.*

* Примечание: заметим, что обновление может существенно занимать ресурсы сервера, поэтому стоит рассмотреть возможность переноса данных регламентов на нерабочее время или уменьшить их интенсивность. Однако, следует учесть, что ряд сущностей не не будут обновленными до завершения работы регламента, а потому не будут учитываться при полнотекстовом поиске.

Периодический контроль очереди в регистрах

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

РС «ОчередьОбновленияКэширующихДанных»

Рекомендуемое значение: должно стремиться к «0» в течение дня.

Регламентное задание:

  • Обновление кэширующих данных.

В течение дня при активной работе пользователей данный регистр «растет». В данном регистре не должны накапливаться ошибки.

Справочник ОчередьЗаданийДокументооборота

Рекомендуемое значение: должно стремиться к «0», не должно быть срок не отработанных задач которых больше 1 суток.

Регламентное задание:

  • Диспетчер обработки очереди заданий.

РС «ОчередьСообщенийВИнтегрированныеСистемы»

Рекомендуемое значение: должно стремиться к «0», не должно быть пакетов, которые не отправлены больше 1 суток.

Регламентное задание:

  • Обмен данными с интегрированными системами.

РС «ИсторияОтправкиСообщенийВИнтегрированныеСистемы»

Рекомендуемое значение: Смотрите разрыв между значениями «Дата Создания» и «Дата Отправки». Разница между ними должна быть не более 1 минуты.

Регламентное задание:

  • Обмен данными с интегрированными системами.

РС ОчередьОбновленияПравДоступ (Оперативные и Долгие)

Рекомендуемое значение: Оперативные (тип) должны стремиться к «0» в течение дня. Долгие (тип) — быть пустым к началу рабочего дня.

Регламентное задание:

  • Обновление прав доступа (оперативное).
  • Обновление прав доступа (долгое)*.

РС «ОчередьУведомлений»

Рекомендуемое значение: Должно стремиться к «0» в течение дня.

Регламентное задание:

  • Уведомление пользователей о произошедших событиях.

4. Библиотека интеграции с «1С:Документооборот» (обмен данными)

Общая информация про библиотеку интеграции «1С:Документооборот» (БИД)

Библиотека интеграции с 1С:Документооборотом (БИД) — это инструмент, который позволяет объединить прикладное решение на «1С:Предприятие 8» с 1С:Документооборотом.

Список прикладных решений, где БИД встроен:

Список прикладных решений, где БИД встроен

(рис. 32)

Актуальный список для «1С:Документооборот, Ред. 2»: its.1c.ru/db/doccorp21/content/800/hdoc.

Актуальный список для «1С:Документооборот, Ред. 3»: its.1c.ru/db/doc30#content:278:hdoc.

Как работает БИД?

Визуальная схема БИД и Веб-сервиса

Визуальная схема БИД и Веб-сервиса (рис. 33)

БИД использует веб-сервис 1С:Документооборота DMService:

Подсистема «Интеграция» в 1С:Документообороте

Подсистема «Интеграция» в 1С:Документообороте (рис. 34)

Библиотека интеграции встраивается в прикладное решение на базе «1С:Предприятия 8»:

Пример встроенной подсистемы «Интеграции с 1С:Документооборотом

Пример встроенной подсистемы «Интеграции с 1С:Документооборотом (рис. 35)

Больше информации о библиотеке:

  • Сайт «1С:Документооборот»: v8.1c.ru/doc8/integratsiya-s-lyubymi-resheniyami/.
  • Документация по БИД: its.1c.ru/db/biddoc.
  • Скачать БИД: releases.1c.ru/project/DMIL3. Так же здесь представлена информация об изменениях.

Веб-сервис DMService

DMService — это веб-сервис в «1С: Документообороте», который позволяет интегрировать другое прикладное решение на «1С:Предприятие 8».

Что DMService делает:

  • Предоставляет доступ к объектам 1С:Документооборота — документам, файлам, задачам, процессам и т. д.
  • Позволяет выполнять операции с этими объектами — создавать, редактировать, удалять, получать информацию.
  • Обеспечивает бесшовную интеграцию — вы можете работать с документами 1С:Документооборота прямо из интерфейса 1С:Предприятия.

Как работает DMService:

  • Использует XDTO-пакет DM — набор объектов, осуществляющих собой представления объектов 1С:Документооборота.
  • Поддерживает одну операцию — execute.
  • Результат операции — объект-потомок DMResponse.
  • В случае ошибки — возвращается DMError с описанием ошибки.

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

  • Создаем запрос DMGetObjectListRequest.
  • Указываем тип объекта (DMInternalDocument).
  • Определяем условие запроса (поиск по наименованию).
  • Выполняем запрос.
  • Разбираем ответ, заполняя таблицу названиями и идентификаторами найденных документов.

Важно:

  • Перед использованием получите версию и редакцию сервиса запросом DMGetVersionRequest.
  • Доработки рекомендуется вносить в модуль ОбработкаЗапросовXDTO Переопределяемый.

Библиотека интеграции 1С:Документооборота (БИД)

  1. Не является самостоятельным решением: предназначена для встраивания в прикладные решения на платформе 1С:Предприятие.
  2. Может использоваться: с любыми версиями 1С:Документооборота, начиная с редакции 1.2.

Подробнее: its.1c.ru/db/metod8dev#content:5889:hdoc.

Отправка данных из базы 1С:ERP УХ в 1С:ДО

Теперь расскажем наш опыт при внедрении интеграции между конфигурацией 1С:ERP УХ и «1С:Документооборот».

Пользователь пришел к нам с ошибкой «Превышено время ожидания», при отправки документов на согласование из 1С:ERP УХ в «1С:Документооборот»:

Ошибка на экране пользователя

Ошибка на экране пользователя (рис. 36)

Подробнее по ошибке

Подробнее по ошибке (рис. 37)

Первое, что мы попробовали — увеличили время таймаута ожидания веб-сервиса в 1С:Документообороте.

Значение по умолчанию «Времени жизни сеанса»: 20 секунд

Значение по умолчанию «Времени жизни сеанса»: 20 секунд (рис. 38)

Проведя эксперимент мы получили по таким документам время выполнения 5–7 минут, что является неприемлемым. Далее начали разбирать причину. Оказалось, что из 1С:ERP УХ в типовом решении библиотеки интеграции по обмену в 1С:ДО отправляется весь реквизитный состав, в том числе и табличные части:

На скрине часть кода общего модуля

На скрине часть кода общего модуля (рис. 39)

// Формирует универсальную структуру входящих данных, предназначенную для загрузки объектов в 1С:Документооборот.
//
// Параметры:
//   Прокси - WSПрокси - объект для подключения к web-сервисам Документооборота.
//   СсылкаНаОбъектИС - ЛюбаяСсылка - объект ИС, источник данных заполнения.
//   СписокВыражений - Массив из Строка - список выражений на встроенном языке, которые требуется выполнить на
//     стороне ИС.
//
// Возвращаемое значение:
//   ОбъектXDTO - объект XDTO типа DMIncomingData.
//
Функция ВходящиеДанныеОбъектаИС(Прокси, СсылкаНаОбъектИС, СписокВыражений) Экспорт
	
	ОбъектИС = СсылкаНаОбъектИС.ПолучитьОбъект();
	
	ОбъектМетаданных = ОбъектИС.Метаданные();
	
	Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных)
			И Не ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных) Тогда
		ВызватьИсключение СтрШаблон(
			НСтр("ru = 'Входящие данные можно сформировать только для объектов типа Справочник или Документ.
				|Объект %1 имеет тип %2';
				|en = 'You can generate incoming data only for the Catalog or Document type object.
				|Object %1 is of the %2 type'"),
			СсылкаНаОбъектИС,
			ОбъектМетаданных.ПолноеИмя());
	КонецЕсли;
	
	Результат = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СоздатьОбъект(Прокси, "DMIncomingData");
	
	// Стандартные реквизиты
	Результат.attributes.Добавить(
		ПреобразоватьРеквизитОбъектаИСВОбъектXDTO(Прокси, "Представление", Строка(СсылкаНаОбъектИС)));
	
	ЗаполнитьРеквизитыИзМетаданных(Прокси, Результат.attributes, ОбъектМетаданных.СтандартныеРеквизиты, ОбъектИС, Истина);
	
	// Реквизиты
	ЗаполнитьРеквизитыИзМетаданных(Прокси, Результат.attributes, ОбъектМетаданных.Реквизиты, ОбъектИС);
	
	// Табличные части
	Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
		
		Если ТабличнаяЧасть.Имя = "ДополнительныеРеквизиты" Тогда
			Продолжить;
		КонецЕсли;
		
		Колонки = Новый Массив;
		Для Каждого Реквизит Из ТабличнаяЧасть.СтандартныеРеквизиты Цикл
			Колонки.Добавить(Реквизит);
		КонецЦикла;
		Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
			Колонки.Добавить(Реквизит);
		КонецЦикла;
		
		Результат.tabularSections.Добавить(ПреобразоватьТаблицуОбъектаИСВОбъектXDTO(
			Прокси,
			ТабличнаяЧасть.Имя,
			ОбъектИС[ТабличнаяЧасть.Имя],
			Колонки));
		
	КонецЦикла;
	
	// Данные из выражений на встроенном языке
	ЗаполнитьДанныеИзСпискаВыражений(Прокси, ОбъектИС, Результат, СписокВыражений);
	
	// Дополнительные реквизиты
	Если УправлениеСвойствами.ИспользоватьДопРеквизиты(СсылкаНаОбъектИС) Тогда
		ЗаполнитьРеквизитыИзМетаданных(
			Прокси,
			Результат.attributes,
			УправлениеСвойствами.СвойстваОбъекта(СсылкаНаОбъектИС, Истина, Ложь),
			ОбъектИС,,
			Истина);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Что мы имеем:

  • Излишняя работа — система тратит ресурсы на обработку данных, которые не всегда необходимы.
  • Превышение таймаута — по умолчанию таймаут обработки веб-сервиса составляет 20 секунд и его может быть недостаточно для обработки объемных документов.
  • Длительное ожидание для пользователя — из-за вышеперечисленных причин отправка и обработка документа может занимать много времени.

В нашем случае:

  • Объемная таблица графика поставок — более 1 000 строк, что являлось основной причиной длительного ожидания.
  • Не было необходимости отправлять все данные реквизитного состава, включая объемные табличные части.

Решение:

  • Оптимизация отправки документов — отправлять только необходимые данные, не включать в структуры ненужные реквизиты и табличные части.

Мы отключили формирование всех табличных частей в пакете сообщения, так как на нашем проекте внедрения они не требовались в 1С:Документообороте.

Пример реализации с помощью использования аннотации &ИзменениеИКонтроль препроцессора #Удалить и #КонецУдалить в расширении (про механизм можно почитать здесь wonderland.v8.1c.ru/blog/razvitie-mekhanizma-rasshireniy-konfiguratsii-15/):

Пример реализации с помощью использования аннотации &ИзменениеИКонтроль препроцессора #Удалить и #КонецУдалить в расширении

(рис. 40)

Если в вашем случаи нужно ограничить только для какого то вида метаданных, то можете добавить одноименные условные сравнивая с переменной:

ОбъектМетаданных

ОбъектМетаданных

(рис. 41)

Как сверять метаданные можно почитать здесь its.1c.ru/db/metod8dev/content/2465/hdoc.

Либо ограничить только по наименованию табличной части:

ОбъектМетаданных

(рис. 42)

Важно:

  • Оценить влияние оптимизации — после внесения изменений в код необходимо протестировать систему и оценить влияние оптимизации на производительность.
  • Обратиться к актуальной документации — подробная информация о работе с веб-сервисом и возможных ошибках содержится в документации к веб-сервису (dl03.1c.ru/content/DMIL/3_0_2_6/UpdateDMIL.htm, актуальная ссылка указана в релизе БИД)

Примечание: в типовом решении БИД отправляет весь перечень реквизитного состава, т. к. его можно использовать полностью в правилах настройках интеграции. Если же вы столкнулись подобной проблемой, можете воспользоваться нашим опытом.

Отправка данных из базы «1С:Документооборот» в 1С:ERP УХ

Расскажем еще один случаи в обмене данных, на этот раз из «1С:Документооборот» в 1С:ERP УХ.

Заказчик жалуется на медленную скорость возврата статусов согласования из 1С:ДО в 1С:ERP УХ, а иногда вовсе статусы не возвращаются.

Немного расскажем, как работает формирование и отправка пакета сообщений в «1С:Документооборот».

По шагам:

  1. Происходит регистрация в плане обмена по узлу (в нашем примере 1С:ERP УХ) по изменениям РС «Текущие состояния документов» и изменениям справочника «Документы предприятия». Регистрацию изменений может вызвать множество событий, например, при согласовании в бизнес-процессе:

    Форма списк РС «Текущие состояние документов»

    Форма списк РС «Текущие состояние документов» (рис. 43)
  2. Далее рассмотрим работу регламентного задания «Обмен данными с интегрированными системами» более детально:
    • Запрос данных: задание выполняет запрос, определенный в функции ПолучитьДанныеДляПередачи() общего модуля «ОбработкаЗапросовXDTOОбмен». Эта функция отвечает за извлечение данных, подлежащих обмену.
    • Массив данных: на выходе функции ПолучитьДанныеДляПередачи() формируется массив данных, который содержит информацию о зарегистрированных изменениях.
    • Формирование сообщений: на основе полученного массива данных регламентное задание формирует сообщения, предназначенные для передачи в интегрированные системы. Эти сообщения хранятся в регистре сведений «Очередь сообщений в интегрированные системы».
    • Снятие регистрации изменений: после успешного формирования сообщений регламентное задание снимает регистрацию изменений с плана обмена по регистру сведений «Текущие состояния документов» и справочнику «Документы предприятия». Это означает, что те изменения, которые уже были обработаны и учтены в процессе обмена данными, больше не будут учитываться при последующих запусках задания.

      Форма списка РС «Очередь сообщений в интегрированные системы»

      Форма списка РС «Очередь сообщений в интегрированные системы» (рис. 44)

      Пример сообщения, просмотр через форму записи РС «Очередь сообщений в интегрированные системы»

      Пример сообщения, просмотр через форму записи РС «Очередь сообщений в интегрированные системы» (рис. 45)
  3. После формирования очереди сообщений происходит отправка сообщения через веб-сервис. Код отправки сообщения в интегрированную систему. Общий модуль «ОбработкаЗапросовXDTOОбмен» процедура ОтправитьДанные():
    Пока Выборка.Следующий() Цикл
    		
    	ИдентификаторСообщения = Выборка.Идентификатор;
    		
    	Попытка
    			
    		Прокси = РаботаСИнтегрированнымиСистемамиПовтИсп.ПолучитьПрокси(Выборка.ИнтегрированнаяСистема);
    			
    		Запрос = РаботаСИнтегрированнымиСистемами.СоздатьОбъект(Прокси, "DMILPutChangesRequest");
    		Запрос.messageData = Выборка.Данные.Получить();
    		Запрос.DMXMLSchema = СхемаПакетаDM;
    		Запрос.versionNumber = ВерсияСервиса;
    			
    		Результат = Прокси.execute(Запрос);
    			
    		Если РаботаСИнтегрированнымиСистемами.ПроверитьТип(Прокси, Результат, "DMILError") Тогда
    			ВызватьИсключение Результат.description;
    		Иначе
    				РегистрыСведений.ИсторияОтправкиСообщенийВИнтегрированныеСистемы.ПеренестиСообщениеВИсторию(
    			Выборка.ИнтегрированнаяСистема,
    			Выборка.МоментВремени,
    			ИдентификаторСообщения);
    		КонецЕсли;
    			
    	Исключение
    			
    		ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    			
    		ЗаписьЖурналаРегистрации(
    			РаботаСИнтегрированнымиСистемами.ИмяСобытияЖурналаРегистрации(
    					НСтр("ru = 'Отправка данных'", ОбщегоНазначения.КодОсновногоЯзыка())),
    			УровеньЖурналаРегистрации.Ошибка,
    			Метаданные.РегистрыСведений.ОчередьСообщенийВИнтегрированныеСистемы,
    			Строка(ИдентификаторСообщения),
    			ТекстСообщенияОбОшибке);
    			
    		МенеджерЗаписи = РегистрыСведений.ОчередьСообщенийВИнтегрированныеСистемы.СоздатьМенеджерЗаписи();
    		МенеджерЗаписи.ИнтегрированнаяСистема = Выборка.ИнтегрированнаяСистема;
    		МенеджерЗаписи.МоментВремени = Выборка.МоментВремени;
    		МенеджерЗаписи.Идентификатор = ИдентификаторСообщения;
    		МенеджерЗаписи.Прочитать();
    		МенеджерЗаписи.КоличествоПопытокОтправки = МенеджерЗаписи.КоличествоПопытокОтправки + 1;
    		МенеджерЗаписи.ТекстСообщенияОбОшибке = ТекстСообщенияОбОшибке;
    		МенеджерЗаписи.Записать();
    			
    	КонецПопытки;
    	
    КонецЦикла;
  4. В случае успешного выполнения отправки сообщения запись в регистре «Очередь сообщений в интегрированные системы» удаляется. И создается запись в РС «ИсторияОтправкиСообщенийВИнтегрированныеСистемы». Все пакеты обрабатываются в одной конструкции Попытка-Исключение. Если хотя бы один элемент в пакете с ошибкой, все остальные элементы пакета уже не обрабатываются.

    Форма списка РС «ИсторияОтправкиСообщенийВИнтегрированныеСистемы»

    Форма списка РС «ИсторияОтправкиСообщенийВИнтегрированныеСистемы» (рис. 46)

Один пакет сообщения содержит следующие элементы:

  • DMDocument — реквизитная часть документов.
  • DMApprovalStateRecord — статус по документу.

Какие проблемы возможны:

  • Из-за ошибки в одном элементе пакета данных может не передаваться весь пакет данных, т. е. по всем документам и статусам не будут приняты изменения в базе приемника.
  • На стороне базы приемника, в нашем случае ERP, могут не успеть обработаться все элементы за 20 секунд и мы получим «Превышение времени ожидания обработки при таймауте при работе с внешними ресурсами». Таймаут 20 секунд является значением по умолчанию.

Далеко не всегда база приемник может обработать весь объем данных за 20 секунд под общей высокой нагрузкой.

Приведем пример пакета сообщения, который сформировался после небольшого сбоя или ожидания. Сейчас не будем брать во внимание, по какой причине данный сбой мог произойти. Регламентное задание «Обмен с интегрированными системами» не работало 30–60 минут, что может быть вполне возможно в реальной жизнь, хоть и далеко не в штатной ситуации.

Пример пакета сообщения, который сформировался после небольшого сбоя или ожидания

(рис. 47)

Данный пакет содержит около 400 сообщений, которые накопились в системе за 30–60 минут. В нашей системе работает 2 000 пользователей и за 30–60 минут может легко набраться подобный объем данных. Этот пакет содержит более 90 тысяч строк и обработать его базе приемнику в выделенный таймаут будет трудоемко, даже если не будет никаких ошибок во всем пакете сообщения.

Что мы сделали:

  • Разделили формирования пакета сообщения реквизитной части DMDocument и статусной части (DMApprovalStateRecord).
  • Под каждый объект стали формировать свой пакет сообщения.

Какими пакеты сообщения стали:

Пример сообщения DMDocument

Пример сообщения DMDocument (рис. 48)

Пример сообщения DMApprovalStateRecord

Пример сообщения DMApprovalStateRecord (рис. 49)

Каждый пакет сообщения стал по реквизитной части (DMDocument)не более 300 строк, по статусной (DMApprovalStateRecord ) не более 10 строк.

Вариант реализации в коде — в общем модуле «ОбработкаЗапросовXDTOОбмен» процедура «СоздатьНовоеСообщение» для этого участка кода. Типовой код формирования сообщения:

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
	
НачатьТранзакцию();
	
Попытка
		
	ВыгрузитьМассивXDTOВСообщение(
		ИнтегрированнаяСистема,
		ИмяВременногоФайла,
		ЗаписьXML,
		ОбъектыXDTO,
		ЗаписиXDTO);
		
	ПланыОбмена.УдалитьРегистрациюИзменений(ИнтегрированнаяСистема, НомерСообщения);
		
Исключение
	ЗаписьXML.Закрыть();
	ОтменитьТранзакцию();
	Если НайтиФайлы(ИмяВременногоФайла).Количество() > 0 Тогда
		УдалитьФайлы(ИмяВременногоФайла);
	КонецЕсли;
		
	ЗаписьЖурналаРегистрации(
		РаботаСИнтегрированнымиСистемами.ИмяСобытияЖурналаРегистрации(
			НСтр("ru = 'Формирование сообщения обмена'", ОбщегоНазначения.КодОсновногоЯзыка())),
		УровеньЖурналаРегистрации.Ошибка,,,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	ВызватьИсключение;
КонецПопытки;
	
ЗафиксироватьТранзакцию()

Добавить два цикла по таблице ОбъектыXDTO и ЗаписиXDTO. Пример кода по данным ОбъектыXDTO:

#Вставка
		
Для Каждого ЭлементЗаписиXDTO Из ЗаписиXDTO Цикл
		
	откНомерСообщения = откНомерСообщения + 1;		
	
	откОбъектыXDTO = Новый Массив;		
		
	откЗаписиXDTO = Новый Массив;
	откЗаписиXDTO.Добавить(ЭлементЗаписиXDTO);
		
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
		
	НачатьТранзакцию();
		
	Попытка
			
		ВыгрузитьМассивXDTOВСообщение(
		ИнтегрированнаяСистема,
		ИмяВременногоФайла,
		ЗаписьXML,
		откОбъектыXDTO,
		откЗаписиXDTO);
			
		ПланыОбмена.УдалитьРегистрациюИзменений(ИнтегрированнаяСистема, откНомерСообщения);
			
	Исключение
		ЗаписьXML.Закрыть();
		ОтменитьТранзакцию();
		Если НайтиФайлы(ИмяВременногоФайла).Количество() > 0 Тогда
			УдалитьФайлы(ИмяВременногоФайла);
		КонецЕсли;
			
		ЗаписьЖурналаРегистрации(
		РаботаСИнтегрированнымиСистемами.ИмяСобытияЖурналаРегистрации(
		НСтр("ru = 'Формирование сообщения обмена'", ОбщегоНазначения.КодОсновногоЯзыка())),
		УровеньЖурналаРегистрации.Ошибка,,,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		//ВызватьИсключение;
	КонецПопытки;
		
	ЗафиксироватьТранзакцию();
КонецЦикла;
#КонецВставки

Пример кода по данным ЗаписиXDTO:

#Вставка
откНомерСообщения = НомерСообщения;
Для Каждого ЭлементОбъектаXDTO Из ОбъектыXDTO Цикл
		
	Если НЕ откНомерСообщения = НомерСообщения Тогда
		откНомерСообщения = откНомерСообщения + 1;
	КонецЕсли;
	откОбъектыXDTO = Новый Массив;
	откОбъектыXDTO.Добавить(ЭлементОбъектаXDTO);
		
	откЗаписиXDTO = Новый Массив;
		
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
		
	НачатьТранзакцию();
		
	Попытка
			
		ВыгрузитьМассивXDTOВСообщение(
		ИнтегрированнаяСистема,
		ИмяВременногоФайла,
		ЗаписьXML,
		откОбъектыXDTO,
		откЗаписиXDTO);
			
		ПланыОбмена.УдалитьРегистрациюИзменений(ИнтегрированнаяСистема, откНомерСообщения);
			
	Исключение
		ЗаписьXML.Закрыть();
		ОтменитьТранзакцию();
		Если НайтиФайлы(ИмяВременногоФайла).Количество() > 0 Тогда
			УдалитьФайлы(ИмяВременногоФайла);
		КонецЕсли;
			
		ЗаписьЖурналаРегистрации(
		РаботаСИнтегрированнымиСистемами.ИмяСобытияЖурналаРегистрации(
		НСтр("ru = 'Формирование сообщения обмена'", ОбщегоНазначения.КодОсновногоЯзыка())),
		УровеньЖурналаРегистрации.Ошибка,,,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		//ВызватьИсключение;
	КонецПопытки;
	
	ЗафиксироватьТранзакцию();
КонецЦикла;
	
	
#КонецВставки

Результат:

  • Каждый объект в отдельном пакете.
  • Малый объем пакета сообщения позволяет успешно выполняться в базе приемника в выделенный таймаут.
  • При возникновении ошибок обмен не останавливается, фиксируется ошибка только для данного объекта.

Заключение

Эта первая часть серии статей «Оптимизация производительности 1С:Документооборота». В ней мы рассмотрели различные способы улучшения работы системы «1С:Документооборот» при высоких нагрузках.

Мы разобрались, как работают роли доступа (дескрипторы), провели оптимизацию на АРМ «Задачи мне», составили список рекомендаций по настройкам параметров и определили регистры, требующие особого внимания при интенсивной работе системы. Также мы рассмотрели работу с библиотекой интеграции с 1С:ДО (БИД) и провели оптимизацию пакета обмена сообщениями.

Внедрение высокоинтенсивной системы — это сложный процесс, который требует тщательной настройки и работы. Если все сделано правильно, эта система может значительно увеличить эффективность и конкурентоспособность бизнеса.

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

В следующей статье этой серии мы рассмотрим:

  • Открытие формы элемента справочника «Документы предприятия».
  • Запуск бизнес-процесса (начать обработку).
  • Закрытие формы и запись элемента справочника «Документы предприятия».

Дополнительные материалы

Текст запроса на SQL со списком неосновных сотрудников

(@P1 numeric(10),@P2 varbinary(16),@P3 numeric(10),@P4 varbinary(16),@P5 numeric(10),@P6 numeric(10),@P7 numeric(10),@P8 numeric(10),@P9 varbinary(16))SELECT TOP 45
T1._Fld6912RRef,
T1._Fld6911,
T1._Fld6961,
T1._Fld6910,
T1._Fld6915RRef,
T2._Fld1613,
T1._Fld6943,
T1._Fld6950RRef,
T1._Fld6953_TYPE,
T1._Fld6953_RTRef,
T1._Fld6953_RRRef,
CASE WHEN (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000BC) THEN (T4._Fld3437) WHEN (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000F1) THEN CASE WHEN (NOT (((T5._Fld4208)) = 0x01)) THEN 0x01 WHEN NOT (NOT (((T5._Fld4208)) = 0x01)) THEN 0x00 END ELSE 0x00 END,
T1._Fld6970,
T1._Fld6932,
T1._Fld6944,
T1._Fld6962,
CASE WHEN T2._Fld1593 = 0x01 AND (T1._Fld6947 = 0x00) AND (NOT (((T1._Fld6961 = N'')))) THEN 4.0 WHEN (T2._Fld1597 = 0x00) OR T1._Fld6964 = 0x01 OR (T1._Fld6961 = N'') THEN CASE WHEN (T1._Fld6931 = 0x00) THEN 0.0 WHEN T1._Fld6964 = 0x01 THEN 2.0 ELSE 1.0 END ELSE CASE WHEN (T1._Fld6931 = 0x00) OR T2._Fld1593 = 0x01 AND (T1._Fld6947 = 0x00) THEN 4.0 ELSE 3.0 END END,
CASE WHEN (T1._Fld6967RRef = 0x9ED1EE88CEEE3EBD4B1CCB4C7852FF99) THEN 0.0 WHEN (T1._Fld6967RRef = 0xA53ED317F47A2FDD432C0A911B3012C2) THEN 1.0 WHEN (T1._Fld6967RRef = 0xBDFDC68F010FFCE2476889D93B9A45FC) THEN 2.0 ELSE 3.0 END,
T1._Fld6957,
T1._Fld6934,
CASE WHEN (T1._Fld6973RRef = 0x870D1DA709F6AF1D45259FCEDEFD2665) THEN 0.0 WHEN (T1._Fld6973RRef = 0xA1515E16B207DC16413F631B76F7BD9C) THEN 1.0 WHEN (T1._Fld6973RRef = 0xB2F489A43D079465449307320460B933) THEN 2.0 WHEN (T1._Fld6973RRef = 0x9B26820E7F40332642AA55E3F435788C) THEN 3.0 ELSE CASE WHEN T1._Fld6957 = 0x01 THEN 1.0 ELSE 0.0 END END,
CASE WHEN (T1._Fld6966RRef = 0x978321BE0001E76642E10A917011A3D3) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 1.0 ELSE 3.0 END WHEN (T1._Fld6966RRef = 0x87C2940938835A28445ADC91DCBB0223) THEN 4.0 WHEN (T1._Fld6966RRef = 0xB951457BE98615BA44F94EED2FA871B9) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 5.0 WHEN (T1._Fld6972 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6972 >= {ts '4024-04-04 00:00:00'}) THEN 8.0 ELSE 6.0 END WHEN (T1._Fld6966RRef = 0xA2188ED2B8E8907D44B84819A62CDFFB) THEN 7.0 WHEN (T1._Fld6966RRef = 0x97DE9D14E23C9F8644FF03E523B923B2) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 9.0 ELSE 10.0 END ELSE 0.0 END,
T1._Fld6956,
CASE WHEN (T1._Fld6968RRef IN (0x00000000000000000000000000000000, 0xA62A672DCC749AF443195D1C5A8F4719)) THEN 0.0 WHEN (T1._Fld6968RRef IN (0x87F60C5B5350F40D40B6E32EB78BCA0B, 0x9A21C9E81B9FFDC54E5D928DF9F2396E, 0x8DEF25997DE294E740E892EBA5780BD6, 0xB3C59569DA439EAF417D9C822F243042, 0x87920132C8499B1943C3A3F3B804C3D9, 0x8F57DBDCD0FC0F5347D3ED2251B791DF, 0xBA641BD660E54A72431F144F599716A6)) THEN 1.0 WHEN (T1._Fld6968RRef IN (0x96DEB1BD61D51DD34954A26A436CC4AC, 0x8F738337EF68E3A843638D02119CA26E, 0x92D6C75910EBE4B048C0803C74EC822B, 0xB1A0BFB1677551504E2F51C1D3E0F354, 0xB4BEDDA7BA61B3C145E46CE69DF88007)) THEN 2.0 ELSE 3.0 END,
T1._Fld6977RRef,
ISNULL(T3._Fld9720,0x00),
T1._Fld6918,
CASE WHEN (T1._Fld6939 > 9.0) THEN 10.0 ELSE T1._Fld6939 END,
CASE WHEN (T1._Fld6913RRef = 0xBCC11D3557FB8D1A404EEB04D3B7F89E) THEN 0.0 WHEN (T1._Fld6913RRef = 0xA2A2762E7C48576648F327B69372FF6B) THEN 2.0 ELSE 1.0 END,
T6._Fld12024RRef
FROM dbo._InfoRg6909 T1
LEFT OUTER JOIN dbo._Reference65 T2
ON ((T1._Fld6915RRef = T2._IDRRef)) AND (T2._Fld743 = @P1)
LEFT OUTER JOIN dbo._InfoRg9717 T3
ON (((0x08 = T3._Fld9719_TYPE AND 0x00000069 = T3._Fld9719_RTRef AND T1._Fld6912RRef = T3._Fld9719_RRRef) AND (T3._Fld9718RRef = @P2)) AND (T3._Fld743 = @P3)) AND ((T3._Fld9718RRef = @P4))
LEFT OUTER JOIN dbo._Reference188 T4
ON (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000BC AND T1._Fld6953_RRRef = T4._IDRRef) AND (T4._Fld743 = @P5)
LEFT OUTER JOIN dbo._Reference241 T5
ON (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000F1 AND T1._Fld6953_RRRef = T5._IDRRef) AND (T5._Fld743 = @P6)
LEFT OUTER JOIN dbo._Reference105 T6
ON (T1._Fld6912RRef = T6._IDRRef) AND (T6._Fld743 = @P7)
WHERE (((T1._Fld743 = @P8)) AND (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
INNER JOIN dbo._InfoRg7102 T7
ON (0x08 = T7._Fld7103_TYPE AND 0x00000069 = T7._Fld7103_RTRef AND T1._Fld6912RRef = T7._Fld7103_RRRef)
INNER JOIN dbo._InfoRg9162 T8
ON (T7._Fld7104RRef = T8._Fld9163RRef)
WHERE (((T7._Fld743 = 0.0)) AND (T8._Fld743 = 0.0)) AND (((T8._Fld9164_TYPE = 0x08 AND T8._Fld9164_RTRef = 0x000000BC AND T8._Fld9164_RRRef IN (0xA1EF00505697C8E711ED77B25B384B9A)) OR (T8._Fld9164_TYPE = 0x08 AND T8._Fld9164_RTRef = 0x000000F1 AND T8._Fld9164_RRRef IN (0xA1EF00505697C8E711ED6B4C3245BAA8, 0xA1EF00505697C8E711ED6B48533921F0))))))) AND ((T1._Fld6950RRef = @P9) AND (T1._Fld6911 = 0x00))
ORDER BY (CASE WHEN (T1._Fld6966RRef = 0x978321BE0001E76642E10A917011A3D3) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 1.0 ELSE 3.0 END WHEN (T1._Fld6966RRef = 0x87C2940938835A28445ADC91DCBB0223) THEN 4.0 WHEN (T1._Fld6966RRef = 0xB951457BE98615BA44F94EED2FA871B9) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 5.0 WHEN (T1._Fld6972 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6972 >= {ts '4024-04-04 00:00:00'}) THEN 8.0 ELSE 6.0 END WHEN (T1._Fld6966RRef = 0xA2188ED2B8E8907D44B84819A62CDFFB) THEN 7.0 WHEN (T1._Fld6966RRef = 0x97DE9D14E23C9F8644FF03E523B923B2) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-04 00:00:00'}) THEN 9.0 ELSE 10.0 END ELSE 0.0 END), (T1._Fld6910), (T1._Fld6911), (T1._Fld6912RRef)

Вернуться в статью

Текст запроса на SQL без списка неосновных сотрудников

(@P1 numeric(10),@P2 varbinary(16),@P3 numeric(10),@P4 varbinary(16),@P5 numeric(10),@P6 numeric(10),@P7 numeric(10),@P8 numeric(10),@P9 varbinary(16))SELECT TOP 45
T1._Fld6912RRef,
T1._Fld6911,
T1._Fld6961,
T1._Fld6910,
T1._Fld6915RRef,
T2._Fld1613,
T1._Fld6943,
T1._Fld6950RRef,
T1._Fld6953_TYPE,
T1._Fld6953_RTRef,
T1._Fld6953_RRRef,
CASE WHEN (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000BC) THEN (T4._Fld3437) WHEN (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000F1) THEN CASE WHEN (NOT (((T5._Fld4208)) = 0x01)) THEN 0x01 WHEN NOT (NOT (((T5._Fld4208)) = 0x01)) THEN 0x00 END ELSE 0x00 END,
T1._Fld6970,
T1._Fld6932,
T1._Fld6944,
T1._Fld6962,
CASE WHEN T2._Fld1593 = 0x01 AND (T1._Fld6947 = 0x00) AND (NOT (((T1._Fld6961 = N'')))) THEN 4.0 WHEN (T2._Fld1597 = 0x00) OR T1._Fld6964 = 0x01 OR (T1._Fld6961 = N'') THEN CASE WHEN (T1._Fld6931 = 0x00) THEN 0.0 WHEN T1._Fld6964 = 0x01 THEN 2.0 ELSE 1.0 END ELSE CASE WHEN (T1._Fld6931 = 0x00) OR T2._Fld1593 = 0x01 AND (T1._Fld6947 = 0x00) THEN 4.0 ELSE 3.0 END END,
CASE WHEN (T1._Fld6967RRef = 0x9ED1EE88CEEE3EBD4B1CCB4C7852FF99) THEN 0.0 WHEN (T1._Fld6967RRef = 0xA53ED317F47A2FDD432C0A911B3012C2) THEN 1.0 WHEN (T1._Fld6967RRef = 0xBDFDC68F010FFCE2476889D93B9A45FC) THEN 2.0 ELSE 3.0 END,
T1._Fld6957,
T1._Fld6934,
CASE WHEN (T1._Fld6973RRef = 0x870D1DA709F6AF1D45259FCEDEFD2665) THEN 0.0 WHEN (T1._Fld6973RRef = 0xA1515E16B207DC16413F631B76F7BD9C) THEN 1.0 WHEN (T1._Fld6973RRef = 0xB2F489A43D079465449307320460B933) THEN 2.0 WHEN (T1._Fld6973RRef = 0x9B26820E7F40332642AA55E3F435788C) THEN 3.0 ELSE CASE WHEN T1._Fld6957 = 0x01 THEN 1.0 ELSE 0.0 END END,
CASE WHEN (T1._Fld6966RRef = 0x978321BE0001E76642E10A917011A3D3) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 1.0 ELSE 3.0 END WHEN (T1._Fld6966RRef = 0x87C2940938835A28445ADC91DCBB0223) THEN 4.0 WHEN (T1._Fld6966RRef = 0xB951457BE98615BA44F94EED2FA871B9) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 5.0 WHEN (T1._Fld6972 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6972 >= {ts '4024-04-05 00:00:00'}) THEN 8.0 ELSE 6.0 END WHEN (T1._Fld6966RRef = 0xA2188ED2B8E8907D44B84819A62CDFFB) THEN 7.0 WHEN (T1._Fld6966RRef = 0x97DE9D14E23C9F8644FF03E523B923B2) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 9.0 ELSE 10.0 END ELSE 0.0 END,
T1._Fld6956,
CASE WHEN (T1._Fld6968RRef IN (0x00000000000000000000000000000000, 0xA62A672DCC749AF443195D1C5A8F4719)) THEN 0.0 WHEN (T1._Fld6968RRef IN (0x87F60C5B5350F40D40B6E32EB78BCA0B, 0x9A21C9E81B9FFDC54E5D928DF9F2396E, 0x8DEF25997DE294E740E892EBA5780BD6, 0xB3C59569DA439EAF417D9C822F243042, 0x87920132C8499B1943C3A3F3B804C3D9, 0x8F57DBDCD0FC0F5347D3ED2251B791DF, 0xBA641BD660E54A72431F144F599716A6)) THEN 1.0 WHEN (T1._Fld6968RRef IN (0x96DEB1BD61D51DD34954A26A436CC4AC, 0x8F738337EF68E3A843638D02119CA26E, 0x92D6C75910EBE4B048C0803C74EC822B, 0xB1A0BFB1677551504E2F51C1D3E0F354, 0xB4BEDDA7BA61B3C145E46CE69DF88007)) THEN 2.0 ELSE 3.0 END,
T1._Fld6977RRef,
ISNULL(T3._Fld9720,0x00),
T1._Fld6918,
CASE WHEN (T1._Fld6939 > 9.0) THEN 10.0 ELSE T1._Fld6939 END,
CASE WHEN (T1._Fld6913RRef = 0xBCC11D3557FB8D1A404EEB04D3B7F89E) THEN 0.0 WHEN (T1._Fld6913RRef = 0xA2A2762E7C48576648F327B69372FF6B) THEN 2.0 ELSE 1.0 END,
T6._Fld12024RRef
FROM dbo._InfoRg6909 T1
LEFT OUTER JOIN dbo._Reference65 T2
ON ((T1._Fld6915RRef = T2._IDRRef)) AND (T2._Fld743 = @P1)
LEFT OUTER JOIN dbo._InfoRg9717 T3
ON (((0x08 = T3._Fld9719_TYPE AND 0x00000069 = T3._Fld9719_RTRef AND T1._Fld6912RRef = T3._Fld9719_RRRef) AND (T3._Fld9718RRef = @P2)) AND (T3._Fld743 = @P3)) AND ((T3._Fld9718RRef = @P4))
LEFT OUTER JOIN dbo._Reference188 T4
ON (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000BC AND T1._Fld6953_RRRef = T4._IDRRef) AND (T4._Fld743 = @P5)
LEFT OUTER JOIN dbo._Reference241 T5
ON (T1._Fld6953_TYPE = 0x08 AND T1._Fld6953_RTRef = 0x000000F1 AND T1._Fld6953_RRRef = T5._IDRRef) AND (T5._Fld743 = @P6)
LEFT OUTER JOIN dbo._Reference105 T6
ON (T1._Fld6912RRef = T6._IDRRef) AND (T6._Fld743 = @P7)
WHERE (((T1._Fld743 = @P8)) AND (EXISTS(SELECT
1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
INNER JOIN dbo._InfoRg7102 T7
ON (0x08 = T7._Fld7103_TYPE AND 0x00000069 = T7._Fld7103_RTRef AND T1._Fld6912RRef = T7._Fld7103_RRRef)
INNER JOIN dbo._InfoRg9162 T8
ON (T7._Fld7104RRef = T8._Fld9163RRef)
WHERE (((T7._Fld743 = 0.0)) AND (T8._Fld743 = 0.0)) AND ((T8._Fld9164_TYPE = 0x08 AND T8._Fld9164_RTRef = 0x000000F1 AND T8._Fld9164_RRRef IN (0xA1EF00505697C8E711ED6B4C3245BAA8)))))) AND ((T1._Fld6950RRef = @P9) AND (T1._Fld6911 = 0x00))
ORDER BY (CASE WHEN (T1._Fld6966RRef = 0x978321BE0001E76642E10A917011A3D3) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 1.0 ELSE 3.0 END WHEN (T1._Fld6966RRef = 0x87C2940938835A28445ADC91DCBB0223) THEN 4.0 WHEN (T1._Fld6966RRef = 0xB951457BE98615BA44F94EED2FA871B9) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 5.0 WHEN (T1._Fld6972 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6972 >= {ts '4024-04-05 00:00:00'}) THEN 8.0 ELSE 6.0 END WHEN (T1._Fld6966RRef = 0xA2188ED2B8E8907D44B84819A62CDFFB) THEN 7.0 WHEN (T1._Fld6966RRef = 0x97DE9D14E23C9F8644FF03E523B923B2) THEN CASE WHEN (T1._Fld6971 = {ts '2001-01-01 00:00:00'}) OR (T1._Fld6971 >= {ts '4024-04-05 00:00:00'}) THEN 9.0 ELSE 10.0 END ELSE 0.0 END), (T1._Fld6910), (T1._Fld6911), (T1._Fld6912RRef)

Вернуться в статью

Вы читаете статью из рубрики:
От экспертов «1С-Рарус»

Есть вопросы по статье? Задайте их нам!

Рассылка «Новости компании»: узнавайте о новых продуктах, услугах и спецпредложениях

Посмотреть все рассылки «1С‑Рарус»

Поле не должно быть пустым
Электронная почта указывается только латиницей, обязательно должен присутствовать знак @, доменное имя не может быть короче двух символов

Посмотреть все рассылки «1С-Рарус»

Иконка «Предупреждение» Отправляя эту форму, Вы соглашаетесь с Политикой конфидециальности и даете согласие на обработку персональных данных компанией «1С-Рарус»

Заинтересованы в сотрудничестве?
Нужна консультация?
Свяжитесь с нами!