Жёлтая тетрадь 📒 Блог о разработке в 1С 👨‍💻
1.12K subscribers
42 photos
69 links
В основном небольшие и нерегулярные личные заметки о разработке на платформе 1С:Предприятие.

@builin - по всем вопросам, вакансии и рекламу не размещаю.

Еще один мой канал: @kodbaza (осторожно, там Java)
Download Telegram
Предопределенное регламентное задание

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

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

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

Для блокировки обмена в копии базы нужно использовать методы подсистемы "Регламентные задания" БСП (полный код см. в ССиМ):
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.<ИмяЗадания>);

@yellow_pad | #РегламентныеЗадания #БСП #обмены #ССиМ
Блокировка таблиц регистрации изменений

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

Ни запрос, ни БлокировкаДанных не позволяют заблокировать таблицу зарегистрированных изменений. Блокировка таблиц регистрации устанавливается вызовом метода ПланыОбмена.ВыбратьИзменения(УзелПланаОбмена, НомерСообщения). Для всех изменений будет установлен НомерСообщения (при регистрации он NULL), по которому можно и отбор в запросе сделать.

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

@yellow_pad | #ПланыОбмена #обмены #блокировка #РегистрацияИзменений
Как исключить параллельное выполнение обмена

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

НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);

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

Блокировка.Заблокировать();

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

Если этого не сделать, то мы можем, например, в разных сеансах выгрузить одни и те же данные. А можем удалить регистрацию данных, выгружаемых другим сеансом.

@yellow_pad | #1С #обмены #ПланОбмена #блокировки #УправляемаяБлокировка #код