Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Заполнение РС (независимый, непериодический)          
Constantus Подменю пользователя
сообщение 27.11.21, 19:46
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

Приветствую, Форумчане!
УФ, самопис

Приветствую, Форумчане!

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

Процедура ЗаполнитьРезультатПроверки(Источник, РезультатПроверки, Ошибка, ТипПроверки)
    
    Запись = РегистрыСведений.РезультатыПроверок.СоздатьМенеджерЗаписи();
    Запись.Дата = ТекущаяДата();
    Запись.ОбъектДанных = Источник;
    Запись.ОписаниеОшибки = ?(РезультатПроверки, Ошибка, "");
    Запись.Результат = ?(РезультатПроверки, "Ошибка", "Успешно");
    Запись.ТипПроверки = ТипПроверки;
    Запись.Записать();
    
КонецПроцедуры



Отладчик показывает, что данные все заполняются правильно, но сам регистр оказывается пустым, т.е. не записывается.
Что я не так сделал? Вроде всё как по учебнику, ну и раньше вроде такое делал... Что я забыл?

Обращение к этой процедуре идет так:

 Пока Выборка.Следующий() Цикл
***************    
            ЗаполнитьРезультатПроверки(Источник.Ссылка, РезультатПроверки, Выборка.ОписаниеОшибки, Выборка.ТипПроверки);
        КонецЦикла;


Если Отказ = Ложь, т.е. проведение разрешено, то запись в регистр происходит. Но если проведение запрещено, то запись в регистр не происходит. Я так понял откатываются в небытиё все транзакции. Хотя отладчик показывает правильность заполнения данными в регистр, запись не происходит.

Как можно справится с ситуацией? Т.е. чтобы запись в РС происходила при любом раскладе...

Batchir Подменю пользователя
сообщение 28.11.21, 0:03
Сообщение #2

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

Стартовать фоновое задание, которое будет писать регистр вне транзакции проведения

Constantus Подменю пользователя
сообщение 28.11.21, 0:10
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

Batchir @ Сегодня, 4:03 * ,

И как это всё сделать? Даже не понимаю дальнейшие действия...

andr_andrey Подменю пользователя
сообщение 29.11.21, 9:18
Сообщение #4

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Constantus @ 27.11.21, 19:46 * ,
Вам, оказывается, уже на инфостарте ответили.

Сообщение отредактировал andr_andrey - 29.11.21, 9:23


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Vofka Подменю пользователя
сообщение 29.11.21, 10:04
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Constantus, если документ не проводится, то записывайте туда из процндуры ПриЗаписи(), например.

Batchir Подменю пользователя
сообщение 29.11.21, 10:42
Сообщение #6

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

Constantus @ Вчера, 0:10 * ,\

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

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

Constantus Подменю пользователя
сообщение 30.11.21, 22:09
Сообщение #7

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

andr_andrey @ Сегодня, 13:18 * ,
Я к тутошним больше прислушиваюсь icon_beer17.gif

Спасибо. Вроде получилось через фондовую биржу (фоновые задания). Получается таким макаром можно наладить проведение документа при любом раскладе...

Batchir Подменю пользователя
сообщение 01.12.21, 10:44
Сообщение #8

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

Цитата(Constantus @ 30.11.21, 22:09) *
Получается таким макаром можно наладить проведение документа при любом раскладе..

Ну тут логика проста.
Если идет отмена транзакции то все изменения данных которые были в рамках этой транзакции откатываются.
Фоновое задание запускается и выполняется отдельным сеансом вне транзакции проведения/записи документа, поэтому не откатываются.

Но тут есть проблема на самом деле. Нужно быть уверенным что проводимый/записываемый документ гарантированно попадет в базу.
Например, нажимаете кнопку ЗаписатьПровести в новом документе.
В подписке ссылка на объект уже есть. Вы стартуете фоновое для того что бы записать данные в регистр.
Но потом где-то в рамках транзакции записи/проведения документа происходит какая-то ошибка (или предусмотрен логикой ОТКАЗ)
и документ не записывается/проводится.
В результате имеем что ссылки на объект для нового документа в базе не появилось, а в регистре фоновым заданием данные появились по ссылке <Объект не найден>.

Vofka Подменю пользователя
сообщение 01.12.21, 11:11
Сообщение #9

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Я, честно говоря, не могу придумать сценария, когда понадобилось бы что-то куда-то писать в случае, когда запись документа не отработала (транзакция отменилась). Поэтому я бы не выносил это за рамки транзакции и делал бы это в ПриЗаписи().

Batchir Подменю пользователя
сообщение 03.12.21, 10:25
Сообщение #10

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

Ну мало ли какая логика может быть заложена.
Например, не важно провелся документ или нет - нужно запустить обновление данных какого-то регистра (к примеру состояний заказов).
И это обновление не нужно делать именно в транзакции проведения.

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

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

Собственно ничего нового. В ERP например формирование проводок вынесено за рамки проведения документа. Мне приходится сталкиваться с тем что если есть возможность вынести другие движения за рамки проведения, то выношу.

andr_andrey Подменю пользователя
сообщение 03.12.21, 11:00
Сообщение #11

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Цитата(Batchir @ 03.12.21, 10:25) *
... но всё меняется для высоконагруженных систем ... стартует фоновое задание, пишутся не оперативные регистры по документу

Если система действительно высоконагружена, может уже писать в очередь сообщений, или пока куча фоновых успевает отрабатывать на сервере 1С?


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Constantus Подменю пользователя
сообщение 03.12.21, 14:59
Сообщение #12

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

Vofka @ 01.12.21, 15:11 * ,

Это была учебная задача. Даже сами авторы признали, что это всё нежизнеспособно. haha.gif
Просто решили проверить сможу ли я это сделать или нет...

Batchir Подменю пользователя
сообщение 03.12.21, 23:00
Сообщение #13

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

andr_andrey @ Сегодня, 11:00 * ,
На самом деле так и делается))) В самой транзакции проведения фиксируется сам факт необходимости формирования отложенных движений в отдельном регистре сведений. А затем стартует алгоритм формирования движений. Этот алгоритм уже обрабатывает эту очередь многопоточно N фоновыми заданиями.
Сам алгоритм управления фоновыми достаточно сложный. Если в двух словах, то он должен уметь запускать определённое количество фоновых и так что бы наборы не пересекались чтоб не ловить блокировки. Огромная куча фоновых заданий так же положит систему. В общем как я и написал - это отдельная история)))

Спасибо сказали: andr_andrey,

andr_andrey Подменю пользователя
сообщение 07.12.21, 9:32
Сообщение #14

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 623
Спасибо сказали: 166 раз
Рейтинг: 130.8

Цитата(Batchir @ 03.12.21, 23:00) *
фиксируется сам факт необходимости формирования отложенных движений в отдельном регистре сведений

Спасибо. Я думал вы уже RabbitMQ/Kafka и им подобные используете.


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 19:32
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!