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

Тема в разделе "1C и всё что с ней связано", создана пользователем Hryv, 15 апр 2010.

  1. Hryv

    Hryv Гость

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

    Предлагаю всем выкладывать в этой теме подобные полезные универсальные функции и процедуры

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    // Преобразование форматированной строки в число
    // весьма полезно для считывания данных из таблиц Excel
    Код (Text):
    Function GetNumber(SNumber) Export
    Value = StrReplace(SNumber,",",".");  
    Value = StrReplace(Value," ","");  
    Value = StrReplace(Value,"'","");
    TNumber = Number(Value);
    Return TNumber
    EndFunction
    //******************************************************************
     
  3. Hryv

    Hryv Гость

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

    Код ( (Unknown Language)):
    Функция ВопросДаНет(текст) экспорт
    Если Вопрос(текст,4)=6 Тогда
    Возврат 1; //Да
    КонецЕсли;
    Возврат 0; //Нет
    КонецФункции
     
    #3 Hryv, 15 апр 2010
    Последнее редактирование: 14 фев 2015
  4. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Код ( (Unknown Language)):

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

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

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

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

    Hryv Гость

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

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Код ( (Unknown Language)):
    Функция СкопироватьСтрокуТЗ(Строка, ТЗ);
    Нов = ТЗ.Добавить();
    Для Каждого Колонка Из ТЗ.Колонки Цикл
    Нов[Колонка.Имя] = Строка[Колонка .Имя];
    КонецЦикла;
    возврат Нов;
    КонецФункции
     
  7. Hryv

    Hryv Гость

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

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

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Даю свой вариант


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


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

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

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


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

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

    evgenyatam Well-Known Member

    Регистрация:
    7 сен 2007
    Сообщения:
    175
    Симпатии:
    0
    так делали на 8.0
    на 8.1 можно без цикла:

    Код (Text):
    Функция СкопироватьСтрокуТЗ(Строка, ТЗ);
    Нов = ТЗ.Добавить();    
    ЗаполнитьЗначенияСвойств(Нов,Строка);
    возврат Нов;
    КонецФункции
     
  10. kaa

    kaa Гость

    Если при обменах с 77 в список значений в семерке запихивается в строку ВСтрокуСРазделителями()
    разобрать в 8
    Код ( (Unknown Language)):
     
    Код ( (Unknown Language)):

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

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    "Универсам 2.4" Копирование документов и справочников между конфигурациями для 1С:Предприятие 7.7.
    Очень хорошая и многофункциональная обработка. Позволяет задавать соответствие реквизитов для переоса, если переносимые данные из разных конфигураций. В одно время мне очень помогла.
     

    Вложения:

    • UniDemo.rar
      Размер файла:
      132,8 КБ
      Просмотров:
      64
  12. al1234567

    al1234567 Гость

    Афоризмы для 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
     
  13. Hryv

    Hryv Гость

    Для 7.7

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

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

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

    Код (Text):
    Функция глВыбор(Вид=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; // выбор не сделан
    КонецФункции //глВыбор
     
  14. SamNeSvoy

    SamNeSvoy Гость

    Я тоже как-то обжегся на таком. Не забывайте, что при удалении строки ТЗ сдвигается на одну позицию и при следующем ПолучитьСтроку() одна строчка получается не проверенной. думаю понятно объяснил :ya_lamo:
     
  15. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

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

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

    vitfil IT-интегратор

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

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

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Работа с почтой (клиент установлен/не установлен пофигу)
    Платформа - 8.х
    Код ( (Unknown Language)):
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераPOP3 = "POP3Сервер";
    Профиль.АдресСервераSMTP = "SMTPСервер";
    Если ВремяОжиданияСервера > 0 Тогда
    Профиль.ВремяОжидания = ВремяОжиданияСервера;
    КонецЕсли;
    Профиль.Пароль          = Пароль;
    Профиль.Пользователь  = Логин;
    Профиль.ПортPOP3      = ПортPOP3;
    Профиль.ПортSMTP      = ПортSMTP;

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

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

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

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

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

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

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

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

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

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

    Nikolon Гость

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

    DISc0nNecT Гость

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

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

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

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

    Mechanicuss New Member

    Регистрация:
    29 дек 2011
    Сообщения:
    3
    Симпатии:
    0
    Ребята, это уже баян.... даже для 2010 года.

    Код ( (Unknown Language)):
        КолвоСтрок = ТЗ.КоличествоСтрок();
    Для Н = 0 По КолвоСтрок-1 Цикл
    ТЗ.ПолучитьСтрокуПоНомеру(КолвоСтрок-Н);
    Если <Условие> Тогда
    ТЗ.УдалитьСтроку(КолвоСтрок-Н);
    КонецЕсли;
    КонецЦикла;
     
Загрузка...
Похожие Темы - Глобальные полезности
  1. Дайнеко
    Ответов:
    5
    Просмотров:
    10.881
  2. Omh
    Ответов:
    21
    Просмотров:
    8.810
  3. Medevic
    Ответов:
    2
    Просмотров:
    3.179

Поделиться этой страницей