МГ: сессия от 2010-09-24.
Продолжаем сессии ответов на вопросы.
Хотя вопросов поступает сейчас не много, но все они очень интересные.
1. Расскажите про настройку Документа вкладка права галочка «Привилегированный режим при проведении»… Как в привилегированном модуле будет выполняться вызов другой процедуры обычного (непривилегированного) общего модуля – с проверками РЛС или без проверок? Само по себе право на действие (галочка на чтение, изменение, удаление и т.п.) проверяется в привилегированном модуле или нет? Т.е. привилегированный модуль отменяет проверки всех прав или только РЛС?
2. Документ счет содержит несколько номенклатур у которых описание в виде форматированного документа Нужно вывести по очереди эти описания в одну печатную форму. Как это сделать?
3. Просьба детальнее объяснить назначения параметров 2 и 3 в методе “Выбрать” Работа с запросами: результат запроса/ Выборка из результата запроса Особенно хотелось бы прояснить ситуацию по использованию 3 параметра “ГруппировкиДляЗначенийГруппировок”, в особенности в ситуации когда используется более одной группировки в запросе.
4. Касается упорядочивания в запросе по моменту времени. В “МГ: сессия от 2010-07-23” этот вопрос разбирался Но еще в 2006 в первом учебном центре 1С преподаватель, если не ошибаюсь на Павел, говорил что сортировку по Моменту делать нельзя Поскольку она не дает 100% результата всегда (и вроде как разработчики платформы не документировали такую возможность). При рассмотрении данного вопроса тогда единственно правильным вариантом сортировки документов было упорядочивание вначале по ДАТА, а затем по ССЫЛКА. Как я понимаю данный подход до сих под не задокументирован? Описано ли где что сортировка по ССЫЛКА + Автоупорядочивание должно давать требуемый результат?
Вопрос про формдоки мелочь:
В итоговом html у закрывающегося тега body не хватает “<“, Прав недорезает одного символа.
ВесьТекст = Лев(Текст, ПозицияНачало-6) + Весьтекст + Прав(Текст, СтрДлина(Текст) – ПозицияКонец +1))
Работать будет и без “<” у закрывающего тега </body>, но так.. для порядку :)
Спасибо, Игорь :)
Итого по сортировке документов: чтобы не было проблем с их упорядочиванием используем сорировка ДАТА + ССЫЛКА, а не МОМЕНТВРЕМЕНИ (ошибки с которым были в БК)
С учетом нулевого блока продвинутого курса )):
Вот так выглядят запросы по упорядочиваю документов, для запроса 1С:
ВЫБРАТЬ
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
1. Если упорядочивание по Дата+Ссылка:
SELECT
T1._IDRRef,
T1._Date_Time
FROM _Document16 T1 WITH(NOLOCK)
ORDER BY (T1._Date_Time), (T1._IDRRef)
2. Если упорядочивание по МоментВремени:
SELECT
T1._IDRRef,
T1._Date_Time,
T1._IDRRef
FROM _Document16 T1 WITH(NOLOCK)
ORDER BY (T1._Date_Time), (T1._IDRRef)
Получается что для второго варианта дублируется ссылка… а так все идентично
Действительно должно быть одно и тоже, но…
То что дублируется ссылка, скорее всего свойство конкрентного релиза платформы. Не будем считать за особенность.
А главная особенность заключается в том, что иногда во вложенных запросах система не дает делать упорядочивание по моменту времени (показывал в мастер-группе).
упорядоячивание по Моменту времени не работает корректно во вложенных запросах и при упорядочивании по УБЫВ(я описал это в письме на адрес МГ). Причина: не корректное построение запроса в SQL Server-е. По какой-то причине именно во вложенном запросе условия упорядочивания накладываются только на Ссылку, а дата остается по ВОЗР.
Продублирую письмо:
анализ сортировки документов показал, что проблемы с сортировкой будут при использовании сортировки по УБЫВ для МоментаВремени и именно во вложенном запросе:
1. При сортировке по МоментуВремени
1.1. В 1С:
ВЫБРАТЬ
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Ссылка В
(ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
УПОРЯДОЧИТЬ ПО
ПоступлениеТоваров.МоментВремени УБЫВ)
1.2. В SQL Server:
SELECT
T1._IDRRef
FROM _Document16 T1 WITH(NOLOCK)
WHERE T1._IDRRef IN
(SELECT TOP 1
T2._IDRRef AS Q_001_F_000RRef
FROM _Document16 T2 WITH(NOLOCK)
ORDER BY T2._Date_Time, T2._IDRRef DESC)
2. При сортировке по Дата+Время
2.1 В 1С:
ВЫБРАТЬ
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Ссылка В
(ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
УПОРЯДОЧИТЬ ПО
ПоступлениеТоваров.Дата УБЫВ,
ПоступлениеТоваров.Ссылка УБЫВ)
2.2. В SQL Server
SELECT
T1._IDRRef
FROM _Document16 T1 WITH(NOLOCK)
WHERE T1._IDRRef IN
(SELECT TOP 1
T2._IDRRef AS Q_001_F_000RRef
FROM _Document16 T2 WITH(NOLOCK)
ORDER BY T2._Date_Time DESC, (T2._IDRRef) DESC)
Обратите внимание на сортировку в п 1.2.:
ORDER BY T2._Date_Time, T2._IDRRef DESC – получается что по дате нет сортировки по убыванию отсюда и проблемы…. А именно сортировка по убыванию и использовалась в обучающем примере
Что самое интересное для прямого запроса все нормально:
SELECT
T1._IDRRef,
T1._Date_Time,
T1._IDRRef
FROM _Document16 T1 WITH(NOLOCK)
ORDER BY (T1._Date_Time) DESC, (T1._IDRRef) DESC – интерпретация запроса с сортировкой по Моменту
SELECT
T1._IDRRef,
T1._Date_Time
FROM _Document16 T1 WITH(NOLOCK)
ORDER BY (T1._Date_Time) DESC, (T1._IDRRef) DESC – интерпретация запроса с сортировкой по Дата+Время
ИТОГО: использовать сортировку по УБЫВ МоментВремени во вложенных запросах нельзя…. Во всех остальных случая вроде работает. Но как я понимаю при таком подходе нет гарантии, что так будет всегда…
Отличный анализ, Сергей.
Полагаю это ошибка платформы, тем не менее о таких подводных камнях нужно знать. Спасибо, Сергей.
ну почему сразу вопросов мало, например, вот такой: В табличную часть добавляю новую строку и ввожу какие-то значения, по клавише Enter переходим к другой колонке и т.д. Если добавим вторую строку, то всё аналогично… а вот если вернемся к предыдущей строке и начнем редактировать, то по клавише Enter уже не сможем перейти к следующей колонке… это можно как-нибудь исправить? :) Клавиша Tab не годится :)
Красивого варианта решения пока не нашел.
Какие есть варианты.
1. В обработчик ПриИзменении каждого реквизита таблицы формы вставить функцию, содержащую код:
ЭлементыТаблицы = ТекущийЭлемент.ПодчиненныеЭлементы;
ТекПоле = ЭлементыТаблицы.Найти(ТекущийЭлемент.ТекущийЭлемент.Имя);
Индекс = ЭлементыТаблицы.Индекс(ТекПоле);
Если ИндексНеопределено И Индекс<ЭлементыТаблицы.Количество() Тогда
ТекущийЭлемент.ТекущийЭлемент = ЭлементыТаблицы[Индекс+1];
КонецЕсли;
Но система не входит в режим редактирования. Не помогает даже свойство Режим редактирования – Непосредственно.
2. Создать сообщение пользователю и привязать его к следующему полю таблицы.
Будет выглядеть криво, но зато будет поле в режиме редактирования.
Спасибо скоромное. Кучу времени потерял пытаясь объединить несколько форматированых документов(благо не мало нового узнал пока разбирался, так что не все время в ведро). Еще раз спасибо за решение.
Всегда рады помочь :)