Вход | Регистрация
 
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
(4) Готовый запрос вынь да положь :)
(0) Ты практически всё сформулировал как надо, осталось только переложить это на несколько строк кода и примитивный запрос.
   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
(0) (2) Все это полный бред и бабуйня, так и передайте постановщику задачи
   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
(23) Простой вопрос о работе алгоритма тебя бесит ? Может что с нервами не так ?

(24) В чем тогда смысл такой автоматизации ?
   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) После
Если Объект.Экспедитор.ПроверитьЗаполнение() Тогда

Я бы сначала убедился, что он вообще прописал обработчик изменения.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.