Обработчик "После завершения транзакции" своими руками

Публикация № 1243723

Разработка - Практика программирования

Быстрые сообщения событийная модель commit

Обработчик "Сразу после завершения транзакции" очень востребован в механизме обмена мгновенными сообщениями, развитием которого фирма 1С заинтересовались настолько, что уже создала "Сервисы интеграции". Но платформа 8.3.17 всё еще не имеет полноценного обработчика "После записи" в подписках на события.
Обработчики событий ПослеЗаписи и ПослеЗаписиНаСервере реализованы только в форме клиентского приложения. Событие завершения транзакции легко отлавливается журналом регистрации, технологическим журналом и механизмом версионирования. Что мешает разработчикам платформы поместить этот механизм в подписки - загадка!

Такой обработчик помог бы в решении как минимум двух задач:
  1. Мгновенная отправка сообщений во внешние базы, интеграционные шины, брокеры сообщений
  2. Быстрая постобработка проведенных документов - формирование бухгалтерских проводок, различных трансляций в управленческий учет или МСФО
Да, эти механизмы можно реализовать и на регламентных заданиях. Цикл запуска РЗ можно выставить хоть в 5 секунд, и это будет работать. Но это как-то не спортивно:
  1. Лог РЗ засоряется холостыми пусками
  2. Сервер находится постоянно под нагрузкой, даже ночью (а вдруг бухгалтеру не спится!)
  3. Эффект 100%-ной загрузки процессора, когда в базе нет ни одного пользователя и происходит частый запуск регламентного задания (см. //infostart.ru/public/996126/)
 
Кроме того, уверен, есть бизнесы, для которых и 5 секунд непростительная задержка при передаче данных. В общем, обработчик "после завершения транзакции" явно востребован, надо искать решение!
 
Честно признаюсь, то что описано далее, работает на низко нагруженной базе (в пике до 200 пользователей, в среднем проводится 1-2 документа в секунду). Поэтому было бы интересно подружиться со смельчаком, который готов опробовать эту идею в более интенсивной среде.
 
Итак, сама идея:

У объекта Блокиро вкаДаных есть замечательное свойство - останавливать выполнение кода, пока не завершится транзакция в другом процессе, или пока не закончится время ожидания блокировки (по умолчанию это время равно 20 секундам). А что если использовать это свойство как пусковой механизм для старта постобработки сразу после завершения транзакции?
 
Проиллюстрирую идею на двух конкретных задачах:

Задача №1. Требуется запускать постобработку трансляции регистра бухгалтерии Хозрасчетный в управленческую подсистему сразу после событий:
  • Проведение/перепроведение документов
  • Снятие с проведения документов
  • Ручная корректировка проводок
Задача №2. Требуется запускать выгрузку во внешнюю систему сразу после записи определенных справочников и документов. Внешняя система способна обрабатывать многопоточную загрузку, единственное ограничение - нельзя параллельно загружать объект с одним идентификатором.
 
Для обеих задач должно выполняться важное условие - пользователи не должны почувствовать замедления в работе.
 
Для Задачи №1:
  • Создадим общий модуль Трансляция_БУ_УУ
  • Создадим подписку на событие ПриЗаписиРегБух, где источник РегистрБухгалтерииНаборЗаписей.Хозрасчетный и событие: ПриЗаписи.
  • Создадим регистр сведений ОчередьТяжелыхДокументов, измерения: Док, Миллисекунды
  • Создадим регламентное задание ОбработкаОчередиТяжелыхДокументов
 
Для Задачи №2:
  • Создадим общий модуль ОбменСВнешнейСистемой
  • Создадим подписку на событие ПриЗаписиДокСпр, где источниками являются справочники и документы, участвующие в выгрузке, событие: ПриЗаписи.
  • Создадим регистр сведений ОчередьТяжелыхДокументов2, измерения: ДокСпр, Миллисекунды
  • Создадим регламентное задание ОбработкаОчередиТяжелыхДокументов2
Далее описывается алгоритм, идентичный для обеих задач. Фразу "набор записей" можно заменить на "ссылочный объект", нюансы кода показаны в конце статьи.

В процедуре обработчика подписки установим управляемую блокировку по регистратору на набор записей регистра. Такая блокировка никому не будет мешать, кроме фонового задания, которое мы запустим следом. Подписка будет вызываться и при снятии с проведения документа, что так же важно для обнуления трансляции в УУ. Подписка будет вызываться дважды при проведении, если у документа стоит признак "Удалять движения автоматически", так конечно уже давно никто не делает, но надеюсь сервер 1С раздаёт разрешения на блокировки согласно очерёдности начала попыток блокировки, у меня проверить возможности не было.
 
В фоновое задание передадим ссылку Регистратора и Хеш-сумму содержимого набора записей регистра – будем считать её идентификатором версии. Для Задачи №2 тоже будем передавать хеш содержимого документа, т.к. атрибут Версия меняется только после завершения транзакции.
 
В процедуре фонового задания откроем программную транзакцию и в цикле будем пытаться установить блокировку на регистр по переданному регистратору. Количество циклов надо подобрать эмпирически исходя из самых плохих прогнозов времени проведения самого тяжёлого документа. Я выбрал 10 циклов, это 10 минут, исходя из 60 секунд времени ожидания блокировки данных, которое определил админ базы.
 
Блокировка выполняется в попытке, но ошибка типа «в этой транзакции уже происходили ошибки» исключена, так как внутри попытки нет вложенных транзакций.
 
Если блокировка преодолена, значит транзакция по записи набора в клиентском процессе завершилась. В этот момент пользователь побежал дальше, для него ожидание закончилось. Мы передали обработку результата завершенной транзакции в фоновое задание. В фоновом задании можно было и не открывать транзакцию и не накладывать блокировку на набор (или ссылочный объект), если мы не обрабатываем данные в совокупности с подчиненными объектами (самим документом и дочерними регистрами), и нам не нужна гарантия согласованности этой совокупности. В моём примере мы открываем транзакцию, чтобы сохранить блокировку на наборе и исключить покушения других процессов на наш набор (а для задачи №2 ещё и исключить параллельную выгрузку объекта с одинаковым идентификатором).
 
Сравниваем версии (Хеш-суммы) переданной и текущей:
  • Если версия та же, значит клиентская транзакция завершилась успешно - выполняем постобработку
  • Если версии различаются, то причин две:
  1. был откат клиентской транзакции - значит ничего делать не надо
  2. пока мы пытались установить блокировку набор записей захватил другой процесс и успешно изменил его - значит тоже ничего не делаем, им займётся фоновое задание того другого процесса
Если все циклы закончились, а мы так и не смогли установить блокировку, значит мы имеем дело с аномально тяжёлым документом, несовместимым с принципом быстрых сообщений. Помещаем ссылку регистратора в специально заготовленный регистр сведений, играющий роль очереди, которую обрабатывает регламентное задание по расписанию, скажем раз в час и только в рабочее время. Если уж пользователь был готов ждать более 10 минут проведения документа, значит это не самый срочный документ, подождёт ещё час или до утра.
 
Если фоновое задание получило битую ссылку регистратора - значит пользователь сразу после создания нового документа нажал кнопку «Провести», документ выдал ошибку, а транзакция откатилась – ничего страшного, управляемая блокировка легко переваривает битые ссылки! Так же не возникает исключительных ситуаций при определении Хеш-суммы: набор записей возвращает пустую коллекцию, а БитаяСсылка.ПолучитьОбъект() возвращает Неопределено, всё легко сериализуется и хешируется.
 
Вывод:
Я предложил вариант триггера, который запускает фоновое задание сразу после завершения транзакции. Пользователи не почувствуют увеличения времени реакции системы, так как внутри пользовательской транзакции нет никаких записей или долгих вычислений, разве что сериализация объекта для вычисления версии, которую платформа должна делать быстро, потому что делает это регулярно при передаче данных между клиентским и серверным контекстами. Транзакция и блокировка внутри фонового задания - необязательны, зависит от решаемой задачи. Варианты использования я предложил в начале статьи. Как вы распорядитесь этой возможностью - решать вам! :-)

 

                           

