Диалог предназначен отнюдь не для замены добротного встроенного, "красивого" Диалога 1с. Применение данного Диалога видится для случаев, когда необходимо то, чего нет в официальном Диалоге. А именно: границы, любой язык, любой стандарт даты, расширенные возможности выбора периода, "тонкости" выбора даты, выбор времени.
Основная логика Диалога построена на моей библиотеке 1с- методов Даты, существенно переработанной, дополненной - самый последний вариант .
Библиотека расширения методов даты включена в данную обработку.
Сразу отвечу на вопросы, которые обязательно возникнут:
1. Почему использованы табличные поля ?
Есть начальные "красивые" варианты на кнопках, ( с оттенками, с эмуляцией выделения , с выделением текущей даты) - работают на порядок (ки) медленнее . Вывести на экран 200 кнопок для "движка" 1с - жуткая проблема.
2.Почему не использовано условное оформление?
а) Самое главное - невозможно управлять оформлением текущих строк табличных полей (раскраска и т.п.) - теряется смысл использования.
б) Достаточно пункта (а). Ещё - серьезный довесок в коде, объеме передаваемых данных, существенное понижение скорости исполнения. Пробовал...
В надежде, что это будет читать кто-нибудь "заинтересованный", не могу не поделиться горечью, накопленной в процессе разработки.
Удручает "гиперчувствительность" обработчиков изменения ячеек и строк табличных полей. Они реагируют буквально на все: на изменения
заголовков, на изменения ячеек других табличных полей, изменение видимости, доступности - не всегда и не предсказуемо - сплошной кошмар! Заставить согласованно работать с десяток взаимосвязанных табличных полей - еще та задача. А отсюда - затраченное время, шаманство, объем программы, скорость.
Весьма не хватает обработчика: "ПриУстановкеНаЭлементФормы(Элемент)".
Во первых была бы решена проблема текущих строк-ячеек табличных полей, табличных документов. Сейчас при установке на них курсора - никакой реакции. Во вторых тогда можно забыть (когда это мешает) про "гиперчувствительность" некоторых обработчиков (как и про сами эти обработчики). По сути, это был бы очень даже универсальный обработчик для затычки дыр! Конечно, если будет реализован тщательно...
Не приятно, что нет возможности управлять оформлением текущей строки табличного поля.
Не радует "навязанность" заголовка формы , недоступность оформления,
даже место освободить нельзя! А пространства всегда не хватает, особенно в связи с умышленным "огрублением" разработчиками общего интерфейса.
Верю: Боги-Web-Такси когда-нибудь взглянут на "землю".
"...Жаль только жить в эту пору прекрасную уж не придется..."
Коротко о диалоге.
На форме диалога организованы все необходимые подсказки на выбранном языке формы. Хороший диалог должен быть интуитивно понятным - на это надеюсь. Работает так: "визуальная" установка даты - один щелчок на табличных полях выбора; двойной щелчок или нажатие кнопки "Ок" - выбор и выход. Для программиста - в процедурах и функциях масса комментариев.
О кодах реквизитов даты
Введено понятие числовых кодов реквизитов даты:
1 - Год; 2 - Полугодие; 3 - Квартал; 4 - Месяц; 5 - Декада; 6 - Неделя;
7 - День(Сутки); 8 - Час; 9 - Минута; 10 - Секунда; 11 - Миллисекунда;
12 - Микросекунда; и т.д.
Функции из библиотеки расширения методов даты теперь работают как с кодами , так и с именами реквизитов на любом языке. Коды более универсальны, не требуется параметра "ИменаРеквизитов" с переводами имен .
О многоязычности.
Перевод для каждого языка реализован в виде строки с тремя уровнями разделителей (из-за стремления к минимальному размеру хранения). Строки переводов , на данный момент (в связи с отсутствием специального справочника перевода "статических" МетаОбъектов) создаются в Модуле обработки. Каждый язык представлен небольшим блоком внутри функции "ЯзыкиГруппыФорм()". Перевод для нового языка делается так: копируется блок известного Вам языка , заменяется код и наименование языка (если нужно- разделители) и переводятся правые подстроки ( Яндекс - Гугль и 30-40 минут). Блоки с ненужными языками можно спокойно удалить (один должен остаться!).
О границах.
Определены 3 вида ограничений диалога.
1. "Абсолютные" границы даты слева и справа. Области выбора даты за данными границами пользователю не доступны, цифры и слова в ячейках таблиц выбора заменены специальным символом ( мною выбран "-").
2. "Условные" (или "предупреждающие") границы даты слева и справа (например, дата за границей запрета редактирования). Визуальные данные в ячейках таблиц выбора предваряются или заканчиваются, в зависимости перехода левой или правой границы специальном символом ( мною выбран ".").
3. Ограничения реквизитов даты. Выбор не возможен для указанных недоступных кодов реквизитов даты. Например, можно указать коды недоступных реквизитов : "1,2,3,5,6,7,8,9,10", будет возможен выбор только месяцев. Недоступные реквизиты на форме выбора периода заменены специальным символом ( мною выбран "_"), соответствующие подстроки маски ввода даты также заменяются этими символами; табличные поля визуального выбора даты для этих реквизитов становятся недоступными.
О поддержке стандартов представления Даты.
Введено понятие "ШаблонДаты":
Шаблон=(Префикс)(строка0)(кодР1)(строка1) ...(КодР10)(строка10)....
Где Префикс=(0 - ведущие нули у значений реквизитов даты)
(1 - только цифровые значения реквизитов с ведущими нулями)
(любой другой символ - без ведущих нулей у значений реквизитов)
КодР - цифровой код реквизита даты (см.выше)
Строка - любая строка без цифровых символов
(нулевая и последняя строка могут быть пустыми).
Примеры шаблона: "07.4.1 8:9" =(0) (День).(Месяц).(Год) (Час):(Минута)
"01,2,3" =(0) (Год),(Полугодие),(Квартал)
В библиотеку добавлены 3 функции, позволяющие работать с шаблонами: Дата_МаскаПоШаблону(...), Дата_ВСтрокуПоШаблону(...), Дата_ ИзСтрокиПоШаблону(...). Такой подход позволяет работать с любым чередованием реквизитов даты и строковых разделителей , т.е. поддерживается любой стандарт представления даты. Не путать с форматом! В некотором смысле Шаблон более универсален, так как дает возможность вставлять между числовыми значениями реквизитов даты строки на любом языке; к тому же из строки даты гарантировано воссоздается дата.
Особенности выбора Даты-Времени.
А) Кроме поля ввода Даты-Времени по маске (согласно указанному международному стандарту-Шаблону), добавлены три кнопки: Предыдущая, Текущая и Следующая даты. При нажатии - меню выбора реквизита Даты на текущем языке формы.
Б) Предусмотрены три режима Диалога с возможность выбора (введено соответствующее поле выбора ):
- (0). Текущий. При выборе значения текущего реквизита Даты значения всех последующих остаются неизменными; цвет текста в таблицах выбора - черный.
- (1). Начальный. При выборе значения текущего реквизита Даты значения всех последующих устанавливаются в начало; цвет текста в таблицах - темно-красный.
- (2).Конечный . При выборе значения текущего реквизита Даты для всех последующих устанавливается конечное значение; цвет текста в таблицах - темно-зеленый.
В) Предусмотрен выбор текущего реквизита Даты и "листание" его значений с любым шагом (количеством соответствующих этому реквизиту периодов). Для этого введены
два поля:
- выбора текущего реквизита Даты;
- ввода-выбора количества периодов листания и самого листания.
При выборе текущего реквизита Даты становятся активными строка и ячейка соответствующей таблицы выбора . И наоборот - при активизации Таблицы-Строки-Ячейки устанавливается имя текущего реквизита в вышеуказанное поле. К сожалению, поле выбора текущего реквизита Даты пришлось ввести из-за трудности визуального определения , какая же Таблица-Строка-Ячейка на данный момент является, так сказать "глобально- активной" на форме, а также невозможностью смены реквизита Даты путем установки курсора на активную ячейку другой таблицы выбора (ни какой реакции!). Таков уж интерфейс 1с...
Г) При завершении работы диалога в параметры выводятся Дата начала и Дата конца периода, соответствующего текущему выбранному реквизиту выбранной Даты.
Таким образом диалог в режиме выбора Даты, Времени или Даты-Времени можно использовать для выбора "простейшего" периода.
Особенности выбора Периода.
А) Для визуального выбора дат начала и конца Периода используются те же табличные поля, что и при выборе Даты (см. выше). Предусмотрены два режима их работы: выбор начала периода (РежимДиалога=1, цвет текста ="ТемноКрасный") и выбор конца периода (РежимДиалога=2, цвет текста ="ТемноЗеленый"). Переключение режимов осуществляется специальными кнопками : "<" , ">" или непосредственной "ручной" установкой Даты-Времени в поле ввода даты начала или конца периода. Для отображения выбора начала и конца периода предусмотрены две строки заголовка вверху формы, для отображения и управления - две строки внизу формы (с полями, кнопками).
Б) Для отображения и выбора имени текущего Периода и выбора-ввода количества Периодов правее табличных полей выбора даты на форму добавлены две колонки: с именами Периодов и соответственно, с их Количеством. Добавлен флаг фиксации Периода - "Фиксировано". При установленном флаге выбранный Период и его длина остаются неизменными при выборе даты начала или конца периода, т.е. Период становиться как бы "привязанным " к дате начала или конца.
В) Несколько слов о выборе "не фиксированного" Периода ("фиксированный" описан выше).
1. Режим выбора начала Периода. При смене текущего реквизита Даты автоматически в колонке имен периодов становиться активной ячейка с именем, соответствующем текущему реквизиты Даты, количество этих периодов устанавливается в 1.
При смене ЗНАЧЕНИЯ текущего реквизита Даты (текущий реквизит тот же ) ранее установленное количество периодов не изменяется. После выбора даты начала периода в колонке имен Периодов можно выбрать любой Период, в т.ч. и не соответствующий текущему реквизиту Даты, в колонке длины можно ввести-выбрать количество этих Периодов. Таким образом Период и его длину можно устанавливать независимо от даты начала периода.
2. Режим выбора конца Периода. На основании установленной ранее Даты начала периода и выбранной Даты конца периода производиться поиск подходящего Периода и его длины (количества периодов), что и отражается в соответствующих колонках Периода (если ничего подходящего не найдено - в секундах). Выбор имени Периода мною заблокирован (не имеет смысла, лишнее это). Зато есть возможность выбора-ввода длины (количества) любого Периода, которая прибавляется к Дате начала периода; Дата конца периода и ее отображение в таблицах выбора изменяется соответствующим образом. Таким образом можно выбирать Дату конца периода - подбирается период и длина или вводить-выбирать длину периода (и соответственно, Период) - изменяется Дата конца периода и ее визуальное отображение.
О недостатках.
а) Код (да простят мне это слово гуру низких языков) далек от совершенства, как по скорости исполнения, так и по лаконичности. Конечно же, возможны ошибки. Единственное оправдание: все-таки много чего охвачено.
б) Пока не реализован реверсивный откат последнего действия.
в) Пока не реализованы любые стандарты номера дня начала недели.