Транзакции в 1С

⇒Курсы Стимул › Справочник › Полезные материалы › 1С:Предприятие 8.2 › Разработчикам › Создание и изменение объект…

1С:Предприятие 8.2 /
Разработчикам /
Создание и изменение объектов метаданных

Проверки, выполняемые в и вне транзакции записи объекта

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

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

В данной транзакции уже происходили ошибки

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

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

Для транзакционных проверок, в свою очередь, выделяются два случая:

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

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

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

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

Курсы бухгалтерии для руководителей
Услуги кураторства
Тренинг-семинар «Как получить работу бухгалтера»
Курсы бухгалтеров с трудоустройством
Курсы программирования 1С:Предприятие 8.2

Другие материалы по теме:
руководитель, инвентаризация товаров, проверки, должность, процесс, состояние, подразделения, выполнить, объект, конфигурирование, пример, сотрудник, документов, документа, документ

Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Создание и изменение объектов метаданных

Другие материалы по теме:

Общесистемные механизмы и принципы

Основные элементы подсистемы. Горизонт и периодичность планирования

Учет безналичных денежных средств. Поступление денежных средств

Почему при оформлении кадровых документов возникает сообщение "Противоречие в периодах по состоянию" и как его избежать?

Почему по основному месту работы сотрудника, который работал на предприятии как внутренний совместитель и был уволен, не проводятся документы по начислению отпуска (больничных и т.д.)?

Нас находят: xnj jpyfxftn d lfyyjq nhfypfrwbb e;t ghjbc Получить(); по причине: В данной транзакции уже происходили, что такое вне транзакции в 1с8, транзакция 1с 8 2 не может выполнена, при проведение вне транзакции остаются движения, номер транзакции 1С8, можно ли проверить есть ли транзакция 1с, можно ли в транзакции при записи установить реквизит объекта 1с

           

Обработка ошибок, возникающих при обмене данными в распределенной информационной базе

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

Общие ошибки, возникающие при работе с XML

Сообщение обмена данными является документом XML, поэтому имеет смысл описать возможные ошибки, которые могут возникнуть во время чтения/записи сообщений обмена данными при использовании средств чтения/записи данных XML, предоставляемых платформой "1С:Предприятие 8". При работе с данными в формате XML может возникать множество различных ситуаций, однако в данной статье будут рассмотрены только те, которые так или иначе имеют отношение к обмену данными в рамках распределенной информационной базы.

