Добрый день, коллеги.

Управляемое приложение, толстый клиент, платформа 8.3.14.1854

Пытаюсь открыть конструктор СКД

```1c
    &НаКлиенте
    Процедура ОткрытьСКД(Команда)

    #Если ТолстыйКлиентУправляемоеПриложение Тогда

    СтандартнаяОбработка = Ложь;

    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    Схема = ПолучитьТекущуюСхему(Запись.ИмяСхемы);

    Если Схема <> Неопределено Тогда
    Конструктор.УстановитьСхему(Схема);
    КонецЕсли;

    Конструктор.Редактировать(ЭтаФорма);

    #Иначе

    ПоказатьПредупреждение(,(НСтр("ru='Для того чтобы редактировать схему компоновки, необходимо запустить приложение в режиме толстого клиента.'")));

    #КонецЕсли

    КонецПроцедуры
```

и получаю по лицу:

Для того чтобы редактировать схему компоновки, необходимо запустить приложение в режиме толстого клиента

Что я делаю не так?! Запускаю толстый клиент из конфигуратора Отладка -> Начало отладки -> Толстый клиент (не стал пробовать добавлением параметра запуска).
Притом этот баг то воспроизводится, то нет! Раза с 10го эта инструкция препроцессора ТолстыйКлиентУправляемоеПриложение заработает, но очень нестабильно все. Либо я дурак, либо лыжи не едут.
---
Норм работает...

```1c
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    #Если Сервер Тогда
    Сообщить("Сервер");
    #ИначеЕсли ВебКлиент Тогда
    Сообщить("ВебКлиент");
    #ИначеЕсли ТонкийКлиент Тогда
    Сообщить("ТонкийКлиент");
    #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
    Сообщить("ТолстыйКлиентОбычноеПриложение");
    #ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда
    Сообщить("ТолстыйКлиентУправляемоеПриложение");
    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    Конструктор.Редактировать(ЭтотОбъект); // Открывается...
    #Иначе
    Сообщить("??");
    #КонецЕсли

    КонецПроцедуры
```

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

```1c
    &НаСервереБезКонтекста
    Функция ЭтоТолстыйКлиент()

    #Если ТолстыйКлиентУправляемоеПриложение Тогда
    Возврат Истина;
    #Иначе
    Возврат Ложь;
    #КонецЕсли

    КонецФункции

    &НаКлиенте
    Процедура ОткрытьСКД(Команда)

    Если ЭтоТолстыйКлиент() Тогда

    СтандартнаяОбработка = Ложь;

    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    Схема = ПолучитьТекущуюСхему(Запись.ИмяСхемы);

    Если Схема <> Неопределено Тогда
    Конструктор.УстановитьСхему(Схема);
    КонецЕсли;

    Конструктор.Редактировать(ЭтаФорма);

    Иначе

    ПоказатьПредупреждение(,(НСтр("ru='Для того чтобы редактировать схему компоновки, необходимо запустить приложение в режиме толстого клиента.'")));

    КонецЕсли

    КонецПроцедуры
```
---
Короче это какой-то глюк определения контекста. Похоже баг платформы?!
---
Столкнулся с таким же глюком платформы =(
---
В багрепортах ничего? Создай
---
Может попробовать

```1c
    #Если НЕ ТонкийКлиент Тогда
```

?
---
#Если НЕ ТонкийКлиент Тогда
В таком случае будет ошибка инициализации КонструкторСхемыКомпоновкиДанных
---
Ошибка - будет (предположительно) или возникает?
По логике, вроде должно работать.
Исследуй подробно свой глюк - пропиши все директивы типа

```1c
    #Если ... Тогда
    Сообщить("Директива такая-то");
    #ИначеЕсли
    #Иначе
    #КонецЕсли
```
---
Возникает. А вы можете у себя проверить?
---
Попробую попробовать... Позже только.
Еще, как вариант, - написать две одноименные процедуры для разных клиентов. А вызывающий код сделать без директив.
---
директива компиляции одна и та же. Да и разделять тут нечего, конструктор схемы только в толстом работает.
---
Норм работает...

```1c
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    #Если Сервер Тогда
    Сообщить("Сервер");
    #ИначеЕсли ВебКлиент Тогда
    Сообщить("ВебКлиент");
    #ИначеЕсли ТонкийКлиент Тогда
    Сообщить("ТонкийКлиент");
    #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
    Сообщить("ТолстыйКлиентОбычноеПриложение");
    #ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда
    Сообщить("ТолстыйКлиентУправляемоеПриложение");
    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    Конструктор.Редактировать(ЭтотОбъект); // Открывается...
    #Иначе
    Сообщить("??");
    #КонецЕсли

    КонецПроцедуры
```

Кеш почисти чтоль...
---
Странно, почему я сразу побежал тему на ИС пилить, а не почистил кэш... это же одинэс... мдааа...
В общем - чистка кеша помогла. Пардон.
---
чистка кеша помогла!
---
- спасибо что ткнул опять носом в неочевидное решение многих непонятных проблемм... Да, очистка кэша помогла
---
В последней версии ДО КОРП есть похожая функция редактирования схемы:

```1c
    &НаКлиенте
    Процедура РедактироватьСхему(Команда)
    #Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
    СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(НастройкиОтчета.АдресСхемы);

    Если СхемаКомпоновкиДанных.НастройкиПоУмолчанию.ДополнительныеСвойства.Свойство("СхемаКомпоновкиДанных") Тогда
    СхемаКомпоновкиДанных.НастройкиПоУмолчанию.ДополнительныеСвойства.СхемаКомпоновкиДанных = Неопределено;
    КонецЕсли;

    Конструктор = Новый КонструкторСхемыКомпоновкиДанных(СхемаКомпоновкиДанных);
    Конструктор.Редактировать(ЭтотОбъект);
    #Иначе
    ПоказатьПредупреждение(, (НСтр("ru='Для того чтобы редактировать схему компоновки, необходимо запустить приложение в режиме толстого клиента.'")));
    #КонецЕсли
    КонецПроцедуры
```

Как видно - это должно работать. Но у меня какой-то глюк.
---
Уберите Таб в начале строки. Директивы должны начинаться без символов перед #
---
Вздор
---
Проверить стоит. У меня сработал именно этот вариант (8.3.22.1704)
---
(19) Да, бред
---
Та же история, как в стартовом сообщении.
Помогает чистка кэша. Можно просто удалить базу из списка и добавить заново.