Еще один вариант триггера.

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

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

Основной минус такой - непонятно как поведёт себя сервер 1С в высоконагруженной базе. Если одновременно 1000 пользователей завершит транзакцию, как быстро будет запущена 1000 регламентных заданий? Боюсь что они попадут в некую очередь, и будут выполняться по мере освобождения ресурсов.

В любом случае идея интересная, и я точно буду её тестировать! :-)

           

 

Процедуру трансляции БУ-УУ ОбработатьДокумент( ) и процедуру выгрузки во внешнюю систему ВыгрузитьОбъект() я не привожу, это другая история, у каждого своя.

 
Для простоты восприятия привожу диаграмму происходящего в динамике:
 
 
 
Код для Задачи №1:

 

 
Код для Задачи №2:

 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 106 31.05.20 21:36 Сейчас в теме
Ой ой, запросы в цикле, да еще и бесконечном. И страшные какие. Текст запроса зачем-то каждый раз заново устанавливается. Почему бы не сгруппировать сначала результат, упорядочить по "РРР.Миллисекунды ВОЗР" и не взять "ПЕРВЫЕ 1", если он все-равно по приоритету выполняется последним? Зачем брать ХЭШ, когда есть свойство ВерсияДанных, которая меняется при любом изменении объекта?
vladimirmatancev; +1 Ответить
2. barelpro 1171 31.05.20 21:46 Сейчас в теме
(1)
Вот вбили на экзаменах в голову что запросы в цикле зло, и принимается как религиозный постулат ) А если этим запросом выполняется проверка очереди, которая динамически пополняется, и когда туда попал один объект несколько раз, нам надо его обработать один раз, как быть?

