Глобальные полезности

  • Автор темы Hryv
  • Дата начала
H

Hryv

#1
Давно хотел такую тему сделать, но руки не доходили
А тут повод хороший появился

... У меня есть глобальная функция:
Код:
Функция ВзятьЧастное(Кфц_Числитель, Кфц_Знаменатель) Экспорт
Возврат ?(ПустоеЗначение(Кфц_Знаменатель) = 1, 0, Кфц_Числитель / Кфц_Знаменатель);
КонецФункции
И везде любое деление пишу только так: ПроцентПлана = ВзятьЧастное(КолПлан, КолФакт). Компактно и надежно, потому что "ПустоеЗначение(Кфц_Знаменатель)" правильно сработает и на 0 и на пустоту.
Предлагаю всем выкладывать в этой теме подобные полезные универсальные функции и процедуры

Вечером, как доберусь дома до своих старых баз, то и от себя что-нибудь выложу.

Правила публикации
Назначение: (краткое описание).
Входные параметры: (краткое описание)
Выходные параметры: (описание если есть)
Исходный код с форматированием: (кнопка 1С в редакторе не зря придумана)
Примеры использования: если требуется.
 

vbs

Well-known member
18.02.2007
1 708
1
#2
// Преобразование форматированной строки в число
// весьма полезно для считывания данных из таблиц Excel
Код:
Function GetNumber(SNumber) Export
Value = StrReplace(SNumber,",",".");  
Value = StrReplace(Value," ","");  
Value = StrReplace(Value,"'",""); 
TNumber = Number(Value);
Return TNumber
EndFunction
//******************************************************************
 
H

Hryv

#3
Вот простенькое

Код:
Функция ВопросДаНет(текст) экспорт
Если Вопрос(текст,4)=6 Тогда
Возврат 1; //Да
КонецЕсли;
Возврат 0; //Нет
КонецФункции
 
Последнее редактирование:

unknown181538

НеГуру
28.12.2008
1 417
0
#4
Код:
Функция ФИО(ФизЛицо)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    ФИОФизЛицСрезПоследних.ФизЛицо,
|    ФИОФизЛицСрезПоследних.Фамилия,
|    ФИОФизЛицСрезПоследних.Имя,
|    ФИОФизЛицСрезПоследних.Отчество
|ИЗ
|    РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
|ГДЕ
|    ФИОФизЛицСрезПоследних.ФизЛицо = &ФЛ";

Запрос.УстановитьПараметр("ФЛ",ФизЛицо);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
возврат СокрЛП(Выборка.Фамилия)+" "+Лев(Выборка.Имя,1)+". "+Лев(Выборка.Отчество,1)+".";
КонецЦикла;
КонецФункции
Вроде кажется стандартным, но в типовых не нашел.
 
Последнее редактирование модератором:
H

Hryv

#5
Код:
//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
//Удаляет те строки ТЗ, в которых значение Колонки равно Значение
Процедура глПочиститьТЗ(ТЗ, Колонка, Значение=0) Экспорт
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Пока ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Колонка)=Значение Цикл
ТЗ.УдалитьСтроку();
КонецЦикла;
КонецЦикла;				
КонецПроцедуры //глПочиститьТЗ

Код:
//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
// Копирует строку из ТЗИ в ТЗР	
// Структура ТЗИ и ТЗР должны совпадать	
Процедура глСкопироватьСтрокуТЗ(ТЗИ, НСИ, ТЗР, НСР=0) Экспорт 
Если ПустоеЗначение(ТЗИ)=1 Тогда
Возврат;
КонецЕсли;
Если ТипЗначенияСтр(ТЗР)<>"ТаблицаЗначений" Тогда
Возврат;
КонецЕсли;
Если НСИ=0 Тогда
Возврат;
КонецЕсли;
Если НСИ>ТЗИ.КоличествоСтрок() Тогда
Возврат;
КонецЕсли;								 

Если НСР=0 Тогда
ТЗР.НоваяСтрока();
НСР = ТЗР.КоличествоСтрок();
КонецЕсли;

КолКол = ТЗИ.КоличествоКолонок();
Для ааа=1 По КолКол Цикл				  
Попытка
Значение = ТЗИ.ПолучитьЗначение(НСИ,ааа);
ТЗР.УстановитьЗначение(НСР,ааа,Значение);
Исключение
Возврат;
КонецПопытки;
КонецЦикла;
КонецПроцедуры //глСкопироватьСтрокуТЗ
 

unknown181538

НеГуру
28.12.2008
1 417
0
#6
Код:
Функция СкопироватьСтрокуТЗ(Строка, ТЗ);
Нов = ТЗ.Добавить();
Для Каждого Колонка Из ТЗ.Колонки Цикл
Нов[Колонка.Имя] = Строка[Колонка .Имя];
КонецЦикла;
возврат Нов;
КонецФункции
 
H

Hryv

#7
Сорри, я выше старую версию процедуры выложил. Она глючит, когда последнюю строку надо удалить
:sorry:

Вот рабочая версия

Код:
//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура глПочиститьТЗ(ТЗ, Колонка, Значение=0) Экспорт
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Пока ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Колонка)=Значение Цикл
Если ТЗ.НомерСтроки=ТЗ.КоличествоСтрок() Тогда
ТЗ.УдалитьСтроку();
Прервать;
КонецЕсли;
ТЗ.УдалитьСтроку();
КонецЦикла;
КонецЦикла;				
КонецПроцедуры //глПочиститьТЗ
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#8
Даю свой вариант


// ТЗ - Таблица, в которой чистим
// Колонка - имя колонки
// Зн - Значение по которому удаляем строки
// ФлагЗавершения - возвращаемое значение: -1 - ошибка в параметрах, 0 - строки не удалялись, 1 - строки удалялись


Функция глПочиститьТЗ(ТЗ, Колонка, Зн) Экспорт

Если ТипЗначенияСтр(
ТЗ) <> "ТаблицаЗначений" Тогда
Возврат -1;
КонецЕсли;

Если ПустаяСтрока(Колонка) = 1 Тогда
Возврат -1;
КонецЕсли;


Шаг = ТЗ.КоличествоСтрок();
ФлагЗавершения = 0;
Пока
Шаг > 0 Цикл
Если
ТЗ.ПолучитьЗначение(Шаг, Колонка) = Зн Тогда
ТЗ.УдалитьСтроку(Шаг);
ФлагЗавершения = 1;
КонецЕсли;

Шаг = Шаг - 1;
КонецЦикла;
Возврат
ФлагЗавершения;
КонецФункции;
 

evgenyatam

Well-known member
07.09.2007
175
0
#9
Функция СкопироватьСтрокуТЗ(Строка, ТЗ);
Нов = ТЗ.Добавить();
Для Каждого Колонка Из ТЗ.Колонки Цикл
Нов[Колонка.Имя] = Строка[Колонка .Имя];
КонецЦикла;
возврат Нов;
КонецФункции
так делали на 8.0
на 8.1 можно без цикла:

Код:
Функция СкопироватьСтрокуТЗ(Строка, ТЗ);
Нов = ТЗ.Добавить();	 
ЗаполнитьЗначенияСвойств(Нов,Строка);
возврат Нов;
КонецФункции
 
