Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Прочитать данные Хранилища из регистра "СохраненныеНастройки"          
Constantus Подменю пользователя
сообщение 20.07.17, 6:48
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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

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

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

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

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


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

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

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

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

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



Bernet Подменю пользователя
сообщение 20.07.17, 8:43
Сообщение #2

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

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

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

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

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


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Constantus Подменю пользователя
сообщение 20.07.17, 9:27
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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

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

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


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

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

Bernet Подменю пользователя
сообщение 20.07.17, 9:32
Сообщение #4

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

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


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Спасибо сказали: Constantus,

Constantus Подменю пользователя
сообщение 20.07.17, 9:40
Сообщение #5

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

попробовал

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


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

Цитата
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
Сообщение #6

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

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


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Constantus Подменю пользователя
сообщение 20.07.17, 10:23
Сообщение #7

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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


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

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

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

Bernet Подменю пользователя
сообщение 20.07.17, 11:01
Сообщение #8

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

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

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


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


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Constantus Подменю пользователя
сообщение 20.07.17, 11:17
Сообщение #9

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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


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

Bernet Подменю пользователя
сообщение 20.07.17, 11:21
Сообщение #10

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

Constantus @ Сегодня, 12:17 * ,
Отладчиком посмотрите в коде, там где получаете строку
Цитата
Если ЭлементГруппа.ЭтоГруппа Тогда
в ЭлементГруппа какой тип? Справочник.Контрагенты или что-то другое?


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Constantus Подменю пользователя
сообщение 20.07.17, 11:59
Сообщение #11

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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


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

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

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


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

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



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


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


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




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



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

Constantus Подменю пользователя
сообщение 20.07.17, 14:37
Сообщение #12

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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


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

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


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

Bernet Подменю пользователя
сообщение 20.07.17, 14:39
Сообщение #13

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 319 раз
Рейтинг: 0

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


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Constantus Подменю пользователя
сообщение 04.08.17, 16:20
Сообщение #14

Ветеран
*******
Группа: Пользователи
Сообщений: 962
Спасибо сказали: 8 раз
Рейтинг: 0

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

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

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

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 19.04.24, 11:33
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!