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

Ошибка записи в базу

Автор Maxx79, 28 дек 2013, 10:54

0 Пользователей и 1 гость просматривают эту тему.

Maxx79

Добрый день!
На форме элемента справочника Номенклатуры есть реквизит с типом ТаблицаЗначений (см. рисунок), который заполняется так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Если Объект.Родитель.Оригинал Тогда
Объект.Оригинал = Истина;
Иначе
Объект.Оригинал = Ложь;
КонецЕсли;
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
Объект.ЦеноваяГруппа = Объект.Родитель.ЦеноваяГруппа;
Объект.ЕдиницаИзмерения = Объект.Родитель.ЕдиницаИзмерения;
Объект.Производитель = Объект.Родитель.Производитель;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | УровниЦен.Ссылка,
               | УровниЦен.ВалютаЦены,
               | УровниЦен.РассчетнаяЦена
               |ИЗ
               | Справочник.УровниЦен КАК УровниЦен";
   
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Стр = ТаблицаЦен.Добавить();
Стр.УровниЦен = Результат.Ссылка;
Стр.ВалютаЦены = Результат.ВалютаЦены;
Стр.РассчетнаяЦена = Результат.РассчетнаяЦена;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗакладкиПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если Элементы.Цена.Имя = "Цена" Тогда
ЗаполнитьЦены();
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦены()
Для Каждого Стр Из ТаблицаЦен Цикл
Стр.ЗначениеЦены = ОбщиеМеханизмы.ПолучитьЦенуТовара(Стр.УровниЦен, Объект.Ссылка);
КонецЦикла;
КонецПроцедуры


Изменить цены (не динамические) пользователь может непосредственно в таблице, при этом происходит следующее:
&НаКлиенте
Процедура ТаблицаЦенПередНачаломИзменения(Элемент, Отказ)
Если Элементы.ТаблицаЦен.ТекущиеДанные.РассчетнаяЦена ИЛИ Элемент.Родитель.Имя <> "Цена" Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ЗаписатьЦенуВБазу(Товар, УЦ, НоваяЦена)
ТоварСсылка = Товар.ПолучитьОбъект();

Если УЦ = Справочники.УровниЦен.ЦенаАкция Тогда
    ТоварСсылка.ЦенаАкция = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаЗакупки Тогда
ТоварСсылка.ЦенаЗакупки = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаКрупныйОпт Тогда
ТоварСсылка.ЦенаКрупныйОпт = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаОпт Тогда
ТоварСсылка.ЦенаОпт = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаРозница Тогда
ТоварСсылка.ЦенаРозница = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаСпец Тогда
ТоварСсылка.ЦенаСпец = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц1 Тогда
ТоварСсылка.Цена1 = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц2.ЦенаАкция Тогда
ТоварСсылка.Цена2 = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц3 Тогда
ТоварСсылка.Цена3 = НоваяЦена;
КонецЕсли;

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

ЗаполнитьЦены();
КонецПроцедуры

После этого при попытке записать объект вылетает ошибка: Данные были изменены или удалены другим пользователем.
Если во "Всех действиях" нажать "Перечитать" - > "Да", то объект можно будет записать.

Помогите разобраться с проблемой!

DmitriyF

Цитата: Maxx79 от 28 дек 2013, 10:54
Добрый день!
На форме элемента справочника Номенклатуры есть реквизит с типом ТаблицаЗначений (см. рисунок), который заполняется так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Если Объект.Родитель.Оригинал Тогда
Объект.Оригинал = Истина;
Иначе
Объект.Оригинал = Ложь;
КонецЕсли;
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
Объект.ЦеноваяГруппа = Объект.Родитель.ЦеноваяГруппа;
Объект.ЕдиницаИзмерения = Объект.Родитель.ЕдиницаИзмерения;
Объект.Производитель = Объект.Родитель.Производитель;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | УровниЦен.Ссылка,
               | УровниЦен.ВалютаЦены,
               | УровниЦен.РассчетнаяЦена
               |ИЗ
               | Справочник.УровниЦен КАК УровниЦен";
   
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Стр = ТаблицаЦен.Добавить();
Стр.УровниЦен = Результат.Ссылка;
Стр.ВалютаЦены = Результат.ВалютаЦены;
Стр.РассчетнаяЦена = Результат.РассчетнаяЦена;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗакладкиПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если Элементы.Цена.Имя = "Цена" Тогда
ЗаполнитьЦены();
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦены()
Для Каждого Стр Из ТаблицаЦен Цикл
Стр.ЗначениеЦены = ОбщиеМеханизмы.ПолучитьЦенуТовара(Стр.УровниЦен, Объект.Ссылка);
КонецЦикла;
КонецПроцедуры


Изменить цены (не динамические) пользователь может непосредственно в таблице, при этом происходит следующее:
&НаКлиенте
Процедура ТаблицаЦенПередНачаломИзменения(Элемент, Отказ)
Если Элементы.ТаблицаЦен.ТекущиеДанные.РассчетнаяЦена ИЛИ Элемент.Родитель.Имя <> "Цена" Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ЗаписатьЦенуВБазу(Товар, УЦ, НоваяЦена)
ТоварСсылка = Товар.ПолучитьОбъект();

Если УЦ = Справочники.УровниЦен.ЦенаАкция Тогда
    ТоварСсылка.ЦенаАкция = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаЗакупки Тогда
ТоварСсылка.ЦенаЗакупки = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаКрупныйОпт Тогда
ТоварСсылка.ЦенаКрупныйОпт = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаОпт Тогда
ТоварСсылка.ЦенаОпт = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаРозница Тогда
ТоварСсылка.ЦенаРозница = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.ЦенаСпец Тогда
ТоварСсылка.ЦенаСпец = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц1 Тогда
ТоварСсылка.Цена1 = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц2.ЦенаАкция Тогда
ТоварСсылка.Цена2 = НоваяЦена;
ИначеЕсли УЦ = Справочники.УровниЦен.Ц3 Тогда
ТоварСсылка.Цена3 = НоваяЦена;
КонецЕсли;

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

ЗаполнитьЦены();
КонецПроцедуры

После этого при попытке записать объект вылетает ошибка: Данные были изменены или удалены другим пользователем.
Если во "Всех действиях" нажать "Перечитать" - > "Да", то объект можно будет записать.

Помогите разобраться с проблемой!

Я так понимаю цены хранятся в самой номенклатуре, не самый лучший вариант. Лучше использовать регистр сведений и там писать все изменения.

Besart

я так понял вы программно меняете данные на форме, попробуйте ОбновитьИнтерфейс() или Обновить() для таб. части, или записывайте в модуле объекта МойОбъект = РеквизитФормыВЗначение("Объект");
МойОбъект.ЗаписатьОбновленныеДанные();// ЗаписатьОбновленныеДанные - экспортная процедура в модуле объекта
ЗначениеВДанныеФормы(МойОбъект, Объект) ;

Maxx79

Спасибо всем! Проблема решена.

ЦитироватьПосле этого при попытке записать объект вылетает ошибка: Данные были изменены или удалены другим пользователем.
Если во "Всех действиях" нажать "Перечитать" - > "Да", то объект можно будет записать.

Помогло:
ЭтаФорма.Прочитать();

Теги:

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

Рейтинг@Mail.ru

Поиск