Про версию тоже не просто так: версия меняется только после завершения транзакции, а внутри транзакции она еще старая
3. zhichkin 738 01.06.20 02:11 Сейчас в теме
(2) Без обид. Просто читаю и плачу. Вашей вины в этом конечно же нет.
Удивительно каких только костылей не приходится придумывать к 1С ...
В данном случае конечно же напрашиваются асинхронные триггеры.
12. barelpro 1171 01.06.20 11:49 Сейчас в теме
(3)

Сервис брокер - интересный механизм! жалко что у вас только презентация и нет статьи с подробным разбором. Будет время досмотрю до конца и задам вопросы. Пока не совсем ясно, как вернуть событие завершения транзакции из сервис-брокера в 1С для запуска например фонового задания постобработки.
19. zhichkin 738 01.06.20 13:33 Сейчас в теме
(12) Как раз готовлю такую публикацию по использованию Service Broker в 1С. Думаю на этой неделе закончить и выпустить на следующей.
Пока не совсем ясно, как вернуть событие завершения транзакции из сервис-брокера в 1С для запуска например фонового задания постобработки.

Хранимая процедура активации пишется на C# - она вызывает, например, http-сервис 1C. Это если говорить о внтренней активации Service Broker. Кроме этого есть ещё внешняя активация через механизм Notifications SQL Server. Есть ещё и третий механизм через оператор SQL Server WAITFOR (RECEIVE ...FROM [Queue] TIMEOUT ...).
barelpro; +1 Ответить
20. barelpro 1171 01.06.20 13:35 Сейчас в теме
(19)
http-сервис - это долго, у меня быстрее )
Но вообще мне нравится, что вы копаете в направлении SQL и C# - большой респект!
22. zhichkin 738 01.06.20 13:47 Сейчас в теме
(20) Данные попадают в очередь. http-сервис нужен только для того, чтобы сообщить 1С, что появились сообщения. Дальше 1С сама разгребает очередь.
Если не http сервис, то можно из 1С поднять соединение по OLE DB и запросом вида WAITFOR (RECEIVE ...FROM [Queue] TIMEOUT ...) поместить в SQL Server своё ожидание сообщений из очереди. Это будет работать моментально как только завершится транзакция помещения первого сообщения в очередь.
TIMEOUT в данном случае указывает время ожидания первого сообщения в очереди, если она пустая.
WAITFOR фактически не создаёт нагрузки на SQL Server - это по сути "спящий" процесс.
23. barelpro 1171 01.06.20 13:53 Сейчас в теме
(22)

Так у меня тот же TIMEOUT - попытка блокировки в цикле, число циклов можно подбирать как и свойство базы "время ожидания блокировки". Само ожидание на блокировке - стандартный механизм 1С, он работает быстро.
И пока открывается OLE DB - соединение транзакция уже может завершиться, опять не вот тебе сразу.
Но как вариант, да, я понял идею, супер!
24. zhichkin 738 01.06.20 14:03 Сейчас в теме
(23) То, что Вы сделали - это очень круто!
Просто меня удручает, что 1С фактически заставляет постоянно искать какие-то недокументированные возможности. Тот же Service Broker работает уже 15 (!) лет, начиная с версии SQL Server 2005. Я пользуюсь Service Broker c 2007 года.
Если бы не лицензионное соглашение 1С я бы давно уже прикрутил асинхронные триггеры к 1С в виде типового документированного решения. Но увы.
Как сказала однажды моя жена: "Я поняла. 1С - это сексуальная ориентация".
Yashazz; Il; dabu-dabu; barelpro; +4 Ответить
26. barelpro 1171 01.06.20 14:08 Сейчас в теме
(24)
Я тоже рефлексирую по этому поводу, но за неимением горничной будем иметь... и подпольно использовать достижения внешнего мира))
zhichkin; +1 Ответить
29. barelpro 1171 01.06.20 14:58 Сейчас в теме
(24)
Кстати, раз уж заговорили о быстрой передаче сигнала между приложениями, подумайте на счет сетевых сокетов, там и подключение к каналу быстро устанавливается, и сама передача быстро идет....
30. zhichkin 738 01.06.20 15:18 Сейчас в теме
(29) Я думаю больше на тему gRPC сейчас. Там есть стриминг данных как раз через сокеты. Это протокол Google для организации взаимодействия между серверами на базе HTTP 2, кторый, кстати, Google и пропихивал очень активно.
31. zhichkin 738 01.06.20 15:21 Сейчас в теме
(29) Кроме этого у Microsoft для .NET есть технология Pipes как раз для взаимодействия между процессами, как на одной машине, так и на разных. Но ... во всех этих случаях, будь то Pipes или gRPC, нужно учитывать аспект целостности данных, а именно транзакции, чтобы случайно по дороге не потерять данные.
32. barelpro 1171 01.06.20 15:50 Сейчас в теме
(31)
Ну для быстрой отправки можно как-то выкрутиться средствами 1С, а для быстрой загрузки без внешних средств не обойтись. Например в коннекторе с Rabbit MQ от Серебрянной пули/БИТа каждые пять минут запускается регламентным заданием слушатель сетевых сокетов, нет ли в очереди сообщений...
33. zhichkin 738 01.06.20 16:02 Сейчас в теме
(32) Вечная проблема интегратора: что использовать "pull" или "push" и каким образом =) Мы какую задачу обсуждаем ? Обмен данными в реальном времени ? Абстрактно это не решается. Нужна конкретная задача и конкретные требования под неё. Я вижу, что Вы это понимаете как никто другой =)
34. nomad_irk 48 01.06.20 16:16 Сейчас в теме
(33)
Вечная проблема интегратора: что использовать "pull" или "push"

