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

Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

 

15

См. также

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

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

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

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

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


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

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

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

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

Показать


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

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

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

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


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


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

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

ОБЪЕДИНИТЬ

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

Показать
Оставьте свое сообщение