Имя: Пароль:
1C
1С v8
Создать флажок программно на обычной форме
,
0 Mikhail Volkov
 
08.12.21
13:56
Есть общая форма Отчет, на которой мне понадобилось добавить флажок. Добавил его, прописал его видимость для нужных мне случаев. При этом, даже когда его видимость Ложь, но некоторых случаях форма искажается: появляются полосы прокрутки... Поэтому решил флажок добавлять программно, в процедуре ПриОткрытии() добавил:

    Если ОтчетОбъект.Метаданные().Реквизиты.Найти("ВыводитьИнформациюОбОплате") <> Неопределено Тогда
        // Добавим флаг ВыводитьИнформациюОбОплате на форму
        ФлагВыводитьИнформациюОбОплате = ЭлементыФормы.Добавить(Тип("Флажок"), "ВыводитьИнформациюОбОплате", Истина, ЭлементыФормы.ПанельФильтра);
        ФлагВыводитьИнформациюОбОплате.Лево            = 6;
        ФлагВыводитьИнформациюОбОплате.Верх            = 77;
        ФлагВыводитьИнформациюОбОплате.Ширина        = 250;
        ФлагВыводитьИнформациюОбОплате.Высота        = 15;
        ФлагВыводитьИнформациюОбОплате.Заголовок    = "Выводить информацию об оплате документа";
        ФлагВыводитьИнформациюОбОплате.Значение        = ОтчетОбъект.ВыводитьИнформациюОбОплате;
        ФлагВыводитьИнформациюОбОплате.ПриИзменении    = ВыводитьИнформациюОбОплатеПриИзменении(Элемент);
    КонецЕсли;    //-МВ
и добавил (оставил от аппаратного добавления флажка):
// Изменение флага "Выводить информацию об оплате документа"
//+МВ 08.12.2021
Процедура ВыводитьИнформациюОбОплатеПриИзменении(Элемент)
    Если ОтчетОбъект.Метаданные().Реквизиты.Найти("ВыводитьИнформациюОбОплате") <> Неопределено Тогда
        ОтчетОбъект.ВыводитьИнформациюОбОплате = ВыводитьИнформациюОбОплате;
    КонецЕсли;
КонецПроцедуры

Жалуется: Обращение к процедуре как к функции (ВыводитьИнформациюОбОплатеПриИзменении) м Переменная не определена (ВыводитьИнформациюОбОплате)
Наверное надо добавлять реквизит ВыводитьИнформациюОбОплате в этих случаях (когда нужен этот флаг), но как ля ОФ? Для УФ нашел УФ. Создать флажок программно
И что писать: ФлагВыводитьИнформациюОбОплате.ПриИзменении?
1 Kassern
 
08.12.21
14:00
(0) вроде же все по-русски "Обращение к процедуре как к функции" и "Переменная не определена". Это же простейшие ошибки. Ну нельзя писать А=ПолучитьА(); Где ПолучитьА - процедура. Нельзя писать А=1+х, и не определить для 1ски х.
2 lodger
 
08.12.21
14:01
вот эта строчка плохая
ФлагВыводитьИнформациюОбОплате.ПриИзменении    = ВыводитьИнформациюОбОплатеПриИзменении(Элемент);

оторви и выбрось. обработчики по другому назначаются.
3 Mikhail Volkov
 
08.12.21
14:05
(1) Да, нельзя. А как нужно?
(2) Как?
4 Kassern
 
08.12.21
14:07
5 Kassern
 
08.12.21
14:08
если коротко, то как-то так: Элемент.УстановитьДействие("ПриИзменении", Новый Действие("ВыполнитьДействиеПриИзмененииДанных"));
6 Mikhail Volkov
 
08.12.21
14:37
(5) Вместо: ФлагВыводитьИнформациюОбОплате.ПриИзменении    = ВыводитьИнформациюОбОплатеПриИзменении(Элемент); писать: ФлагВыводитьИнформациюОбОплате.УстановитьДействие("ПриИзменении", Новый Действие("ВыводитьИнформациюОбОплатеПриИзменении"));? Что-то зависло на сохранении конфигурации?
7 Kassern
 
08.12.21
14:39
(6) ПолеФормы (FormField)
УстановитьДействие (SetAction)
Синтаксис:
УстановитьДействие(<ИмяСобытия>, <Действие>)
Параметры:
<ИмяСобытия> (обязательный)
Тип: Строка.
Имя события, для которого устанавливается новое действие.
<Действие> (обязательный)
Тип: Строка.
Указывается имя обработчика.
Описание:
Устанавливает обработчик события.
8 Mikhail Volkov
 
08.12.21
16:04
Странно: ОШИБКА при синхронизации с сервером защиты
Cannot create file "C:\ProgramData\Protect\LocalProtect\config.xml".
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом
У меня Альфа-Авто...
(7) Спс, как в (6) заработало! В обработчике ПриИзменении написал: Сообщить("ВыводитьИнформациюОбОплате: " + ВыводитьИнформациюОбОплате); выводит всегда: "ВыводитьИнформациюОбОплате: Нет" независимо от состояния флага!?
Реквизит ВыводитьИнформациюОбОплате (Булево) вручную добавил в конфигураторе.
9 lodger
 
08.12.21
16:17
(8) добавь
ФлагВыводитьИнформациюОбОплате.ПутьКДанным = "ВыводитьИнформациюОбОплате"
10 Mikhail Volkov
 
08.12.21
16:19
Добавил еще: ФлагВыводитьИнформациюОбОплате.Данные = ВыводитьИнформациюОбОплате; Пишет: Ошибка при установке значения атрибута контекста (Данные) по причине: Неправильный путь к данным.
(9) В кавычках надо?
11 lodger
 
08.12.21
16:22
(10) ну ты сам сперва попробуй. окошко конфигуратора в другой стороне.
12 УдавВПопугаях
 
08.12.21
16:22
что за ... зачем программно добавлять то, мышкой нельзя? если форма плывет, значит привязки криво стоят. потом, убрать видимость недостаточно, вернее даже не нужно, нужно доступность ставить или и то и другое, в зависимотси от предпочтений, но возможность ставить/убирать флаг дает именно доступность, а не видимость
13 УдавВПопугаях
 
08.12.21
16:24
фокус с нажатием на невидимые реквизиты уже давно с бородой
14 УдавВПопугаях
 
08.12.21
16:26
добавлять реквизиты кодом из за того что появляются полосы прокрутки.. ну блин это треш, три раза (0) перечитал
15 Mikhail Volkov
 
08.12.21
16:49
(9) Поле объекта не обнаружено (ПутьКДанным). А с Данные, и с кавычками заработало! Вот так:

    Если ОтчетОбъект.Метаданные().Реквизиты.Найти("ВыводитьИнформациюОбОплате") <> Неопределено Тогда
        // Добавим флаг ВыводитьИнформациюОбОплате на форму
        ФлагВыводитьИнформациюОбОплате = ЭлементыФормы.Добавить(Тип("Флажок"), "ВыводитьИнформациюОбОплате", Истина, ЭлементыФормы.ПанельФильтра);
        ФлагВыводитьИнформациюОбОплате.Лево        = 6;
        ФлагВыводитьИнформациюОбОплате.Верх        = 77;
        ФлагВыводитьИнформациюОбОплате.Ширина        = 250;
        ФлагВыводитьИнформациюОбОплате.Высота        = 15;
        ФлагВыводитьИнформациюОбОплате.Заголовок    = "Выводить информацию об оплате документа";
        ФлагВыводитьИнформациюОбОплате.Данные        = "ВыводитьИнформациюОбОплате";
        ФлагВыводитьИнформациюОбОплате.Значение        = ОтчетОбъект.ВыводитьИнформациюОбОплате;
        ФлагВыводитьИнформациюОбОплате.УстановитьДействие("ПриИзменении", Новый Действие("ВыводитьИнформациюОбОплатеПриИзменении"));
    КонецЕсли;    //-МВ

Единственное смущает, что Реквизит ВыводитьИнформациюОбОплате (Булево) вручную добавил в конфигураторе. Надо бы программно добавлять, когда этот флаг нужен?
16 УдавВПопугаях
 
08.12.21
16:57
Микхаил как всегда временно переориентировался к вопросам прога, а не админа, объяснить, зачем он по конкретной задаче делает именно так, как всегда не хочет.
по добавлению кнопок на форму в гугле тысячи статей и веток форумов
что с вами не так, Микхаил...
17 Kassern
 
08.12.21
17:16
(15) это потому, что вы смотрите мануалы для управляемых форм, там как раз используется "ПутьКДанным"
18 Mikhail Volkov
 
08.12.21
18:01
(12) Доступность - не помогает, когда флаг не нужен форма все равно становится искаженной: появляются полосы прокрутки.
(16) Раньше добавлял элементы на формы, не было проблем, уже не помню...
(17) Да, в Интернете все статьи по УФ, быстрее здесь спросить.
(15)+ Закрыл, открыл конфигуратор, добавленный вручную (не программно) реквизит формы не исчез! Вроде не мешает, когда флаг не нужен, форма не искажается.
19 Mikhail Volkov
 
10.12.21
13:44
Еще вопрос: понадобилось программно (по вопросу) запускать отчет Движения взаиморасчетов (Альфа-Авто отчет Движения взаиморасчетов для определенного Контрагента. Написал по примеру https://its.1c.ru/db/metod8dev/content/4143/hdoc

Процедура ЗапускОтчетаДвиженияВзаиморасчетов(Дата, Контрагент) Экспорт
    ДатаНачала = НачалоМесяца(Дата + 2*30*24*60*60);
    УсловияОтбора  = Новый Структура("Контрагент", Контрагент);
    ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", УсловияОтбора, Истина);
    ОткрытьФорму("Отчет.ДвиженияВзаиморасчетовСОстатками.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры    // ЗапускОтчетаДвиженияВзаиморасчетов()

Вместо отчета открывается его форма настройки без отбора по Контрагент. Так и должно? Или пример для УФ (как (17)), как правильно для обычных форм? И куда ДатаНачала всунуть? Мне отчет за 2-3 месяца нужен.
20 dubolom
 
10.12.21
13:45
(19) Отдельную тему создай
21 lodger
 
10.12.21
13:47
ОткрытьФорму это про УФ больше.
в ОФ такие трюки обычно плохо работают.
в ОФ можешь просто
НовыйОТчет = Отчет.ДвиженияВзаиморасчетовСОстатками.ПолучитьФорму();
НовыйОТчет.Контрагент = Контрагент;
НовыйОТчет.Открыть();
НовыйОТчет.Сформировать();

или что то в этом духе.
22 osa1C
 
10.12.21
14:03
(18) просто привязки элементов посмотри
23 Mikhail Volkov
 
10.12.21
14:14
(21) Ошибка: Переменная не определена (Отчет)
    НовыйОтчет = <<?>>Отчет.ДвиженияВзаиморасчетовСОстатками.ПолучитьФорму(); (Проверка: Толстый клиент (обычное приложение))
24 Kassern
 
10.12.21
14:19
(23) Если это обращение к отчетам конфигурации, то нужно "Отчеты"
25 Mikhail Volkov
 
10.12.21
14:31
(24) Спс, исправил. Теперь другая: Поле объекта не обнаружено (Контрагент)    НовыйОтчет.Контрагент = Контрагент;
Как отчеты отбор задать?
26 Kassern
 
10.12.21
14:38
(25) Прочтите вот это https://infostart.ru/1c/articles/1493225/
Там есть пример для обычных форм
27 УдавВПопугаях
 
10.12.21
14:38
СхемаКомпоновкиДанных = Отчеты.ПланПроизводстваГодовой.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Ссылка", Ссылка);
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Квартал", Квартал.Квартал);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
28 УдавВПопугаях
 
10.12.21
14:39
оставить запись в бложике Микхаила
29 Mikhail Volkov
 
11.12.21
07:35
Оказывается в Альфа-Авто в дкВзаиморасчетыНажатие() есть пример запуска отчета Взаиморасчеты. По нему сделал свой:

Процедура ЗапускОтчетаДвиженияВзаиморасчетов(Дата, Контрагент) Экспорт
    // заполним параметры отчета
    Отчет = Отчеты.ДвиженияВзаиморасчетовСОстатками.Создать();
    Отчет.ДатаНачала = НачалоМесяца(Дата - ?(День(Дата) > 15, 1, 2)*30*24*60*60);
    Отчет.ВыводитьИнформациюОбОплате = Истина;
    Отчет.ВидОтчета = Перечисления.ВидыОтчетов.ДвиженияСОстатками;
    Отчет.РежимВыводаОтчета = Перечисления.РежимыВыводаОтчета.ТабличныйДокумент;
    Отчет.РежимНастройки = Перечисления.РежимыНастройкиОтчетов.Эксперт;
    Отчет.ИмяФормыНастроек = "НастройкиДвиженияСОстатками";
    Отчет.ЗаполнитьНачальныеНастройки("ТекстЗапросаОстатки");
    Для каждого Измерение Из Отчет.ИзмеренияСтроки Цикл
        Если Измерение.ПутьКДанным = "ПериодРегистратор"
         Или Измерение.ПутьКДанным = "Контрагент" Тогда
            Измерение.Использование = Истина;
        Иначе
            Измерение.Использование = Ложь;
        КонецЕсли;
    КонецЦикла;
    
    // показатели все только итоговых сумм
    Для Каждого СтрокаПоказателей Из Отчет.Показатели Цикл
        Если СтрокаПоказателей.Имя = "ИтогоСуммаУпр" Тогда
            СтрокаПоказателей.Использование = Истина;
        Иначе
            СтрокаПоказателей.Использование = Ложь;
        КонецЕсли;
    КонецЦикла;
    
    // фильтры
    Попытка
        Отчет.ПостроительОтчета.Отбор.Контрагент.Значение = Контрагент;
        Отчет.ПостроительОтчета.Отбор.Контрагент.Использование = Истина;
    Исключение
    КонецПопытки;
    
    ФормаОтчета = ПолучитьОбщуюФорму("Отчет");
    ФормаОтчета.ОтчетОбъект = Отчет;
    ФормаОтчета.Заголовок = "Движения взаиморасчетов";
    ФормаОтчета.Открыть();
    
КонецПроцедуры    // ЗапускОтчетаДвиженияВзаиморасчетов()
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан