Последние сообщения

#11
7.7 / Re: УПС! или испанский стыд...
Последний ответ от Харлампий Дымба - 18 ноября 2024, 17:33
Поддержу тему, просто чтоб Сергею неодиноко было. Опять же - именно для испанского стыда нужны как минимум двое :)

Что-то вот глобальных проколов, слава богу, не припомню. Пару относительно лайтовых:
1. На одной из первых 1сных работ вечерком чистил сервер (если так можно назвать машину с win95) и удалил копию базы db1, оставив рабочую с именем db, я же не знал, что предыдущий 1сник был с параноидальной дуринкой. На следующий день в обед достал её из корзины - и прослыл в бухгалтерии волшебником, спасшим базу.
2. Когда-то научил продвинутую бухшу, работавшую со многими на аутсорсе, обходу авторизации через USRDEF0, чтоб ей присланные базы без проблем открывать. Она воспользовалась советом стукнувшись ночью по rdp к рабочей базе своего нового клиента - крупного поставщика автозапчастей. А база была в SQL. Подключение к базе само собой слетело, но вроде обошлось без жертв: прогер на следующий день базу подключил обратно (наверное, тоже прослыл волшебником, спасшим базу).

Из тех что касается себя:
Ковыряешь день какой-нибудь отчет, предварительно выгрузив его во внешний, потом ПКМ на исходном отчете и вместо "Заменить на внешний отчет" щёлкаешь "Сохранить как внешний отчет" и затираешь все изменения. Обидно.
То же самое - но только через двойное редактирование в разных конфигураторах - открываешь внешний отчет в рабочей базе, потом переходишь для отладки в копию базы, там доводишь очет и сохраняешь, а потом нечаянно повторно сохраняешь в конфигураторе рабочей базы, выкинув в помойку всю работу.

Что касается языка, то у каждого, наверное, за эти годы уже есть какие-то флажки: "тут внимательно - был негативный опыт".
Немного моих:
\ - контролируй делений на ноль;
+ - хочешь получить строку, следи за первым операндом;
всегда учитывай есть ли УРБД;
всегда учитывай состав компонент (типа не используй объект Календарь, если не уверен что будет компонента "Расчет")
храни и вызывай внешние dll в одном месте (каталог программы, а не каталог базы данных), чтобы избежать проблем с правами на регистрацию компонент;
используй только необходимое;
при удаление/изменении - помни про указатель и порядок выборки;
для глобальной переменной считывание реквизитов из базы выполняется при присвоении - осторожно;

Если Иначе КонецЕсли - логические выражения проверяются полностью;
Окр() - всегда указывай способ округления, всегда учитывай точность результата, при распределении суммы по базе не забывай про оставшиеся копейки;
Строка() - преобразование документа в строку идёт с датой/без даты в зависимости от уникальности нумерации, при работе со строками (особенно обмены между базами) помни про многострочность и запрещенные символы;
Дата - указывать год полностью '18.11.2024' (год начала рабочего столетия), не путай двойные кавычки и одинарные;
Формат() - "ДДММГГГ", "Д (0)ДДММГГ", "Д ДДММММГГ" и прочие неправильные форматные строки - молча вхолостую отрабатывает, не меняя вывод;
Найти() - не путай порядок параметров, результат >0, а не =1
Состояние() - не преобразует агрегатные объекты к пользовательскому представлению: Состояние(Спр.ТекущийЭлемент()) - неправильно;
Каталогиб() и прочие возвращающие пути - по разному работали в разных ОС (в win95 не добавлялся последний слеш) - уже неактуально;
ИмяКомпьютера() - для терминального подключения вернёт имя сервера;
НачатьТранзакцию() - не забыть Зафиксировать или Отменить, с Попытка дружит плохо (или не дружит?), запись изменений делать подобранными порцями;
ЗначениеВСтрокуВнутр и ЗначениеВСтроку - не путать между собой и особенно при восстановлении значений через ЗначениеИзСтрокиВнутр и ЗначениеИзСтроки;
СтатусВозврата - смотри где используешь, если надо, а как правило - надо, то делай после него Возврат;
ПустоеЗначение и ПолучитьПустоеЗначение - не путай;
ПустоеЗначение() возвращает ноль для битых ссылок - используй Выбран()=1 для дополнительной проверки (замедляет);
ЗаписьЖурналаРегистрации - старайся использовать при программных изменениях объектов;
УдалитьОбъекты - может падать на больших количествах - удаляй порциями;
ОткрытьФорму - используй при необходимости #;
ПриОтменеПроведенияДокумента() - не вызывается при пометке документа на удаление (хотя ИТС считает иначе, и в частности поэтому в ЗиК была историческая проблема с созданием дублирующих записей-перерасчетов, попившая крови многим);
ПриУдаленииЭлемента(), ПриУдаленииДокумента() - вызывается также и при отмене удаления, так что надо контролировать состояние на момент вызова, при удалении группы и подчиненных вызывается единожды для всех сразу;
ИспользоватьСлой() - после переключения видимости слоя туда-сюда Видимость()=1
Не называй реквизиты формы на "я";
Не именуй реквизиты формы, атрибуты справочников и переменные одинково;