Сообщение об ошибке Описание ошибки
Возможные пути исправления ошибки
Не установлен MS XML Core Services 4.0 На компьютере не установлен Microsoft XML Core Services 4.0, используемый "1С:Предприятием 8" для работы с XML
Установить Microsoft XML Core Services 4.0. При установке "1С:Предприятия 8" Microsoft XML Core Services 4.0 устанавливается автоматически
Ошибка разбора XML Ошибка, возникающая при синтаксическом анализе данных XML в процессе чтения.
Все ошибки, определенные в SAX2, трансформируются в данную ошибку, генерируемую платформой "1С:Предприятие 8"
Проверить правильность оформления и синтаксис данных XML (см. http://www.w3.org/TR/REC-xml).
Ошибочный порядок записи XML Методы записи содержимого документа XML вызываются в неправильном порядке. Например, запись атрибута вызывается после записи текста элемента.
Выявить и исправить места некорректного порядка вызова методов
Текст XML содержит недопустимые символы Записываемый текст XML содержит недопустимые символы.
Текст XML должен соответствовать требованиям, изложенным в главе 2.2 рекомендации XML (см. http://www.w3.org/TR/REC-xml#charsets)
Недопустимое имя XML Записываемое имя XML содержит недопустимые символы.
Имя XML должно соответствовать требованиям, изложенным в главе 2.3 рекомендации XML (см. http://www.w3.org/TR/REC-xml#NT-Name)
Пустое значение URI допустимо только для пространства имен по умолчанию Производится попытка записать соответствие пространства имен, в котором URI пространства имен, представленному пустой строкой, соответствует непустой префикс.

Значение URI пространства имен должно соответствовать рекомендации Namespaces in XML (см.   http://www.w3.org/TR/REC-xml-names)

Переопределение пространства имен по умолчанию для текущего элемента XML недопустимо Текущий записываемый элемент не относится ни к какому пространству имен. Поэтому для него недопустимо определение непустого пространства имен по умолчанию.
Переопределение пространства имен по умолчанию для элемента, не относящегося ни к какому пространству имен -запрещено
Ошибка преобразования данных XML Ошибка возникает вследствие нарушения структуры передаваемых данных.
При чтении данных XML платформой производится автоматическое определение типа получаемых данных, кроме случаев, когда тип данных указан при вызове операции чтения. Если структура данных XML не соответствует структуре данных, определяемых типом, то будет сгенерировано данное сообщение об ошибке.
При обмене данными в рамках распределенной информационной базы используются штатные механизмы записи/чтения XML. Данная ошибка является следствием искажения сообщения обмена. Необходимо повторно получить сообщение от информационной базы — источника сообщения
Значения данного типа не могут быть представлены в XML

Производится попытка записи в XML значения, для типа которого не определена процедура записи в XML. Или производится попытка чтения из XML значения неизвестного типа или типа, для которого не определена процедура чтения из XML.

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

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

Ситуации, возникающие при обмене данными в рамках распределенной информационной базы

Сообщение об ошибке Описание ошибки
Возможные пути исправления ошибки
Узел не является узлом распределенной ИБ При вызове одного из методов встроенного языка, относящегося к распределенной ИБ, значение переданного параметра — узла плана обмена — не принадлежит плану обмена с установленным признаком "Распределенная информационная база".
Необходимо убедиться в правильности передаваемого в метод параметра
Запись сообщения обмена данными не начата В метод записи изменения данных передан в качестве параметра объект ЗаписьСообщенияОбмена, у которого не был вызван метод НачатьЗапись или был вызван метод завершения записи (ПрерватьЗапись, ЗакончитьЗапись).
Убедиться, что вызов записи изменений вызывается в рамках процесса записи объекта ЗаписьСообщенияОбмена
Чтение сообщения обмена данными не начато В метод чтения изменения данных передан в качестве параметра объект ЧтениеСообщенияОбмена, у которого не был вызван метод НачатьЧтение или был вызван метод завершения записи (ПрерватьЧтение, ЗакончитьЧтение).
Убедиться, что вызов чтения изменений вызывается в рамках процесса чтения объекта ЧтениеСообщенияОбмена.
Номер сообщения распределенной ИБ должен быть больше номера ранее принятого сообщения Производится попытка чтения старого (возможно, уже принятого) сообщения обмена данными.
Необходимо произвести синхронизации номера принятого сообщения в текущем узле распределенной ИБ и номера отправленного сообщения в узле — источнике сообщения обмена данными. Этого можно достичь при помощи непосредственного изменения соответствующих реквизитов у узлов плана обмена, по которому осуществляется работа, или выполнить запись необходимого количества сообщений обмена данными в узле — источнике сообщения
Начальный образ может быть выгружен только во вновь созданную или пустую ИБ По указанному месторасположению начального образа уже существует другая информационная база.
Необходимо убедиться, что при создании начального образа указано место, в котором не существует информационной базы
Ошибка формата представления изменений Структура и порядок следования элементов сообщения обмена данными не соответствуют требуемому.
При обмене данными в рамках распределенной информационной базы используются штатные механизмы записи/чтения XML. Данная ошибка является следствием искажения сообщения обмена данными. Необходимо повторно получить сообщение от информационной базы — источника сообщения
Попытка приема изменений от неизвестной конфигурации При попытке чтения сообщения обмена данными в рамках распределенной информационной базы обнаружено несоответствие конфигураций источника и приемника сообщения.
По всей видимости, сообщение обмена было записано для информационной базы, имеющей конфигурацию, отличную от данной. Подобная ситуация может произойти в случае ручной настройки распределенной информационной базы.

Проверки, выполняемые в и вне транзакции записи объекта

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

Искажены изменения конфигурации! При попытке чтения сообщения обмена данными обнаружены искажения в передаваемых изменениях конфигурации.
Необходимо получить от источника сообщения новое сообщение обмена данными
Конфигурация узла распределенной ИБ не соответствует ожидаемой! Конфигурация текущей информационной базы была изменена по отношению к конфигурации информационной базы источника сообщения.

В случае чтения сообщения обмена данными от подчиненного узла в главном узле данная ситуация является штатной и означает наличие изменений конфигурации, которые еще не были получены в подчиненном узле — источнике сообщения.

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

Изменения конфигурации не могут быть получены из подчиненного узла распределенной ИБ При чтении сообщения обмена, полученного от подчиненного узла, в нем обнаружены изменения конфигурации.
Подобная ситуация может возникнуть если имеет место искажение сообщения обмена, либо обмен производится в распределенной информационной базе с незавершенным процессом перестроения иерархии узлов. Необходимо убедится, что сообщение обмена получено без искажений и правильно заполнены узлы соответствующего плана обмена в обоих узлах распределенной информационной базы (источнике и приемнике сообщения).
Из главного узла распределенной ИБ получены изменения конфигурации.
Необходимо выполнить обновление конфигурации базы данных.
Обновление может быть выполнено в режиме Конфигуратор
Из главного узла получены изменения конфигурации.
Необходимо запустить систему в режиме Конфигуратор, произвести обновление конфигурации базы данных, после чего повторить чтение данного сообщения обмена в режиме 1С:Предприятие для завершения чтения сообщения.
Данные не входят в состав плана обмена При чтении сообщения обмена обнаружены данные, не входящие в состав плана обмена.
При обмене данными в рамках распределенной информационной базы используются штатные механизмы записи/чтения XML. Данная ошибка является следствием искажения сообщения обмена. Необходимо повторно получить сообщение от информационной базы — источника сообщения

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

Ошибки базы данных и транзакции

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

  • невосстановимые;

  • восстановимые.

К невосстановимым относятся такие ошибки базы данных, при возникновении которых функционирование 1С:Предприятия 8 может быть серьезно нарушено. Поэтому, во избежание более серьезных неприятностей (например, порчи данных),  при возникновении невосстановиимой ошибки выполнение 1С:Предприятия 8 прекращается. Если невосстановимая ошибка базы данных произошла в процессе выполнения транзакции, то все изменения сделанные в рамках этой транзакции отменяются.

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

В данной транзакции уже происходили ошибки.

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

Копировать в буфер обменаНачатьТранзакцию(); Записано =Ложь;ПокаНе Записано ЦиклПопытка Данные.Записать(); Записано =Истина;ИсключениеКонецПопытки;КонецЦикла; ЗафиксироватьТранзакцию();

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

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

Копировать в буфер обменаЗаписано =Ложь;ПокаНе Записано ЦиклПопытка НачатьТранзакцию(); Данные.Записать(); ЗафиксироватьТранзакцию(); Записано =Истина;Исключение ОтменитьТранзакцию();КонецПопытки;КонецЦикла;

В данном варианте, если при выполнении оператора Данные.Записать() произойдет восстановимая ошибка базы данных, то при обработке исключения, вызванного этой ошибкой, транзакция будет отменена и при повторном выполнении цикла транзакция будет начата сначала.

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

Копировать в буфер обменаНачатьТранзакцию();// Начало транзакции — счетчик становится равным 1… НачатьТранзакцию();// Счетчик увеличивается на 1 и становится равным 2… ЗафиксироватьТранзакцию();// Счетчик уменьшается на 1 и становится равным 1… ЗафиксироватьТранзакцию();// Фиксация транзакции

Если же при значении счетчика траназкций большем 1 произойдет обращение к методу ОтменитьТранзакцию(), то значение счетчика транзакций не только будет уменьшено на 1, но и произойдет установка признака, не позволяющего зафиксировать результаты выполнения всей транзакции в целом. И последующее обращение к методу ЗафиксироватьТранзакцию(), выполняемое при значении счетчика транзакций равном 1, фактически приведет к отмене  транзакции:

Копировать в буфер обменаНачатьТранзакцию();// Начало транзакции — счетчик становится равным 1… НачатьТранзакцию();// Счетчик увеличивается на 1 и становится равным 2… ОтменитьТранзакцию();// Счетчик уменьшается на 1 и становится равным 1, устанавливается признак отмены транзакции…. ЗафиксироватьТранзакцию();// Фактическая отмена транзакции

Аналогично, ошибка базы данных, произошедшая при значении счетчика транзакций большем 1, приведет к невозможности продолжения и фиксации всей транзакции в целом.

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