Ошибка: Данные были изменены или удалены другим пользователем

1. TopZlodey 13 09.06.18 13:11 Сейчас в теме
Всем доброго времени суток. В общем пытаюсь научиться программировать на 1С, создал обработку которая при попытке удаления строки из ТЧ справочника уточняет его намерение и удаляет те же данные в РС. Все вроде бы как должно отрабатывать но при попытке записать данные (нажатие кнопки "записать" или "записать и закрыть") начинает выдавать ошибку "Данные были изменены или удалены другим пользователем". При этом при любых других изменениях справочника и регистра никаких проблем нет. Подскажите пожалуйста в какую сторону копать или в чем может быть причина-решение?
По теме из базы знаний
Найденные решения
7. artgen 09.06.18 14:09 Сейчас в теме
(4) Ну как и говорил, ты программно изменил и записал объект, который пытаешься записать интерактивно.
Не знаю, зачем это все нужно, наверное в качестве эксперимента.
Ты в объекте, который получил на сервере, поменял только родителя и записал, в объекте ты строки ТЧ не менял.
ЭФО_Объект = СтруктураЗаписи.Изделие.ПолучитьОбъект();
ЭФО_Объект.Родитель = Справочники.ЭФО.ПустаяСсылка();
....
ЭФО_Объект.Записать();

Этот код и приводит к ошибке, что данные уже изменены.
Либо удаляй строки в Объекте, либо записывай его интерактивно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VitalySh 09.06.18 13:31 Сейчас в теме
5. TopZlodey 13 09.06.18 13:37 Сейчас в теме
(2) Не уверен в чем именно проблема

&НаКлиенте
Процедура ТаблицаРесурсыИзделияПередУдалением(Элемент, Отказ)
	ДанныеСтроки = Элемент.ТекущиеДанные;
	
	СтруктураЗаписи = Новый Структура("Изделие,РесурсИзделия", ДанныеСтроки.НаименованиеИзделия, ДанныеСтроки.НаименованиеИзделия);
	ТекущаяСтрока = Элемент.ТекущаяСтрока;

	Оповещение = Новый ОписаниеОповещения("ТаблицаРесурсыИзделияПередУдалениемЗавершение", ЭтотОбъект, Новый Структура("СтруктураЗаписи,ТекущаяСтрока", СтруктураЗаписи, ТекущаяСтрока));
	
	ТекстВопроса = "Ресурс изделия будет удален из табличной части.
	|Продолжить?";
	
	Отказ = Истина;
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет);
	

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаРесурсыИзделияПередУдалениемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Ответ = РезультатВопроса;
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
		
	СтруктураЗаписи = ДополнительныеПараметры.СтруктураЗаписи;
	Отказ = Ложь;
	ТаблицаРесурсыИзделияПередУдалениемНаСервере(СтруктураЗаписи, Отказ);
	
	Если Отказ = Истина Тогда
		Возврат;
	КонецЕсли;
	
	ТекущаяСтрока = ДополнительныеПараметры.ТекущаяСтрока;
	СтрокаТаблицы = Объект.ТаблицаРесурсыИзделия.НайтиПоИдентификатору(ТекущаяСтрока);
	Объект.ТаблицаРесурсыИзделия.Удалить(СтрокаТаблицы);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ТаблицаРесурсыИзделияПередУдалениемНаСервере(СтруктураЗаписи, Отказ)
	
	НаборЗаписей = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
	
	НаборЗаписей.Отбор.РесурсИзделия.Установить(СтруктураЗаписи.РесурсИзделия);
	НаборЗаписей.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
	
	
	ЭФО_Объект = СтруктураЗаписи.Изделие.ПолучитьОбъект();
	ЭФО_Объект.Родитель = Справочники.ЭФО.ПустаяСсылка();	
	
	Попытка
		НачатьТранзакцию();	
		НаборЗаписей.Записать();	
		ЭФО_Объект.Записать();
		ЗафиксироватьТранзакцию();

	Исключение
		ОтменитьТранзакцию();

		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Произошла ошибка при удалении табличной части";
		Сообщение.Сообщить();

		ЗаписьЖурналаРегистрации("Произошла ошибка при удалении табличной части ресурсов изделия");
		
		Отказ = Истина;

	КонецПопытки;
	
КонецПроцедуры
Показать
3. artgen 09.06.18 13:34 Сейчас в теме
Ну так написано же что данные были изменены, то есть ты программно изменил и записал объект, который пытаешься записать интерактивно.
4. TopZlodey 13 09.06.18 13:36 Сейчас в теме
(3) Тогда код совсем не работает, так как при повторном открытии удаленные данные остаются на месте.
7. artgen 09.06.18 14:09 Сейчас в теме
(4) Ну как и говорил, ты программно изменил и записал объект, который пытаешься записать интерактивно.
Не знаю, зачем это все нужно, наверное в качестве эксперимента.
Ты в объекте, который получил на сервере, поменял только родителя и записал, в объекте ты строки ТЧ не менял.
ЭФО_Объект = СтруктураЗаписи.Изделие.ПолучитьОбъект();
ЭФО_Объект.Родитель = Справочники.ЭФО.ПустаяСсылка();
....
ЭФО_Объект.Записать();

Этот код и приводит к ошибке, что данные уже изменены.
Либо удаляй строки в Объекте, либо записывай его интерактивно.
8. TopZlodey 13 09.06.18 14:11 Сейчас в теме
(7)
ы в объекте, который получил на сервере, поменял только родителя и записал, в объекте ты строки ТЧ не менял.

Спасибо большое.
А каким образом их можно удалить?
Как понимаю тоже через ЭФО_Объект?
6. пользователь 09.06.18 14:05
Сообщение было скрыто модератором.
...
9. artgen 09.06.18 14:19 Сейчас в теме
Правильно, через ЭФО_Объект.
А вообще старайся сразу программировать правильно. Любые записи в регистр должны происходить в "Обработке проведения".
При удалении строки табличной части никаких удалений записей в регистре происходить не должно.
Все, пошел обедать.
10. TopZlodey 13 09.06.18 14:22 Сейчас в теме
(9) Понял, спасибо за помощь, попробую сделать)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот