Перевод конфигурации на 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 РежимСовместимости

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    253367    1402    421    

1152

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6161    323    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18160    ovetgana    112    

110

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    10589    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10121    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16291    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13934    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10671    AlexeyPROSTO_1C    1    

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

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

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

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

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


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

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

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

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

Показать


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

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

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

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


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


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

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

ОБЪЕДИНИТЬ

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

Показать
18. echo77 1938 09.07.19 10:57 Сейчас в теме
(16) Есть мысли как это побороть?
23. serferian 28 06.09.19 17:15 Сейчас в теме
(18) в данном случае было решено через добавление в компоновки поля с типом Организация, т.е.
{ДоговорКонтрагента.Организация.* КАК Организация}
17. echo77 1938 02.07.19 17:20 Сейчас в теме
(0) В итоге как решается проблема я так и не понял...
19. echo77 1938 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 50 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 28 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 28 07.09.19 11:48 Сейчас в теме
(24) Если написать так - проблема будет не решена ) Также будет добавлено условие И NULL = &П!
GonziK_KIV; +1 Ответить
26. GonziK_KIV 09.09.19 09:03 Сейчас в теме
(25)Верно! Беру свои слова назад)
27. Serj1C 484 19.02.20 14:15 Сейчас в теме
Странно, что ошибка даже в 8.3.16 имеет место быть!
28. Serj1C 484 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 55 30.11.20 14:38 Сейчас в теме
31. Denic_01 55 01.12.20 11:48 Сейчас в теме
(29)
Проще заменить на НЕ NULL = &П


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

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

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

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


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

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

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

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

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


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

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