Жизнь после проведения. Мастерим костыли

20.10.22

Разработка - Механизмы типовых конфигураций

Пробуем отловить момент после окончания проведения документа.

Вступительное слово

Типовые средства платформы не предоставляют события "После проведения", хотя данная тема весьма популярна в поисковиках.

Что же можно использовать из типовых возможностей? Событие "ПослеЗаписиНаСервере" формы объекта документа: "жирный" минус - актуально только для интерактивного проведения из формы объекта. Отчасти можно использовать в каких-то локальных случаях. Но для широкого применения, прежде всего при программном создании документов, данное событие не подходит.

А есть ли что-то в типовых конфигурациях? Если взять семейство конфигурация УТК/КА/ERP, то там можно найти функционал автоматического формирования расходных ордеров на товары. Вкратце алгоритм приблизительно следующий:

  1. Формируется таблица изменений движений документа по регистру накопления ТоварыКОтгрузке
  2. В событии ПриЗаписи модуля набора записей регистра накопления ТоварыКОтгрузке вызывается процедура переоформления ордеров:
    1. Выполняется запись в специальный регистр сведений ОчередьПереоформленияРасходныхОрдеров
    2. В фоновом режиме (в файловом варианте работы не в фоне) запускается процедура переоформления ордеров
    3. После успешного переоформления ордеров регистр сведений ОчередьПереоформленияРасходныхОрдеров очищается

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

 

Практическое применение

Так для чего же нужно отлавливать событие ПослеПроведения? Пример - под спойлером!

 
 Немного предистории: прикладной пример использования

 

Первое приближение

Первое, что пришло в голову - пробуем установить на документ исключительную блокировку: получилось - транзакция проведения завершена. Частично это проблему решило:

  • блокировку установили --> исходный документ проведен --> выполняем нужные действия
  • блокировку установить не удалось --> записываем ссылку на исходный документ в регистр очереди --> регламентным заданием выполняем нужные действия

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

 

Итоговый костыль

Идею попытки установки исключительной блокировки требовалось развить, так как пока это единственный универсальный "железный" метод проверки окончания проведения документа (коллеги, буду рад другим вариантам!). Логично, что необходимо в случае неудачной блокировки сделать паузу и попытаться заблокировать еще раз. Опять приплыли: нативной паузы в платформе нет. На счастье параллельно велась разработка обмена с http-сервисом и на ум пришло http-соединение с указанием таймаута. Как оказалось в последствие, идея оказалась не нова) Итого сложилась следующая картина:

  1. Назначаем количество попыток блокировки документа, чтобы в случае чего не уйти в бесконечный цикл
  2. Определяемся с паузой между попытками блокировки
  3. В качестве паузы используем http-запрос на недоступный ip-адрес

Итоговая функция для проверки окончания проведения документа

 
 Листинг функции
Функция ДождатьсяЗавершенияПроведения(ИсходныйДокумент, Попыток = 5, Таймаут = 5) Экспорт
	
	
	СоединениеФиктивное = Новый HTTPСоединение("1.2.3.4",,,,,Таймаут);
	ЗапросФиктивный 	= Новый HTTPЗапрос("/example");
	

    Для К = 1 По Попыток Цикл
		
		
		Попытка
			
			НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
			Блокировка 				= Новый БлокировкаДанных;
			ЭлементБлокировки 		= Блокировка.Добавить("Документ."+ИсходныйДокумент.Метаданные().Имя);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ИсходныйДокумент);
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

			Блокировка.Заблокировать();
			ЗафиксироватьТранзакцию();
			
			// если удалось заблокировать, то проведение закончено
			Возврат Истина;
			
		Исключение
			
			ОтменитьТранзакцию();
			
		КонецПопытки;
		
		Попытка
			
			// Перед следующей попыткой блокировки документа
			// делаем паузу длительностью в Таймаут секунд
			ОтветПауза = СоединениеФиктивное.Получить(ЗапросФиктивный);
			
			
		Исключение
			
		КонецПопытки;
		
	КонецЦикла;
	
	
	
	Возврат Ложь;

КонецФункции

 

 

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

Данное решение не претендует на "истину в первой инстанции", так что с удовольствием почитаю как критику (не спорю, возможно что-то мог важное упустить), так и альтернативные варианты решения данной задачи!

См. также

Ключи аналитик учета в ЕРП, КА, УТ

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Бесплатно (free)

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

08.11.2023    3721    ids79    21    

62

Распределение по базе среднего в ЗИКГУ 3.1

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 Россия Бюджетный учет Абонемент ($m)

Результат расчета начислений (отпуск, БЛ и т.д.) может распределятся по базе среднего заработка. У таких начислений на вкладке "Налоги, взносы, бухучет" стоит галка "По базе среднего заработка". Но бывают случаи, что данное распределение необходимо скорректировать.

1 стартмани

14.09.2023    312    1    Vlx    0    

1

Расширение типового механизма настройки заполнения бухгалтерской отчетности (на примере конфигурации 1С:ERP. Управление холдингом 3.1.8.15)

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Управление холдингом 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

В статье приведен алгоритм доработок типового механизма настройки заполнения бухгалтерской отчетности на примере конфигурации 1С:ERP. Управление холдингом (3.1.8.15). Цель доработок - сделать процесс настроек более гибким и удобным для пользователей

11.09.2023    1228    ICL-Soft    3    

9

Разбор механизма "Настройки полей формы" в 1С:ERP. Управление холдингом

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье я постараюсь разобрать механизм, который Вам может встретиться на просторах типовой конфигурации 1С:ERP. Управление холдингом. Я не могу гарантировать, что этот механизм не исключат из следующих версий конфигурации (как, собственно, и любой другой). К сожалению, мне не удалось найти его ни в одном модуле конфигурации "Библиотеки стандартных подсистем". Мне он показался интересным, и захотелось более детально во всем этом разобраться.

18.07.2023    1668    it_box    0    

6

Работа с контактной информацией. Часть 2

Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

05.06.2023    4611    biimmap    4    

36

Особенности настройки хранения файлов в томах в конфигурации 1С:Документооборот 3.0

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Документооборот Бесплатно (free)

В данной статье мы рассмотрим, как настроить хранение файлов в томах, тома хранения файлов в 1С, правила размещения файлов в томах и проверку целостности данных тома в 1С:ДО.

30.05.2023    4888    Koder_Line    1    

4

Работа с контактной информацией. Часть 1

Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.05.2023    8007    biimmap    41    

57

Пример использования механизма "Блокировки изменения объектов" (БП, ЗУП, УХ, ЕРП)

Механизмы типовых конфигураций 8.3.14 1С:Бухгалтерия 3.0 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x Россия Абонемент ($m)

Механизм позволяет добавлять обработчики блокировки формы от изменения пользователем с выводом предупреждения "Документ не редактируется по причине:" и указанием причин блокировки. Также по некоторому условию может быть выведена кнопка "Разблокировать форму".

1 стартмани

18.05.2023    4534    9    FilippSerg    1    

28
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. user1466751 15.09.22 10:56 Сейчас в теме
1. В ПриЗаписи документа накладываете исключительную блокировку на него.
2. Запускаете фоновое задание с нужным кодом.
3. В фоном задании в самом начале накладываете неисключительную блокировку на документ.
4. Фоновое ждет окончания транзакции записи документа из п.1 и только после ее окончания продолжает выполнение кода.
5. Профит.

Исключение: массовая запись документов в п.1 в одной транзакции (КД какая-нибудь). Решение: не делать в одной транзакции массовой записи :)
2. RocKeR_13 1046 15.09.22 11:10 Сейчас в теме
(1)
1. В ПриЗаписи документа накладываете исключительную блокировку на него.

Зачем еще раз на проводимый документ устанавливать исключительную блокировку?

Данный алгоритм использовал: довольно часто на п.3 блокировка выпадала в исключение из-за превышения времени ожидания блокировки.
3. user1466751 15.09.22 11:12 Сейчас в теме
(2)
Чтобы фоновое задание дождалось окончания транзакции записи документа.

Чтобы не было превышения времени блокировки не изменяйте в длинной транзакции много документов.
4. RocKeR_13 1046 15.09.22 11:16 Сейчас в теме
(3) При проведении и так накладывается блокировка на документ.

Чтобы не было превышения времени блокировки не изменяйте в длинной транзакции много документов.

Это от лукавого) Контролировать это почти невозможно
5. user1466751 15.09.22 11:29 Сейчас в теме
(4)
Значит, минус первый пункт.

Почему невозможно? Вы же управляете процессами в базе.
В целом первопричина у вас в локальных пиках, но решение с паузой не решает эту проблему. Если транзакции короткие, то и с регистром и ожиданием на блокировке все отработает. Если транзакция длинная, то точно так же после ее завершения у вас вываливается большое количество доков к обработке, что и из РС в пике.
В чем ценность такого решения перед регистром и регзаданием при сохранении длинных транзакций?
6. RocKeR_13 1046 15.09.22 11:38 Сейчас в теме
(5) Я там ничем не управляю: в базу вносят доработки несколько разных компаний + настройки автоматического формирования определяются в пользовательском режиме для произвольных документов + могут запускать закрытие месяца в рабочее время + есть интеграции с сайтом и кучей разных web/http-сервисов. Поэтому я и пишу: в большинстве случаев вами предложенный алгоритм, действительно, работает. Но в некоторых ситуациях и для некоторых видов документов периодически вываливается. Подобрав нужную паузу и нужное количество итераций предложенный способ значительно уменьшает количество таких ситуаций. Да, естественно, предложенный метод не полностью гарантирует нам, что мы дождемся окончания транзакции, если только не организуем бесконечный цикл ожидания. Сейчас, например, 5 итераций с паузой в 5 секунд пока полностью исключил выпадание документов в регистр заданий.
7. user1466751 15.09.22 11:43 Сейчас в теме
(6)
5*5 = 25. По умолчанию ожидание на блокировке 20 секунд. Может стоило до 30 поднять и не париться?)

PS Сочувствую с отсутствием управления.
8. RocKeR_13 1046 15.09.22 11:46 Сейчас в теме
(7) Поднимем при необходимости) В принципе большинство процессов на моей совести, но я отношусь только к одной из сопровождающих компаний. В целом-то всё не так уж и плохо)
9. coollerinc 178 09.11.22 11:55 Сейчас в теме
Пауза есть в БСП или в БТС. Делается с помощью ожидания фонового задания.

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