Лично я сторонник "pull" ибо негоже пихать что-либо куда-либо, если приемник к этому не готов(а) :)
35. zhichkin 738 01.06.20 16:21 Сейчас в теме
(34) Лично я не сторонник категоричных высказываний =) Интеграция - девушка с характером =)
37. barelpro 1171 01.06.20 16:23 Сейчас в теме
(34)
а я сторонник "быстро отправил и забыл", пусть посредники разбираются
39. nomad_irk 48 01.06.20 16:25 Сейчас в теме
(37)Одному мне вспомнилось:

"наше дело - не рожать, сунул - вынул и бежать!" ? :)
40. barelpro 1171 01.06.20 16:28 Сейчас в теме
(39)

хорошая поговорка ), но в случае интеграции получателей одного сообщения может быть много, почему об этом должен беспокоиться отправитель? По хорошему он вообще не должен знать сколько их, получателей.
41. nomad_irk 48 01.06.20 16:31 Сейчас в теме
(40)Для этих целей служит любая шина данных, но оно, как правило, в крупных компаниях. Мелкие компании выстраивают интеграцию чаще всего с помощью файлов и источник данных, как правило, при этом должен позаботится о каждом получателе.
42. barelpro 1171 01.06.20 16:51 Сейчас в теме
(41)

Полноценная ESB - да, не дешёвое удовольствие, но брокер сообщений типа Rabbit MQ всем по карману. Особенно после того, как БИТ выложил бесплатные исходники коннектора 1С-Rabbit MQ! )))
51. BabySG 04.06.20 12:43 Сейчас в теме
(42) ну, тут есть подсистема + компонента + возможность отказаться от регзаданий https://sbpg.atlassian.net/wiki/spaces/1C2RMQ/overview
И все бесплатно )
36. barelpro 1171 01.06.20 16:22 Сейчас в теме
(33)
Да мы просто вёдем светскую беседу ). Задача обеспечения доставки из контекста статьи выпадает.
С нетерпением ждём статьи использованию Service Broker в 1С!
38. zhichkin 738 01.06.20 16:23 Сейчас в теме
(36) Спасибо за интерес. Постараюсь не обмануть ожиданий =)
43. zhichkin 738 03.06.20 00:59 Сейчас в теме
(36) Выложил пример практического использования Service Broker на GitHub.
https://github.com/zhichkin/one-c-sharp-sql/tree/master/messaging/service-broker
Там есть:
- установочный скрипт SQL,
- демонстрационная обработка 1С,
- пример использования в коде SQL,
- результаты теста производительности.
barelpro; +1 Ответить
4. ardn 100 01.06.20 07:54 Сейчас в теме
В регистр тяжелых документов запросто могут попасть и нетяжелые.
Поправьте, если не прав, блокировка живет до окончания транзакции. Если менять пакет объектов в единой транзакции, например групповой обработкой, установленные искусственные блокировки будут долгими, все по этим объектам не обработается.
7. barelpro 1171 01.06.20 11:07 Сейчас в теме
(4)
Ну в рабочее время на боевой базе вряд ли кому-то придёт в голову надолго блокировать одной длинной транзакцией большое количество документов. Скорее всего разобьют на маленькие. А в нерабочее время - ну да, без спешки, пойдет обработка через очередь тяжёлых документов,
5. sam441 119 01.06.20 08:04 Сейчас в теме
Не знаю, чего на автора накинулись, мне показался подход интересным, благодарю.
barelpro; +1 Ответить
6. barelpro 1171 01.06.20 10:55 Сейчас в теме
(5)
Спасибо! Просто пока ещё не прдтянулись те, кто реально занимается интеграцией )
8. nomad_irk 48 01.06.20 11:11 Сейчас в теме
(6)Как по мне: в случае интеграций, нужно максимально использовать асинхронность. Лично меня пока не сможет никто убедить, что данные в интегрируемых системах нужны прям сию же секунду в случае использования транзакционных учетных систем.
9. barelpro 1171 01.06.20 11:14 Сейчас в теме
(8)
Так а чем фоновое задание, которое продолжает работать после проведения документа - не ассинхронность?
10. nomad_irk 48 01.06.20 11:23 Сейчас в теме
(9)Тем, что асинхронность - это два разных действия разнесенных по времени и транзакциям. Транзакция в данном конкретном случае - это само это фоновое задание, выполняющее проведение документа + еще какие-то действия.

Проводить документы и "складывать" эти документы в буффер для обработки их другим регл заданием и собственно другое регл. задание по обработке буффера - это есть асинхронность.

Провести документ и дальше выполнить обмен/выгрузку/еще что-то с этим самым документом в рамках одного регл задания - это синхронность.

Без буффера выполнять синхронизацию да еще и реал-тайм - такое себе.
11. barelpro 1171 01.06.20 11:42 Сейчас в теме
(10)
Хм... А вы поняли что в фоновом задании открывается вторая транзакция сразу, как закончилась первая в клиентском процессе?
13. nomad_irk 48 01.06.20 12:56 Сейчас в теме
(11)Понял. Это породит просто кучу транзакций передачи данных по каждому измененному объекту в рамках первой транзакции для какого-нибудь события типа восстановления последовательности.

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

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

В публикации упоминается варианты использования:
1. мгновенная синхронизация данных с другими учетными системами
2. мгновенное отражение в регл учете.

Разберем оба варианта использования, начнем со второго.

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

Мгновенная синхронизация в условиях транзакционных учетных систем - это по сути чушь, потому что для такого рода синхронизации нужна доступность удаленной базы в момент синхронизации. В случае такой синхронизации, если удаленная система по какой-то причине станет не доступной в момент проведения документа, что делать с данными, которые должны быть переданы, но не передались? Ответ: их нужно накапливать в неком "буффере", либо, спустя какое-то время, изменять исходные данные еще раз, чтобы инициализировать синхронизацию данных. Исходя из условий выполнения, придется еще раз выполнять изменение данных. Если таки накапливать данные для передачи в неком "буффере", то для чего вообще тогда весь этот сыр-бор с мгновенной синхронизацией данных?
14. barelpro 1171 01.06.20 13:16 Сейчас в теме
(13)
Я предложил вариант тригера, который запускает фоновое задание сразу после завершения транзакции. А как уж вы распорядитесь этой возможностью - решать вам.

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

Да, регламентный учет - посмертный учет, там оперативно только деньги умеют считать. А вот в управленческом учете важна оперативность, причем чтобы управленческие отчеты быстро строились, данные для них желательно предварительно подготовить. Вот вам еще одно применение этого тригера!

Давайте, включайте инженерный идеемёт! )))
15. acanta 01.06.20 13:22 Сейчас в теме
(14) Посмертный учет в моем понимании это после ликвидации предприятия. А как ведут на предприятии регламентный или управленческий - это зависит от бизнес процессов.
barelpro; +1 Ответить
18. nomad_irk 48 01.06.20 13:32 Сейчас в теме
(15) Лично мне не раз приходилось наблюдать, как из регл. учета пытаются делать упр учет, как это все работает не так как хотелось бы руководству :)
16. nomad_irk 48 01.06.20 13:23 Сейчас в теме
(14) ESB так же может быть недоступной, т.к. это такая же учетная система по своей сути.

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

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


