1с провел не тот документ

Обновлено: 07.07.2024

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

Было мнение, что 1С просто "захлебывается", т.к. проведение документов при выгрузке происходит интенсивнее, пытался лимитировать по времени (даже в ущерб производительности), но данное мнение не подтвердилось.

Если кто сталкивался с подобным откликнитесь пожалуйста. Как решили данную проблему?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Программное проведение документа
Привет. Пишу такой код для программного проведения документа(обработку пишу): &НаСервере.

Программное проведение документа из обработки
Всем привет! В обработке создаю документ, но не пойму как его провести. Пробовал вот так, но не.

Проведение документа в общем модуле
Помогите пожалуйста, я создал объект для "Регламентных Заданий". создаю объект Документа и.

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

dima_si, какая версия конфигурации и какая совместимость стоит у расширения ?

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

1С:Предприятие 8.3 (8.3.14.1779)
Бухгалтерия предприятия, редакция 3.0 (3.0.73.38)
Выгрузка из банка через файлы

Добавлено через 13 минут
dggrom, подскажите где искать, плутаю по меню, не могу проверить включен ли режим обмена.
1С:Предприятие 8.3 (8.3.14.1779)
Бухгалтерия предприятия, редакция 3.0 (3.0.73.38)
Выгрузка из банка через файлы

Возможно прошло обновление и расширение отключилось. Посмотреть можно в предприятии на вкладе с подключаемыми внешнии обработками. Там должно быть ваше расширение и гореть зеленная лампочка.

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

Решение

dima_si, у расширения уберите безопасный режим dggrom, не прокатит, в режиме обмена обработка проведения вооообще не вызывается ))) Dethmontt, разве ? Если в "ПередЗаписью" и "ПриЗаписи" не закомментировать этот код, потом не вызывается процедура проведения ? Коллеги, давайте не будем забывать, что конфигурация типовая, лезть в конфигурацию никто мне не позволит, да и потом, она же обновляться будет. dggrom - расширение не отключается, по крайней мере визуально этого не видно. Там много чего еще в этом расширении, но вот отпадает этот момент. И как объяснить тот факт, что ручками то все нормально проводится, а вот когда идет выгрузка из банка (выгружаем выписку по старинке, через файлы), то не все срабатывают документы. Да, какая-то часть срабатывает. Некоторые остаются. При этом доки проводятся, инфа не выгружается. А после берешь этот документ, еще раз проводишь руками и вуаля - все нормально, пользователя не меняли, на права грешить не нужно.

dima_si, Ну значит нужно анализировать ту часть которая проводится с той которая не провелась нормально.

расширение не отключается, по крайней мере визуально этого не видно

При переносе данных между базами часто возникает ситуация, когда движения документов переносить не требуется, а перенесенные документы следует проводить в базе-приёмнике. Например, в базе-источнике ведется управленческий учет, а в базе-приемнике регламентированный. Если при переносе не учитывать свойство «Проведен» документа, то можно получить в приемнике проведенные документы, у которых данные в движениях и в объекте не соответствуют друг другу.

В правилах конвертации объектов (ПКО) в обработчике «Перед загрузкой» существуют параметры «РежимЗаписи» и «РежимПроведения», указание которых обеспечивает необходимый режим записи объекта, но в этом случае, запись происходит во время загрузки данных и если, по каким-то причинам, документ не запишется, загрузка данных будет прервана. Правильней записывать новые документы в конце загрузки, когда все перенесенные объекты уже будут в базе - приемнике.

Несколько основных моментов:

Для решения стоящей задачи наиболее удобно использовать обработчики событий конвертации в целом. Но нам необходимо определить – объект - это документ, и если документ – то проводится ли он. Для идентификации документа используем параметр обработчика ИмяТипаОбъекта.

I. Первый, более простой, случай: требуется оставлять в базе-приемнике документы непроведенными.

Подразумевается, что пользователи в базе-приемнике проверят документы и потом их проведут. Если не переносить движения и просто указать в свойстве «Проведен» - «Значение = Ложь», то можем получить при повторном переносе документы внешне не проведенные, но с движениями. К этому получим справедливое возмущение пользователей, которые не смогут понять результатов отчетов.

Свойство «Проведен» необходимо исключить из переноса в каждом документе. Нам необходимо при выгрузке данных запоминать необходимые для отмены проведения документы и после загрузки данных записать их с режимом отмены проведения. Помимо ссылки на документ необходимо сохранять и информацию об его пометке удаления. Для получения информации о пометке удаления данное свойство каждого проводимого документа необходимо передавать в параметр, который назовем также, как и имя свойства - ПометкаУдаления. (Рис.1)

1. В обработчике « Перед загрузкой данных » конвертации создаем параметр с типом значений «Таблица значений». В колонку "Действие" строкой будем записывать – что делать с документом: просто отменять проведение или еще проставлять пометку на удаление.

ТаблицаДокументов = Новый ТаблицаЗначений ;
ТаблицаДокументов . Колонки . Добавить ( "Ссылка" );
ТаблицаДокументов . Колонки . Добавить ( "Действие" );
Параметры . Вставить ( "ТаблицаДокументов" , ТаблицаДокументов );

2. В обработчике «После загрузки объекта» конвертации, определяем найден ли объект, является ли объект документом, проводится ли он, и если в приемнике он проведен, то только тогда помещаем ссылку на него в наш параметр ТаблицаДокументов.

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

