Имя: Пароль:
1C
 
должна вызываться форма выбора контрагента
,
0 bplmeddy
 
27.04.17
15:30
Доброго времени суток. Есть задача: при нажатии на кнопку, если поле ввода не заполнено, должна вызываться форма выбора контрагента, с последующей записью ЗначенияВыбора в соответствующее поле. Есть "ПолеВвода", привязанное к реквизиту (тип рекв. - Справочник.Ссылка.Контрагенты). Также на форме документа есть кнопка подбор, через которую в документ набиваются товары/услуги. Привожу кусок кода из процедуры, в которой вызывается выбор Контрагента:

Если ЭлементыФормы.Склад.Значение.Пустая() Тогда
        Предупреждение("Вы не выбрали СКЛАД !");
        Возврат
    КонецЕсли;
    Если Склад = Справочники.Склады.НайтиПоКоду("000000002") Тогда
        Родитель = Справочники.Контрагенты.НайтиПоКоду("000004171");
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Контрагенты.Код
                   |ИЗ
                   |    Справочник.Контрагенты КАК Контрагенты
                   |ГДЕ
                   |    Контрагенты.Родитель = &Родитель";
                   Запрос.УстановитьПараметр("Родитель",Родитель);
    Номера = Новый СписокЗначений;
    Номера.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Код"));
    ФормаКонтр = Справочники.Контрагенты.ПолучитьФормуВыбора("ФормаВыбора");
    ФормаКонтр.Отбор.Код.ВидСравнения = ВидСравнения.ВСписке;
    ФормаКонтр.Отбор.Код.Значение = Номера;
    ФормаКонтр.Отбор.Код.Использование = Истина;
    ФормаКонтр.ОткрытьМодально();

Также, код процедуры "ОбработкаВыбора":

Если Источник.Заголовок = "Подбор продажи" Тогда
        Кол = 1;
        Цен = 1;
        ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000007");
        Если НЕ ЗначениеВыбора.ТипыНоменклатуры = Справочники.ТипыНоменклатуры.НайтиПоКоду("000000002") Тогда
            Если ВвестиЧисло(Кол, "Введите количество товара", 10, 0) Тогда
                Номен = ЗначениеВыбора;
                СтруктураОтбора = Новый Структура;
                СтруктураОтбора.Вставить("Номенклатура",Номен);
                СтруктураОтбора.Вставить("Склад",ЭлементыФормы.Склад.Значение);
                Ост = РегистрыНакопления.ТоварыНаСкладах.Остатки(,СтруктураОтбора,"Номенклатура","Количество").Итог("Количество");
                Если Кол > Ост Тогда
                    Предупреждение("Такого количество товара нет на складе "+ЭлементыФормы.Склад.Значение+" !");
                    Возврат
                КонецЕсли;
            Иначе
                Возврат
            КонецЕсли;
            Если ВвестиЧисло(Цен,"Введите цену продажи",10,2) Тогда
                СтруктураОтбора.Очистить();
                СтруктураОтбора.Вставить("Номенклатура",ЗначениеВыбора.Ссылка);
                СтруктураОтбора.Вставить("ТипыЦен",ТипЦен);
                РезЦен = Окр(РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(,СтруктураОтбора).Цена*Справочники.Валюты.НайтиПоКоду("000000001").Курс,2,1);
                Если РезЦен > Цен Тогда
                    Предупреждение("Продажа в МИНУС !!!");
                    Возврат
                КонецЕсли;
            Иначе
                Возврат
            КонецЕсли;
            ЭлементыФормы.ТоварыИУслуги.ДобавитьСтроку();
            ЭлементыФормы.ТоварыИУслуги.ТекущаяСтрока.Товар = ЗначениеВыбора;
            ЭлементыФормы.ТоварыИУслуги.ТекущаяСтрока.Количество = Кол;
            ЭлементыФормы.ТоварыИУслуги.ТекущаяСтрока.Цена = Цен;
            ПодсчётСумы();
            ИтоговаяЦена();
        КонецЕсли;
        Источник.Активизировать();
    ИначеЕсли Источник.Заголовок = "Справочник Контрагенты" Тогда
        ЭлементыФормы.Мастер.Значение = ЗначениеВыбора;
    КонецЕсли;

