При обновлении распределенной информационной базы (РИБ) в 1С:Рознице пользователи часто сталкиваются с ошибкой "В данной транзакции уже происходили ошибки!", особенно когда речь идет о переходе на новые релизы (например, с 2.2.6 на 2.2.12 или с 2.2.12 на 2.13.8). Эта ошибка обычно возникает в периферийном узле во время получения данных, и в журнале регистрации она часто сопровождается упоминанием документа "Ввод начальных остатков узла", а также указанием на то, что сообщение обмена удалено из кэша.
Проанализируем эту ситуацию и рассмотрим различные подходы к ее устранению, начиная с подготовительных шагов и заканчивая конкретными решениями.
Прежде чем приступать к обновлению РИБ, особенно в случае возникновения проблем, мы настоятельно рекомендуем выполнить ряд подготовительных действий. Эти шаги помогут минимизировать риски и упростить процесс восстановления в случае непредвиденных ситуаций.
Сообщение "В данной транзакции уже происходили ошибки!" не является первопричиной проблемы, а лишь ее следствием. Оно означает, что на более раннем этапе внутри текущей транзакции произошло какое-то исключение, и СУБД пометила эту транзакцию как "испорченную" (или "только для отмены" - rollback only). Любая последующая попытка выполнить операцию с базой данных в рамках этой же транзакции приведет к выдаче данного сообщения.
Часто эта ошибка возникает при попытке проведения документа "Ввод начальных остатков узла", который передается в периферийный узел (иногда это путают с загрузкой остатков из Розницы 2.2). Проблема может быть связана с некорректными данными в этом документе, дублирующимися строками, или спецификой обработки этого документа в обновленной конфигурации.
Для более точного определения места возникновения исходной ошибки (до того, как транзакция стала "испорченной") мы рекомендуем использовать технологический журнал 1С. Настройте в нем фильтрацию по событиям SDBL с параметром Func = "setRollbackOnly", а также по событию EXCP. Это поможет выявить участок кода, где транзакции был присвоен статус "только для отмены", и найти истинную причину проблемы.
Один из наиболее эффективных и подтвержденных на практике способов решения этой проблемы, согласно опыту пользователей, заключается во временном отключении кода, отвечающего за проведение документа "Ввод начальных остатков узла" в момент обновления.
Мы выяснили, что документ ВводНачальныхОстатковУзла часто становится камнем преткновения. Если в периферийной базе имеются старые или некорректные документы этого типа, или же новый релиз некорректно обрабатывает их при получении, это может привести к исключению, которое испортит транзакцию.
Разберем по шагам, как это сделать:
ПланыОбмена, найдите ПоМагазину, затем откройте его МодульОбъекта.ПередЗаписью или аналогичной, которая выполняется при получении данных обмена. Часто этот код выглядит следующим образом:
// ... другие операции ...
ВыборкаДокументов = Документы.ВводНачальныхОстатковУзла.Выбрать(,, Новый Структура("КодУзлаОбмена", ПредопределенныйУзел.Код), "Дата");
Пока ВыборкаДокументов.Следующий Цикл
ДокументВыборки = ВыборкаДокументов.ПолучитьОбъект;
Если ДокументВыборки <> Неопределено И НЕ ДокументВыборки.ПометкаУдаления И НЕ ДокументВыборки.Проведен Тогда
ДокументВыборки.Узел = Ссылка;
Если НЕ ОбменДаннымиПереопределяемый.ЗаписатьВводОстатков(ДокументВыборки, РежимЗаписиДокумента.Проведение) Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ... другие операции ...
Обратите внимание на строку Пока ВыборкаДокументов.Следующий Цикл. Именно в этом цикле при попытке обработки существующего документа может возникнуть ошибка.
ВводНачальныхОстатковУзла. Это можно сделать, добавив // перед каждой строкой или используя блоки #Если &НеИспользованиеРИБ Тогда ... #КонецЕсли, но для временного решения достаточно просто закомментировать.
// Начало закомментированного блока для обхода ошибки при обновлении РИБ
// ВыборкаДокументов = Документы.ВводНачальныхОстатковУзла.Выбрать(,, Новый Структура("КодУзлаОбмена", ПредопределенныйУзел.Код), "Дата");
// Пока ВыборкаДокументов.Следующий Цикл
// ДокументВыборки = ВыборкаДокументов.ПолучитьОбъект;
// Если ДокументВыборки <> Неопределено И НЕ ДокументВыборки.ПометкаУдаления И НЕ ДокументВыборки.Проведен Тогда
// ДокументВыборки.Узел = Ссылка;
// Если НЕ ОбменДаннымиПереопределяемый.ЗаписатьВводОстатков(ДокументВыборки, РежимЗаписиДокумента.Проведение) Тогда
// Отказ = Истина;
// КонецЕсли;
// КонецЕсли;
// КонецЦикла;
// Конец закомментированного блока
МодульОбъекта плана обмена, раскомментируйте строки, сохраните конфигурацию базы данных и обновите конфигурацию базы данных. Это важно для обеспечения корректной работы РИБ в дальнейшем.Этот метод является более радикальным, но часто помогает в случаях, когда прямые обмены или комментирование кода не решают проблему. Он предполагает временное превращение периферийного узла в обычную, самостоятельную базу, ее обновление, а затем повторное включение в структуру РИБ.
Мы рекомендуем использовать этот подход, если предыдущее решение с комментированием кода не дало результата, или если вы имеете дело с очень большим количеством пропущенных релизов, что усложняет последовательное обновление.
Разберем процесс по шагам:
ГлавныйУзел. Установите ее в пустое значение (Не определено).НастройкаПодчиненногоУзлаЗавершена. Снимите флажок или установите ее в Ложь.После этих действий периферийный узел временно станет обыкновенной, самостоятельной информационной базой.
Central_to_Shop_N.zip).После успешной загрузки начального образа и проведения первичного обмена, периферийный узел будет снова полноценно работать в составе РИБ.
Если ошибка "В данной транзакции уже происходили ошибки!" связана непосредственно с некорректными данными в документе "Ввод начальных остатков узла", мы можем попробовать скорректировать его.
Выясним возможные причины, среди которых часто требуется поиск и восстановление битых ссылок:
ЦеныНоменклатуры, могут присутствовать дублирующие строки, что вызывает исключение при попытке их обработки или записи.Рассмотрим варианты корректировки:
ВводНачальныхОстатковУзла. Например, если проблема в ценах номенклатуры, можно очистить табличную часть ЦеныНоменклатуры.
// Пример кода для очистки табличной части "ЦеныНоменклатуры"
// ВНИМАНИЕ: Выполняйте этот код на резервной копии и с полным пониманием его работы!
// Откройте базу в режиме конфигуратора
// Запустите "Выполнить произвольный код" или создайте временную обработку
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ССЫЛКА
|ИЗ Документ.ВводНачальныхОстатковУзла
|ГДЕ Истина"; // Можно добавить условия для отбора конкретных документов
ВыборкаДокументов = Запрос.Выполнить().Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
Попытка
ДокументОбъект = ВыборкаДокументов.ССЫЛКА.ПолучитьОбъект();
Если ДокументОбъект.ЦеныНоменклатуры.Количество() > 0 Тогда
ДокументОбъект.ЦеныНоменклатуры.Очистить();
ДокументОбъект.Записать();
Сообщить("В документе " + ДокументОбъект.Номер + " от " + ДокументОбъект.Дата + " очищена табличная часть ЦеныНоменклатуры.");
КонецЕсли;
Исключение
Сообщить("Ошибка при обработке документа " + ВыборкаДокументов.ССЫЛКА + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ЦеныНоменклатуры). После удаления дублей обязательно зарегистрируйте данный документ к выгрузке (если он должен участвовать в обмене) и попробуйте провести обмен снова.ВводНачальныхОстатковУзла в периферийном узле через "Все функции" -> "Стандартные" -> "Удаление помеченных объектов" (после пометки их на удаление). Это может помочь, если именно их наличие или попытка проведения вызывает конфликт при обновлении.Иногда, на первый взгляд нелогичное, но действенное решение заключается в манипуляциях с датой запрета изменения данных. Эта проблема может быть вызвана тем, что система пытается что-то записать или изменить в документе "Ввод начальных остатков узла" за период, который уже закрыт для изменений.
Рассмотрим шаги, как это сделать:
Мы видим, что проблема обновления РИБ в 1С:Рознице с ошибкой "В данной транзакции уже происходили ошибки!" является достаточно комплексной и может быть вызвана разными причинами, часто связанными с обработкой документа ВводНачальныхОстатковУзла. Мы разобрали несколько действенных решений: от временного комментирования кода до полной переинициализации узла и корректировки данных. Всегда помните о необходимости создания резервных копий и тестировании любых изменений на копии базы данных перед применением на рабочей системе.