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

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

Автор Goodest81, Вчера в 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 от Вчера в 11:32Goodest81, можно и так.
А в рамках моего кода можно и по другому?
Для меня не понятно как себя поведет  ДокРеализация.Записать(РежимЗаписиДокумента.Проведение), если до этого было
ДокРеализация.Записать(РежимЗаписиДокумента.Запись).
Проведение - это же запись, а потом проведение, а документ у меня уже записан, или при Проведении идет встроенная проверка, если записан, то просто провести?
Не будет ли тут попытка записать второй документ, в результате выскочит ошибка?

Максим75

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

Теги:

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

Рейтинг@Mail.ru

Поиск