Вот это прям очень хороший пример. Потому что УУ, как правило, требует другие структуры хранения данных для отчетов, что предлагают типовые конфигурации и чтобы не ломать типовую конфигурацию, ваш вариант будет одним из вариантов решения трансформации данных для УУ отчетов.
barelpro; +1 Ответить
17. barelpro 1171 01.06.20 13:31 Сейчас в теме
(16)
если ESB не имеет онлайн-доступности, это не ESB а учётная система, как вы правильно сказали )
Онлайн доступность - это то ради чего существует само понятие шины или брокера сообщений
Но раз уж так случилось что ESB вдруг недоступна, ну тогда кладем в очередь "тяжелых документов" и обрабатываем по мере доступности получателя. Я ж говорю, в статье главный акцент именно на идее триггера после коммита транзакции, остальное ваше творчество.
21. nomad_irk 48 01.06.20 13:35 Сейчас в теме
(17)Вот вы и ответили на вопрос о том, какая это будет мгновенная синхронизация данных :)
И это - нормально в условиях транзакционных учетных систем.
25. barelpro 1171 01.06.20 14:04 Сейчас в теме
(21)
Сочувствую вашей боли! ))
Но поверьте, есть системы, где все работает, и собственники не скупятся вкладывать деньги в нормальные технологии!
27. nomad_irk 48 01.06.20 14:26 Сейчас в теме
(25)Да хоспади, не во вкладывании денег и не в нормальных технологиях проблемы, а в том, что ESB так же требует обслуживания, во время которого она не доступна, может навернутся сервер, обслуживающий ESB, может еще что-то.....
28. barelpro 1171 01.06.20 14:39 Сейчас в теме
(27)
Не, ну понятно, что в работе любой системы должны быть технологические окна, даже в 24*7. Саппорт - единственная профессия будущего, когда всё тотально будет автоматизировано )
44. shmalevoz 227 03.06.20 21:46 Сейчас в теме
Мы делали несколько иную схему реализации, хотя сама базовая идея была той же, блокировка и несколько потоков выполнения. Сделали несколько служебных регистров и писали данные в них, и на одном из них висели взаимоблокировки. А если что-то падало, то по разнице в регистрах можно было понято что обработано, а что осталось вне внимания.
Пи этом у вас несколько недоделано - ПослеЗавершенияТранзакции хорошо бы получал коллекцию объектов, которые в транзакции участвовали, если уж надо ловить такое событие, то обычно нужно понимать полную атомарность состава.

Даже примерный набросок схемы остался =))
45. shmalevoz 227 03.06.20 23:06 Сейчас в теме
Прошу простить, к предыдущему сообщению - не прикрепилась картинка

barelpro; +1 Ответить
46. barelpro 1171 04.06.20 00:30 Сейчас в теме
(45)

Да, насчет атомарности состава - правильное замечание, но тут всё зависит от совокупности данных, с которыми мы собираемся работать после транзакции, у каждого свой кейс.
Вообще моей идее ровно неделя, чем дальше, тем интересней, уже поймал интересную фичу - есть такой регистр сведений ДополнительныеСведения, он отвечает за механизм допсведений в типовых конфигурациях. Когда пользователь меняет сразу несколько допсведений в одном объекте, в подписке в наборе один порядок записей, а после завершения транзакции уже другой, и хеши не совпадают, хотя по содержания наборы идентичны! В общем, тут еще пилить и пилить!
Хорошо что вы придумали такой же механизм, жалко что не написали статью 8-)
47. shmalevoz 227 04.06.20 00:43 Сейчас в теме
(46)
Там конечно с подводными камнями не все просто... Что есть то есть =) Многократная запись объекта в одной транзакции чего только стоит =)
Подвычищу код от лишнего и наверное выложу конфигурацию и статью, а то сейчас там многовато сопутствующих всяких вызовов под другую задачу.
58. shmalevoz 227 09.06.20 09:29 Сейчас в теме
(46)
Выделил реализацию в чистое решение, выложил статью и решение
Реализация программного события ПослеЗавершенияТранзакции
надеюсь пригодится. Решение проверено экслуатацией.
48. asved.ru 35 04.06.20 09:04 Сейчас в теме
Менеджер сервиса технологии 1С:Фреш, ВыполнитьПослеТранзакции()
shmalevoz; +1 Ответить
49. shmalevoz 227 04.06.20 11:18 Сейчас в теме
(48) Глянул код в Менеджере сервиса, снимаю шляпу перед автором идеи. Намного проще, стабильней и понятней. За неимением платформенного события конечно тоже костылик, но намного более качественный. Регламентные задания для определения.... Вот что значит использовать правильные объекты для реализации задачи =)
50. barelpro 1171 04.06.20 11:38 Сейчас в теме
(49)
Тоже хочу посмотреть, не у всех есть доступ к дистрибутиву Фреш )
54. asved.ru 35 04.06.20 14:47 Сейчас в теме
(50) Вкратце - используется непредопределенное регламентное задание, создаваемое внутри транзакции. Как только транзакция зафиксируется, менеджер заданий его выполнит, а если она откатится - не было никакого задания. Ну и убраться за собой.
52. shmalevoz 227 04.06.20 13:00 Сейчас в теме
Сначала о возможных проблемах типового варианта, потом будут выдержки из типового кода, вдруг забанят =)
Главной проблемой видится невозможность контроля расписания выполнения Регламентных заданий, а поскольку там все опирается на них, то опять же получается невозможно автоматом нормально собрать атомарный состав транзакции. Сами 1С тоже об этом прямо пишут
Сами 1С об этом тоже прямо пишут
ни в каких случаях не следует задавать периодичность выполнения регламентных заданий меньше одной минуты;

И кажется вполне возможной ситуация, когда (скажем накопление сведений происходит из событий ПриЗаписи)
Объект.Записать()
// 5 секунд
Объект1.Записать()

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

Реализации в несколько потоков в ведут себя значительно лучше в первом моменте и совсем лишены второго.
53. shmalevoz 227 04.06.20 13:35 Сейчас в теме
И выдержки из менеджера сервиса

// Привилегированным режимом обрамлены обращения к РегламентныеЗадания. Для краткости
УстановитьПривилегированныйРежим(Истина);

ЗаданиеМетаданные	= Метаданные.РегламентныеЗадания.ПослеТранзакции;

// Задания постобработки текущего сеанса 
ЗаданияОтбор = Новый Структура;
ЗаданияОтбор.Вставить("Метаданные", ЗаданиеМетаданные);
ЗаданияОтбор.Вставить("Ключ", Формат(НомерСеансаИнформационнойБазы(), "ЧГ=0"));
ЗаданияОтбор.Вставить("Использование", Истина);

ТранзакцияЗадание	= Неопределено;
ОбновлениеЭто		= Ложь;
ОшибкаТекст			= "";

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

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

Показать


Примерно вкратце вот так. Для своего кейса конечно решение отличное, в сервисе нет мгновенного обмена с управляемыми базами, там задержки нормальное явление, и необходимо просто гарантированно что-то вызвать после транзакции (скорее всего обмен), но не всем кейсам это подойдет =)
А если нужна оперативность и/или сбор состава транзакции, то имхо схема с несколькими потоками предпочтительней, несмотря на более сложную реализацию.
JohnyDeath; +1 Ответить
55. barelpro 1171 04.06.20 15:02 Сейчас в теме
(53)
Ага, для каждого пользовательского сеанса создается отдельное регл задание. Но не понятно, с какой периодичностью запускаются регл задания? И код регл задания тоже интересно посмотреть. Похоже что оно выполняется постоянно, и слушает в цикле какую -то очередь - там самый смысл метода.
В общем одни загадки...
56. shmalevoz 227 04.06.20 15:13 Сейчас в теме
(55)
Исходя из опыта допила Фреша, то как раз примерно раз в минуту, там была масса проблем с частотой запуска асинхронного обмена.
А код задания достаточно прост, в него параметрами приходит таблица очереди вызовов и дергаются переданные в очереди методы. Ну плюс там число попыток, и прочая сервисная обвязка.
57. barelpro 1171 04.06.20 15:46 Сейчас в теме
(56)
Если для каждого номера сеанса создается отдельное регл задание - представляю как выглядит таблица регл заданий, ведь ее потом никто не чистит )
Вообще тут не спроста используется ЗаблокироватьДанныеДляРедактирования, это костыль - потому что по другому нельзя убедиться, что параллельно это же задание не записывается в другом процессе и мы не словим блокировку или измененную версию при записи, т.к. таблица регл заданий - это обычный ссылочный объект, как справочник или документ.
И что делает регл задание, если оно запустилось, а транзакция, породившая его еще не закончилась? Ждать следующего запуска?
Ну и периодичность запуска регл задания - тут тоже слабое место. А если все пользователи выйдут из базы, а куча регл заданий останется и будет запускаться, то получится как описано здесь https://infostart.ru/public/996126/

Забавно, но я до метода (который описан в статье) использовал именно регл задания, создавал, перезаписывал, управлял расписанием, и отказался, потому что нашел более быстрый метод )
59. Cyberhawk 122 09.07.20 20:12 Сейчас в теме
Упало ФЗ или просто не запустилось, и привет - факт изменения нигде не сохранился.
Механизм ненадежный.
60. shmalevoz 227 09.07.20 20:36 Сейчас в теме
(59) Тогда сохранились записи в регистре сведений, они пишутся в основном потоке выполнения, их можно подобрать регл. заданием например. А ФЗ служат для определения границы транзакции и вызова события ПослеЗавершения.
61. Cyberhawk 122 09.07.20 20:43 Сейчас в теме
(60)
записи в регистре сведений, они пишутся в основном потоке выполнения
Ничего такого я на картинке из публикации не вижу:
62. shmalevoz 227 09.07.20 20:49 Сейчас в теме
(61) Сорри, я со своей публикацией попутал =)
https://infostart.ru/public/1248326/
Оставьте свое сообщение

