База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему таблица значений заполняется только после второго выбора заявки?
- В этой теме 1 ответ, 2 участника, последнее обновление 4 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
22 сентября 2026 в 14:26 #38702
&НаСервере
Процедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере()Если Не ЗначениеЗаполнено(Запись.ЗаявкаНаПроизводство) Тогда
// Очистить реквизит формы через ЗначениеВРеквизитФормы
ПустаяТЗ = Новый ТаблицаЗначений;
ПустаяТЗ.Колонки.Добавить(«Номенклатура»);
ПустаяТЗ.Колонки.Добавить(«Количество»);
ПустаяТЗ.Колонки.Добавить(«ЕдиницаИзмерения»);
ПустаяТЗ.Колонки.Добавить(«Включать»);
ЗначениеВРеквизитФормы(ПустаяТЗ, «НоменклатураЗаказовПереработчику»);
Возврат;
КонецЕсли;Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| Обеспечение.Номенклатура КАК Номенклатура,
| Обеспечение.Упаковка КАК Упаковка,
| Обеспечение.Количество КАК Количество
|ИЗ
| Документ.ЗаказПереработчику2_5.ОбеспечениеМатериаламиИРаботами КАК Обеспечение
|ГДЕ
| Обеспечение.Ссылка = &Ссылка
| И Обеспечение.ВариантОбеспечения = &ВариантОбеспечения»;
Запрос.УстановитьПараметр(«Ссылка», Запись.ЗаявкаНаПроизводство);
Запрос.УстановитьПараметр(«ВариантОбеспечения», Перечисления.ВариантыОбеспечения.КОбеспечению);
Результат = Запрос.Выполнить().Выгрузить();// Формируем обычную ТЗ
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Номенклатура»);
ТЗ.Колонки.Добавить(«Количество»);
ТЗ.Колонки.Добавить(«ЕдиницаИзмерения»);
ТЗ.Колонки.Добавить(«Включать»);Для Каждого Стр Из Результат Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.Количество = Стр.Количество;
НоваяСтрока.ЕдиницаИзмерения = Стр.Упаковка;
НоваяСтрока.Включать = Ложь;
КонецЦикла;// Явная синхронизация с формой
ЗначениеВРеквизитФормы(ТЗ, «НоменклатураЗаказовПереработчику»);КонецПроцедуры
&НаКлиенте
Процедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПосле(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере();
КонецПроцедуры почему таблица значений на форме НоменклатураЗаказовПереработчику заполняется только после того как выбрать заявку переработчику 2 раз, после первого раза таблица значений на форме пуста хотя и имеет в себе данные -
22 сентября 2026 в 14:26 #38703
Причина в порядке выполнения обработчиков. В момент вызова серверной процедуры реквизит формы
Запись.ЗаявкаНаПроизводствоеще содержит старое значение. Поэтому при первом выборе запрос выполняется со старой ссылкой, обычно с пустой, и таблица остается пустой.После первого выбора реквизит уже записан. При втором выборе серверная процедура видит значение, выбранное в первый раз, поэтому таблица заполняется данными от предыдущей заявки.
Нужно не читать ссылку из
Запись.ЗаявкаНаПроизводствовнутри серверной процедуры, а передавать в нееВыбранноеЗначениеиз клиентского обработчика.### Исправленный вариант
1С (Код)123456789101112131415161718&НаКлиентеПроцедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПосле(Элемент,ВыбранноеЗначение,ДополнительныеДанные,ВыборДобавлением,СтандартнаяОбработка)Если ЗначениеЗаполнено(ВыбранноеЗначение) ТогдаЗапись.ЗаявкаНаПроизводство = ВыбранноеЗначение;ИначеЗапись.ЗаявкаНаПроизводство = Неопределено;КонецЕсли;ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере(ВыбранноеЗначение);КонецПроцедурыСерверную процедуру нужно изменить, чтобы она принимала ссылку параметром:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455&НаСервереПроцедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере(ЗаявкаНаПроизводство)ПустаяТЗ = Новый ТаблицаЗначений;ПустаяТЗ.Колонки.Добавить("Номенклатура");ПустаяТЗ.Колонки.Добавить("Количество");ПустаяТЗ.Колонки.Добавить("ЕдиницаИзмерения");ПустаяТЗ.Колонки.Добавить("Включать");Если Не ЗначениеЗаполнено(ЗаявкаНаПроизводство) ТогдаЗначениеВРеквизитФормы(ПустаяТЗ,"НоменклатураЗаказовПереработчику");Возврат;КонецЕсли;Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Обеспечение.Номенклатура КАК Номенклатура,| Обеспечение.Упаковка КАК Упаковка,| Обеспечение.Количество КАК Количество|ИЗ| Документ.ЗаказПереработчику2_5.ОбеспечениеМатериаламиИРаботами КАК Обеспечение|ГДЕ| Обеспечение.Ссылка = &Ссылка| И Обеспечение.ВариантОбеспечения = &ВариантОбеспечения";Запрос.УстановитьПараметр("Ссылка",ЗаявкаНаПроизводство);Запрос.УстановитьПараметр("ВариантОбеспечения",Перечисления.ВариантыОбеспечения.КОбеспечению);Результат = Запрос.Выполнить().Выгрузить();Для Каждого СтрРезультата Из Результат ЦиклНоваяСтрока = ПустаяТЗ.Добавить();НоваяСтрока.Номенклатура = СтрРезультата.Номенклатура;НоваяСтрока.Количество = СтрРезультата.Количество;НоваяСтрока.ЕдиницаИзмерения = СтрРезультата.Упаковка;НоваяСтрока.Включать = Ложь;КонецЦикла;ЗначениеВРеквизитФормы(ПустаяТЗ,"НоменклатураЗаказовПереработчику");КонецПроцедурыКлючевые изменения:
1. В клиентской процедуре используется
ВыбранноеЗначение.
2. Выбранное значение сразу присваивается реквизиту:1С (Код)1Запись.ЗаявкаНаПроизводство = ВыбранноеЗначение;3. Эта же ссылка явно передается на сервер:
1С (Код)12ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере(ВыбранноеЗначение);4. На сервере запрос использует параметр процедуры, а не
Запись.ЗаявкаНаПроизводство:1С (Код)123Запрос.УстановитьПараметр("Ссылка",ЗаявкаНаПроизводство);Дополнительно обратите внимание на этот момент:
1С (Код)1НоваяСтрока.ЕдиницаИзмерения = Стр.Упаковка;В запросе поле называется
Упаковка, а в таблице формы колонка называетсяЕдиницаИзмерения. Это допустимо, если вы сознательно хотите записать упаковку в единицу измерения. Но если в форме должна отображаться именно единица измерения номенклатуры, нужно получать ее отдельным полем запроса, например черезНоменклатура.ЕдиницаИзмерения, если такое поле есть в вашей конфигурации.Можно также оставить вашу текущую серверную процедуру и просто передавать туда выбранную ссылку:
1С (Код)1234567891011121314&НаКлиентеПроцедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПосле(Элемент,ВыбранноеЗначение,ДополнительныеДанные,ВыборДобавлением,СтандартнаяОбработка)Запись.ЗаявкаНаПроизводство = ВыбранноеЗначение;ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере(ВыбранноеЗначение);КонецПроцедурыИ сервер:
1С (Код)123456789101112131415&НаСервереПроцедура ВДС_ЗаявкаНаПроизводствоОбработкаВыбораПослеНаСервере(ЗаявкаНаПроизводство)Если Не ЗначениеЗаполнено(ЗаявкаНаПроизводство) Тогда// очистка таблицыВозврат;КонецЕсли;// Запрос использовать с параметром ЗаявкаНаПроизводствоЗапрос.УстановитьПараметр("Ссылка",ЗаявкаНаПроизводство);КонецПроцедурыГлавная ошибка была именно здесь:
1С (Код)1Запрос.УстановитьПараметр("Ссылка", Запись.ЗаявкаНаПроизводство);В обработчике выбора это значение может быть еще не обновлено. Поэтому на первом выборе используется предыдущее значение, а на втором уже значение, установленное при первом выборе.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.