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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Прочитать данные Хранилища из регистра "СохраненныеНастройки"

Автор: Constantus 20.07.17, 6:48

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

В Моби-С в настройках Агента используется регистр "СохраненныеНастройки", в частности хранятся данные по Контрагентам.

Пользователь - Агент. Наименование настройки : Отбор.Контрагенты, где данные хранятся в ХранилищеЗначений (список Контрагентов)

При открытии формы настроек Агента, вкладка Контрагенты заполняется кодом:

    ТаблСОтбором = ПрочитатьОтбор(Агент,"Контрагенты");
    ЗаполнитьОтборПостроителя(ТаблСОтбором,ПостроительОтчетаКонтрагенты,БланкПостроителяОтчетаКонтрагенты);


Т.е. зная Пользователя (владельца), волшебным образом счтываются данные по Контрагентам и заполняются данные.

У меня стоит задача обратная.

Имеется Контрагент, который хранится в ХранилищеЗначений регистра СохраненныеНастройки. Зная этого Контрагента мне нужно получить Пользователя из этого регистра.

Имеется документ ПКО, в нем есть реквизит "Агент". В документе прописан "Контрагент", зная его нужно заполнить реквизит "Агент" полем выбора, т.к. Контрагенту могут соответствовать несколько Пользователей (владельцев, Агентов) в регистре Сохраненные настройки.

Как можно обратится к ХранилищуЗначений, получить от туда Контрагента и сопоставить его с данными СохраненнойНастройки, как Пользователя (Владельца) и вставить значение Агента в реквизит документа ПКО?



Автор: Bernet 20.07.17, 8:43

Constantus @ Сегодня, 7:48 * ,
Сразу напрямую не найдете. Сначала нужно вычитать все эти настройки запросом, а дальше в цикле получать из хранилища данные и сравнивать контрагента. Как-то так:

Запрос = Новый Запрос;
Запрос.ТЕкст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
|ГДЕ
|     СохраненныеНастройки.НаименованиеНастройки = &ИмяНастройки
|";

Запрос.УстановитьПараметр("ИмяНастройки", "Отбор.Контрагенты");

ПользовательСсылка = Неопределено;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий Цикл
      ХранилищеНастройки = Выборка.СохраненнаяНастройка;
      ЗначениеНастройки = ХранилищеНастройки.Получить();
      Если ЗначениеЗаполнено(ЗначениеНастройки) И ТипЗнч(ЗначениеНастройки) = Тип("СправочникСсылка.Контрагенты") Тогда
            Если ЗначениеНастройки = ВАШКОНТРАГЕНТ Тогда
                    ПользовательСсылка = Выборка.Пользователь;
                    Прервать;
            КонецЕсли;
      КонецЕсли;
КонецЦикла;

Автор: Constantus 20.07.17, 9:27

Bernet @ Сегодня, 11:43 * ,

Пользователей с таким отбором я получил

      ХранилищеНастройки = Выборка.СохраненнаяНастройка;
      ЗначениеНастройки = ХранилищеНастройки.Получить();


Дает ТаблицуЗначений. Судя по всему в этой таблице и хранятся данные по Контрагентам.

Я так подозреваю, что нужно теперь пройтись по этой ТаблицеЗначений, чтобы вытащить оттуда Контрагентов. Как?

Автор: Bernet 20.07.17, 9:32

Constantus @ Сегодня, 10:27 * ,
раз у вас там таблица, вы можете чтобы не перебирать все строки воспользоваться поиском по таблице, функцией "Найти"

      ХранилищеНастройки = Выборка.СохраненнаяНастройка;
      ТаблицаКонтрагентов = ХранилищеНастройки.Получить();
      СтрокаКонтрагента = ТаблицаКонтрагентов.Найти(ВАШКОНТРАГЕНТ,"Контрагент");
      Если СтрокаКонтрагента <> Неопределено Тогда // ВЫ НАШЛИ СВОЕГО КОНТРАГЕНТА
            ПользовательСсылка = Выборка.Пользователь;
      КонецЕсли;

Автор: Constantus 20.07.17, 9:40

попробовал

Для Каждого ЭлемОтбора Из ЗначениеНастройки Цикл
  
          Сообщить(ЭлемОтбора.Значение);
КонецЦикла;


Вроде вывел всех Контрагентов, но проблема всплыла в том, что при назначении Контрагентов используется "В группе из списка" и на экран вывело только наименование групп Контрагентов... причем длинным списком:

Цитата
T018. КВАДРАТ 1 (3, 4, 4/...; T019. ДЖЕННЕТ БАЗАР; T004. 8 МКР; T006. 11 МКР ; T007. 11 МКР ГУНДОГАР БАЗ...; T012. МИР 7; T020. ГАУДАН 1 (А, Б); T024. ГАУДАН 2 (В); T028. ГАУДАН 3 (ДОСААФ)

Автор: Bernet 20.07.17, 10:15

Constantus @ Сегодня, 10:40 * ,
получается у вас в таблице список хранится? тогда надо по списку поиском пройти:

      ХранилищеНастройки = Выборка.СохраненнаяНастройка;
      ЗначениеНастройки = ХранилищеНастройки.Получить();
      Для Каждого ЭлемОтбора Из ЗначениеНастройки Цикл
            СписокКонтрагентов = ЭлемОтбора.Значение;
            Если СписокКонтрагентов.НайтиПоЗначению(Вашконтрагент) <> Неопределено Тогда
                    ПользовательСсылка = Выборка.Пользователь;
            КонецЕсли;
     КонецЦикла;

Автор: Constantus 20.07.17, 10:23

Bernet @ Сегодня, 13:15 * ,


Хуже... там хранится список групп? Т.е. "В группе из списка"...

В приведенном мною списке укзаны именно группы контрагентов...

В Моби-С имеется кнопка, которая выводит список всех контрагентов в макет. Я не смог разобраться, там все построено на ПостроителеОтчета... но как-то универсально выводит спиок контрагентов независимо как составлен список контрагентов...

Автор: Bernet 20.07.17, 11:01

Constantus @ Сегодня, 11:23 * ,
ну блин, геморойно конечно получается, но я хз, тогда так: после того как получили список с группами, в каждой группе ищем нашего контрагента...

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

                       Если НЕ Результат.Пустой() Тогда
                             ПользовательСсылка = Выборка.Пользователь;
                       КонецЕсли;
               КонецЕсли;
            КонецЦикла;
     КонецЦикла;


но честно говоря этот код уже начинает попахивать гавнецом... запрос в цикле это херово, тут возникнет вопрос производительности при большой нагрузке...

Автор: Constantus 20.07.17, 11:17

Bernet @ Сегодня, 14:01 * ,


Поле объекта не обнаружено (ЭтоГруппа)

Автор: Bernet 20.07.17, 11:21

Constantus @ Сегодня, 12:17 * ,
Отладчиком посмотрите в коде, там где получаете строку

Цитата
Если ЭлементГруппа.ЭтоГруппа Тогда
в ЭлементГруппа какой тип? Справочник.Контрагенты или что-то другое?

Автор: Constantus 20.07.17, 11:59

Цитата(Bernet @ 20.07.17, 14:01) *
запрос в цикле это херово, тут возникнет вопрос производительности при большой нагрузке..


Согласен... вдруг в группе еще сделают группу... 32542620.gif

Но как тогда Обработка Моби-С вытаскивает эти значения кнопкой с выводом в макет?

Это сама кнопка вывода:
    РезультатЗапроса=СформироватьПостроительОтчетаКонтрагенты(
        ТекАгент,
        ЗапретитьИзменятьТипЦен,
        ЗапретитьИзменятьСкидку,
        ВыделятьЦветомКонтрагентов,
        Ложь);
    
    форма = ПолучитьФорму("ФормаВыводТаблДок", , "Контрагенты_" + ТекАгент);    
    макет = ПолучитьМакет("МакетКонтрагенты");
    областьШапка = макет.ПолучитьОбласть("Шапка");
    областьШапка.Параметры.Заголовок = "Контрагенты агента " + ТекАгент;
    форма.Заголовок = "Контрагенты агента " + ТекАгент;
    тдСоставСегмента = новый ТабличныйДокумент();
    тдСоставСегмента.Вывести(областьШапка);
    тзРезультат = РезультатЗапроса.Выгрузить();
    для каждого стр из тзРезультат Цикл
        область = макет.ПолучитьОбласть("Строка");
        область.Параметры.Контрагент = стр.Контрагент;
        тдСоставСегмента.Вывести(область);
    КонецЦикла;


Это часть кода из СформироватьПостроительОтчетаКонтрагенты

    ТаблСОтбором = ПрочитатьОтбор(ПарамАгент,"Контрагенты"); //прочитаем из регистра отбор
    
    ЗаполнитьОтборПостроителя(ТаблСОтбором,Построитель,БланкПостроителяОтчетаКонтрагенты);
    Построитель.Выполнить();
    Если ТолькоСсылки Тогда
        Возврат Построитель.Результат;
    КонецЕсли;



Функция ПрочитатьОтбор(Агент,НазваниеОтбора) Экспорт
    ТаблСОтбором = ПрочитатьИзРегистраСохраненныеНастройки(Агент,"Отбор."+НазваниеОтбора);
    Если ТипЗнч(ТаблСОтбором) <> Тип("ТаблицаЗначений") Тогда  //нет настройки
        ТаблСОтбором = СоздатьТаблицуОтбор();                        //создаем пустую
    КонецЕсли;
    возврат ТаблСОтбором;    
КонецФункции


И почти как у Вас


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




Цитата(Bernet @ 20.07.17, 14:21) *
в ЭлементГруппа какой тип? Справочник.Контрагенты или что-то другое?



Скорее всего да, ибо другие данные не используются. Но нужно наверное учесть в каком типе эти данные храняться в Хранилище...

Автор: Constantus 20.07.17, 14:37

Constantus @ Сегодня, 14:59 * ,


Спасибо большое. Вроде все сделал. Вытащил расшифровку по контраегнтам из перечня. Воспользовался ихним решением:

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


Бернет, спасибо!

Автор: Bernet 20.07.17, 14:39

Constantus @ Сегодня, 15:37 * ,
Не за что, я попытался помочь wink.gif

Автор: Constantus 04.08.17, 16:20

Час от часу не легче...

До этого момента пытались вытащить Контрагентов из Хранилища по Агенту...
Т.е. из РС "Сохраненные настройки", зная Пользователя (Агента) из Хранилища вытаскивали список Контрагентов. Здесь получается типа Один(Агент)-к-Многим(Контрагенты)

Сейчас встала обратная задача. Мы знаем Контрагента, который получается хранится в ХранилищеЗначений. Зная его, теперь нужно выяснить, кто Пользователь этого Контрагента из РС "Сохраненные настройки".

Как вытащить данные их Хранилища по определенному критерию? Где вообще находится это хранилище?

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