Перевод конфигурации на 8.3.13

06.11.18

Разработка - СКД

Опыт решения проблем. 1. Проблема с СКД преобразованием запроса при отключении режима совместимости:

СКД при генерации Запроса МакетаКомпоновщика добавляет в запросы дополнительные условия:

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)

после преобразования превращается в

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
ГДЕ
    NULL = &П
    И NULL = &П2

исходный запрос:

 

ВЫБРАТЬ
    ЗаявкиОпт.Заявка КАК Заявка,
    ЗаявкиОпт.Номенклатура КАК Номенклатура,
    ЗаявкиОпт.КоличествоШтЗаказОстаток КАК ОстатокЗаявки,
    ЗаявкиОпт.Спецификация КАК Спецификация,
    ЗаявкиОпт.Размер КАК Размер,
    ЗаявкиОпт.КатегорияКамней КАК КатегорияКамней
ПОМЕСТИТЬ _ЗаявкиОпт_
ИЗ
    РегистрНакопления.Заявки.Остатки(
            ,
            Номенклатура = &Номенклатура
                И Размер = &Размер
                И КатегорияКамней = &КатегорияКамней) КАК ЗаявкиОпт
ГДЕ
    ЗаявкиОпт.КоличествоШтЗаказОстаток > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    _ОстаткиЗаявки_.Спецификация КАК Спецификация
ПОМЕСТИТЬ _СписокСпецификаций_
ИЗ
    _ЗаявкиОпт_ КАК _ОстаткиЗаявки_
ГДЕ
    _ОстаткиЗаявки_.Спецификация <> ЗНАЧЕНИЕ(справочник.Спецификации.ПустаяССылка)

СГРУППИРОВАТЬ ПО
    _ОстаткиЗаявки_.Спецификация
;
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СпецификацииСоставКамней.Ссылка КАК Ссылка
ПОМЕСТИТЬ _ОбрабатываемыеСпецификации_
ИЗ
    _СписокСпецификаций_ КАК СписокСпецификаций
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Спецификации.СоставКамней КАК СпецификацииСоставКамней
        ПО (СпецификацииСоставКамней.Ссылка = СписокСпецификаций.Спецификация)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Спецификации.Ссылка КАК Спецификация
ПОМЕСТИТЬ _КатегорииКамней_
ИЗ
    _ОбрабатываемыеСпецификации_ КАК Спецификации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаявкиОпт.Заявка КАК Заявка,
    ЗаявкиОпт.Номенклатура КАК Номенклатура,
    ЗаявкиОпт.ОстатокЗаявки КАК ОстатокЗаявки,
    ЗаявкиОпт.Размер КАК Размер,
    ЗаявкиОпт.КатегорияКамней КАК КатегорияКамней
ИЗ
    _ЗаявкиОпт_ КАК ЗаявкиОпт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ _КатегорииКамней_ КАК КатегорииКамней
        ПО (КатегорииКамней.Спецификация = ЗаявкиОпт.Спецификация)

Запрос после преобразования СКД (в отчете устанавливались несколько отборов!!):

ВЫБРАТЬ
    ЗаявкиОпт.Заявка КАК Заявка,
    ЗаявкиОпт.Номенклатура КАК Номенклатура,
    ЗаявкиОпт.КоличествоШтЗаказОстаток КАК ОстатокЗаявки,
    ЗаявкиОпт.Спецификация КАК Спецификация,
    ЗаявкиОпт.Размер КАК Размер,
    ЗаявкиОпт.КатегорияКамней КАК КатегорияКамней
ПОМЕСТИТЬ _ЗаявкиОпт_
ИЗ
    РегистрНакопления.Заявки.Остатки(
            ,
            ((Номенклатура = &Номенклатура
                И Размер = &Размер
                И КатегорияКамней = &КатегорияКамней) И Номенклатура.НоменклатурнаяГруппа = &П) И КонтрагентСклад = &П2) КАК ЗаявкиОпт