См. также

Обмен данными. Консистентность vs Многопоточность Промо

Интеграция v8 1cv8.cf Бесплатно (free)

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

03.09.2019    12110    m-rv    1    

Программное событие "ПослеЗавершенияТранзакции"

Инструментарий разработчика Практика программирования Обмен данными 1С v8 1cv8.cf Абонемент ($m)

Подсистема программного события "ПослеЗавершенияТранзкации". Сбор и хранение сведений о событиях записи в разрезе транзакций.

1 стартмани

09.06.2020    1029    0    shmalevoz    0    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

27.01.2020    25321    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

15.01.2020    22833    John_d    22    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

10.12.2016    37198    unichkin    72    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    17412    kuzyara    33    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    8216    Sibars    19    

Простейший пример создания бизнес-процессов

Практика программирования Управление бизнес-процессами (BPM) v8::Бизнес-процессы 1cv8.cf Бесплатно (free)

Простой пример создания бизнес-процессов в несколько шагов. Может пригодиться при первом знакомстве с ними или для решении задач экзамена 1С:Специалист по платформе.

20.11.2019    14645    YPermitin    18    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    30035    tormozit    100    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

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

01.10.2019    32274    Yashazz    50    

СКД. Отчеты с картинками

Практика программирования Работа с интерфейсом v8::СКД 1cv8.cf Бесплатно (free)

Решение популярных кейсов с картинками в отчетах на СКД.

25.09.2019    20716    YPermitin    37    

СКД не только для отчетов

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

18.09.2019    19147    YPermitin    36    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    77771    tormozit    131    

Оповещения боту из 1С за 31 минуту

Практика программирования Интеграция v8::УФ 1cv8.cf Бесплатно (free)

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

18.09.2019    16934    feva    41    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    48085    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    48172    ids79    54    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    48139    tormozit    41    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    27782    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

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

03.09.2019    25298    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    31060    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    44587    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    79072    ids79    49    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    34192    avalakh    22    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    57846    ids79    11    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16004    m-rv    2    

Как проводятся документы в типовых конфигурациях от 1С

Математика и алгоритмы Практика программирования Разработка v8::ОУ ERP2 УТ11 Россия УУ Бесплатно (free)

В свое время, когда только начинал шаги в 1С и изучал, как проводятся документы в конфигурациях на платформе 1С по книге "Разработка управляемого интерфейса" (Хрусталева Е.Ю.), и там были представлены примеры совсем далекие от того, как сейчас проводятся документы в современных конфигурациях от 1С.

24.07.2019    27157    skv_79    35    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    35318    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    25811    YPermitin    14    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20123    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19537    SeiOkami    50    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

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

25.06.2019    51463    ids79    25    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    24793    dmurk    145    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    30439    m-rv    21    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    42283    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    29204    Eret1k    23    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    35078    ellavs    126    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28189    itriot11    34    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    27265    ellavs    88    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

21.03.2019    26115    barelpro    82    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    31074    YPermitin    53    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    76141    Serginio    108    

Добавление отчетов в типовые конфигурации 1С

Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем) v8::УФ v8::СКД 1cv8.cf Бесплатно (free)

Описание различных способов добавления общих и контекстных отчетов в конфигурации 1С, построенные на базе БСП. Основные моменты и нюансы.

07.03.2019    53061    ids79    45    

Функциональные опции 1С 8.3 – все возможные варианты использования

Практика программирования Разработка v8::УФ 1cv8.cf Бесплатно (free)

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

22.02.2019    34072    ids79    14    

Информирование пользователя. Работа с объектом «СообщениеПользователю»

Практика программирования Разработка v8::УФ 1cv8.cf Бесплатно (free)

Различные варианты и нюансы использования объекта СообщениеПользователю и другие способы информирования пользователя: без привязки к какой-либо форме и с выводом сообщения в отдельном окне.

15.02.2019    50585    ids79    49    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    34448    ids79    40    

Производительность сервера 1С и фоновые задания

Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Бесплатно (free)

В падении производительности сервера 1С зачастую виноваты не регламентные / фоновые задания, они выполняют полезную работу. Но задания нельзя оставлять «наедине» с базой.

05.02.2019    19056    user715208    38    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    38749    ids79    9    

Управляемые блокировки по полям из свойства "Поля блокировки данных"

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8::blocking Бесплатно (free)

Добрый день, коллеги! Хотелось бы поделиться обнаруженной особенностью работы механизма управляемых блокировок, а именно блокировке по полям, указанным в свойстве «Поля блокировки данных».

24.01.2019    6712    mshumakov    3    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29146    grumagargler    28