8.х Обработка заполнение дополнительного реквизита

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем duke2003, 14 июн 2019 в 12:13.

  1. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    здравствуйте! Есть справочник - "Номенклатура". В виде номенклатуры добавлен дополнительный реквизит - "ГОСТ". Нужно из поля - "Описание" перенести данные в доп. реквизит.

    делаю так:
    Код:
    Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   Номенклатура.Код КАК Код,
            |   Номенклатура.Наименование КАК Наименование,
            |   Номенклатура.Описание КАК Описание
            |ИЗ
            |   Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |   Номенклатура.Описание <> &Описание";
        Запрос.УстановитьПараметр("Описание", "");
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
         
         МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование).ПолучитьОбъект();
            МояНоменклатура.Описание = "";
         
            МояНовыйРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ГОСТ");
            МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание;
         
            МояНоменклатура.Записать();
            Сообщить(МояНоменклатура.Наименование + " " + ВыборкаДетальныеЗаписи.Описание)
        КонецЦикла;
    ругается вот так:
    Значение не является значением объектного типа (Значение)
    МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание;

    подскажите, как обратиться к доп. реквизиту и записать в него данные?
  2. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    не кто не знает что ли?
  3. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Значения дополнительных реквизитов хранятся в табличной части справочника.
    Т.е. для того, чтобы установить значение доп.реквизита элементу номенклатуры, Вам надо в табличную часть "ДополнительныеРеквизиты" добавить строку (или изменить значение в имеющейся строке, если она уже есть).

    upload_2019-6-16_12-36-12.png

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

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

    Т.е. в Вашем случае вместо строки
    Код:
    МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание;
    напишите
    Код:
    УстановитьЗначениеДопСвойства(МояНоменклатура, МояНовыйРеквизит, ВыборкаДетальныеЗаписи.Описание)
    Последнее редактирование: 16 июн 2019 в 13:10
  4. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    ругается в Общем модуле УправлениеСвойствами.
    Код:
    {ОбщийМодуль.УправлениеСвойствами.Модуль(1168)}: Метод объекта не обнаружен (ПолучитьОбъект)
                ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
    
    625 .jpg
  5. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Точно ссылку на номенклатуру передаете?
  6. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    вот так:
    МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование).ПолучитьОбъект();
    МояНовыйРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ГОСТ");
    УстановитьЗначениеДопСвойства(МояНоменклатура, МояНовыйРеквизит, ВыборкаДетальныеЗаписи.Описание);
  7. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Ну да, я не заметил сразу, что Вы передаете не ссылку, а объект.
    Уберите получение объекта номенклатуры.
    Код:
    МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование);
    --- Объединение сообщений, 16 июн 2019 в 19:56 ---
    Вообще, поиск номенклатуры по наименованию - это лишнее.
    Вместо наименования в Вашем запросе можно саму ссылку выбирать.
  8. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    теперь ругается на МояНоменклатура.Записать();
    Код:
    {Обработка.ЗаполнениеГОСТизОписания.Форма.Форма.Форма(53)}: Метод объекта не обнаружен (Записать)
            МояНоменклатура.Записать();
    
    а если закоментить, то процедура выполняется, но ни чего не сохраняется
  9. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Верно, записывать не надо. Запись выполнится в той процедуре.
    Почему не сохраняется, сложно сказать.
    Проверьте настройки вашего доп.реквизита (в пользовательском режиме). В частности его тип значения. Я так понимаю, тип должен быть строковый, раз вы туда описание записываете.
  10. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    проверил - доп реквизит - строка
    000(14-28).JPG 001(14-29).JPG

    нашел вот такую процедуру в общих модулях, которая записывает доп реквизиты - УправлениеСвойствами.ЗаписатьСвойстваУОбъекта

    сделал так:
    Код:
    Процедура ЗаполнитьНаСервере()
        // Вставить содержимое обработчика.
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
      
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   Номенклатура.Код КАК Код,
            |   Номенклатура.Наименование КАК Наименование,
            |   Номенклатура.Описание КАК Описание
            |ИЗ
            |   Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |   Номенклатура.Описание <> &Описание";
      
        Запрос.УстановитьПараметр("Описание", "");
      
        РезультатЗапроса = Запрос.Выполнить();
      
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
      
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            // Вставить обработку выборки ВыборкаДетальныеЗаписи
            МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование);
            ДопРеквизитГОСТ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок", "ГОСТ");
          
            ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
            ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
            ТаблицаДопРеквизитов.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка"));
          
            НовыйРекизит = ТаблицаДопРеквизитов.Добавить();
            НовыйРекизит.Свойство = ДопРеквизитГОСТ;
            НовыйРекизит.Значение = ВыборкаДетальныеЗаписи.Описание;
          
            УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(МояНоменклатура, ТаблицаДопРеквизитов);
    
            Сообщить(МояНоменклатура.Наименование + " " + ВыборкаДетальныеЗаписи.Описание)
        КонецЦикла;
      
        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    КонецПроцедуры


    ошибок тоже нет, и тоже ни чего не сохраняется.
  11. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Ну, по сути да, это тот же код, что и в моей процедуре.
    Еще есть мысль, почему не работает, - возможно, не находится доп.реквизит (хотя по наименованию должен был найтись).

    Вообще, есть же специальный реквизит, по которому в конфигураторе предполагается обращаться к этому доп.реквизиту.

    upload_2019-6-18_11-18-13.png

    Посмотрите, какое имя для разработчика задано для этого доп.реквизита.
    Это имя строкой и передавайте в мою процедуру в параметр "Свойство".
    И в запросе выбирайте ссылку вместо поиска по наименованию.

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.Описание КАК Описание
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Описание <> &Описание";
    
    Запрос.УстановитьПараметр("Описание", "");
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        УстановитьЗначениеДопСвойства(ВыборкаДетальныеЗаписи.Ссылка, "ТутНапишитеИмяДляРазработчика", ВыборкаДетальныеЗаписи.Описание);
    КонецЦикла;
    duke2003 нравится это.
  12. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    1cUserAndrew,спасибо за помощь
    все получилось
    --- Объединение сообщений, 19 июн 2019 в 04:35 ---
    1cUserAndrew, а программно имя для разработчика можно вытаскивать?
    Последнее редактирование: 19 июн 2019 в 07:30
  13. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.106
    Симпатии:
    206
    Баллы:
    104
    Да, у плана вида характеристик "ДополнительныеРеквизитыИСведения" есть реквизит "Имя". Вот это оно и есть.
  14. TopicStarter Overlay
    duke2003
    Online

    duke2003

    Регистрация:
    Пятница
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    не совсем понимаю как написать. можете подсказать?