Проверка данных ТЗ и их запись в РС

1. TopZlodey 13 18.06.18 09:33 Сейчас в теме
Здравствуйте, написал код:

Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)

ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;

ПризнакОсновногоРесурса = ТекущиеДанные.ПризнакОсновногоРесурса;

Для Каждого СтрокаТЧ Из ТаблицаРесурсыИзделия Цикл
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;

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

РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);

КонецЦикла;
ТекущиеДанные.ПризнакОсновногоРесурса = ПризнакОсновногоРесурса;
КонецПроцедуры


&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);

РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
РС.Прочитать();
РС.Очистить();

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



РС.Записать();


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

В идеале при выставлении пользователем в колонке типа Булево "флажка" (ПризнакОсновногоРесурса) все остальные значения колонки снимаются, после чего всё записываются в специально отведенный РС. Но столкнулся с проблемами:
1) Программа пытается, но не может записать строку которую изменяет пользователь (выдает ошибку на тему того что запись с такими полями уже существует)
2) Так и не записывает данные в РС.
Помогите решить как это исправить.
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
23. TopZlodey 13 18.06.18 15:01 Сейчас в теме +1 $m
Может быть кому нибудь пригодится для примера
Решение:

&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)


ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;

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

МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;

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


&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);

РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);

Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);

Попытка

РС.Записать();

Исключение

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

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

Отказ = Истина;

КонецПопытки;

КонецПроцедуры
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
16. vasilev2015 2698 18.06.18 11:41 Сейчас в теме
(1) Вместо унылого перечисления полей
....
СтрокаРС.СпособыХранения = СтруктураЗаписи.СпособыХранения;
СтрокаРС.СрокСлужбы = СтруктураЗаписи.СрокСлужбы;
СтрокаРС.СрокХранения = СтруктураЗаписи.СрокХранения;
...
всегда используйте процедуру ЗаполнитьЗначенияСвойств(Приемник, Источник)


И еще лучше: не переносите из таблицы в набор записей регистра, а выведите
поле типа "Набор записей регистра" на форму. Даже программировать не нужно.
+
2. TopZlodey 13 18.06.18 09:52 Сейчас в теме
3. pyrkin_vanya 488 18.06.18 10:04 Сейчас в теме
Это означает, что в Вашем регистре уже есть запись с таким набором измерений. Поэтому и вываливается ошибка. Следовательно, нужно пересмотреть структуру Вашего регистра.
+
4. TopZlodey 13 18.06.18 10:06 Сейчас в теме
(3) Это я понимаю, и хотел попробовать добавить эту колонку в исключения через НайтиПоИдентификатору(ТекущаяСтрока), но не вышло.
+
5. pyrkin_vanya 488 18.06.18 10:09 Сейчас в теме
(4)В смысле "в исключения"?! В исключения чего?
+
6. TopZlodey 13 18.06.18 10:12 Сейчас в теме
(5) Через Если Не ТаблицаРесурсыИзделия.НайтиПоИдентификатору(ТекущаяСтрока) Тогда
....
КонецЕсли;
То есть проверить и если это та самая строка которую мы меняем то не трогать её
+
7. pyrkin_vanya 488 18.06.18 10:14 Сейчас в теме
(6)Зачем вообще Вы перебираете циклом это ТаблицаРесурсыИзделия? У вас же уже есть ТекущиеДанные. Там все находится.
+
8. pyrkin_vanya 488 18.06.18 10:18 Сейчас в теме
И вообще такое мне кажется лучше делать при записи документа. Ибо ссылки может еще не быть...
+
9. TopZlodey 13 18.06.18 10:23 Сейчас в теме
(8)Немного не понял. Запись строк в ТЗ (ТаблицаРесурсыИзделия) у меня происходит в РС в процедуре ПриОкончанииРедактирования, сейчас мне нужно изменить-записать что у меня изменилось значение в одной колонке. Я не говорю что у меня написано правильно, наоборот мне нужно изменить чтобы было правильно, помогите пожалуйста поправить.
+
10. pyrkin_vanya 488 18.06.18 10:29 Сейчас в теме
(9)Вы тут СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
делаете отбор по ссылке. Ссылки может и не быть еще. Вы можете просто создать объект и на форме тыкать свою галочку. И у Вас будет ошибка. Я не понимаю изначальную задачу, поэтому могу лишь предположить. В процедуре после записи. когда уже есть ссылка, обходите свою табличную часть и пишите данные в регистр. Зачем они там вам нужны при установке галочки?
+
11. TopZlodey 13 18.06.18 10:38 Сейчас в теме
(10) Ошибка то выходит не из за того что ссылки нет, а из за того что программа пытается записать строку которая уже есть, мне с этим нужно разобрать. Проще говоря, мне нужно чтобы все остальные строки ТЗ записались в регистр кроме той которую я изменяю.
+
13. pyrkin_vanya 488 18.06.18 10:41 Сейчас в теме
(11)Вы меня не поняли. Вам нужно записывать данные в регистр только после записи самого объекта.
+
19. TopZlodey 13 18.06.18 12:23 Сейчас в теме
(13) Объект Записался, если вы про данные в ТЗ, вопрос как перезаписать данные других строк ТЗ-Регистра
+
20. pyrkin_vanya 488 18.06.18 12:30 Сейчас в теме
(19)У регистра сведений в записи есть параметр. Замещать. По умолчанию, вроде, стоит ложь. Посмотрите синтакс-помощник.
+
21. TopZlodey 13 18.06.18 12:41 Сейчас в теме
(20)
параметр. Замещать
Это ведь только через МенеджерЗаписи, через набор нельзя?
+
12. azanas 18.06.18 10:40 Сейчас в теме
Чем тебя не устроил ответ в другой твоей теме?Выведи на форму справочника табличную часть,где будет отображаться записи из твоего регистра. ТЧ заполняй при открытии справочника.Записывай при записи справочника.Удаляй все записи в регистре с отбором по справочнику,и записывай новый набор.
Если принципиально делать запись в регистр после изменения ТЧ, тогда делай аналогично,удаляй движения по отбору и записывай новые.
+
15. TopZlodey 13 18.06.18 11:34 Сейчас в теме
(12) Извините, тогда был какой то глюк на форуме и я не мог ничего писать. А это все мне нужно для того чтобы пользователь вводил все в тз и только проходя все проверки эти данные записывались в регистр.
+
17. azanas 18.06.18 11:47 Сейчас в теме
(15) Добавь свои проверки и запись в регистр в момент записи справочника =)
+
18. TopZlodey 13 18.06.18 11:52 Сейчас в теме
(17) Давайте не будем менять все, просто если есть возможность подскажите как поправить то что есть)
+
22. azanas 18.06.18 13:18 Сейчас в теме
14. azanas 18.06.18 10:43 Сейчас в теме
Замени

РС.Прочитать();
РС.Очистить();

на

РС.Записать();
+
23. TopZlodey 13 18.06.18 15:01 Сейчас в теме +1 $m
Может быть кому нибудь пригодится для примера
Решение:

&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)


ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;

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

МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;

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


&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);

РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);

Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);

Попытка

РС.Записать();

Исключение

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

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

Отказ = Истина;

КонецПопытки;

КонецПроцедуры
+
Внимание! Тема сдана в архив

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