Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 10:36

Записать документ, затем провести

Автор Goodest81, 17 окт 2024, 08:48

0 Пользователей и 1 гость просматривают эту тему.

Goodest81

Добрый день. Опыта маловато, объясните.
Есть регламентная обработка обмена между двумя базами, например База1 и База2 , в этой обработке на Базе1 идет код, который вытягивает накладные из Базы2 и записывает в Базу1
Попытка
ДокРеализация.Записать(РежимЗаписиДокумента.Запись);
Исключение
ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
Сообщить(ОписаниеОшибки());
КонецПопытки;

Ситуация следующая, отдел просит сразу проводить документ, я то понимаю, что по логике это не правильно, но требуют так.
Если я поменяю на ДокРеализация.Записать(РежимЗаписиДокумента.Проведение), то документ запишется и проведется, но есть ньюанс, в момент проведения могут выйти различные ошибки - нет товара, не тот счет и т.д. и если  обрабатывается 40 накладных и в каждой будет ошибка, то все накладные не проведутся и не запишутся.
Вопрос, как грамотно сделать, чтобы вначале документ записался, а затем провелся, чтобы в случае, если будут ошибки в момент проведения, накладная была записана в базу, а там уже специально обученные люди будут разбираться.
Мне сделать так

Попытка
ДокРеализация.Записать(РежимЗаписиДокумента.Запись);
                ФайлЛог.ЗаписатьСтроку("Загружен документ - " + СокрЛП(ДокРеализация.Ссылка));
                ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
                ФайлЛог.ЗаписатьСтроку("Проведен документ - " + СокрЛП(ДокРеализация.Ссылка));
Исключение
ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
Сообщить(ОписаниеОшибки());
КонецПопытки;
или после попытки делать
Попытка
                ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
                ФайлЛог.ЗаписатьСтроку("Проведен документ - " + СокрЛП(ДокРеализация.Ссылка));
Исключение
ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
Сообщить(ОписаниеОшибки());
КонецПопытки;
Я не совсем понимаю, что произойдет, если документ записал, а потом пытаюсь еще раз сделать запись и проведение. РежимЗаписиДокумента.Проведение это же и запись и проведение?

Максим75

Goodest81, вначале пишите и тут же проводите. если не проведется в силу различных проверок при проведении, то будет в базе просто записаным.

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

Goodest81

Максим75, сразу делать ДокРеализация.Записать(РежимЗаписиДокумента.Проведение)? или ДокРеализация.Записать(РежимЗаписиДокумента.Запись) затем ДокРеализация.Записать(РежимЗаписиДокумента.Проведение)

Максим75

Goodest81, делаете там где или у Вас. запись, потом проведение.

Goodest81

Максим75, Я правильно понял, делаю попытку запись, затем после нее попытку Проведение как ниже в коде?
            Попытка
                ДокРеализация.Записать(РежимЗаписиДокумента.Запись);
                ФайлЛог.ЗаписатьСтроку("Загружен документ - " + СокрЛП(ДокРеализация.Ссылка));
            Исключение
                ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

            Попытка
                ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
                ФайлЛог.ЗаписатьСтроку("Проведен документ - " + СокрЛП(ДокРеализация.Ссылка));
            Исключение
                ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
                Сообщить(ОписаниеОшибки());
            КонецПопытки;


Максим75

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

Вот цитата:

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

Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
     Возврат;
КонецЕсли;

// код обработчика
// ...
КонецПроцедуры

Это необходимо для того, чтобы никакая бизнес-логика объекта не выполнялась при записи объекта через механизм обмена данными, поскольку она уже была выполнена для объекта в том узле, где он был создан. В этом случае все данные загружаются в ИБ «как есть», без искажений (изменений), проверок или каких-либо других дополнительных действий, препятствующих загрузке данных.

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

Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();

вот ссылочка https://its.1c.ru/db/v8std/content/773/hdoc

Goodest81

Цитата: Максим75 от 17 окт 2024, 11:32Goodest81, можно и так.
А в рамках моего кода можно и по другому?
Для меня не понятно как себя поведет  ДокРеализация.Записать(РежимЗаписиДокумента.Проведение), если до этого было
ДокРеализация.Записать(РежимЗаписиДокумента.Запись).
Проведение - это же запись, а потом проведение, а документ у меня уже записан, или при Проведении идет встроенная проверка, если записан, то просто провести?
Не будет ли тут попытка записать второй документ, в результате выскочит ошибка?

Максим75

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

Goodest81

Добрый день. Помогите с обменом.
Обмен регламентированный, стартует внешняя обработка. Все ок, но в случае проведения документа, если нет на складе товара, то обмен колом встает. Если запускаю в ручную, ошибки вижу, но обмен отрабатывает полностью.
Весь код показать не могу, но смысл следующий, если накладной из базы1 нет в базе2, то создаем  накладную в базе2, пихаем все данные из накладной из базы 1, записываем (это отрабатывает всегда), потом пытаемся провести и тут если есть товар на складе, то все ок, если нет - то в фоне падает, в ручном - выдает ошибку
Строка № 1. Не хватает ТМЦ "такого-то"  Артикул такой-то в количестве таком-то
{ВнешняяОбработка.НазваниеОбработки.МодульОбъекта(Строка_такая-то)}: Ошибка при вызове метода контекста (Записать): Не удалось провести "Расходная накладная такие-то данные"!
(часть сообщения изменил, таковы правила)

Попытка
ДокРеализация.Записать(РежимЗаписиДокумента.Запись);
ФайлЛог.ЗаписатьСтроку("Загружен документ - " + СокрЛП(ДокРеализация.Ссылка));
Исключение
ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
КонецПопытки;

Попытка
ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
ФайлЛог.ЗаписатьСтроку("Загружен и проведен документ - " + СокрЛП(ДокРеализация.Ссылка));
Исключение
ФайлЛогОшибки.ЗаписатьСтроку(ОписаниеОшибки());
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
  ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"), УровеньЖурналаРегистрации.Ошибка, , ,ТекстОшибки);
КонецПопытки;

Как правильно сделать, чтобы по ошибке обмен колом не вставал, а продолжал дальше

Максим75

Goodest81,
смотрите, ну надо тогда изменять логику в процедуре ОбработкаПроведения.
вот поищите и почитайте про такое:

"Использование признака ОбменДанными.Загрузка в обработчиках событий объекта"

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

это один из вариантов.
возможно есть и другие варианты решения этого.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск