8.х Не получается изменить элемент таб части

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем TODD22, 1 сен 2015.

  1. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Здравствуйте.

    В УТ 11 есть справочник "Варианты комплектации номенклатуры"

    У элемента есть табличная часть товары в которой содержится перечень из которого состоит комплект.
    Товар продаётся комплектами. Комплект состоит из тары и товара.

    Пытаюсь проставить в табличной части у позиции номенклатуры количество в таре.

    Например комплект:
    бутылка - 0.5 кол-во 1 шт
    товар кол-во 0.5 шт.

    Нужно это сделать разово для всех элементов. У всех сейчас стоит количество = 1.

    Пишу вот такой быдлокод но не суть важно. Это разовое исправление после загрузки.

    Код:
    Пока Результат.Следующий() Цикл
           
            ЭлементСпр = Результат.Ссылка.ПолучитьОбъект();
           
            Для Каждого Элемент Из ЭлементСпр.Товары Цикл
                Если Элемент.Номенклатура = Бут05 Тогда
                    Количество = 0.5;
                ИначеЕсли  Элемент.Номенклатура = Бут1 Тогда
                    Количество = 1;
                ИначеЕсли  Элемент.Номенклатура = Бут15 Тогда
                    Количество = 1.5;
                ИначеЕсли  Элемент.Номенклатура = Бут2 Тогда
                    Количество = 2;
                ИначеЕсли  Элемент.Номенклатура = Бут3 Тогда
                    Количество = 3;
                Иначе
                    Напиток = Элемент.Номенклатура;
                КонецЕсли;
               
            КонецЦикла;
            //Ищем строку в таб части с напитком и меняем количество
            Для Каждого Строка Из ЭлементСпр.Товары Цикл
                Если Строка.Номенклатура = Напиток Тогда
                    Строка.Количество = Количество;
                КонецЕсли;
            КонецЦикла;
           
            ЭлементСпр.Записать();
        КонецЦикла;
    
    Но в итоге элемент не перезаписывается. Смотрю отладчиком элементы получаю. Количество во втором цикле присваиваю. Но почему то эти изменения не сохраняются.
    Что я делаю не так?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    После

    ЭлементСпр.Записать();

    Какой код отрабатывает?
  3. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Типовой :)
    В моей процедуре дальше идёт "КонцеПроцедуры".
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Это я понял :)
    Но в модуле объекта еще может быть обработчики событий + подписки на события.
  5. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Ну да... видимо где то какой то флаг.
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    В подписках на событие можно посмотреть.
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Как ты определяешь, что значения реквизитов в ТЧ элемента не изменились?
  8. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Ну как... оно должно стать не 1 литр, а 1.5 литра. Смотрю отладкой во втором цикле количество изменяется. Но после записи ничего не происходит. Открываю справочник. Смотрю комплект. Как стояла единица так и стоит.
    --- Объединение сообщений, 1 сен 2015 ---
    По процедурам пробежался отладчиком. Вроде всё нормально. Везде флаг отказ = ложь.
    Видимо надо подписку искать.
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Чет я не совсем код понял. Не вижу данных, но судя по условию
    Если Элемент.Номенклатура = Бут05 Тогда
    Количество = 0.5;
    ИначеЕсли Элемент.Номенклатура = Бут1 Тогда
    Количество = 1;
    ИначеЕсли Элемент.Номенклатура = Бут15 Тогда
    Количество = 1.5;
    ИначеЕсли Элемент.Номенклатура = Бут2 Тогда
    Количество = 2;
    ИначеЕсли Элемент.Номенклатура = Бут3 Тогда
    Количество = 3;
    Иначе
    Напиток = Элемент.Номенклатура;
    КонецЕсли;

    У нас Напиток может принимать значение от предыдущего элемента выборки либо (на первой итерации) вообще остаться неинициализированным. То же самое касается и количества.
  10. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    "Попытка" никаких ошибок не выдаёт.
    --- Объединение сообщений, 1 сен 2015 ---
    Шурик в табличной части всегда 2 элемента. Один из них бутылка, а второй товар.
    Значения инициализируются. Смотрел отладчиком. Почему то не происходит запись.
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Перед и после ЭлементСпр.Записать(); в ЭлементСпр какие значения?
  12. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Теперь уже только завтра посмотрю. База на работе.
  13. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Так подождите, там наверно отказ на изменение если есть движение данному элементу, нет?
  14. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Движений скорее всего нет. Но вот про отказ я то же подумал. Если интерактивно делать то нужно с начало включить возможность редактирования этих реквизитов.
    Не разбирался как механизм запрета редактирования работает?
    Я отладчиком смотрел вроде должен записывать. Предполагаю что где то срабатывает подписка.
  15. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Не то?

    Код:
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
        МассивНепроверяемыхРеквизитов = Новый Массив;
        ИспользоватьХарактеристики = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
        // Проверка заполнения характеристик в т.ч. товары.
        НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект, МассивНепроверяемыхРеквизитов, Отказ);
       
        ОбщегоНазначенияУТ.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ);
    
        // Проверка заполнения характеристик в шапке.
        Если Не ИспользоватьХарактеристики Или Не Справочники.Номенклатура.ХарактеристикиИспользуются(Владелец) Тогда
    
            МассивНепроверяемыхРеквизитов.Добавить("Характеристика");
    
        КонецЕсли;
       
        ПроверятьХарактеристикуКомпонента =
            ИспользоватьХарактеристики И Не ЗначениеЗаполнено(ХарактеристикаОсновногоКомпонента)
            И Справочники.Номенклатура.ХарактеристикиИспользуются(НоменклатураОсновногоКомпонента);
        Если ПроверятьХарактеристикуКомпонента Тогда
            ПроверяемыеРеквизиты.Добавить("ХарактеристикаОсновногоКомпонента");
        КонецЕсли;
       
        Если ЗначениеЗаполнено(НоменклатураОсновногоКомпонента) Тогда
            ОтборТоваров =
                Новый Структура("Номенклатура, Характеристика", НоменклатураОсновногоКомпонента, ХарактеристикаОсновногоКомпонента);
            ПредставлениеОсновногоКомпонента =
                НоменклатураКлиентСервер.ПредставлениеНоменклатуры(НоменклатураОсновногоКомпонента, ХарактеристикаОсновногоКомпонента);
            Если Товары.НайтиСтроки(ОтборТоваров).Количество() = 0 Тогда
                ТекстСообщения = НСтр("ru = 'Основной компонент `%НазваниеТовара%` в товарах не найден.
                    |Укажите основной компонент из перечня товаров'");
                ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НазваниеТовара%", ПредставлениеОсновногоКомпонента);
               
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , "Объект", Отказ);
            КонецЕсли;
        КонецЕсли;
       
        ОтборТоваров = Новый Структура("Номенклатура, Характеристика", Владелец, Характеристика);
        ПредставлениеВладельца = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(Владелец, Характеристика);
        Для Каждого СтрокаТЧ из Товары.НайтиСтроки(ОтборТоваров) Цикл
            ТекстСообщения = НСтр("ru = 'В строке %НомерСтроки% указан товар ""%НазваниеТовара%"".
                |Один и тот же товар не может являться и комплектом, и комплектующей одновременно.'");
            ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НазваниеТовара%", ПредставлениеВладельца);
            ТекстСообщения = СтрЗаменить(ТекстСообщения, "%НомерСтроки%", СтрокаТЧ.НомерСтроки);
           
            Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТЧ.НомерСтроки, "Номенклатура");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , Поле, "Объект", Отказ);
        КонецЦикла;
       
        ТипНоменклатуры = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Владелец, "ТипНоменклатуры");
        Если ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда
            МассивНепроверяемыхРеквизитов.Добавить("КоличествоУпаковок");
            МассивНепроверяемыхРеквизитов.Добавить("Количество");
            МассивНепроверяемыхРеквизитов.Добавить("Наименование");
            Если ВариантРасчетаЦеныНабора = Перечисления.ВариантыРасчетаЦенНаборов.ЦенаЗадаетсяЗаНаборРаспределяетсяПоДолям Тогда
                ПроверяемыеРеквизиты.Добавить("Товары.ДоляСтоимости");
            КонецЕсли;
        КонецЕсли;
       
        ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
    КонецПроцедуры
  16. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Не знаю. То или нет. Завтра буду проверять :)
  17. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    В подписках явного ничего не увидел. Сейчас еще гляну.. по идее варианта два только либо подписка либо модуль объекта. В модуле кроме этого где отказ может сработать больше нет ничего. Перед записью не проверяется. Нарою отпишусь.

    Хм.. Взял демо базу..
    Под администратором.. Открыл в толстом клиенте УТ 11)).. Взял Портативный инструмент разработчика.. выбрал один из вариантов и попробовал поменять везде количество на 5..

    Обработка объектов завершено, обработано 1 элементов за 0:00:01 (1 сек). Грубое среднее время обработки элемента - 1 000,00 мс

    Открываю его.. а там как с гуся вода всё по старому.
    Последнее редактирование: 1 сен 2015
  18. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    То есть у тебя та же проблема? Не изменяется значение?
  19. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну по факту я сделал тоже самое. Программно попробовал поменять. Просто на демо базе и тупо решил всем товарам поставить 5.. Борь надо ковырнуть такое ощущение что где то еще хранится и перезаполняется) Ибо я в транзакции делал и ошибку не выдал.
  20. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    А ты чем подписки искал? у тебя отчёт есть?

Поделиться этой страницей