Справочники:
Родитель и ИспользоватьРодителя(), Владелец и ИспользоватьВладельца() - не путай
Получить(),Установить() и ИспользоватьДату() - осторожно, для работы в формах используй лучше Получить(), в отчетах и обработках - что удобно;
ИспользоватьДату() - не забывай про параметр УстСразу;
Установить() - работает без Записать();
получить() и установить() через 2 точки работает на последних релизах;
Уровень() - для верхнего уровня возвращает 1;
УстановитьАтрибут(), ПолучитьАтрибут(), а также присвоение и получение атрибутов справочника - молча вхолостую  отрабатывает для групп атрибуты с режимом использования "Для элементы", а для элементов - с режимом использования "Для групп";
НайтиПоКоду() - если код числовой, можно передать строкой;
ВыбратьЭлементыПоРеквзитиу () - про это писал отдельно;
ОбратныйПорядок() - используй до выборки, не забывай указать параметр Режим;
Записать - если меняешь реквизиты в выборке, то используй ПорядокКодов, ПорядокНаименований, ПорядокРеквизита, а также иерархию, которые не затрагивают измененяемые реквизиты;
Удалить(1) - не используй / используй осознано
Блокировка() - возвращает состояние блокировки для ТЕКУЩЕГО пользователя, особый режим использования;
Записать(), Удалить(), СнятьПометкуУдаления(), ПометкаУдаления() - контролируй возможность блокировки другим пользователем;
Программное Записать() не вызывает ПриЗаписи() и т.д.;
ИспользоватьСписокОбъектов() - отключай иерархию или контролируй владельца/родителя, + не будет работать быстрый поиск по строке;
ПриВводеСтроки, ПриРедактированииНовойСтроки, ПриНачалеРедактированияСтроки - не путай, писал про это;
Редактирование в форме списка использовать осознано - есть ряд особенностей, писал про это;
в ПриОткрытии и прочем таком - присваивай значения атрибутам, только если они меняются, чтобы у пользователя ненужная Модифицированность не возникала;
Не путай объект и ссылку на объект;

Документы:
Многое подобно справочникам и плюс:
Документ.Операция - если не знаешь точно, сначала вызывай .СуществуетОперация();
Новый() - если меняешь / устанавливаешь дату - контролируй номер;
ПриЗаписиПерепроводить(1) - не забывай;
УстановитьВремя() - работает после АвтоВремяОтключить(), вызывать во ВводНового();
Не уверен в работе .Провести() без предварительного .Записать();
УстановитьРеквизитСправочника() с указанием документа будет позже, чем ручная или программная (через .Установить) запись в этот же день, значения за одну дату устанвливаются по порядку документов;
ОбработкаУдаленияПроведения не вызывается при перепроведении;
ПривязыватьСтроку - работает для расчета, регистров, периодических значений - если привязываешь строки, то зануляй привязку в конце (иначе при групповом перепроведении может вылезти в чужих документах?);

СписокЗначений:
Не путай НайтиЗначение и Принадлежит, и вообще не используй Принадлежит без особой надобности (тормоза);
вСтрокуСРазделителями - если в списке есть многострочные строки, то результат тоже будет многострочным (внимательно при обменах);

ТаблицаЗначений - тут много всего, надо будет поразбираться как-нибудь:
НомерСтроки и ТекущаяСтрока() - не путай
НоваяКолонка - для чисел указывай тип явно, иначе Свернуть() не будет правильно суммировать колонки, в котороых есть пустые ячейки (где явно не задано значение 0);
НоваяКолонка - если задашь несуществующий тип  (опечатка, например) - молча отработает;
НайтиЗначение - параметры Строка и Колонка если указаны, то поиск идёт только в указанной строке/колонке, так что зануляй Строка (или Колонка) перед поиском.
Выгрузить/Загрузить - не сохраняет значения установленные ВидимостьКолонки,  ВыводитьПиктограммы, Фиксировать
Сортировать - пользуйся *;
Сортировать - помни про Параметр ДокумПоДате;
Сортировать - баг, после сортировки нельзя использовать КоличествоСтрок(), СдвинутьСтроку() и что-то ещё, вроде писал про это;
Заполнить - используй только в  обёртке Если .Количестовстрок()>0;
Если кладешь СписокЗначений/ТаблицуЗначений в СписокЗначений/ТаблицуЗначений для каждой новой строки делай СоздатьОбъект();

Таблица:
КоличествоСтраниц - работает долго, + нужен контроль релиза
ВывестиСекцию или Область - проигрывают ПолучитьСекцию();
Напечатать  - длина имени принтера максимум 31 символ (-20 на русский _Перенаправлено ХХ) = 11 символов;

Не, не осилил.






#12
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от Djelf - 18 ноября 2024, 16:01
Описание поблемы.
Проблема: При событии тп "Выбор" переключение слоев глючит - слои наслаиваются.
Решение: Отложенный перенос этого события в событие ПриНажатииКлавиши, там это работает нормально.
Возможные проблемы: клавиатуры пианистов, у которых есть клавиша F13

P.S. Слишком быстро отбивает повторное редактирование, 4g отрубился, и усё..
#13
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от Djelf - 18 ноября 2024, 15:43
ТабличноеПоле, переключение на Слой Формы


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

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

#14
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от Злоп - 12 ноября 2024, 01:04
#15
FormEx / Re: СтрокаДействийФормы или ка...
Последний ответ от Злоп - 11 ноября 2024, 15:58
Получилось?
#16
FormEx / Re: Пробел как разделитель гру...
Последний ответ от Злоп - 11 ноября 2024, 15:57
На региональные настройки клюшкам пофиг
#17
FormEx / Re: Пробел как разделитель гру...
Последний ответ от Злоп - 11 ноября 2024, 15:53
Ээээ? Где нужен разделитель разрядов конкретно?
Насколько позволяет мой мелкий опыт то если выводить число - выводится без всяких разделителей, кроме десятичной точки.
Если речь идет о крыжике разделителя триад в числовых реквизитов - то хз, я их не использую для единообразия
.
А так сделай формат сам как надо
Формат(тутчисло, "Ч.2. ")
#18
FormEx / Пробел как разделитель групп р...
Последний ответ от sau - 11 ноября 2024, 13:42
При разделении на триады использовать пробел? В региональный настройках стоит "пробел", но все равно используется "запятая" (Windows 10). Может есть какое-то решение.
#19
FormEx / Re: СтрокаДействийФормы или ка...
Последний ответ от trdm - 11 ноября 2024, 11:29
Цитата: Злоп от 09 ноября 2024, 23:58А чуть подробнее что надо?
да хотел разграничить проверки при записи документа.
Одно дело когда он проводится, другое когда сопоставляется номенклатура постепенно.
#20
7.7 / Re: КОПИЛКА: здесь всякие редк...
Последний ответ от Злоп - 10 ноября 2024, 13:58
ПОЛУЧИТЬ ПАРАМЕТРЫ ШРИФТА ФОРМЫ
обсуждалось здесь

РасшФормы = СоздатьОбъект("РасширениеФормы");
	ВП = РасшФормы.ВнутреннееПредставление;
	//ОТЛАДКА Сообщить(РазделительСтрок+ВП);
	
	//{"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,"да","нет")+"
			|");