K
#10
Если при обменах с 77 в список значений в семерке запихивается в строку ВСтрокуСРазделителями()
разобрать в 8
Код:
Код:
Функция ИзСтрокиСРазделителями(Значение,Разделитель = ",") Экспорт
Рез = Новый СписокЗначений;
Стр = СокрЛП(Значение);
Если Стр = "" Тогда
Возврат Рез; 
КонецЕсли; 
Стр = Сред(Стр,2,СтрДлина(Стр)-2);
Стр = СтрЗаменить(Стр,"""","");
Стр = СтрЗаменить(Стр,",","@");
Разделитель = "@";
Поз = Найти(Стр,Разделитель);
Пока Поз>0 Цикл
СтрДобавления = СокрЛП(Лев(Стр,Поз-1));
Рез.Добавить(СтрДобавления);
Стр = Прав(Стр,СтрДлина(Стр) - Поз);
Поз = Найти(Стр,Разделитель);
КонецЦикла;
Рез.Добавить(СокрЛП(Стр));
Возврат Рез;
КонецФункции
 

Darlock

Well-known member
04.01.2008
560
1
#11
"Универсам 2.4" Копирование документов и справочников между конфигурациями для 1С:Предприятие 7.7.
Очень хорошая и многофункциональная обработка. Позволяет задавать соответствие реквизитов для переоса, если переносимые данные из разных конфигураций. В одно время мне очень помогла.
 

Вложения

A

al1234567

#12
Афоризмы для 1С версии 7.7
Просто скопируйте этот файл 1cv7Main.tip в папку 1С, и вы будет читать вместо советов дня - афоризм. Сенека, Сократ, Аристотель, Иоанн Златоуст, Шекспир, Конфуций, Лао-Цзы, А. Чехов, Махатма Ганди и многие другие. Советы дня доступны в 1С 7.7 через пункт меню "Помощь" - "Советы дня".
Скачать бесплатно можно по адресу: http://depositfiles.com/files/9yv9lsstb

Программа автоархивирования баз для 1С 7.7.
Программа Save1с.vbs версия 3.0 предназначена для быстрого и удобного автосоздания и автоведения архивов файлов базы 1С-Предприятия 7.7 как на жестком диске, так и на съемном диске (если он вставлен в USB-гнездо компьютера).
Программа предназначена только для файловой версии 1С (т.е. для
файлов данных типа DBF (для SQL версии 1С она не подходит).
Программа представлена в виде открытого программного кода и свободна для чтения и редактирования.
Размер программы - 4895 Байт.
Архив создается при запуске программы автоматически.
Скачать можно по адресу: http://www.way.zachalo.ru/ArchSave1C.zip
 
H
#13
Для 7.7

Иногда не очень удобно использовать Вопрос()
Видел (и даже сам когда-то делал ;) ), как выдаются окна с текстом типа
"Если вам надо это, тогда нажмите ДА
если вам надо то, тогда нажмите НЕТ
иначе нажмите ОТМЕНА"

А что делать если вариантов больше трех?

Конечно, для этого можно использовать список значений!
Вот функция для выбора из списка от 2 до 10 пунктов (по умолчании в виде меню)
Возващает: 0 - выбор не сделан, иначе номер выбранного пункта
Ее также можно использовать для быстрого создания простых менюшек (например, под кнопки)

Код:
Функция глВыбор(Вид=1, Таймаут=0, П1, П2, П3="", П4="", П5="", П6="", П7="", П8="", П9="", П10="") Экспорт
Спис = СоздатьОбъект("СписокЗначений");
Спис.ДобавитьЗначение(П1);
Спис.ДобавитьЗначение(П2);
Если П3<>"" Тогда
Спис.ДобавитьЗначение(П3);
КонецЕсли;
Если П4<>"" Тогда
Спис.ДобавитьЗначение(П4);
КонецЕсли;
Если П5<>"" Тогда
Спис.ДобавитьЗначение(П5);
КонецЕсли;
Если П6<>"" Тогда
Спис.ДобавитьЗначение(П6);
КонецЕсли;
Если П7<>"" Тогда
Спис.ДобавитьЗначение(П7);
КонецЕсли;
Если П8<>"" Тогда
Спис.ДобавитьЗначение(П8);
КонецЕсли;
Если П9<>"" Тогда
Спис.ДобавитьЗначение(П9);
КонецЕсли;
Если П10<>"" Тогда
Спис.ДобавитьЗначение(П10);
КонецЕсли;					
ВыбЗнач = "";
ВыбПоз = 0;
Если Спис.ВыбратьЗначение(ВыбЗнач, "Сделайте выбор", ВыбПоз, Таймаут, Вид)=1 Тогда
Возврат ВыбПоз;
КонецЕсли;
Возврат 0; // выбор не сделан
КонецФункции //глВыбор
 
S

SamNeSvoy

#14
Сорри, я выше старую версию процедуры выложил. Она глючит, когда последнюю строку надо удалить
:sorry:

Вот рабочая версия

Код:
//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура глПочиститьТЗ(ТЗ, Колонка, Значение=0) Экспорт
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Пока ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Колонка)=Значение Цикл
Если ТЗ.НомерСтроки=ТЗ.КоличествоСтрок() Тогда
ТЗ.УдалитьСтроку();
Прервать;
КонецЕсли;
ТЗ.УдалитьСтроку();
КонецЦикла;
КонецЦикла;				
КонецПроцедуры //глПочиститьТЗ
Я тоже как-то обжегся на таком. Не забывайте, что при удалении строки ТЗ сдвигается на одну позицию и при следующем ПолучитьСтроку() одна строчка получается не проверенной. думаю понятно объяснил :ya_lamo:
 

Дайнеко

Well-known member
19.11.2009
951
0
#15
Часто бывает нужно переменной А присвоить значение от Б , но если Б пустое, тогда взять В. Вместо громоздкого Если и даже ?() я создал простую функцию:
Код:
Функция НаВыбор(ПарОсновной, ПарАлтернатива) Экспорт
Возврат ?(НЕ(ПустоеЗначение(ПарОсновной) = 1), ПарОсновной, ПарАлтернатива);
КонецФункции	// НаВыбор
И по всему тексту программы я пишу компактно.
Ставка = НаВыбор(Товар.Ставка, Константа.Ставка);
Адрес = НаВыбор(Док.АдресРазгрузки, Клиент.Адрес);

Доходит до лени. Например нужно после выбора клиента внести в документ его адрес, но при условии, что адрес еще не внесен в док-т:
ПолеАдрес = НаВыбор(ПолеАдрес, Клиент.Адрес);

Это выражение так прижилось в нашем коллективе, что мы и разговариваем так "на выбор из спр-ка такого ... и такого-то".
А еще можно функцию и вкладывать друг в друга...
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#16
Почистил ветку от флуда. Просьба ко всем авторам отредактировать свои сообщения и привести к виду:
Назначение: (краткое описание).
Входные параметры: (краткое описание)
Выходные параметры: (описание если есть)
Исходный код с форматированием: (кнопка 1С в редакторе не зря придумана)
Примеры использования: если требуется.

В дальнейшем весь флуд будет нещадно удаляться. Опубликованные не по правилам полезности тоже будут удаляться.
Господа и дамы, хватит бардак разводить. Ну, пожалуйста...
 

Darlock

Well-known member
04.01.2008
560
1
#17
Работа с почтой (клиент установлен/не установлен пофигу)
Платформа - 8.х
Код:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераPOP3 = "POP3Сервер";
Профиль.АдресСервераSMTP = "SMTPСервер";
Если ВремяОжиданияСервера > 0 Тогда
Профиль.ВремяОжидания = ВремяОжиданияСервера;
КонецЕсли; 
Профиль.Пароль			 = Пароль;
Профиль.Пользователь  = Логин;
Профиль.ПортPOP3		 = ПортPOP3;
Профиль.ПортSMTP		 = ПортSMTP;

Если ТребуетсяSMTPАутентификация Тогда
Профиль.ПарольSMTP	  = ПарольSMTP;
Профиль.ПользовательSMTP = ЛогинSMTP;
Иначе
Профиль.ПарольSMTP		 = Пароль;
Профиль.ПользовательSMTP = Логин;
КонецЕсли; 

ИнтернетПочта = Новый ИнтернетПочта;

Состояние("Выполняется попытка подключения к почтовому серверу ...");
Попытка
ИнтернетПочта.Подключиться(Профиль);
Исключение
Сообщить("Не удалось выполнить подключение!");
Возврат;
КонецПопытки;

Для каждого Получатель Из Адресаты Цикл

ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;

Для Каждого СтрокаВложения Из Вложения Цикл
ПочтовоеСообщение.Вложения.Добавить("Двоичные данные", "Полный путь к файлу");
КонецЦикла; 

// Общие свойства письма
ПочтовоеСообщение.ИмяОтправителя = Пользователь;
ПочтовоеСообщение.Отправитель	 = АдресЭлектроннойПочты;
ПочтовоеСообщение.Получатели.Добавить(Адрес);
ПочтовоеСообщение.Тема			= СокрЛП(ТемаПисьма);
ПочтовоеСообщение.Тексты.Добавить("Текст сообщения");

Попытка
ИнтернетПочта.Послать(ПочтовоеСообщение);
ПризнакОтправки = Истина;
Исключение
Сообщить("Не удалось послать письма!" + " " + ОписаниеОшибки());
Сообщить(СокрЛП(Получатель.НомерСтроки) + " не отправлено");
//Возврат;
КонецПопытки;

КонецЕсли; 
КонецЦикла; 
Предупреждение("Отправка писем успешно завершена!",5,"Завершение отправки");

ИнтернетПочта.Отключиться();
 
N

Nikolon

#18
Может и фигня, но недавно поработал с универсальной обработкой ПоискИЗаменаЗначений, позволяет заменять одни элементы объекта другими, например удобно менять счета при обновлении.
 
D

DISc0nNecT

#19
Назначение: Получение даты с точностью до 1мс
Выходные параметры: Тип возвращаемого значения - Строка
Код:
// формирует дату с точностью до 1мс
//
Функция ТекМиллисекунды() Экспорт

MSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
MSScriptControl.Language = "javascript";
Миллисекунды = MSScriptControl.eval("new Date().getMilliseconds(0)");
Возврат Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy hh:mm:ss'") + "," + Миллисекунды;  

КонецФункции //ТекМиллисекунды
Добавлено: Назначение: функция транспонирует значения переданной таблицы
Входные параметры: ТЗ - таблица значений для обработки
Выходные параметры: ТЗ2 - транспонированная таблица
Код:
// функция транспонирует значения переданной таблицы
//
Функция ПеревернутьТЗ(ТЗ) 	
ТЗ2 = Новый ТаблицаЗначений; 
Массив = ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0]); 
К = 1; 
Для Каждого Значения ИЗ Массив ЦИКЛ 
ТЗ2.Колонки.Добавить("COL" + К);
К = К + 1;
Конеццикла;		  	

Колво = ТЗ2.Колонки.Количество(); 	
//обходим колонки оригинальной таблицы
Для Каждого Колонка из ТЗ.Колонки Цикл
//для каждой колонки из оригинальной таблицы добавим строки в новой таблице
Строка = ТЗ2.Добавить();
//выгружаем колонку в массив
СтрокаИсточник = ТЗ.ВыгрузитьКолонку(Колонка); 
Для М = 0 По Колво - 1 Цикл 
//заполняем значение строки новой таблицы из массива по индексам
Строка[М] = СтрокаИсточник[М]; 
КонецЦикла; 
КонецЦикла;					  	
Возврат ТЗ2;
КонецФункции
 

Mechanicuss

New member
29.12.2011
3
0
#20
Я тоже как-то обжегся на таком. Не забывайте, что при удалении строки ТЗ сдвигается на одну позицию и при следующем ПолучитьСтроку() одна строчка получается не проверенной. думаю понятно объяснил :rolleyes:
Ребята, это уже баян.... даже для 2010 года.

Код:
	КолвоСтрок = ТЗ.КоличествоСтрок();
Для Н = 0 По КолвоСтрок-1 Цикл
ТЗ.ПолучитьСтрокуПоНомеру(КолвоСтрок-Н);
Если <Условие> Тогда
ТЗ.УдалитьСтроку(КолвоСтрок-Н);
КонецЕсли;
КонецЦикла;