|
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
Varlant1n 12.01.21 - 08:57 | Здравствуйте, дорогие форумчане! У меня вопрос о реализации одной задачи. У меня есть документ. В этой форме документа есть поле ввода №1. Рядом с этим полем есть поле ввода №2. Так вот мне надо, чтобы при выборе значения поля ввода №1, поле №2 автоматически брало ПОСЛЕДНЕЕ значение из другого документа, где изначально и создается список в котором есть поле №1 и поле №2 и период. Надеюсь объяснил доходчиво. Спасибо заранее, дорогие друзья. | ||
ДенисЧ 1 - 12.01.21 - 08:59 | Не доходчиво.
Не объяснил, в чём проблема. Как поймать изменение Поля1? Или как выбрать последнее значение из документаДругой? | ||
Varlant1n 2 - 12.01.21 - 09:07 | (1) Еще раз постараюсь объяснить. Есть документ "ЗаданиеМенеджеру", в форме документа "ЗаданиеМенеджеру" есть два поля ввода над списком. Это поле ввода №1 и поле ввода №2. При выборе поля ввода №1, мне надо, чтобы поле ввода №2 автоматически брало свое последнее значение из документа ЗаказКлиента, где в одной из форм данного документа есть список в котором есть период, поле №1 и поле №2. То есть выбираю №1 и документ автоматом мне пишет №2 из другого документа. | ||
Varlant1n 3 - 12.01.21 - 09:09 | (2) При этом я надеюсь понятно, что выбирая поле №1 документ выбирает значение поля №2 из другого документа по полю №1 (равно) и последнее по периоду | ||
acht 4 - 12.01.21 - 09:16 | (2) Так что не получается-то?
- Не можешь обработать выбор поля1? - Не можешь получить последнее значение из документа? - Не можешь установить значение поля2? - Вооббще ничего не понимаешь? Про что тебе рассказывать? | ||
Paint_NET 5 - 12.01.21 - 09:18 | |||
Varlant1n 6 - 12.01.21 - 09:21 | (4) Не могу установить поле №2. | ||
Paint_NET 7 - 12.01.21 - 09:26 | (6) В каком месте? Покажи код. | ||
acht 8 - 12.01.21 - 09:30 | (6) Элемент формы, отображающий Поле2 связан с данными. Надо установить этим данным нужное значение. Конкретнее можно сказать, только увидев код/скриншоты/сообщение об ошибке. | ||
El_Duke 9 - 12.01.21 - 09:35 | |||
Paint_NET 10 - 12.01.21 - 09:37 | (9) Кстати, да. Корявая реализация. | ||
El_Duke 11 - 12.01.21 - 09:55 | (10) Реализацию можно сделать идеальной, сама идея тупая.
Выбрал ты экспедитора, по нему подобрался водила из прошлого документа 3-х дневной давности. А сегодня он на больничном/в прогуле/в отпуске или вообще уволился. Как это отслеживать ? Все это выдумки ленивого начальника ленивых менеджеров для якобы упрощения работы. Такие хотелки надо зарубать на корню как крайнюю форму тупости | ||
Fedor-1971 12 - 12.01.21 - 11:14 | (11) Ну уж, так-то сразу, тупым серпом и по кокам Всё зависит от взаимодействия сотрудников и размера конторы Логика в запросе есть: 1 раз устанавливаем водилу и дальше поле заполняется автоматом, т.е. набиваем машину одному, потом меняем на другого и т.д. Ни что не мешает менеджеру узнать языком кто на линии и в первом документе выбрать его | ||
El_Duke 13 - 12.01.21 - 11:18 | (12) И зачем тогда нужны все извраты с подбором, если все равно придется языком узнавать кто есть и выбирать другого если автоматом подобранного нет ? | ||
Fedor-1971 14 - 12.01.21 - 11:26 | (13) Узнали 1 раз, а подбираем в многих документах (например, готовим отгрузки в режиме "Вот прямо сейчас повезут").
Если водил штук 20 с близкими фамилиями (Попов, Папов, Папанеску, Попович) или много старых записей с уволенными, то выбор конкретного станет вопросом. Мы же не знаем что за БД у ТС, степень её засорённости и где хранятся данные водителей (вполне возможно, что вместе с доверенностями получателей при реализации) | ||
El_Duke 15 - 12.01.21 - 11:31 | (14) Это все замечательно, только это не то что автор хочет
Ему надо по экспедитору подбирать водителя из последнего документа. Но никто не может гарантировать что он сегодня на работе. И если это надо уточнять по телефону - теряется смысл всей задумки т.к. придется все редактировать руками У меня вопрос: зачем весь этот цирк ? | ||
Fedor-1971 16 - 12.01.21 - 11:45 | (15) так это и есть запрос ТС: Создаём документ, актуализируем 1 раз водилу, сохраняем, в следующем получаем актуального водилу автоматически
Всё это имеет малый смысл, если у менеджера 2-3 документа в день и много водителей Но если возник вопрос, значит менеджеры пашут аки пчёлки с десятком отгрузок в час, что нам не известно. | ||
El_Duke 17 - 12.01.21 - 11:58 | (16) Я задачу понял совсем иначе, автору не помешает уточнить еще раз
Пока что никакого смысла в реализации не видно | ||
El_Duke 18 - 12.01.21 - 12:06 | Если много отгрузок, то зачем выбирать одного и того же водителя ? Он уже уехал с предыдущим грузом, а мы его выбираем под другую доставку ? Смысл ? | ||
Varlant1n 19 - 12.01.21 - 12:31 | Ребят, я немного поменял, некоторые моменты, во-первых перенес данные в регистр сведений. То есть туда будет записываться пара Поле №1 (Экспедитор) и Поле №2 (Водитель) и оттуда будут браться данные для документа. ТО есть при выборе Поля №1 в документе, автоматов из регистра сведений будет браться его пара, то есть Поле №2. Таким образом я написал запрос, но в нем я затупил, точнее знаний не хватает, сорри, я учусь((( Посмотрите, я вообще правильно иду? :
Запрос = Новый Запрос "ВЫБРАТЬ
| СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
| СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
| СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
|ИЗ
| РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
|УПОРЯДОЧИТЬ ПО
| СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
Запрос.УстановитьПараметр("Водитель", Водитель);
Результат = Запрос.Выполнить().Выбрать();
ВыбранныйЭкспедитор = ЭтаФорма.Элементы.Экспедитор;
Пока Результат.Следующий() Цикл
Если ВыбранныйЭкспедитор = Экспедитор Тогда
Водитель.Выбрать();
КонецЕсли;
КонецЦикла;
Но что длеать с этим всем я не понимаю | ||
El_Duke 20 - 12.01.21 - 12:37 | (19) Ты не объяснил толком для чего все это нужно, где и как все это будет применяться. Поэтому невозможно оценить правильно/неправильно
Давай для примера практическую ситуацию где это должно работать | ||
Varlant1n 21 - 12.01.21 - 12:44 | (20) Ситуация такая. Логист планирует пару на период. Каждому экспедитору водителя. Эти данные сохраняются в регистре сведений. Потом при оформлении документы Заказы клиентов. При выборе экспедитора этому заказу, должна автоматом заполниться его пара. То есть его водитель из регистра | ||
El_Duke 22 - 12.01.21 - 12:46 | (21) Прекрасно
Допустим запланировал ваш логист эту пару на понедельник. Экспедитор вышел на работу, а водитель забухал и не вышел Что делать будете ? | ||
acht 23 - 12.01.21 - 12:52 | (22) Задолбал.
Без доработки: Если не вышел, то исправит ручками.
Если вышел, то исправит ручками.
С доработкой: Если не вышел, то исправит ручками. Если вышел, то мышкой не пошевелит Как думаешь, что лучше и какой случай "вышел/не вышел" чаще? | ||
Varlant1n 24 - 12.01.21 - 12:53 | (22) Поэтому поле (водитель) остается полем ввода, на всякий случай, если надо будет вводить ручками | ||
El_Duke 25 - 12.01.21 - 12:57 | |||
Bigbro 26 - 12.01.21 - 12:59 | (25) в том что невыход - редкое событие и в 95% случаев у нас все нормально. | ||
acht 27 - 12.01.21 - 13:01 | (25) В упрощении работы менеджера по заполнению документа путем подстановки значений по умолчанию. Ваш К.О. | ||
Varlant1n 28 - 12.01.21 - 13:03 | Я переделал таким образом, потому что при изменении объект может быть и удалением, то есть пустым значением
Если Объект.Экспедитор.ПроверитьЗаполнение() Тогда
Запрос = Новый Запрос
"ВЫБРАТЬ
| СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
| СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
| СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
|ИЗ
| РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
|УПОРЯДОЧИТЬ ПО
| СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
Запрос.УстановитьПараметр("Водитель", Водитель);
Результат = Запрос.Выполнить().Выбрать();
ВыбранныйЭкспедитор = Объект.Экспедитор;
Пока Результат.Следующий() Цикл
Если ВыбранныйЭкспедитор = Экспедитор Тогда
Объект.
КонецЕсли;
КонецЦикла; | ||
Varlant1n 29 - 12.01.21 - 13:54 | Переделал дальше. Можете подсказать, как мне из данного запроса значение поля Водитель вставить в документе?
ВыбранныйЭкспедитор = Объект.Экспедитор;
Если ЗначениеЗаполнено(ВыбранныйЭкспедитор) Тогда
Запрос = Новый Запрос
"ВЫБРАТЬ
| СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
| СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
| СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
|ИЗ
| РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
|УПОРЯДОЧИТЬ ПО
| СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
Запрос.УстановитьПараметр("Водитель", Водитель);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Если ВыбранныйЭкспедитор = Экспедитор Тогда
Водитель.Выбрать();
КонецЕсли;
КонецЦикла;
КонецЕсли; | ||
Varlant1n 30 - 12.01.21 - 14:12 | Я переделал еще и вот итог:
ВыбранныйЭкспедитор = Объект.Экспедитор;
Если ЗначениеЗаполнено(ВыбранныйЭкспедитор) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
| СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
| СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
|ИЗ
| РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
|УПОРЯДОЧИТЬ ПО
| СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если ВыбранныйЭкспедитор = Выборка.Экспедитор И Объект.Дата = Выборка.Период Тогда
КонецЕсли;
КонецЦикла;
КонецЕсли; Рекламное место пустует | ||
acht 31 - 12.01.21 - 14:26 | (30) Держи уж
Если ЗначениеЗаполнено(Объект.Экспедитор) Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ ПЕРВЫЕ 1
| СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
|ИЗ
| РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних(&Период,
| Экспедитор = &Экспедитор
| ) КАК СведенияОбЭкспедиторахСрезПоследних
|УПОРЯДОЧИТЬ ПО
| СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ");
Запрос.УстановитьПараметр("Период", Объект.Дата);
Запрос.УстановитьПараметр("Экспедитор", Объект.Экспедитор);
Выборка = Запрос.Выполнитью.Выбрать();
Если Выборка.Следующий() Тогда
Объект.Водитель = Выборка.Водитель;
КонецЕсли;
КонецЕсли; | ||
Varlant1n 32 - 12.01.21 - 14:47 | (31) Так и сделал минут пять назад, но почему-то не заполняется значение поля водитель в документе. | ||
acht 33 - 12.01.21 - 14:50 | (32) Значит у тебя или поле редактирования свящано с другими данными, или типа водителя в регистре не совпадает с типом водителя в документе. Бери отладчик и вперед. | ||
Varlant1n 34 - 12.01.21 - 15:06 | (33) Типы одни и те же. И отладчик не работает почему-то. То есть никак не реагирует на изменения происходящие с объектом Экспедитор. | ||
acht 35 - 12.01.21 - 15:13 | (34) А как он должен реагировать? | ||
Fedor-1971 36 - 12.01.21 - 16:49 | (34) Поставь точку останова на строке Выборка = Запрос.Выполнитью.Выбрать(); Таки убедись, что изменения применены (F5 - сохраняем изменения и запускаем 1С) Открываем документ, выбираем экспедитора и попадаем на точку останова шагаем по коду F10 (F11 - если надо зайти в процедуру) Смотрим изменения чего нам надо либо в Табло (Ctrl+Alt+W), либо в Вычислить выражения (Shift + F9) На вкус и цвет все фломастеры разные Если БД серверная, надо убедиться, что на сервере включена отладка | ||
acht 37 - 12.01.21 - 16:57 | (36) После
Если Объект.Экспедитор.ПроверитьЗаполнение() Тогда Я бы сначала убедился, что он вообще прописал обработчик изменения. |
|
Список тем форума |