Пробовал сделать через оператор "Если" и анализ заголовков. При подборе товара всё работает нормально, но при выборе Контрагента, платформа даже на обращается к процедуре "ОбработкаВыбора".
Вопрос: как можно решить эту проблему ? Буду очень благодарен!
1 aka AMIGO
 
модератор
27.04.17
15:33
(0) Что означает название ветки?
2 Масянька
 
27.04.17
15:33
(1) Поддерживаю.
3 Джинн
 
27.04.17
15:34
После Справочники.Склады.НайтиПоКоду("000000002") и Справочники.Контрагенты.НайтиПоКоду("000004171") даже читать дальше не стал.
4 bplmeddy
 
27.04.17
15:34
(1) Случайно стёр, извиняюсь. Должно быть "Одна "ОбработкаВыбора" на две процедуры.
5 bplmeddy
 
27.04.17
15:36
(3) Это всё, что Вы можете сказать по теме ? Возможно я не правильно сформулировал вопрос. Или возможно, в Вашем (конечно единственно верном) понимании, все изначально всё делают правильно, и иначе "ни-ни" ?
6 Масянька
 
27.04.17
15:37
(5) Не понятно сформулировал... Совсем...
7 aka AMIGO
 
27.04.17
15:37
(3) Тут вот что.. Если БД устоявшаяся, и пользователи обученные/инструктированные и аккуратные - поиск по коду уместен.
8 bplmeddy
 
27.04.17
15:40
(6) Суть в чём: когда идёт подбор товара - всё нормально, обработка выбора вызывается и корректно работает. Когда идёт выбор Контрагента, в этом куске:

Номера = Новый СписокЗначений;
    Номера.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Код"));
    ФормаКонтр = Справочники.Контрагенты.ПолучитьФормуВыбора("ФормаВыбора");
    ФормаКонтр.Отбор.Код.ВидСравнения = ВидСравнения.ВСписке;
    ФормаКонтр.Отбор.Код.Значение = Номера;
    ФормаКонтр.Отбор.Код.Использование = Истина;
    ФормаКонтр.ОткрытьМодально();

то даже нет вызова процедуры "ОбработкаВыбора".
Главный вопрос - почему?

Так лучше ?
9 Михаил Козлов
 
27.04.17
15:40
(5) Обычно это делают в событии элемента формы НачалоВыбора.
10 Масянька
 
27.04.17
15:42
(8) То есть есть кнопка "Подбор"? Именно, кнопка.
11 bplmeddy
 
27.04.17
15:42
(9) Хорошо, это в принципе решает ситуацию, если к примеру вызвать это событие в нужный момент. Если подскажите как - с радостью воспользуюсь.
12 bplmeddy
 
27.04.17
15:43
(10) Да. Именно кнопка. К слову, конфигурация самописная(самопальная).

Вот код, который привязан к подбору товара:

Процедура ПодборТовараНажатие(Элемент)
    Если ЭлементыФормы.Склад.Значение.Пустая() Тогда
        Предупреждение("Вы не выбрали склад!");
        Возврат
    Иначе
        ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуВыбора("ФормаВыбора",ЭтаФорма);
        ФормаПодбора.ЗакрыватьПриВыборе = Ложь;
        ФормаПодбора.Заголовок = "Подбор продажи";
        ФормаПодбора.Открыть();
    КонецЕсли;
КонецПроцедуры
13 bplmeddy
 
27.04.17
15:47
(12) Всё, сам досмотрел. Сильно извиняюсь, я дурак.
Решение: если в условии получения формы подбора, не указать владельца "("ФормаВыбора",ЭтаФорма);" то "ОбработкаВыбора" не будет вызываться. Всем спасибо. Можно расходится.
Ещё раз, тысяча извинений =)
14 Михаил Козлов
 
27.04.17
18:32
(12) Во всех типовых выбор договора контрагента в документах. Например, в возврате товаров покупателем (фильтр на вид договора. Фильтр на организацию и владельца устанавливается в РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента(...):
Процедура ДоговорКонтрагентаНачалоВыбора(Элемент, СтандартнаяОбработка)

    // сохраним договор контрагента, возможно понадобится к нему вернуться
    мТекущийДоговорКонтрагента = ДоговорКонтрагента;

    СписокВидовДоговоров = Новый СписокЗначений;
    СписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
    СписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером);
    РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента(ЭтотОбъект, ЭтаФорма, Элемент, Контрагент, ДоговорКонтрагента,
                                            СписокВидовДоговоров, СтандартнаяОбработка);

КонецПроцедуры // ДоговорКонтрагентаНачалоВыбора()
15 Михаил Козлов
 
27.04.17
18:34
(14)+ А вот и из РаботыСДиалогами (только она длинная):
Процедура НачалоВыбораЗначенияДоговораКонтрагента(ДокументОбъект, ФормаДокумента, ЭлементФормы, Контрагент, ДоговорКонтрагента,
                                                  ВидыДоговораВзаиморасчетов, СтандартнаяОбработка,
                                                  СтруктураДополнительныхПараметров = Неопределено) Экспорт

    СтандартнаяОбработка = Ложь;

    МетаданныеДокумента = ДокументОбъект.Метаданные();

    // В качестве владельца формы выбора устанавливаем данный элемент формы, чтобы выбранное
    // значение было присвоено стандартно.
    ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора(,ЭлементФормы,);

    // Владельца менять по умолчанию не даем.
    ФормаВыбора.ПараметрОтборПоВладельцу = Контрагент;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;

    Если ВидыДоговораВзаиморасчетов<>Неопределено Тогда

        // Оставим в выборе только "правильные" договоры
        Если ТипЗнч(ВидыДоговораВзаиморасчетов) = Тип("СписокЗначений") Тогда
            ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения                    = ВидСравнения.ВСписке;
        Иначе
            ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения                    = ВидСравнения.Равно;
        КонецЕсли;
        ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Значение                            = ВидыДоговораВзаиморасчетов;
        ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Использование                       = Истина;
        ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидДоговора.Доступность = Ложь;
    КонецЕсли;

    // Еще надо фильтровать по организации, если она заполнена
    Если ОбщегоНазначения.ЕстьРеквизитДокумента("Организация",МетаданныеДокумента)
       И ЗначениеЗаполнено(ДокументОбъект.Организация) Тогда
        ФормаВыбора.СправочникСписок.Отбор.Организация.Значение                            = ДокументОбъект.Организация;
        ФормаВыбора.СправочникСписок.Отбор.Организация.Использование                       = Истина;
        ФормаВыбора.СправочникСписок.Отбор.Организация.ВидСравнения                        = ВидСравнения.Равно;
        ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Организация.Доступность = Ложь;
    КонецЕсли;

    // Добавим фильтры по дополнительным параметрам отбора
    Если ТипЗнч(СтруктураДополнительныхПараметров) = Тип("Структура") Тогда
        Для каждого ЭлементСтруктуры Из СтруктураДополнительныхПараметров Цикл

            СтруктураОтбора = ЭлементСтруктуры.Значение;
            
            ЗначениеОтбора     = Неопределено;
            ВидСравненияОтбора = Неопределено;
            ДоступностьОтбора  = Неопределено;

            Если СтруктураОтбора.Свойство("ЗначениеОтбора", ЗначениеОтбора) Тогда

                Если СтруктураОтбора.Свойство("ВидСравненияОтбора", ВидСравненияОтбора) Тогда
                    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравненияОтбора;
                Иначе
                    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравнения.Равно;
                КонецЕсли;

                ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Значение      = ЗначениеОтбора;
                ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Использование = Истина;

                Если СтруктураОтбора.Свойство("ДоступностьОтбора", ДоступностьОтбора) Тогда
                    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = ДоступностьОтбора;
                Иначе
                    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = Ложь;
                КонецЕсли;

            КонецЕсли;

        КонецЦикла;

    КонецЕсли;
    
    ФормаВыбора.ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
    ФормаВыбора.НачальноеЗначениеВыбора = ДоговорКонтрагента;

    ФормаВыбора.Открыть();

КонецПроцедуры // НачалоВыбораЗначенияДоговораКонтрагента()
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший