Здравствуйте, написал код:
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПризнакОсновногоРесурса = ТекущиеДанные.ПризнакОсновногоРесурса;
Для Каждого СтрокаТЧ Из ТаблицаРесурсыИзделия Цикл
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЦикла;
ТекущиеДанные.ПризнакОсновногоРесурса = ПризнакОсновногоРесурса;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
РС.Прочитать();
РС.Очистить();
Для Каждого Строка Из СтруктураЗаписи Цикл
СтрокаРС = РС.Добавить();
СтрокаРС.Изделие = СтруктураЗаписи.Изделие;
СтрокаРС.РесурсыИзделия = СтруктураЗаписи.РесурсыИзделия;
СтрокаРС.ЕдиницыИзмерения = СтруктураЗаписи.ЕдиницыИзмерения;
СтрокаРС.СпособыХранения = СтруктураЗаписи.СпособыХранения;
СтрокаРС.СрокСлужбы = СтруктураЗаписи.СрокСлужбы;
СтрокаРС.СрокХранения = СтруктураЗаписи.СрокХранения;
СтрокаРС.УстановленныйРесурс = СтруктураЗаписи.УстановленныйРесурс;
СтрокаРС.ПризнакОсновногоРесурса = СтруктураЗаписи.ПризнакОсновногоРесурса;
СтрокаРС.Примечание = СтруктураЗаписи.Примечание;
СтруктураЗаписи.ПризнакОсновногоРесурса = Ложь;
КонецЦикла;
РС.Записать();
КонецПроцедуры
В идеале при выставлении пользователем в колонке типа Булево "флажка" (ПризнакОсновногоРесурса) все остальные значения колонки снимаются, после чего всё записываются в специально отведенный РС. Но столкнулся с проблемами:
1) Программа пытается, но не может записать строку которую изменяет пользователь (выдает ошибку на тему того что запись с такими полями уже существует)
2) Так и не записывает данные в РС.
Помогите решить как это исправить.
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПризнакОсновногоРесурса = ТекущиеДанные.ПризнакОсновногоРесурса;
Для Каждого СтрокаТЧ Из ТаблицаРесурсыИзделия Цикл
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЦикла;
ТекущиеДанные.ПризнакОсновногоРесурса = ПризнакОсновногоРесурса;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
РС.Прочитать();
РС.Очистить();
Для Каждого Строка Из СтруктураЗаписи Цикл
СтрокаРС = РС.Добавить();
СтрокаРС.Изделие = СтруктураЗаписи.Изделие;
СтрокаРС.РесурсыИзделия = СтруктураЗаписи.РесурсыИзделия;
СтрокаРС.ЕдиницыИзмерения = СтруктураЗаписи.ЕдиницыИзмерения;
СтрокаРС.СпособыХранения = СтруктураЗаписи.СпособыХранения;
СтрокаРС.СрокСлужбы = СтруктураЗаписи.СрокСлужбы;
СтрокаРС.СрокХранения = СтруктураЗаписи.СрокХранения;
СтрокаРС.УстановленныйРесурс = СтруктураЗаписи.УстановленныйРесурс;
СтрокаРС.ПризнакОсновногоРесурса = СтруктураЗаписи.ПризнакОсновногоРесурса;
СтрокаРС.Примечание = СтруктураЗаписи.Примечание;
СтруктураЗаписи.ПризнакОсновногоРесурса = Ложь;
КонецЦикла;
РС.Записать();
КонецПроцедуры
В идеале при выставлении пользователем в колонке типа Булево "флажка" (ПризнакОсновногоРесурса) все остальные значения колонки снимаются, после чего всё записываются в специально отведенный РС. Но столкнулся с проблемами:
1) Программа пытается, но не может записать строку которую изменяет пользователь (выдает ошибку на тему того что запись с такими полями уже существует)
2) Так и не записывает данные в РС.
Помогите решить как это исправить.
По теме из базы знаний
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Очистка базы от наработанных данных организации
- Ни в ЗУП ногой!? А мне нравится! Часть 1. Главные сложности решения, что отталкивает
- Базовый курс для начинающих 1С-программистов. Онлайн-курс с 7 февраля по 17 апреля 2024 г.
- Планы обмена VS История данных
Найденные решения
Может быть кому нибудь пригодится для примера
Решение:
&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);
Попытка
РС.Записать();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Произошла ошибка при удалении ресурса изделия";
Сообщение.Сообщить();
ЗаписьЖурналаРегистрации("Произошла ошибка при удалении ресурса изделия");
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Решение:
&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);
Попытка
РС.Записать();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Произошла ошибка при удалении ресурса изделия";
Сообщение.Сообщить();
ЗаписьЖурналаРегистрации("Произошла ошибка при удалении ресурса изделия");
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Вместо унылого перечисления полей
....
СтрокаРС.СпособыХранения = СтруктураЗаписи.СпособыХранения;
СтрокаРС.СрокСлужбы = СтруктураЗаписи.СрокСлужбы;
СтрокаРС.СрокХранения = СтруктураЗаписи.СрокХранения;
...
всегда используйте процедуру ЗаполнитьЗначенияСвойств(Приемник, Источник)
И еще лучше: не переносите из таблицы в набор записей регистра, а выведите
поле типа "Набор записей регистра" на форму. Даже программировать не нужно.
....
СтрокаРС.СпособыХранения = СтруктураЗаписи.СпособыХранения;
СтрокаРС.СрокСлужбы = СтруктураЗаписи.СрокСлужбы;
СтрокаРС.СрокХранения = СтруктураЗаписи.СрокХранения;
...
всегда используйте процедуру ЗаполнитьЗначенияСвойств(Приемник, Источник)
И еще лучше: не переносите из таблицы в набор записей регистра, а выведите
поле типа "Набор записей регистра" на форму. Даже программировать не нужно.
Это означает, что в Вашем регистре уже есть запись с таким набором измерений. Поэтому и вываливается ошибка. Следовательно, нужно пересмотреть структуру Вашего регистра.
(8)Немного не понял. Запись строк в ТЗ (ТаблицаРесурсыИзделия) у меня происходит в РС в процедуре ПриОкончанииРедактирования, сейчас мне нужно изменить-записать что у меня изменилось значение в одной колонке. Я не говорю что у меня написано правильно, наоборот мне нужно изменить чтобы было правильно, помогите пожалуйста поправить.
(9)Вы тут СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
делаете отбор по ссылке. Ссылки может и не быть еще. Вы можете просто создать объект и на форме тыкать свою галочку. И у Вас будет ошибка. Я не понимаю изначальную задачу, поэтому могу лишь предположить. В процедуре после записи. когда уже есть ссылка, обходите свою табличную часть и пишите данные в регистр. Зачем они там вам нужны при установке галочки?
делаете отбор по ссылке. Ссылки может и не быть еще. Вы можете просто создать объект и на форме тыкать свою галочку. И у Вас будет ошибка. Я не понимаю изначальную задачу, поэтому могу лишь предположить. В процедуре после записи. когда уже есть ссылка, обходите свою табличную часть и пишите данные в регистр. Зачем они там вам нужны при установке галочки?
(10) Ошибка то выходит не из за того что ссылки нет, а из за того что программа пытается записать строку которая уже есть, мне с этим нужно разобрать. Проще говоря, мне нужно чтобы все остальные строки ТЗ записались в регистр кроме той которую я изменяю.
Чем тебя не устроил ответ в другой твоей теме?Выведи на форму справочника табличную часть,где будет отображаться записи из твоего регистра. ТЧ заполняй при открытии справочника.Записывай при записи справочника.Удаляй все записи в регистре с отбором по справочнику,и записывай новый набор.
Если принципиально делать запись в регистр после изменения ТЧ, тогда делай аналогично,удаляй движения по отбору и записывай новые.
Если принципиально делать запись в регистр после изменения ТЧ, тогда делай аналогично,удаляй движения по отбору и записывай новые.
Может быть кому нибудь пригодится для примера
Решение:
&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);
Попытка
РС.Записать();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Произошла ошибка при удалении ресурса изделия";
Сообщение.Сообщить();
ЗаписьЖурналаРегистрации("Произошла ошибка при удалении ресурса изделия");
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Решение:
&НаКлиенте
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТаблицаРесурсыИзделия.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ТекущиеДанные);
МассивСтрок=ТаблицаРесурсыИзделия.НайтиСтроки(Новый структура("ПризнакОсновногоРесурса",ТекущиеДанные.ПризнакОсновногоРесурса));
Если МассивСтрок.Количество() > 1 Тогда
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
Если СтрокаТЧ.ПризнакОсновногоРесурса Тогда
СтрокаТЧ.ПризнакОсновногоРесурса = Ложь;
СтруктураЗаписи = Новый Структура("Изделие,РесурсыИзделия,ЕдиницыИзмерения,СпособыХранения,СрокСлужбы,СрокХранения,УстановленныйРесурс,ПризнакОсновногоРесурса,Примечание");
СтруктураЗаписи.Вставить("Изделие", Объект.Ссылка);
ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТЧ);
РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РесурсыИзделияПризнакОсновногоРесурсаПриИзмененииНаСервере(СтруктураЗаписи);
РС = РегистрыСведений.Ресурсы.СоздатьНаборЗаписей();
РС.Отбор.Изделие.Установить(СтруктураЗаписи.Изделие);
РС.Отбор.РесурсыИзделия.Установить(СтруктураЗаписи.РесурсыИзделия);
Запись = РС.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаписи);
Попытка
РС.Записать();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Произошла ошибка при удалении ресурса изделия";
Сообщение.Сообщить();
ЗаписьЖурналаРегистрации("Произошла ошибка при удалении ресурса изделия");
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот