КОПИЛКА: здесь всякие редкости, полезности, тонкости, неочевидности.

Автор Злоп, 03 ноября 2024, 01:02

« назад - далее »

Злоп

..касающиеся всякого по 7.7, в т.ч. Formex и т.д.
Обсуждения здесь не писать! Если надо обсуждение - то ссылку на уже существующую старую ветку или просто пост внутри это ветки со ссылкой на обсуждение в другой ветке.

@АЛьФ Прошу закрепить вверху форума.

Злоп

Редко встречающаяся инфа/дока по методу ИТЗ

ЗаполнитьКолонкуПоАлгоритму([Индекс = ''''], Колонка, ИнкрементируемоеЗначение, Инкремент)
Назначение: 
заполняет колонку таблицы Инкрементируемым значением. 
Параметры: 
Индекс - тип: Строка, Число. Идентификатор или номер индекса, по которому
упорядочиваются и фильтруются строки заполняемой таблицы. По умолчанию
используется основной индекс. 
Колонка - тип: Строка, Число. Идентификатор или номер заполняемой колонки. 
ИнкрементируемоеЗначение - тип: Число. Значение, которым будет заполнена
колонка с учетом инкремента. 
Инкремент -  тип: Число. Значение, которым будет инкрементированно
"ИнкрементируемоеЗначение". 
(пример задали 1,2 получили 1,3,5 до КоличестваСтрок в индексе с учетом
фильтра).

Для более сложного алгоритма использовать можно так: Написал @Arbuz

_вм =СоздатьОбъект("ВыполняемыйМодуль");
    _стр ="
    |Перем Парам;
    |Процедура ВНачало(__знач)
    |    Парам =__знач;
    |КонецПроцедуры
    |
    |Функция NextValue()
    |    Парам =Парам +1;
    |    Возврат Парам;
    |КонецФункции
    |";
    _вм.УстановитьМодуль(_стр);
    _вм.КомпилироватьМодуль();
    _вм.ВыполнитьМодуль();
    _вм.ВНачало(0);

    ИТЗ.ЗаполнитьКолонкуПоАлгоритму(, 1, _вм);

Злоп

Если взять файл в кодировке UTF8, прочитать первую строку штатным методом объекта "Текст" (d кодировке 1251) и сделать
Стр = глСервис.EncodeFromUTF8(ТутПерваяСтрока);
то на выходе в Стр в первом символе получим мусор какой-то и этот первый символ лишний, его надо отрезать. По крайне мере это так если файл начинается с кода: EF BB BF

Злоп

А вот Кнопка с картинкой не из Библиотеки картинок очень прикольным способом делается, Написал @Djelf

//Кнопка //:АссоциативныйВектор
АФ=РФ.ДобавитьАтрибут(Кнопка.Идентификатор,10); // картинка
АФ.Заголовок = Кнопка.Заголовок;
АФ.Подсказка = Кнопка.Подсказка;
АФ.Описание  = Кнопка.Подсказка;
АФ.Формула   = Кнопка.Формула;
Картинка        = Система.ПолучитьOLEКартинку(Кнопка.Картинка);
АФ.Значение.УстановитьКартинку(Картинка);
АФ.Значение.РежимРисования(Кнопка.РежимРисования);
АФ.Стиль = 1342193675; // стань же кнопкой!

Злоп

ПЕРЕКОДИРОВКА С ИСПОЛЬЗОВАНИЕМ BinaryData
Написал <Ветер в поле>
...Я всегда использовал BinaryData из 1cpp для перекодировки. А для перекодировки единичных строк просто написал функцию для перекодировки из любой систем в любую с использованием того же BinaryData

// Кодировки: 0 - windows-1251, 1 - OEM, 2 - UTF-16, 3 - UTF-8
Функция ИзменитьКодировку(Стр, ИсхКодировка, КонКодировка) Экспорт
    Перем ТекСтр;
    
    оБуфер = СоздатьОбъект("BinaryData");
    оБуфер.Кодировка = КонКодировка;
    
    Если ИсхКодировка = 0 Тогда
        оБуфер.ЗаписатьСтроку(Стр, 1);
        
    Иначе
        оБуферИсх = СоздатьОбъект("BinaryData");
        оБуферИсх.ЗаписатьСтроку(Стр, 1);
        оБуферИсх.Перейти(0, 0);
        оБуферИсх.Кодировка = ИсхКодировка;
        
        Если ИсхКодировка >= 2 Тогда //UTF-16 или 8
            Пока оБуферИсх.ПрочитатьСтроку(ТекСтр, 0) = 1 Цикл
                оБуфер.ЗаписатьСтроку(ТекСтр, 0);
            КонецЦикла;
            
        Иначе
            оБуферИсх.ПрочитатьСтроку(ТекСтр, оБуферИсх.Размер());
            оБуфер.ЗаписатьСтроку(ТекСтр, 1);
        КонецЕсли;
        
        оБуферИсх = "";
    КонецЕсли;
    
    оБуфер.Перейти(0, 0);
    оБуфер.Кодировка = 0; //прочитаем без перекодировки
    оБуфер.ПрочитатьСтроку(ТекСтр, оБуфер.Размер());
    
    оБуфер = "";
    
    Возврат ТекСтр;
    
КонецФункции //ИзменитьКодировку

Злоп

ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ ПРЕДОПРЕДЕЛЕННОЙ ПРОЦЕДУРЫ ВводНаОсновании()
По СП - у процедуры всего один параметр. Но ничто не мешает определить, например, вот так:

//--------------------------------------------------------------------
Процедура ВводНаОсновании(ДокОснование, Переоформление=0,РежимВвода=0)
   РежимВвода = 77;
   Предупреждение("РежимВвода="+РежимВвода+" - 77?");

Что получится:
- если процедура вызывается платформой (или кодом ОткрытьФорму("Документ.ЧтоТо",Параметры,ДокументОснование)), то РежимВвода изменить внутри процедуры не удастся и никаких исключений не получаем при этом...
- если процедура вызывается программно в модуле формы типа
ВводНаОсновании(ДокументОснование,0,77)
то РежимВвода вполне себе нормально изменяется... 

Скорее всего и в прочих предопределенных процедурах аналогично (не проверял)...

Злоп

ПОЛУЧИТЬ ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ ЧЕГО-ТО...
Есть Документ.ПриходнаяНакладная.Товар,
где Товар - нетипизированный справочник.
.
Чорный запрос с выражением
|Код = Документ.ПриходнаяНакладная.Товар.Код;

Возвращает интересную штуку - какой-то внутренний код (id?)

Злоп


Злоп

ПОЛУЧИТЬ ПАРАМЕТРЫ ШРИФТА ФОРМЫ
обсуждалось здесь

РасшФормы = СоздатьОбъект("РасширениеФормы");
	ВП = РасшФормы.ВнутреннееПредставление;
	//ОТЛАДКА Сообщить(РазделительСтрок+ВП);
	
	//{"Dialogs",
	//{"Frame",
	//{"-11","0","0","0","400","0","0","0","204","1","2","1","34","MS Sans Serif","320","165"," ","","","128","","1","1","6","29","-1","0","128",
	ВП = СтрПолучитьСтроку(ВП,3);
	//ОТЛАДКА Сообщить(РазделительСтрок+ВП);
	
	ВП = СокрЛП(СтрЗаменить(ВП,"{",РазделительСтрок));
	ВП = СтрЗаменить(ВП,",",РазделительСтрок);
	ВП = СтрЗаменить(ВП,"""","");

	ШрифтПоУмолчанию = Число(СтрПолучитьСтроку(ВП,22));
	ШрифтИмя = СтрПолучитьСтроку(ВП,14);
	ШрифтРазмер = Число(СтрПолучитьСтроку(ВП,1));
	ШрифтЖирный = Число(СтрПолучитьСтроку(ВП,5));
	ШрифтНаклонный = Число(СтрПолучитьСтроку(ВП,6));
	ШрифтПодчеркнутый = Число(СтрПолучитьСтроку(ВП,7));
	ШрифтЗачеркнутый = Число(СтрПолучитьСтроку(ВП,8));
	
	ШрифтРазмерПриведенный = ШрифтРазмер * (-0.77273);
	ШрифтРазмерПриведенныйДробь = ШрифтРазмерПриведенный - Цел(ШрифтРазмерПриведенный);
	ШрифтРазмерПриведенныйДробь = ?(ШрифтРазмерПриведенныйДробь<0.5,0,0.5);
	ШрифтРазмерПриведенный = Цел(ШрифтРазмерПриведенный)+ШрифтРазмерПриведенныйДробь;
	
	Сообщить("Форма, шрифт:
			|"+СимволТабуляции+"шрифт по умолчанию: "+?(ШрифтПоУмолчанию<>0,"да","нет")+"
			|"+СимволТабуляции+"имя: "+ШрифтИмя+"
			|"+СимволТабуляции+"размер: "+ШрифтРазмер+"(?"+ШрифтРазмерПриведенный+"пт)
			|"+СимволТабуляции+"начертание: "+?(ШрифтЖирный=400,"нормальный","жирный")+"
			|"+СимволТабуляции+"наклонный: "+?(ШрифтНаклонный<>0,"да","нет")+"
			|"+СимволТабуляции+"подчеркнутый: "+?(ШрифтПодчеркнутый<>0,"да","нет")+"
			|"+СимволТабуляции+"зачеркнутый: "+?(ШрифтЗачеркнутый<>0,"да","нет")+"
			|");

Злоп


Djelf

ТабличноеПоле, переключение на Слой Формы


Процедура тп_ПриНажатииКлавиши(тп,ВиртКод,Данные,Клавиатура,ФСО)
	Если ВиртКод = 124 Тогда //F13
		Форма.ИспользоватьСлой("Общий",2);
		Форма.Закладки.ТекущаяСтрока(1);
		Форма.Обновить();		
	КонецЕсли;
КонецПроцедуры

Процедура тп_Выбор(тп,СтрокаТП,КолонкаТП,РегионТП)
    Сервис.SendKeys("{F13}");
КонецПроцедуры


Djelf

Описание поблемы.
Проблема: При событии тп "Выбор" переключение слоев глючит - слои наслаиваются.
Решение: Отложенный перенос этого события в событие ПриНажатииКлавиши, там это работает нормально.
Возможные проблемы: клавиатуры пианистов, у которых есть клавиша F13

P.S. Слишком быстро отбивает повторное редактирование, 4g отрубился, и усё..

Злоп

Вывод числового значения с использованием Формат()

Если в Формат опустить задание общей длины числа, то форматированное значение будет БЕЗ лидирующих пробелов, а если задавать явно длину числа - то вывод будет с лидирующими пробелами:
"<"+Формат(123.45,"Ч15.2")+">" = <         123.45>
"<"+Формат(123.45,"Ч.2")+">" = <123.45>

А вот штучка, когда значение "не влазит" в разрядную сетку:
"<"+Формат(0,"Ч(0)15.2.'")+">" = <'999'999'999.99> // причем увеличение длины не дает результата...
"<"+Формат(0,"Ч(0).2.'")+">" = <0.00>

ADirks

Цитата: Djelf от 18 ноября 2024, 16:01Описание поблемы.
Проблема: При событии тп "Выбор" переключение слоев глючит - слои наслаиваются.
Решение: Отложенный перенос этого события в событие ПриНажатииКлавиши, там это работает нормально.

Я в таких случаях пользуюсь однократным таймером.
Также таймер пригождается, когда на какое-то событие нужно выполнить что-то, занимающее много времени. Чтобы поток событий тек спокойно :)

Например, обработка активации ячейки в объекте ПолеТабличногоДокумента:
Перем оТаймер;
Перем сзДанныеДляТаймера;
//===========================================================


Процедура Таймер_ПриАктивизацииЯчейки() Экспорт
    Если оТаймер <> Неопределено Тогда
        оТаймер.ОбработкаОжидания("Таймер_ПриАктивизацииЯчейки", 0);
    КонецЕсли;
    оТаймер = Неопределено;

    ТекСтрока = сзДанныеДляТаймера.Получить("ТекСтрока");
    Обл = сзДанныеДляТаймера.Получить("Обл");
    Расшифровка = сзДанныеДляТаймера.Получить("Расшифровка");
    
    //...
КонецПроцедуры

Процедура тдТЧПриАктивизацииЯчейки(Источник, Таблица, Действие, ТекСтрока, ТекСтолбец, НомерВида) Экспорт
    Если Форма.АктивныйЭлемент() <> "тдТЧ" Тогда //обновление ТЧ при выборе счета - в этот момент не нужно реагировать
        Возврат;
    ИначеЕсли фНеРеагироватьНаСобытия = 1 Тогда
        Возврат;
    КонецЕсли;
    
    Если Действие <> 1 Тогда //реагировать нужно только на активацию ячейки (Действие == 1)
        Возврат;
    КонецЕсли;
    
    Обл = Таблица.Область(ТекСтрока, ТекСтолбец);
    Расшифровка = Обл.Расшифровка();
    сзДанныеДляТаймера = СоздатьОбъект("СписокЗначений");
    сзДанныеДляТаймера.Установить("ТекСтрока", ТекСтрока);
    сзДанныеДляТаймера.Установить("Обл", Обл);
    сзДанныеДляТаймера.Установить("Расшифровка", Расшифровка);

    оТаймер = СоздатьОбъект("РасширениеФормы");
    оТаймер.ОбработкаОжидания("Таймер_ПриАктивизацииЯчейки", 200);
КонецПроцедуры

Злоп

ОТКЛЮЧИТЬ ВЫЗОВ ПОМОЩИ ПО F1
Для обработки нажатия кнопки F1 используем Ф-штатные, например, ПриНажатииКнопкиКлавиатуры().
Чтобы отключить показ "помощи", выполняемый системой, дополнительно в ГМ ставим

Процедура ПриПолученииКомандыГлавнымОкном(Команда, НулевойПараметр, ФСО)
	
	Если Команда = 57670
	Тогда // нажата F1
		ФСО = 0; 
		Возврат; 
	КонецЕсли;
	
КонецПроцедуры // ПриПолученииКомандыГлавнымОкном()