Версия для печати темы (https://pro1c.org.ua/index.php?s=e333ac2e80280bb52a46fad049f3d74e&showtopic=36115)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Отбор документов по контрагенту

Автор: kot488 23.03.17, 17:18

Имеется самописная конфигурация. В конфигурации есть документы с формой списка


Для всех пользователей отображается поле отбора test1, а для пользователей с ролью test отображается только поле отбора test. Это поле имеет ссылку на справочник контрагентов.

В документе есть поле Кто платит. Пользователи с ролью test всегда будут выбирать только одного плательщика Компания.
Теперь сама проблема, нужно что бы когда пользователь переходит на список документов у него автоматически подставлялся в поле отбора test контрагент Компания.


Как это можно очень просто реализовать, я далек от 1С

Автор: podcast 23.03.17, 17:26

kot488 @ Сегодня, 17:18 * ,
Событие Выбор для списка. Там прописываете обработчик.
Примерно так.

&НаСервере
Процедура СписокВыборНаСервере()
    Контрагент = Справочники.Контрагенты.НайтиПоКоду("КодКонтрагента");
    РеквизитПлательщик = Контрагент;    
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СписокВыборНаСервере();
КонецПроцедуры

Автор: logist 23.03.17, 17:30

Цитата(kot488 @ 23.03.17, 17:18) *
В документе есть поле Кто платит. Пользователи с ролью test всегда будут выбирать только одного плательщика Компания.

Зачем тогда фильтр? Сделайте сразу в запросе списка условие, При создании формы устанавливайте параметр списка.

Автор: kot488 23.03.17, 17:54

podcast @ Сегодня, 17:26 * ,

Такого события как Вы написали нет, вот что нашел похожее

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)


logist @ Сегодня, 17:30 * ,

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


podcast @ Сегодня, 17:26 * ,

Сделал вот так
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если РольДоступна("Интерфейс_РабСтол_ПартнерыСД") Тогда
        ОпределитьДоступностьПартнерам(ЭтаФорма)
    КонецЕсли;    

    ДлиннаНомераДекларации = Метаданные.Документы.ДекларацияДоставкаТоваров.Реквизиты.НомерДекларации.Тип.КвалификаторыСтроки.Длина;
    
    Организация = Пользователи.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновнаяОрганизация");

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

Процедура СписокВыборНаСервере()
    Контрагент = Справочники.Контрагенты.НайтиПоКоду("000002643");
    РеквизитПлательщик = Контрагент;    
КонецПроцедуры


Контрагента подставляет правильно, но не происходит фильтр(

Автор: logist 23.03.17, 18:19

Цитата(kot488 @ 23.03.17, 17:54) *
Если здесь можно прописать что брать такого то контрагента, то подскажите пожалуйста как

так у вас же это уже написано:
 ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = Контрагент;


Цитата(kot488 @ 23.03.17, 17:54) *
Контрагента подставляет правильно, но не происходит фильтр(

Потому что выше вам не подсказали, что надо отбор списка устанавливать.

Автор: kot488 23.03.17, 18:53

Цитата(logist @ 23.03.17, 18:19) *
так у вас же это уже написано:

Но не хватает строки что бы взять указанного контрагента, правильно?

Автор: logist 23.03.17, 20:28

ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = Справочники.Контрагенты.НайтиПоКоду("000002643");

Автор: kot488 24.03.17, 9:40

logist @ Вчера, 20:28 * ,

Цитата(logist @ 23.03.17, 20:28) *
ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = Справочники.Контрагенты.НайтиПоКоду("000002643");



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


ПРи проверке говорит что переменная не определена
{Документ.ДекларацияПочта.Форма.ФормаСписка.Форма(88,55)}: Змінна не визначена (Справочники)
ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = <<?>>Справочники.Контрагенты.НайтиПоКоду("000002643"); (Перевірка: Тонкий клієнт)


Вот что у меня в реквизитах формы


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


Захожу в список документов, отбор не делает тоже. Пробую отобрать документы в ручную, и при выборе контрагента выскакивает ошибка Метод обьекта не обнаружен (НайтиПоКоду)

Автор: Vidocq05 24.03.17, 11:26

Цитата(kot488 @ 24.03.17, 9:40) *
 ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = Контрагент.НайтиПоКоду("000002643");

НайтиПоКоду нужно выполнять НаСервере

kot488 @ Сегодня, 9:40 * ,
ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = НайтиКонтрагентСервер("000002643");

&НаСервереБезКонтекста
Функция НайтиКонтрагентСервер(Код)
  
    Контрагент = Справочники.Контрагенты.НайтиПоКоду(Код);
    Возврат Контрагент;

КонецФункции

Автор: Batchir 24.03.17, 11:35

Не вчитывался особо в тему, если что извините.
В УПП, например, есть общий модуль ОбщегоНазначенияКлиентСервер
в котором есть полезные процедуры и функции по отбору динамических списков.
Я например часто пользуюсь процедурой УстановитьЭлементОтбораДинамическогоСписка.
Может содрать от туда эти процедурки и будет Вам счастье по установке отборов.

Автор: kot488 24.03.17, 11:44

Цитата(Vidocq05 @ 24.03.17, 11:26) *
ЭлементОтбораКурьеркаОтправитель.ПравоеЗначение = НайтиКонтрагентСервер("000002643");



А это куда вписвать?

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

&НаСервереБезКонтекста
Функция НайтиКонтрагентСервер(Код)
  
    Контрагент = Справочники.Контрагенты.НайтиПоКоду(Код);
    Возврат Контрагент;

КонецФункции

Автор: Vidocq05 24.03.17, 12:40

kot488 @ Сегодня, 11:44 * ,

Цитата(kot488 @ 24.03.17, 11:44) *
А это куда вписвать?

Ну както так))
Цитата(kot488 @ 24.03.17, 11:44) *
Если Не Контрагент.Пустая() Тогда

Контрагент это что? По нему нужно делать отбор?

Автор: kot488 24.03.17, 13:39

Vidocq05 @ Сегодня, 12:40 * ,

Убрал строку, ошибок никаких нет, не знаю для чего оно


Прописал еще вот что, и заработало

&НаКлиенте
Процедура ПриОткрытии(Отказ)
        Если ЗначениеЗаполнено(Организация) Тогда
        УстановитьПараметрыОтбораПользователя();
    КонецЕсли;
    [b]УстановитьПараметрыОтбораПлательщикПользователя();[/b]
    
КонецПроцедуры


Но как только заходишь в базу под нужным пользователем его сеанс подвисает, много документом в базе. А есди сделать по автору документа, это не ускорит?

Или может можно сделать в отборе что бы не брались во внимание документы которые младше 01.01.2017?

Автор: Vidocq05 24.03.17, 13:44

kot488 @ Сегодня, 13:33 * ,
А какой код здесь УстановитьПараметрыОтбораПользователя() ?

Автор: logist 24.03.17, 13:45

Цитата(kot488 @ 24.03.17, 11:44) *
А это куда вписвать?

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

Автор: kot488 24.03.17, 15:04

Цитата(Vidocq05 @ 24.03.17, 13:44) *
А какой код здесь УстановитьПараметрыОтбораПользователя() ?


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


Посмотрел список документов, от пользователя которому не доступно поле Плательщик, у них тоже делается отбор по Вашему коду выше, и все отображается только список документов в которых контрагент 000002643

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua