Имя: Пароль:
1C
1С v8
Автоматическое заполнение водителя, при выборе экспедитора в документе.
0 Varlant1n
 
12.01.21
08:57
Здравствуйте, дорогие форумчане! У меня вопрос о реализации одной задачи. У меня есть документ. В этой форме документа есть поле ввода №1. Рядом с этим полем есть поле ввода №2. Так вот мне надо, чтобы при выборе значения поля ввода №1, поле №2 автоматически брало ПОСЛЕДНЕЕ значение из другого документа, где изначально и создается список в котором есть поле №1 и поле №2 и период. Надеюсь объяснил доходчиво. Спасибо заранее, дорогие друзья.
1 ДенисЧ
 
12.01.21
08:59
Не доходчиво.
Не объяснил, в чём проблема. Как поймать изменение Поля1?
Или как выбрать последнее значение из документаДругой?
2 Varlant1n
 
12.01.21
09:07
(1) Еще раз постараюсь объяснить. Есть документ "ЗаданиеМенеджеру", в форме документа "ЗаданиеМенеджеру" есть два поля ввода над списком. Это поле ввода №1 и поле ввода №2. При выборе поля ввода №1, мне надо, чтобы поле ввода №2 автоматически брало свое последнее значение из документа ЗаказКлиента, где в одной из форм данного документа есть список в котором есть период, поле №1 и поле №2. То есть выбираю №1 и документ автоматом мне пишет №2 из другого документа.
3 Varlant1n
 
12.01.21
09:09
(2) При этом я надеюсь понятно, что выбирая поле №1 документ выбирает значение поля №2 из другого документа по полю №1 (равно) и последнее по периоду
4 acht
 
12.01.21
09:16
(2) Так что не получается-то?
- Не можешь обработать выбор поля1?
- Не можешь получить последнее значение из документа?
- Не можешь установить значение поля2?
- Вооббще ничего не понимаешь?

Про что тебе рассказывать?
5 Paint_NET
 
12.01.21
09:18
(4) Готовый запрос вынь да положь :)
(0) Ты практически всё сформулировал как надо, осталось только переложить это на несколько строк кода и примитивный запрос.
6 Varlant1n
 
12.01.21
09:21
(4) Не могу установить поле №2.
7 Paint_NET
 
12.01.21
09:26
(6) В каком месте? Покажи код.
8 acht
 
12.01.21
09:30
(6) Элемент формы, отображающий Поле2 связан с данными. Надо установить этим данным нужное значение. Конкретнее можно сказать, только увидев код/скриншоты/сообщение об ошибке.
9 El_Duke
 
гуру
12.01.21
09:35
(0) (2) Все это полный бред и бабуйня, так и передайте постановщику задачи
10 Paint_NET
 
12.01.21
09:37
(9) Кстати, да. Корявая реализация.
11 El_Duke
 
гуру
12.01.21
09:55
(10) Реализацию можно сделать идеальной, сама идея тупая.

Выбрал ты экспедитора, по нему подобрался водила из прошлого документа 3-х дневной давности. А сегодня он на больничном/в прогуле/в отпуске или вообще уволился. Как это отслеживать ?

Все это выдумки ленивого начальника ленивых менеджеров для якобы упрощения работы. Такие хотелки надо зарубать на корню как крайнюю форму тупости
12 Fedor-1971
 
12.01.21
11:14
(11) Ну уж, так-то сразу, тупым серпом и по кокам
Всё зависит от взаимодействия сотрудников и размера конторы

Логика в запросе есть: 1 раз устанавливаем водилу и дальше поле заполняется автоматом, т.е. набиваем машину одному, потом меняем на другого и т.д.
Ни что не мешает менеджеру узнать языком кто на линии и в первом документе выбрать его
13 El_Duke
 
гуру
12.01.21
11:18
(12) И зачем тогда нужны все извраты с подбором, если все равно придется языком узнавать кто есть и выбирать другого если автоматом подобранного нет ?
14 Fedor-1971
 
12.01.21
11:26
(13) Узнали 1 раз, а подбираем в многих документах (например, готовим отгрузки в режиме "Вот прямо сейчас повезут").
Если водил штук 20 с близкими фамилиями (Попов, Папов, Папанеску, Попович) или много старых записей с уволенными, то выбор конкретного станет вопросом.

Мы же не знаем что за БД у ТС, степень её засорённости и где хранятся данные водителей (вполне возможно, что вместе с доверенностями получателей при реализации)
15 El_Duke
 
гуру
12.01.21
11:31
(14) Это все замечательно, только это не то что автор хочет
Ему надо по экспедитору подбирать водителя из последнего документа. Но никто не может гарантировать что он сегодня на работе. И если это надо уточнять по телефону - теряется смысл всей задумки т.к. придется все редактировать руками
У меня вопрос: зачем весь этот цирк ?
16 Fedor-1971
 
12.01.21
11:45
(15) так это и есть запрос ТС: Создаём документ, актуализируем 1 раз водилу, сохраняем, в следующем получаем актуального водилу автоматически

Всё это имеет малый смысл, если у менеджера 2-3 документа в день и много водителей
Но если возник вопрос, значит менеджеры пашут аки пчёлки с десятком отгрузок в час,
что нам не известно.
17 El_Duke
 
гуру
12.01.21
11:58
(16) Я задачу понял совсем иначе, автору не помешает уточнить еще раз
Пока что никакого смысла в реализации не видно
18 El_Duke
 
гуру
12.01.21
12:06
Если много отгрузок, то зачем выбирать одного и того же водителя ? Он уже уехал с предыдущим грузом, а мы его выбираем под другую доставку ? Смысл ?
19 Varlant1n
 
12.01.21
12:31
Ребят, я немного поменял, некоторые моменты, во-первых перенес данные в регистр сведений. То есть туда будет записываться пара Поле №1 (Экспедитор) и Поле №2 (Водитель) и оттуда будут браться данные для документа. ТО есть при выборе Поля №1 в документе, автоматов из регистра сведений будет браться его пара, то есть Поле №2. Таким образом я написал запрос, но в нем я затупил, точнее знаний не хватает, сорри, я учусь((( Посмотрите, я вообще правильно иду? :

Запрос = Новый Запрос
    "ВЫБРАТЬ
    |    СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
    |    СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
    |    СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
    |ИЗ
    |    РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
    |УПОРЯДОЧИТЬ ПО
    |    СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
    
    Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
    Запрос.УстановитьПараметр("Водитель", Водитель);
    
    Результат = Запрос.Выполнить().Выбрать();
    ВыбранныйЭкспедитор = ЭтаФорма.Элементы.Экспедитор;
    
    Пока Результат.Следующий() Цикл
        Если ВыбранныйЭкспедитор = Экспедитор Тогда
            Водитель.Выбрать();
        КонецЕсли;    
    КонецЦикла;



Но что длеать с этим всем я не понимаю
20 El_Duke
 
гуру
12.01.21
12:37
(19) Ты не объяснил толком для чего все это нужно, где и как все это будет применяться. Поэтому невозможно оценить правильно/неправильно
Давай для примера практическую ситуацию где это должно работать
21 Varlant1n
 
12.01.21
12:44
(20) Ситуация такая. Логист планирует пару на период. Каждому экспедитору водителя. Эти данные сохраняются в регистре сведений. Потом при оформлении документы Заказы клиентов. При выборе экспедитора этому заказу, должна автоматом заполниться его пара. То есть его водитель из регистра
22 El_Duke
 
гуру
12.01.21
12:46
(21) Прекрасно
Допустим запланировал ваш логист эту пару на понедельник. Экспедитор вышел на работу, а водитель забухал и не вышел
Что делать будете ?
23 acht
 
12.01.21
12:52
(22) Задолбал.
Без доработки:
    Если не вышел, то исправит ручками.
    Если вышел, то исправит ручками.
С доработкой:
    Если не вышел, то исправит ручками.
    Если вышел, то мышкой не пошевелит

Как думаешь, что лучше и какой случай "вышел/не вышел" чаще?
24 Varlant1n
 
12.01.21
12:53
(22) Поэтому поле (водитель) остается полем ввода, на всякий случай, если надо будет вводить ручками
25 El_Duke
 
гуру
12.01.21
12:57
(23) Простой вопрос о работе алгоритма тебя бесит ? Может что с нервами не так ?

(24) В чем тогда смысл такой автоматизации ?
26 Bigbro
 
12.01.21
12:59
(25) в том что невыход - редкое событие и в 95% случаев у нас все нормально.
27 acht
 
12.01.21
13:01
(25) В упрощении работы менеджера по заполнению документа путем подстановки значений по умолчанию. Ваш К.О.
28 Varlant1n
 
12.01.21
13:03
Я переделал таким образом, потому что при изменении объект может быть и удалением, то есть пустым значением

Если Объект.Экспедитор.ПроверитьЗаполнение() Тогда
        Запрос = Новый Запрос
        "ВЫБРАТЬ
        |    СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
        |    СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
        |    СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
        |ИЗ
        |    РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
        |УПОРЯДОЧИТЬ ПО
        |    СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
        
        Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
        Запрос.УстановитьПараметр("Водитель", Водитель);
        
        Результат = Запрос.Выполнить().Выбрать();
        ВыбранныйЭкспедитор = Объект.Экспедитор;
        
        Пока Результат.Следующий() Цикл
            Если ВыбранныйЭкспедитор = Экспедитор Тогда
                Объект.
                
            КонецЕсли;
        КонецЦикла;
29 Varlant1n
 
12.01.21
13:54
Переделал дальше. Можете подсказать, как мне из данного запроса значение поля Водитель вставить в документе?

ВыбранныйЭкспедитор = Объект.Экспедитор;
    Если ЗначениеЗаполнено(ВыбранныйЭкспедитор) Тогда
        Запрос = Новый Запрос
        "ВЫБРАТЬ
        |    СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
        |    СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
        |    СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
        |ИЗ
        |    РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
        |УПОРЯДОЧИТЬ ПО
        |    СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
        
        Запрос.УстановитьПараметр("Экспедитор", Экспедитор);
        Запрос.УстановитьПараметр("Водитель", Водитель);
        
        Результат = Запрос.Выполнить().Выбрать();
        
        
        Пока Результат.Следующий() Цикл
            Если ВыбранныйЭкспедитор = Экспедитор Тогда
                Водитель.Выбрать();
            КонецЕсли;
        КонецЦикла;

        
    КонецЕсли;
30 Varlant1n
 
12.01.21
14:12
Я переделал еще и вот итог:

    ВыбранныйЭкспедитор = Объект.Экспедитор;
    Если ЗначениеЗаполнено(ВыбранныйЭкспедитор) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        |    СведенияОбЭкспедиторахСрезПоследних.Период КАК Период,
        |    СведенияОбЭкспедиторахСрезПоследних.Экспедитор КАК Экспедитор,
        |    СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
        |ИЗ
        |    РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних КАК СведенияОбЭкспедиторахСрезПоследних
        |УПОРЯДОЧИТЬ ПО
        |    СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ";
        
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Если ВыбранныйЭкспедитор = Выборка.Экспедитор И Объект.Дата = Выборка.Период Тогда
            
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
31 acht
 
12.01.21
14:26
(30) Держи уж

Если ЗначениеЗаполнено(Объект.Экспедитор) Тогда

    Запрос = Новый Запрос("
        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    СведенияОбЭкспедиторахСрезПоследних.Водитель КАК Водитель
        |ИЗ
        |   РегистрСведений.СведенияОбЭкспедиторах.СрезПоследних(&Период,
        |       Экспедитор = &Экспедитор
        |   ) КАК СведенияОбЭкспедиторахСрезПоследних
        |УПОРЯДОЧИТЬ ПО
        |   СведенияОбЭкспедиторахСрезПоследних.Период УБЫВ");
    Запрос.УстановитьПараметр("Период", Объект.Дата);
    Запрос.УстановитьПараметр("Экспедитор", Объект.Экспедитор);
    
    Выборка = Запрос.Выполнитью.Выбрать();
    Если Выборка.Следующий() Тогда
        Объект.Водитель = Выборка.Водитель;
    КонецЕсли;
    
КонецЕсли;
32 Varlant1n
 
12.01.21
14:47
(31) Так и сделал минут пять назад, но почему-то не заполняется значение поля водитель в документе.
33 acht
 
12.01.21
14:50
(32) Значит у тебя или поле редактирования свящано с другими данными, или типа водителя в регистре не совпадает с типом водителя в документе. Бери отладчик и вперед.
34 Varlant1n
 
12.01.21
15:06
(33) Типы одни и те же. И отладчик не работает почему-то. То есть никак не реагирует на изменения происходящие с объектом Экспедитор.
35 acht
 
12.01.21
15:13
(34) А как он должен реагировать?
36 Fedor-1971
 
12.01.21
16:49
(34) Поставь точку останова на строке    Выборка = Запрос.Выполнитью.Выбрать();
Таки убедись, что изменения применены (F5 - сохраняем изменения и запускаем 1С)

Открываем документ, выбираем экспедитора и попадаем на точку останова
шагаем по коду F10 (F11 - если надо зайти в процедуру)
Смотрим изменения чего нам надо либо в Табло (Ctrl+Alt+W), либо в Вычислить выражения (Shift + F9)
На вкус и цвет все фломастеры разные

Если БД серверная, надо убедиться, что на сервере включена отладка
37 acht
 
12.01.21
16:57
(36) После

Если Объект.Экспедитор.ПроверитьЗаполнение() Тогда

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