3. В обработчике «После загрузки данных» конвертации отменяем проведение у записанных документов, проставляем при необходимости пометку на удаление и удаляем наш параметр. При желании отследить процесс удаления код обработчика может выглядеть так:

II. Требуется обеспечить проведение документов в базе-приемнике при переносе.

В этом случае необходимо помимо пометки удаления передавать значение свойства «Проведен» в параметр «Проведен» и данный параметр анализировать в обработчике «После загрузки объекта» (Рис.2).

1. « Перед загрузкой данных » Повторяем создание параметра конвертации, как в первом примере

ТаблицаДокументов = Новый ТаблицаЗначений ;
ТаблицаДокументов . Колонки . Добавить ( "Ссылка" );
ТаблицаДокументов . Колонки . Добавить ( "Действие" );
Параметры . Вставить ( "ТаблицаДокументов" , ТаблицаДокументов );

2. «После загрузки объекта » После загрузки мы должны уже работать с объектами, которые еще не записаны в базе. Документы можно выделить по типу значения, а новый объект, перед внесением в таблицу параметра, необходимо предварительно записать. Не забываем установить параметр «ОбъектМодифицирован» в «Ложь».

Если ИмяТипаОбъекта = "Документ"
И Объект . Метаданные (). Проведение = Метаданные . СвойстваОбъектов . Проведение . Разрешить Тогда

Если Не ОбъектНайден Тогда
Объект . Записать ();
ОбъектМодифицирован = Ложь;
КонецЕсли;

НоваяСтрока = Параметры . ТаблицаДокументов . Добавить ();
НоваяСтрока . Ссылка = Объект . Ссылка ;

Если ПараметрыОбъекта . Получить ( "Проведен" ) Тогда
НоваяСтрока . Действие = "Проведение" ;
ИначеЕсли ПараметрыОбъекта . Получить ( "ПометкаУдаления" ) Тогда
НоваяСтрока . Действие = "Удаление" ;
Иначе
НоваяСтрока . Действие = "Отмена" ;
КонецЕсли;
КонецЕсли;

3. «После загрузки данных » После загрузки мы должны пропустить запись документа, если он не проведен в базе-источнике и в базе приемника. Также необходимо проследить за пометкой удаления.

Для каждого СтрокаТч Из Параметры . ТаблицаДокументов Цикл


Если СтрокаТч . Действие = "Отмена" И Не СтрокаТч . Ссылка . Проведен Тогда
Если СтрокаТч . Ссылка . ПометкаУдаления Тогда //Для снятия пометки удаления
Попытка
ДокОбъект = СтрокаТч . Ссылка . ПолучитьОбъект ();
ДокОбъект . ПометкаУдаления = Ложь;
ДокОбъект . Записать ();
Исключение
КонецПопытки;
КонецЕсли;

Если СтрокаТч . Действие = "Проведение" Тогда
РежимЗаписи = РежимЗаписиДокумента . Проведение ;
Иначе
РежимЗаписи = РежимЗаписиДокумента . ОтменаПроведения ;
КонецЕсли;

Если СтрокаТч . Действие = "Удаление" Тогда
ДокОбъект . ПометкаУдаления = Истина;
ДокОбъект . Записать ();
ИначеЕсли СтрокаТч . Ссылка . ПометкаУдаления Тогда
ДокОбъект . ПометкаУдаления = Ложь;
ДокОбъект . Записать ();
КонецЕсли;
Исключение

Особенности использования поля "Проведен" и процесса проведения

В документах 1С:Предприятия 8 поддерживается механизм проведения. Он представляет собой реализованную на уровне системы методологию отражения в учетных механизмах события хозяйственной жизни, отражаемого документом. Механизм проведения реализован таким образом, чтобы, с одной стороны, минимизировать усилия разработчика при использовании его в типовых случаях, а, с другой стороны, чтобы обеспечить гибкие возможности изменения стандартной методологии.

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

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

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

Использование поля Проведен и процесса проведения является только предлагаемой системой методологией.

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

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

Предлагаемая системой методология обеспечивает наиболее простой способ управления документом и его движениями для случая, когда документ содержит информацию о некотором событии, произошедшим на предприятии, а движения отражают эти события в различных учетных механизмах. Если у документа в метаданных свойство УдалениеДвижений имеет значение УдалятьАвтоматически, то перед проведением и при отмене проведения автоматически выполняется удаление существующих движений. Таким образом, при использовании стандартной методологии разработчику необходимо реализовать только формирование новых движений в обработчике ОбработкаПроведения() .

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

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

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

Проверка изменения данных при записи объектов

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

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

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

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

Например, считывание может быть выполнено обращением через ссылку:

Однако следует учитывать, что при обращении к ссылке считывается весь объект целиком. То, что он ранее считывался и находится в кеше, здесь не поможет, так как при работе транзакции используется отдельный кеш. Соответственно, затраты на получение одного или двух реквизитов могут оказаться неоправданно большими. Поэтому можно рекомендовать для считывания отдельных реквизитов использовать запросы. Например:

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

Заметим, что таким способом можно, например, определить, что объект помечается на удаление. Для этого достаточно проверить, изменение поля ПометкаУдаления .

Однако если нам нужно обработать изменение реквизита после записи документа, например, в обработчике ПриЗаписи , то, разумеется, считывание данных из базы данных не подходит, так как информация в базе данных уже изменена. В этом случае нужно само считывание выполнять в обработчике ПередЗаписью и запоминать считанные значения в переменных модуля. А уже анализ выполнять в обработчике ПриЗаписи .

Читайте также: