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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Почему таблица значений заполняется только после второго выбора заявки?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38702
      Фото аватараOdineski
      Участник

        &НаСервере
        Процедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере()

        Если Не ЗначениеЗаполнено(Запись.ЗаявкаНаПроизводство) Тогда
        // Очистить реквизит формы через ЗначениеВРеквизитФормы
        ПустаяТЗ = Новый ТаблицаЗначений;
        ПустаяТЗ.Колонки.Добавить(«Номенклатура»);
        ПустаяТЗ.Колонки.Добавить(«Количество»);
        ПустаяТЗ.Колонки.Добавить(«ЕдиницаИзмерения»);
        ПустаяТЗ.Колонки.Добавить(«Включать»);
        ЗначениеВРеквизитФормы(ПустаяТЗ, «НоменклатураЗаказовПереработчику»);
        Возврат;
        КонецЕсли;

        Запрос = Новый Запрос;
        Запрос.Текст = «ВЫБРАТЬ
        | Обеспечение.Номенклатура КАК Номенклатура,
        | Обеспечение.Упаковка КАК Упаковка,
        | Обеспечение.Количество КАК Количество
        |ИЗ
        | Документ.ЗаказПереработчику2_5.ОбеспечениеМатериаламиИРаботами КАК Обеспечение
        |ГДЕ
        | Обеспечение.Ссылка = &Ссылка
        | И Обеспечение.ВариантОбеспечения = &ВариантОбеспечения»;
        Запрос.УстановитьПараметр(«Ссылка», Запись.ЗаявкаНаПроизводство);
        Запрос.УстановитьПараметр(«ВариантОбеспечения», Перечисления.ВариантыОбеспечения.КОбеспечению);
        Результат = Запрос.Выполнить().Выгрузить();

        // Формируем обычную ТЗ
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить(«Номенклатура»);
        ТЗ.Колонки.Добавить(«Количество»);
        ТЗ.Колонки.Добавить(«ЕдиницаИзмерения»);
        ТЗ.Колонки.Добавить(«Включать»);

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

        // Явная синхронизация с формой
        ЗначениеВРеквизитФормы(ТЗ, «НоменклатураЗаказовПереработчику»);

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

        &НаКлиенте
        Процедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПосле(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
        ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере();
        КонецПроцедуры почему таблица значений на форме НоменклатураЗаказовПереработчику заполняется только после того как выбрать заявку переработчику 2 раз, после первого раза таблица значений на форме пуста хотя и имеет в себе данные

      • #38703
        bot_avaOdin — Одинэсник
        Участник

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

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

          Нужно не читать ссылку из Запись.ЗаявкаНаПроизводство внутри серверной процедуры, а передавать в нее ВыбранноеЗначение из клиентского обработчика.

          ### Исправленный вариант

          Серверную процедуру нужно изменить, чтобы она принимала ссылку параметром:

          Ключевые изменения:

          1. В клиентской процедуре используется ВыбранноеЗначение.
          2. Выбранное значение сразу присваивается реквизиту:

          3. Эта же ссылка явно передается на сервер:

          4. На сервере запрос использует параметр процедуры, а не Запись.ЗаявкаНаПроизводство:

          Дополнительно обратите внимание на этот момент:

          В запросе поле называется Упаковка, а в таблице формы колонка называется ЕдиницаИзмерения. Это допустимо, если вы сознательно хотите записать упаковку в единицу измерения. Но если в форме должна отображаться именно единица измерения номенклатуры, нужно получать ее отдельным полем запроса, например через Номенклатура.ЕдиницаИзмерения, если такое поле есть в вашей конфигурации.

          Можно также оставить вашу текущую серверную процедуру и просто передавать туда выбранную ссылку:

          И сервер:

          Главная ошибка была именно здесь:

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С