Заполнение доп.реквизитов номенклатуры программно УТ 11.4
При заполнении доп. реквизитов номенклатуры, в карточке и на ценниках они отображаются, а на вкладке "реквизиты" пусто. Подскажите, пожалуйста, как правильно их заполнить?
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Об = СтрокаДанных.Ссылка.ПолучитьОбъект();
НоваяСтрока = Об.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СтрокаДанных.Свойство;
НоваяСтрока.Значение = СтрокаДанных.Значение;
КонецЕсли;
Об.Записать();
КонецЦикла;
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Об = Номенклатура.ПолучитьОбъект();
Об.ДопРеквизит1 = Строка.Реквизит1;
И так для остальных реквизитов)
Об.Записать();
Показать
(10)
Кстати, а состав допреквизитов для этого справочника установлен в "Наборах дополнительных реквизитов и сведений"? И есть ли там заполняемые реквизиты?
И если хоть что-то изменить в любом реквизите номенклатуры, то все доп.реквизиты добавленные программно стираются
Это как раз понятно. Строки тч допреквизитов заполняются из реквизитов формы каждый раз при записи. Попробуйте редактировать не строки тч объекта, а реквизиты формы, при необходимости добавляя их программно. Как формируются наименования этих реквизитов - можно подсмотреть в бсп.
Кстати, а состав допреквизитов для этого справочника установлен в "Наборах дополнительных реквизитов и сведений"? И есть ли там заполняемые реквизиты?
Во-первых не заполненое еще один реквизит из табличной части Дополнительные реквизиты. А именно - ТекстоваяСтрока.
А во-вторых - что такое " СтрокаДанных.Свойство"? И есть ли у данной номенклатуры привязанный доп. реквизит в доп.реквизитах? Можно ли в режиме пользователя добавить данное значение в карточке номенкалтуры?
А во-вторых - что такое " СтрокаДанных.Свойство"? И есть ли у данной номенклатуры привязанный доп. реквизит в доп.реквизитах? Можно ли в режиме пользователя добавить данное значение в карточке номенкалтуры?
(5) ну вот кусок кода
То есть СтрокаДанных из какого то файла, и ты получаешь объект именно СтрокаДанных. Зачем? Зачем тогда надо было Номенклатуру искать? Тут нужно получать объект именно номенклатуры, а дальше уже отладчиком смотришь, где у этого объекта находятся нужные реквизиты, присваиваешь им значения из СтрокаДанных и записываешь объект. А у тебя получается ты получаешь Объект СтрокаДанных , присваиваешь ему значения из СтрокаДанных, и пытаешься записать это все. )
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Об = СтрокаДанных.Ссылка.ПолучитьОбъект();
ПоказатьТо есть СтрокаДанных из какого то файла, и ты получаешь объект именно СтрокаДанных. Зачем? Зачем тогда надо было Номенклатуру искать? Тут нужно получать объект именно номенклатуры, а дальше уже отладчиком смотришь, где у этого объекта находятся нужные реквизиты, присваиваешь им значения из СтрокаДанных и записываешь объект. А у тебя получается ты получаешь Объект СтрокаДанных , присваиваешь ему значения из СтрокаДанных, и пытаешься записать это все. )
(9)
У меня не получалось у СтрокаДанных.Сылка проверить пустую ссылку. Поэтому так
А по сути Строка данных.Ссылка и Номенклатура одно и тоже, так как при прочитке данных из файла делается тоже самое
И эти реквизиты записываются и отображаются в номенклатуре, но не заполняются в реквизитах.
Скрины есть в одном из ответов. Если бы проблемы была в СтрокаДанных.Ссылка, то вообще бы не записывались реквизиты
Зачем тогда надо было Номенклатуру искать
У меня не получалось у СтрокаДанных.Сылка проверить пустую ссылку. Поэтому так
А по сути Строка данных.Ссылка и Номенклатура одно и тоже, так как при прочитке данных из файла делается тоже самое
Процедура ЗаполнитьТаблицуXLS_НаСервере()
КоличествоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтроковыйНомер = Формат(НомерСтроки, "ЧН=0; ЧГ=0");
СтрокаДанных = ДанныеФайла.Добавить();
Номен = ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 1).ТекущаяОбласть.Текст;
СтрокаДанных.Ссылка = Справочники.Номенклатура.НайтиПоНаименованию(Номен);
Свойс = ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 2).ТекущаяОбласть.Текст;
СтрокаДанных.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Свойс);
СтрокаДанных.Значение = ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 3).ТекущаяОбласть.Текст;
КонецЦикла;
ПоказатьИ эти реквизиты записываются и отображаются в номенклатуре, но не заполняются в реквизитах.
Скрины есть в одном из ответов. Если бы проблемы была в СтрокаДанных.Ссылка, то вообще бы не записывались реквизиты
общий модуль УправлениеСвойствами
*******
для инициализации
УправлениеСвойствами.ПриСозданииНаСервере(Форма, ДополнительныеПараметры)
УправлениеСвойствами.ПриЧтенииНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ПередЗаписьюНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(Форма, Отказ, ПроверяемыеРеквизиты, Объект)
ЗнСвойства = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, "ИмяРеквизитаДляРазработчика")
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений)
*******
для инициализации
УправлениеСвойствами.ПриСозданииНаСервере(Форма, ДополнительныеПараметры)
УправлениеСвойствами.ПриЧтенииНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ПередЗаписьюНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(Форма, Отказ, ПроверяемыеРеквизиты, Объект)
(18) Пока Оберон не отвечает, может Вы подскажете, что может быть не так? )
Код исправила по рекомендациям. При первом открытии свойства заполнены, но опять только на вкладке карточка. В реквизитах пусто. При записи, закрытии и открытии, соответственно все стирается.
Код исправила по рекомендациям. При первом открытии свойства заполнены, но опять только на вкладке карточка. В реквизитах пусто. При записи, закрытии и открытии, соответственно все стирается.
Процедура ЗагрузитьСвойстваНаСервере()
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
Пользователь = Пользователи.ТекущийПользователь();
Номер = 0;
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Номер = Номер + 1;
ТаблицаДопРеквизитов.Очистить();
НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
НоваяСтрока.Свойство = СтрокаДанных.Свойство;
НоваяСтрока.Значение = СтрокаДанных.Значение;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);
КонецЕсли;
Показать
(17) Нашла тоже эту функцию УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) в других темах. Добавила, но выходит ошибка
25.10.2021 15:03:51
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(90)}: Об.Записать();
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(101)}: ЗагрузитьСвойстваНаСервере();
по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Номер = Номер + 1;
Об = СтрокаДанных.Ссылка.ПолучитьОбъект();
НоваяСтрока = Об.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СтрокаДанных.Свойство;
НоваяСтрока.Значение = СтрокаДанных.Значение;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура,Об.ДополнительныеРеквизиты);
Об.Записать();
КонецЕсли;
Показать25.10.2021 15:03:51
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(90)}: Об.Записать();
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(101)}: ЗагрузитьСвойстваНаСервере();
по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
(20) OMG!
// Записывает дополнительные реквизиты и сведения владельцу свойств.
// Изменения происходят в транзакции.
//
// Параметры:
// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.
// ТаблицаСвойствИЗначений - ТаблицаЗначений:
// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
// * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
//
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
т.о. Вам требуется создать ТЗ и заполнить ее необходимыми значениями
например во так вот:
или воспользоваться
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатуры(НоменклатураСсылка, ДополнительныеРеквизиты);
или для заполнения формы:
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатурыВФорме(Форма, ТаблицаИзменений);
// Записывает дополнительные реквизиты и сведения владельцу свойств.
// Изменения происходят в транзакции.
//
// Параметры:
// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.
// ТаблицаСвойствИЗначений - ТаблицаЗначений:
// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
// * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
//
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
т.о. Вам требуется создать ТЗ и заполнить ее необходимыми значениями
например во так вот:
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
или воспользоваться
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатуры(НоменклатураСсылка, ДополнительныеРеквизиты);
или для заполнения формы:
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатурыВФорме(Форма, ТаблицаИзменений);
(21) А все равно непонятно. Номенклатура и так ссылка на объект, про таблицу значений вообще непонятно тогда, раз не саму таблицу надо указывать. Потом еще что-то про процедуру) Я еще только начинаю и не могу читать между строк, не обязательно так реагировать, если кто-то Вас не понимает с полуслова
(22) В общем код должен быть типа такого, немного доделайте под себя
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
ТаблицаДопРеквизитов.Очистить();
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Наименование);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
КонецЕсли;
// ДопСвойство_1
Если ЗначениеЗаполнено(ЗнСвойства1) Тогда
нСтрока = ТаблицаДопРеквизитов.Добавить();
нСтрока.Свойство = "ДопСвойство_1";
нСтрока.Значение = ЗнСвойства1;
КонецЕсли;
// ДопСвойство_2
Если ЗначениеЗаполнено(ЗнСвойства2) Тогда
нСтрока = ТаблицаДопРеквизитов.Добавить();
нСтрока.Свойство = "ДопСвойство_2";
нСтрока.Значение = ЗнСвойства2;
КонецЕсли;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);
КонецЦикла;
Показать
(24)
используйте проверку на наличие значения свойства, что то типа:
код выше изменил добавил проверки
используйте проверку на наличие значения свойства, что то типа:
Если ЗначениеЗаполнено(ЗнСвойства) Тогда
нСтрока = ТаблицаДопРеквизитов.Добавить();
нСтрока.Свойство = "ДопСвойство_1";
нСтрока.Значение = ЗнСвойства;
КонецЕсли;
код выше изменил добавил проверки
(25) Исправила код, проверки пока не добавляла. При первом открытии свойства заполнены, но опять только на вкладке карточка( В реквизитах пусто. При записи, закрытии и открытии, соответственно все стирается.
Процедура ЗагрузитьСвойстваНаСервере()
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
Пользователь = Пользователи.ТекущийПользователь();
Номер = 0;
Для Каждого СтрокаДанных Из ДанныеФайла Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе
Номер = Номер + 1;
ТаблицаДопРеквизитов.Очистить();
НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
НоваяСтрока.Свойство = СтрокаДанных.Свойство;
НоваяСтрока.Значение = СтрокаДанных.Значение;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);
КонецЕсли;
Показать Спр = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка); //Ваше
ТЗСвойств = Новый ТаблицаЗначений;
Колонки = ТЗСвойств.Колонки;
Колонки.Добавить("Свойство");
Колонки.Добавить("Значение");
МассивДопРеквизитов = УправлениеСвойствами.СвойстваОбъекта(Спр, Истина); // Получаем все доп.реквизиты номенклатуры
Для Каждого ДопРеквизит Из МассивДопРеквизитов Цикл
НоваяСтрока = ТЗСвойств.Добавить();
НоваяСтрока.Свойство = ДопРеквизит;
//Здесь можно анализироват Наименование доп.реквизита и в заивимости от этого записывать ваше значение
// но нужно учесть, какого типа доп.реквизит. Если строка или число, проблем нет. Если тип Дополнительное значение,
// то придется программно искать в справочнике ссылку на это значение.
Если НоваяСтрока.Свойство.Наименование = СтрокаДанных.Свойство Тогда //Ваша строка из xls, скорее всего строка с названием доп.реквизита.
НоваяСтрока.Значение = СтрокаДанных.Значение;
КонецЕсли;
КонецЦикла;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Спр, ТЗСвойств);
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот