Имя: Пароль:
1C
1С v8
Помогите решить проблему с пересечением фиксированных настроек
0 Fragster
 
гуру
14.06.17
14:12
Есть форма с динамическим списком. При открытии устанавливается отбор, который пользователь не должен иметь возможность снять. Сейчас это делается через фиксированные настройки (очень удобно, что они не сохраняются).

Отбор не на фиксированное значение, а на диапазон. Когда пользователь добавляет свой отбор через "найти", всё хорошо. Когда пользователь добавляет свой отбор через "настроить список", то у него закономерно вылетает ошибка про пересечение настроек.

Как правильно обойти ошибку (и при этом не дать пользователю установить "неправильный отбор")?

Саму форму менять нежелательно.
1 aleks_default
 
14.06.17
15:03
ИМХО никак, только сбрасывать фиксированный отбор и все фильтры из него добавлять в пользовательские настройки. По крайней мере я не нашел как подружить фиксированные настройки с пользовательскими.
У себя сделал визуализацию фиксированных настроек в форме с возможностью их сброса.
2 Fragster
 
гуру
14.06.17
16:01
(1) так в том то и дело, что у пользователя не должно быть возможности сбросить фикс. настройки.
Например фикс. настройки на сумму больше 1000, пользователь хочет отобрать сумму меньше 10000...
3 aleks_default
 
14.06.17
16:30
Да я понял что нужно. Я тоже не нашел, как это можно сделать красиво, поэтому мне подошел такой выход из ситуации.
4 Fragster
 
гуру
14.06.17
16:34
можно программно поменять запрос, добавив параметр и установив его вместо отбора, но как-то страшно:

Список = Форма.Список;
        Схема = Новый СхемаЗапроса();
        Список.ПроизвольныйЗапрос = Истина;
        Схема.УстановитьТекстЗапроса(Список.ТекстЗапроса);
        Пакет = Схема.ПакетЗапросов.Получить(0);
        Оператор = Пакет.Операторы.Получить(0);
        ИмяТаблицы = Оператор.Источники.Получить(0).Источник.Псевдоним;
        Оператор.Отбор.Добавить(ИмяТаблицы + ".Поле В (&Отбор)");
        Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
        Список.Параметры.УстановитьЗначениеПараметра("Отбор", Отбор);
5 Fragster
 
гуру
07.07.17
13:57
решение из (4) не работает для 8.3.9 и 8.3.10 - там слетают привязки элементов управления
6 Вафель
 
07.07.17
14:02
на 8.3.9 не слетают
7 Вафель
 
07.07.17
14:33
Скорее всего это проявление особенности устройства динамического списка в совокупности с улучшением конструктора запросов в 8.3.9 (см. downloads.v8.1c.ru/conte... »»  )

Особенность такая - если у поля есть 2 имени (т.е. это стандартное поле без псевдонима, например Наименование) - то при задействовании такого поля, форма запоминает английский вариант имени (Description для наименования).

Если после этого такому полю добавить стандартный псевдоним на русском языке (Наименование) - то форма его больше не найдет (потому что у поля с псевдонимом нет второго варианта, а основной вариант Наименование не равен запомненному формой Description).



Условия для появления проблемы:

конфигурация должна быть в режиме совместимости 8.3.9 (не использовать на 8.3.9) или выше
у динамического списка используется произвольный запрос и в нем не установлены псевдонимы полей (именно в таком виде запрос генерируется платформой при установке флага "Произвольный запрос")
Если текст запроса такого списка отредактировать конструктором запросов (достаточно просто открыть конструктор и нажать "ОК") то все стандартные поля потеряют связь с формой  Аналогичная проблема будет в режиме Предприятие если текст запроса такого списка изменить с помощью схемы запроса.
8 Fragster
 
гуру
07.07.17
14:37
(7) я знаю, читай первоисточник дальше...
9 apokrit
 
07.07.17
14:40
"Обычный" элемент отбора с РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный не подходит?
10 Fragster
 
гуру
07.07.17
14:43
(9) он может сохраниться и наложиться при следующем открытии формы выбора, например из другого элемента управления
11 Fragster
 
гуру
07.07.17
14:44
когда он не нужен. да и пользователю не всегда нужно знать о том, что есть какой-то отбор
12 apokrit
 
07.07.17
14:45
(0) Недоступные элементы отбора не используются для формирования пользовательских настроек, а сохраняются только пользовательские настройки. Т.е. нет, не может.
13 Вафель
 
07.07.17
14:45
Можно кстати английских синонимов вручную добавить
14 apokrit
 
07.07.17
14:45
Недоступные элементы отбора не видно.
15 Fragster
 
гуру
07.07.17
14:46
(13) ага, чтобы сломать все на 8.3.8 и ниже :) или в зависимости от релиза добавлять или нет синонимы...
16 apokrit
 
07.07.17
14:47
(13) Можно. Еще можно вариант встроенного языка на английский поменять - тогда конструктор (схема) сам их на английском сделает...
Только после этого они перестанут на русском находиться, например в данных строки.
17 Вафель
 
07.07.17
14:47
(15) так ты универсальную надстройку пишешь или что?
18 Вафель
 
07.07.17
14:48
(15) у тебя кстати режим совместимости какой?
19 Fragster
 
гуру
07.07.17
14:57
(18) сейчас 8.3.5 :) ну и 8.3.8
20 Fragster
 
гуру
07.07.17
15:01
(9) а как это сделать не дергая сервер и форму?

так не прокатывает:

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

&НаКлиенте
Функция ПолучитьПользовательскиеНастройки()
    Настройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
    ЭлементОтбора = Настройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДоговора");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ВидыДоговора = Новый СписокЗначений;
    ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.СПокупателем"));
    ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.Прочее"));
    ЭлементОтбора.ПравоеЗначение = ВидыДоговора;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    Возврат Настройки;
КонецФункции
21 Вафель
 
07.07.17
15:01
(19) Откуда тогда проблемы с псевдонимами?
22 Fragster
 
гуру
07.07.17
15:01
открывается без отбора. хотя то же самое с фиксированными настройками работает
23 Fragster
 
гуру
07.07.17
15:01
(21) ну вот переведут типовые на новый режим совместимости и всё сломается.
24 Вафель
 
07.07.17
15:03
(23) к тому времени уже 8.3.15 выпустят уже наверно
25 Fragster
 
гуру
07.07.17
15:04
(24) говорят, УХ и ДО уже скоро будет 8.3.10
26 Fragster
 
гуру
07.07.17
15:04
и ЗУП
27 Вафель
 
07.07.17
15:05
(25) Откуда тогда 8.3.5?
28 Fragster
 
гуру
07.07.17
15:06
(27) управленческий гомункул, с неснимаемым режимом совместимости из-за несериализуемых значений в хранилищах значений и кучей мин замедленного действия
29 apokrit
 
07.07.17
15:10
(20) Обычные настройки нельзя через параметры передать (если только конечно в открываемой форме нет соответствующего кода).
Если больше совсем ни как - можно попробовать поменять настройки в форме уже после открытия (но это, мягко говоря, уродство, конечно и замедление от этого будет)
30 apokrit
 
07.07.17
15:13
+(29) А что код из (4) работает "не дергая сервер и форму"?
31 Fragster
 
гуру
07.07.17
15:20
(29) фиксированные прекрасно передаются, такой код работает: &НаКлиенте
Процедура Договор2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыОткрываемойФормы = Новый Структура;
    ПараметрыОткрываемойФормы.Вставить("ФиксированныеНастройки", ПолучитьФиксированныеНастройки());
    ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыОткрываемойФормы, Элемент,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Функция ПолучитьФиксированныеНастройки()
    Настройки = Новый НастройкиКомпоновкиДанных;
    ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДоговора");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ВидыДоговора = Новый СписокЗначений;
    ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.СПокупателем"));
    ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.Прочее"));
    ЭлементОтбора.ПравоеЗначение = ВидыДоговора;
//    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    Возврат Настройки;
КонецФункции
32 Fragster
 
гуру
07.07.17
15:21
собственно, и пользовательские можно, но там больше букв
33 apokrit
 
07.07.17
15:25
(31) Это к чему?
Я уже написал что "просто" настройки передать в список через параметр открытия формы нельзя (не предусмотрено).

Но ведь, вариант со схемой запроса явно не на клиенте реализован. В чем проблема в этом же месте изменить обычные настройки?
34 Fragster
 
гуру
07.07.17
15:26
(33) там есть вариант передачи пользовательских настроек списка. как туда добавить мой отбор, да еще и чтобы он не отображался?
35 Fragster
 
гуру
07.07.17
15:27
(33) вариант со схемой запроса мне не нравится. он от безысходности.
36 Fragster
 
гуру
07.07.17
15:28
изначально был вариант передачи фиксированных настроек
37 Fragster
 
гуру
07.07.17
15:28
например он не привязывался к названию элемента формы
38 Cyberhawk
 
07.07.17
15:31
"Например фикс. настройки на сумму больше 1000, пользователь хочет отобрать сумму меньше 10000..." // Ну ведь очень простая ситуация: либо отказаться от пользовательского отбора, либо от фиксированной настройки (в один момент времени - в одном контексте). Чего тут думать?
39 Fragster
 
гуру
07.07.17
15:36
(38) альтернатива?
40 Cyberhawk
 
07.07.17
16:09
(39) Отсюда не видно