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

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 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

11.04.2024    544    tango    0    

3

Формула в реквизите. Приквелл к сериалу "Ценовая власть"

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

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

10 стартмани

11.04.2024    423    tango    5    

4

Ценовая власть. Второй сезон

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

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

08.04.2024    791    tango    0    

2

Ценовая власть (УТ 11.5) - 2

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

В прошлый раз специальной обработкой мы выбрали объекты УТ 1.5, группируя по подсистемам. Оказалось, что состав подсистем не вполне корректно отображает функциональную структуру, но зато мы нашли процедуру, которая, вроде бы, должна содержать в себе всё, что нас интересует. Обновление цен должно ведь следовать выбранной стратегии ценообразования, верно? Иначе что она обновляет...

06.04.2024    483    tango    1    

1

Ценовая власть или Управление ценообразованием (УТ 11.5)

Ценообразование, анализ цен Механизмы типовых конфигураций Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Абонемент ($m)

Ценовая власть - это способность (возможность) компании изменять в некоторых пределах отпускную цену своего товара (услуг, продукции). Чем в более широких пределах вы можете играть в цену продажи, тем больше этой власти у вас. Если вы не можете управлять отпускной ценой, то это или не ваш бизнес, или не бизнес вовсе. Здесь в рубрике "База знаний аналитика и руководителя проекта" слово проект не ограничено "проектом в 1С". Посмотрим, что для этого есть в УТ 11.5.

1 стартмани

05.04.2024    605    tango    12    

2

Расширяем возможности дополнительных обработок и настраиваем их отладку

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

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2686    YA_418728146    11    

45

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

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

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1217    8    2ncom    6    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

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

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    5040    mrXoxot    11    

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

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

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

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

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

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

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

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

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

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