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

Автор Злоп, 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; Возврат; КонецЕсли; КонецПроцедуры // ПриПолученииКомандыГлавнымОкном()