ГДЕ
    ЗаявкиОпт.КоличествоШтЗаказОстаток > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    _ОстаткиЗаявки_.Спецификация КАК Спецификация
ПОМЕСТИТЬ _СписокСпецификаций_
ИЗ
    _ЗаявкиОпт_ КАК _ОстаткиЗаявки_
ГДЕ
    _ОстаткиЗаявки_.Спецификация <> ЗНАЧЕНИЕ(справочник.Спецификации.ПустаяССылка)

СГРУППИРОВАТЬ ПО
    _ОстаткиЗаявки_.Спецификация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СпецификацииСоставКамней.Ссылка КАК Ссылка
ПОМЕСТИТЬ _ОбрабатываемыеСпецификации_
ИЗ
    _СписокСпецификаций_ КАК СписокСпецификаций
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Спецификации.СоставКамней КАК СпецификацииСоставКамней
        ПО (СпецификацииСоставКамней.Ссылка = СписокСпецификаций.Спецификация)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Спецификации.Ссылка КАК Спецификация
ПОМЕСТИТЬ _КатегорииКамней_
ИЗ
    _ОбрабатываемыеСпецификации_ КАК Спецификации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
ГДЕ
    NULL = &П
    И NULL = &П2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаявкиОпт.Заявка КАК Заявка,
    ЗаявкиОпт.Номенклатура КАК Номенклатура,
    ЗаявкиОпт.ОстатокЗаявки КАК ОстатокЗаявки,
    ЗаявкиОпт.Размер КАК Размер,
    ЗаявкиОпт.КатегорияКамней КАК КатегорияКамней
ИЗ
    _ЗаявкиОпт_ КАК ЗаявкиОпт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ _КатегорииКамней_ КАК КатегорииКамней
        ПО (КатегорииКамней.Спецификация = ЗаявкиОпт.Спецификация)

 

Видно что в текст запроса были добавлены условия! (выделено)

А т.к. необходимо было в результате связь по пустым значениям выводить тоже - то отчет просто перестал выдавать результат!

Найдено описание изменения в релизе:

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

В режиме совместимости с версией 8.3.12 поведение не изменилось.

При добавлении отбора в запрос набора данных схемы компоновки данных, содержащего объединения, отбор помещался только в те части объединения, в которых было доступно поле, к которому применяется отбор. Унифицировано применение отборов в системе компоновки данных между набором данных-объединение и набором данных-запрос с объединением в запросе.

Найденный вариант обхода:

ВЫБРАТЬ ПЕРВЫЕ 1
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
из _ЗаявкиОпт_

 

СКД 1С 8.3.13 РежимСовместимости

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122182    670    389    

714

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    4043    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8161    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    4658    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5807    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6703    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4521    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. json 3297 06.11.18 12:31 Сейчас в теме
Спасибо за информацию!
2. Hans 2 07.11.18 08:18 Сейчас в теме
Ты сначала описал бы проблему, а потом делал преобразования. А так не понятно от каких косяков у тебя решение.
12. serferian 26 07.11.18 13:23 Сейчас в теме
3. serferian 26 07.11.18 08:28 Сейчас в теме
Проблема в том, что СКД к запросу
ВЫБРАТЬ Константу

добавляет автоотборы по всем полям указанным в отборах настроек компоновки
соответственно этот запрос не возвращает ни одной записи, хотя как раз предполагается, что он вернет всегда одну!

Правда только если этот запрос идет в связке с ОБЪЕДИНИТЬ с другими таблицами.
Дмитрий74Чел; +1 Ответить
4. RustIG 1351 07.11.18 08:30 Сейчас в теме
(0) СКД периодически обновляют?! а кто знает, какие еще в СКД нерешенные проблемы?
7. sergathome 4 07.11.18 09:51 Сейчас в теме
(4) Специфическая работа компоновки в привилегированном режиме - проблема ? или фича ;))
5. echo77 1868 07.11.18 09:38 Сейчас в теме
(0) Галка Автозаполнение в наборе данных запрос стоит?
6. serferian 26 07.11.18 09:40 Сейчас в теме
8. vano-ekt 123 07.11.18 10:13 Сейчас в теме
13. serferian 26 07.11.18 13:59 Сейчас в теме
(8) Очень проблематично
9. echo77 1868 07.11.18 10:34 Сейчас в теме
Напишите, пожалуйста в публикации, что проблема здесь:
ВЫБРАТЬ
    Спецификации.Ссылка КАК Спецификация
ПОМЕСТИТЬ _КатегорииКамней_
ИЗ
    _ОбрабатываемыеСпецификации_ КАК Спецификации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
ГДЕ
    NULL = &П
    И NULL = &П2
Показать


Пришлось сравнивать тексты запросов, чтобы понять в чем отличия :-/
11. serferian 26 07.11.18 13:22 Сейчас в теме
10. logarifm 1117 07.11.18 11:57 Сейчас в теме
Фигня какая-то полная. Статья абсолютно не раскрыта проблемнаые места в явном виде не указаны - пока ставлю МИНУС
14. lunjio 66 07.11.18 18:04 Сейчас в теме
Правильнее было бы указать что такой запрос:

ВЫБРАТЬ
    Спецификации.Ссылка КАК Спецификация
ПОМЕСТИТЬ _КатегорииКамней_
ИЗ
    _ОбрабатываемыеСпецификации_ КАК Спецификации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)

Показать


преобразуется СКД в следующий запрос после наложение отбора на поле наименование:

ВЫБРАТЬ
    Спецификации.Ссылка КАК Спецификация
ПОМЕСТИТЬ _КатегорииКамней_
ИЗ
    _ОбрабатываемыеСпецификации_ КАК Спецификации
ГДЕ
	Спецификации.Наименование = &П

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
ГДЕ
	NULL = &П
Показать


после использования отборов.
Предложенный вами в конце вариант отбора это что ? В Итоговом запросе добавлять объединение ? А пробовать не использовать автозаполнение и явное указание через {ГДЕ} пробовали и проверяли результат?
echo77; Дмитрий74Чел; +2 Ответить
15. serferian 26 08.11.18 08:16 Сейчас в теме
(14)
ВЫБРАТЬ Спецификации.Ссылка КАК Спецификация ПОМЕСТИТЬ _КатегорииКамней_ ИЗ _ОбрабатываемыеСпецификации_ КАК Спецификации


Добавлял {ГДЕ}
Пробовал двойное вложение подзапросов
Пробовал прогонять через 2 временные таблицы
Галку Автозаполнение снять не могу - запрос СКД подсовывается программно, т.к. используется в нескольких местах, да и собственно сабж не о том)
16. serferian 26 09.11.18 10:12 Сейчас в теме
Вот более простой запрос для понимания:
в ТоварыПолученные &П3 встал верно,
а в РеализованныеТовары автоматом добавился отбор по организации (поля организация в регистре нет)

ВЫБРАТЬ
    ТоварыПолученныеОстатки.СерияНоменклатуры КАК СерияНоменклатуры
ПОМЕСТИТЬ _ТоварыПолученныеОстатки_
ИЗ
    РегистрНакопления.ТоварыПолученные.Остатки(&П, (((Контрагент В (&Контрагент))) И Организация = &П3) И СерияНоменклатуры = &П4) КАК ТоварыПолученныеОстатки

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    РеализованныеТоварыОстатки.СерияНоменклатуры
ИЗ
    РегистрНакопления.РеализованныеТовары.Остатки(&П, ((ДоговорКонтрагента.Владелец В (&Контрагент))) И СерияНоменклатуры = &П4) КАК РеализованныеТоварыОстатки
ГДЕ
    NULL = &П3

Показать
18. echo77 1868 09.07.19 10:57 Сейчас в теме
(16) Есть мысли как это побороть?
23. serferian 26 06.09.19 17:15 Сейчас в теме
(18) в данном случае было решено через добавление в компоновки поля с типом Организация, т.е.
{ДоговорКонтрагента.Организация.* КАК Организация}
17. echo77 1868 02.07.19 17:20 Сейчас в теме
(0) В итоге как решается проблема я так и не понял...
19. echo77 1868 14.07.19 11:30 Сейчас в теме
(0) 1С это поправило в следующих версиях платформы
При добавлении отбора в запрос набора данных схемы компоновки данных, содержащего объединения, отбор обязательно добавляется во все части объединения, если у набора данных включено автоматическое заполнение доступных полей или поле, к которому применяется отбор, получается через точку от поля, доступного для отбора.
Кроме того, если группа элементов отбора содержала поле, которое было недоступно в одном из объединений, и другое поле, которое было доступно и при этом в другой части объединения все поля были доступными, то такой отбор будет применен и в той части, в которой он был недоступен, с заменой недоступных полей на NULL.

Если в отчете или динамическом списке используется запрос, содержащий объединения и нужно, чтобы отбор на некоторое поле помещался только в определенные части объединения, то рекомендуется отключить для набора данных автоматическое заполнение доступных полей и добавить требуемое поле только в нужные части объединения.

В режиме совместимости с версией 8.3.13 поведение не изменилось.


Источник: https://dl04.1c.ru/content/Platform/8_3_14_1779/1cv8upd_8_3_14_1779.htm#c2e40243-2915-11e9-a3f7-0050569f678a
20. kabanoff 49 01.08.19 15:30 Сейчас в теме
У меня вот точно такая же проблема. Большой отчет в 1С:Предприятие 8.3 (8.3.13.1644) стал выдавать некорректные данные.
Чтобы это воспроизвести, напишем простой запрос в СКД, галку "Автозаполнение" отключим:

ВЫБРАТЬ
	Пользователи.Ссылка КАК Пользователь
ПОМЕСТИТЬ Пользователи
ИЗ
	Справочник.Пользователи КАК Пользователи
{ГДЕ
	Пользователи.Ссылка.* КАК Пользователь}
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	АктПриемки.Ссылка КАК Документ
{ВЫБРАТЬ
	Документ.*}
ИЗ
	Документ.АктПриемки КАК АктПриемки
ГДЕ
	АктПриемки.Дата МЕЖДУ &Дата1 И &Дата2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ПриходныйОрдерНаТовары.Ссылка
ИЗ
	Пользователи КАК Пользователи
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
		ПО Пользователи.Пользователь = ПриходныйОрдерНаТовары.Ответственный
ГДЕ
	ПриходныйОрдерНаТовары.Дата МЕЖДУ &Дата1 И &Дата2
Показать


При использовании отбора по полю "Пользователь" запрос становится вот таким, тем самым выкидывая из его результата документы "Акт приемки":
ВЫБРАТЬ
	Пользователи.Ссылка КАК Пользователь
ПОМЕСТИТЬ Пользователи
ИЗ
	Справочник.Пользователи КАК Пользователи
ГДЕ
	Пользователи.Ссылка = &П
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	АктПриемки.Ссылка КАК Документ,
	АктПриемки.Представление КАК ДокументПредставление
ИЗ
	Документ.АктПриемки КАК АктПриемки
ГДЕ
	АктПриемки.Дата МЕЖДУ &Дата1 И &Дата2
	И NULL = &П

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ПриходныйОрдерНаТовары.Ссылка,
	ПриходныйОрдерНаТовары.Представление
ИЗ
	Пользователи КАК Пользователи
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
		ПО Пользователи.Пользователь = ПриходныйОрдерНаТовары.Ответственный
ГДЕ
	ПриходныйОрдерНаТовары.Дата МЕЖДУ &Дата1 И &Дата2
Показать
21. GonziK_KIV 06.09.19 10:00 Сейчас в теме
Посмотрел, проанализировал.
Для решения конкретно этой проблемы вижу ровно два варианта (если не переписывать, конечно, сам отчет скд):

1. Поставить режим совместимости с 8.3.12
2. Переход на 8.3.15 со снятием автозаполнения и использованием {} в запросе СКД

В версии 8.3.13 способов по обходу проблемы не нашел.

Ну неужели нет адекватного способа для решения проблемы? Ну не могли разработчики так это оставить. Не верю).

А то полундра какая-то!
22. serferian 26 06.09.19 17:00 Сейчас в теме
Основная мысль - добавить во вторую таблицу 1 строку из таблицы, на которую наложились нормальные условия. Например:

ВЫБРАТЬ
    Пользователи.Ссылка КАК Пользователь
ПОМЕСТИТЬ Пользователи
ИЗ
    Справочник.Пользователи КАК Пользователи
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    АктПриемки.Ссылка КАК Документ,
    АктПриемки.Представление КАК ДокументПредставление
ИЗ
    Документ.АктПриемки КАК АктПриемки, (Выбрать первые 1 Пользователь из Пользователи)
ГДЕ
    АктПриемки.Дата МЕЖДУ &Дата1 И &Дата2
Показать
Franchiser; GonziK_KIV; +2 Ответить
24. GonziK_KIV 06.09.19 17:57 Сейчас в теме
(22)
Лучше так:
ВЫБРАТЬ
    Пользователи.Ссылка КАК Пользователь
ПОМЕСТИТЬ Пользователи
ИЗ
    Справочник.Пользователи КАК Пользователи
;

////////////////////////////////////////////////////////////­­­////////////////////
ВЫБРАТЬ
    АктПриемки.Ссылка КАК Документ,
    АктПриемки.Представление КАК ДокументПредставление
ИЗ
    Документ.АктПриемки КАК АктПриемки Левое Соединение (Выбрать первые 1 Пользователь из Пользователи) как ВложеныйЗапрос По (Истина)
ГДЕ
    АктПриемки.Дата МЕЖДУ &Дата1 И &Дата2
Показать


Т.к. если в искусственно созданном подзапросе не будет данных, то и итогового результата не будет
25. serferian 26 07.09.19 11:48 Сейчас в теме
(24) Если написать так - проблема будет не решена ) Также будет добавлено условие И NULL = &П!
GonziK_KIV; +1 Ответить
26. GonziK_KIV 09.09.19 09:03 Сейчас в теме
(25)Верно! Беру свои слова назад)
27. Serj1C 483 19.02.20 14:15 Сейчас в теме
Странно, что ошибка даже в 8.3.16 имеет место быть!
28. Serj1C 483 20.02.20 07:26 Сейчас в теме
Делюсь тем, как пришлось сделать мне.
Поскольку в реальной жизни никто не будет сравнивать NULL на равенство с параметром, то я из МакетаКомпоновки перед исполнением вычищаю все эти условия. Примерно так:

УстранитьОшибкуЛишнихОтборовСКД(МакетКомпоновки.НаборыДанных[0].Запрос, МакетКомпоновки.ЗначенияПараметров);


Процедура УстранитьОшибкуЛишнихОтборовСКД(ТекстЗапросаСКД, ЗначенияПараметров) Экспорт
	// Суть: Заменить все вхождения "NULL = &П..." на ИСТИНА
	
	НовыйТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "NULL = &П", "ИСТИНА");
	
	Для Каждого Парам Из ЗначенияПараметров Цикл
		Если Лев(Парам.Имя, 1)="П" и ЗначениеЗаполнено(Сред(Парам.Имя, 2)) Тогда
			Если СтрНайти(НовыйТекстЗапросаСКД, "ИСТИНА"+Сред(Парам.Имя, 2)) Тогда
				НовыйТекстЗапросаСКД = СтрЗаменить(НовыйТекстЗапросаСКД, "ИСТИНА"+Сред(Парам.Имя, 2), "ИСТИНА");
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ТекстЗапросаСКД = НовыйТекстЗапросаСКД;
КонецПроцедуры
Показать
29. Franchiser 47 13.03.20 12:40 Сейчас в теме
Проще заменить на НЕ NULL = &П
30. Denic_01 46 30.11.20 14:38 Сейчас в теме
31. Denic_01 46 01.12.20 11:48 Сейчас в теме
(29)
Проще заменить на НЕ NULL = &П


много было убито времени, прежде чем снизошло понимание, что хоть НЕ NULL = &П, хоть NULL = &П вернет тупо NULL а не Ложь или Истину )
поэтому решил NULL поменять на какую нибудь бессмысленную строку
как то так
СтрЗаменить(ИсходныйЗапрос, "NULL = &П", "НЕ ""+_+"" = &П")
32. user1464234 01.12.20 12:30 Сейчас в теме
(31) а как правильно писать? Isnull(&п) ?
И дальше что?
Клиент в &п ?
33. Denic_01 46 02.12.20 13:16 Сейчас в теме
(32)
не понял вопрос
вся идея в том, что бы заменить на нечто, что будет работать не зависимо от того что стоит после после "П", а там могут быть либо цифры, либо цифры +")"
и еще проблема, что разные условия установленные пользователем генерят разные "грабли" как то так:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL = &П", "НЕ ""+_+"" = &П"); // для условия "="
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL В (&П", "НЕ ""+_+"" В (&П"); // для "в списке"
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL В ИЕРАРХИИ (&П", "НЕ ""+_+"" В (&П"); // для "В группе", "В группе из списка"
34. user1464234 02.12.20 13:20 Сейчас в теме
(33) я полагала, что проблема в том, что код не виден через конструктор запросов. Т.е. как в конструкторе запроса написать проверку на вхождение в параметр, если параметр не передали.
И не писать эту проверку кодом вне запроса
35. Denic_01 46 03.12.20 09:32 Сейчас в теме
(34)
через изначальный конструктор видно ничего и не будет
придется переопределять формирование отчета программно
в целом это выглядит так:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, 
						КомпоновщикНастроек.ПолучитьНастройки(),,,
						Тип("ГенераторМакетаКомпоновкиДанных"));

	ТекстЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос;
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL = &П", "НЕ ""+_+"" = &П");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL В (&П", "НЕ ""+_+"" В (&П");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL В ИЕРАРХИИ (&П", "НЕ ""+_+"" В (&П");
	
	МакетКомпоновки.НаборыДанных[0].Запрос = ТекстЗапроса;
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);	
		
КонецПроцедуры
Показать


КомпоновщикМакета.Выполнить преобразует запрос к тому что будет выполнен в итоге, на этом этапе и возникают автоматические условия, которые можно "выпилить".
user1464234; +1 Ответить
36. serferian 26 03.12.20 13:49 Сейчас в теме
(35) Ребят не надо извращаться.
Это не баг ) это фича новой платформы.

надо просто в СхемеКомпоновки построить правильный запрос.

В некоторых случаях обходится через добавление конструкций вида: {Поле.* КАК ИмяПоля}
37. Denic_01 46 03.12.20 16:40 Сейчас в теме
(36)

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

Раз это фича - то какие же мы как разработчики имеем плюсы от полуслучайного разбрасывания по запросу, в принципе никогда не выполнимых, условий ?
38. serferian 26 03.12.20 17:27 Сейчас в теме
(37) если только в этом дело, то да... лучше навтыкать подмену строк в запросах... тоже вроде "рефакторинг", но на это время есть )
39. Denic_01 46 03.12.20 17:50 Сейчас в теме
(38)


Ну... если для вас воткнуть копипастом процедуру из общего модуля в метод ПриКомпоновкеРезультата и разбираться в логике/переписывать сложный отчет это одно и тоже - то снимаю шляпу. При том не факт, что будет результат из всех этих "изысканий". Но это лирика.

Главное, что все таки хотелось бы услышать в чем "Фича" - какие ПЛЮСЫ мы со всего этого имеем ???
Оставьте свое сообщение